File Coverage

lib/FFI/Temp.pm
Criterion Covered Total %
statement 36 36 100.0
branch 8 14 57.1
condition 1 2 50.0
subroutine 10 10 100.0
pod 0 2 0.0
total 55 64 85.9


line stmt bran cond sub pod time code
1             package FFI::Temp;
2              
3 18     18   646395 use strict;
  18         33  
  18         695  
4 18     18   97 use warnings;
  18         52  
  18         1000  
5 18     18   352 use 5.008004;
  18         62  
6 18     18   143 use Carp qw( croak );
  18         50  
  18         1240  
7 18     18   99 use File::Spec;
  18         27  
  18         718  
8 18     18   11491 use File::Temp qw( tempdir );
  18         282636  
  18         8275  
9              
10             # ABSTRACT: Temp Dir support for FFI::Platypus
11             our $VERSION = '2.11'; # VERSION
12              
13              
14             # problem with vanilla File::Temp is that is often uses
15             # as /tmp that has noexec turned on. Workaround is to
16             # create a temp directory in the build directory, but
17             # we have to be careful about cleanup. This puts all that
18             # (attempted) carefulness in one place so that when we
19             # later discover it isn't so careful we can fix it in
20             # one place rather thabn alllll the places that we need
21             # temp directories.
22              
23             my %root;
24              
25             sub _root
26             {
27 43     43   2122 my $root = File::Spec->rel2abs(File::Spec->catdir(".tmp"));
28 43         739 my $lock = File::Spec->catfile($root, "l$$");
29              
30 43         241 foreach my $try (0..9)
31             {
32 43 50       154 sleep $try if $try != 0;
33 43 100 50     3197 mkdir $root or die "unable to create temp root $!" unless -d $root;
34              
35             # There is a race condition here if the FFI::Temp is
36             # used in parallel. To work around we run this 10
37             # times until it works. There is still a race condition
38             # if it fails 10 times, but hopefully that is unlikely.
39              
40             # ??: doesn't account for fork, but probably doesn't need to.
41 43 50       5026 open my $fh, '>', $lock or next;
42 43 50       706 close $fh or next;
43              
44 43         187 $root{$root} = 1;
45 43         808 return $root;
46             }
47             }
48              
49             END {
50 18     18   575676 foreach my $root (keys %root)
51             {
52 12         342 my $lock = File::Spec->catfile($root, "l$$");
53 12         1546 unlink $lock;
54             # try to delete if possible.
55             # if not possible then punt
56 12 50       1363 rmdir $root if -d $root;
57             }
58             }
59              
60             sub newdir
61             {
62 24     24 0 1399636 my $class = shift;
63 24 50       124 croak "uneven" if @_ % 2;
64 24         2091 File::Temp->newdir(DIR => _root, @_);
65             }
66              
67             sub new
68             {
69 19     19 0 10217 my $class = shift;
70 19 50       101 croak "uneven" if @_ % 2;
71 19         95 File::Temp->new(DIR => _root, @_);
72             }
73              
74             1;
75              
76             __END__