#!./perl BEGIN { chdir 't' if -d 't'; @INC = '../lib'; require Config; import Config; if ($Config{'extensions'} !~ /\bFile\/Glob\b/i) { print "1..0\n"; exit 0; } } use strict; use warnings; # Test::More needs threads pre-loaded use if $Config{useithreads}, 'threads'; use Test::More; BEGIN { if (! $Config{'useithreads'}) { plan skip_all => "Perl not compiled with 'useithreads'"; } } use File::Temp qw(tempdir); use File::Spec qw(); use File::Glob qw(csh_glob); my($dir) = tempdir(CLEANUP => 1) or die "Could not create temporary directory"; my @temp_files = qw(1_file.tmp 2_file.tmp 3_file.tmp); for my $file (@temp_files) { open my $fh, ">", File::Spec->catfile($dir, $file) or die "Could not create file $dir/$file: $!"; close $fh; } my $cwd = Cwd::cwd(); chdir $dir or die "Could not chdir to $dir: $!"; sub do_glob { scalar csh_glob("*") } # Stablish some glob state my $first_file = do_glob(); is($first_file, $temp_files[0]); my @files; push @files, threads->create(\&do_glob)->join() for 1..5; is_deeply( \@files, [($temp_files[1]) x 5], "glob() state is cloned for new threads" ); @files = threads->create({'context' => 'list'}, sub { return do_glob(), threads->create(\&do_glob)->join() })->join(); is_deeply( \@files, [@temp_files[1,2]], "..and for new threads inside threads" ); my $second_file = do_glob(); is($second_file, $temp_files[1], "state doesn't leak from threads"); chdir $cwd or die "Could not chdir back to $cwd: $!"; done_testing;