1*91f110e0Safresh1#!./perl 2*91f110e0Safresh1 3*91f110e0Safresh1BEGIN { 4*91f110e0Safresh1 chdir 't' if -d 't'; 5*91f110e0Safresh1 @INC = '../lib'; 6*91f110e0Safresh1 require Config; import Config; 7*91f110e0Safresh1 if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) { 8*91f110e0Safresh1 print "1..0\n"; 9*91f110e0Safresh1 exit 0; 10*91f110e0Safresh1 } 11*91f110e0Safresh1} 12*91f110e0Safresh1use strict; 13*91f110e0Safresh1use warnings; 14*91f110e0Safresh1# Test::More needs threads pre-loaded 15*91f110e0Safresh1use if $Config{useithreads}, 'threads'; 16*91f110e0Safresh1use Test::More; 17*91f110e0Safresh1 18*91f110e0Safresh1BEGIN { 19*91f110e0Safresh1 if (! $Config{'useithreads'}) { 20*91f110e0Safresh1 plan skip_all => "Perl not compiled with 'useithreads'"; 21*91f110e0Safresh1 } 22*91f110e0Safresh1} 23*91f110e0Safresh1 24*91f110e0Safresh1use File::Temp qw(tempdir); 25*91f110e0Safresh1use File::Spec qw(); 26*91f110e0Safresh1use File::Glob qw(csh_glob); 27*91f110e0Safresh1 28*91f110e0Safresh1my($dir) = tempdir(CLEANUP => 1) 29*91f110e0Safresh1 or die "Could not create temporary directory"; 30*91f110e0Safresh1 31*91f110e0Safresh1my @temp_files = qw(1_file.tmp 2_file.tmp 3_file.tmp); 32*91f110e0Safresh1for my $file (@temp_files) { 33*91f110e0Safresh1 open my $fh, ">", File::Spec->catfile($dir, $file) 34*91f110e0Safresh1 or die "Could not create file $dir/$file: $!"; 35*91f110e0Safresh1 close $fh; 36*91f110e0Safresh1} 37*91f110e0Safresh1my $cwd = Cwd::cwd(); 38*91f110e0Safresh1chdir $dir 39*91f110e0Safresh1 or die "Could not chdir to $dir: $!"; 40*91f110e0Safresh1 41*91f110e0Safresh1sub do_glob { scalar csh_glob("*") } 42*91f110e0Safresh1# Stablish some glob state 43*91f110e0Safresh1my $first_file = do_glob(); 44*91f110e0Safresh1is($first_file, $temp_files[0]); 45*91f110e0Safresh1 46*91f110e0Safresh1my @files; 47*91f110e0Safresh1push @files, threads->create(\&do_glob)->join() for 1..5; 48*91f110e0Safresh1is_deeply( 49*91f110e0Safresh1 \@files, 50*91f110e0Safresh1 [($temp_files[1]) x 5], 51*91f110e0Safresh1 "glob() state is cloned for new threads" 52*91f110e0Safresh1); 53*91f110e0Safresh1 54*91f110e0Safresh1@files = threads->create({'context' => 'list'}, 55*91f110e0Safresh1 sub { 56*91f110e0Safresh1 return do_glob(), threads->create(\&do_glob)->join() 57*91f110e0Safresh1 })->join(); 58*91f110e0Safresh1 59*91f110e0Safresh1is_deeply( 60*91f110e0Safresh1 \@files, 61*91f110e0Safresh1 [@temp_files[1,2]], 62*91f110e0Safresh1 "..and for new threads inside threads" 63*91f110e0Safresh1); 64*91f110e0Safresh1 65*91f110e0Safresh1my $second_file = do_glob(); 66*91f110e0Safresh1is($second_file, $temp_files[1], "state doesn't leak from threads"); 67*91f110e0Safresh1 68*91f110e0Safresh1chdir $cwd 69*91f110e0Safresh1 or die "Could not chdir back to $cwd: $!"; 70*91f110e0Safresh1 71*91f110e0Safresh1done_testing; 72