1*5759b3d2Safresh1use strict; 2*5759b3d2Safresh1use warnings; 3*5759b3d2Safresh1 4*5759b3d2Safresh1BEGIN { 5*5759b3d2Safresh1 require($ENV{PERL_CORE} ? '../../t/test.pl' : './t/test.pl'); 6*5759b3d2Safresh1 7*5759b3d2Safresh1 use Config; 8*5759b3d2Safresh1 if (! $Config{'useithreads'}) { 9*5759b3d2Safresh1 skip_all(q/Perl not compiled with 'useithreads'/); 10*5759b3d2Safresh1 } 11*5759b3d2Safresh1} 12*5759b3d2Safresh1 13*5759b3d2Safresh1use ExtUtils::testlib; 14*5759b3d2Safresh1use File::Path (); 15*5759b3d2Safresh1use File::Spec; 16*5759b3d2Safresh1use Cwd; 17*5759b3d2Safresh1my $cwd = cwd(); 18*5759b3d2Safresh1 19*5759b3d2Safresh1use threads; 20*5759b3d2Safresh1 21*5759b3d2Safresh1BEGIN { 22*5759b3d2Safresh1 if (! eval 'use threads::shared; 1') { 23*5759b3d2Safresh1 skip_all('threads::shared not available'); 24*5759b3d2Safresh1 } 25*5759b3d2Safresh1 26*5759b3d2Safresh1 local $SIG{'HUP'} = sub {}; 27*5759b3d2Safresh1 my $thr = threads->create(sub {}); 28*5759b3d2Safresh1 eval { $thr->kill('HUP') }; 29*5759b3d2Safresh1 $thr->join(); 30*5759b3d2Safresh1 if ($@ && $@ =~ /safe signals/) { 31*5759b3d2Safresh1 skip_all('Not using safe signals'); 32*5759b3d2Safresh1 } 33*5759b3d2Safresh1 34*5759b3d2Safresh1 plan(2); 35*5759b3d2Safresh1}; 36*5759b3d2Safresh1 37*5759b3d2Safresh1{ 38*5759b3d2Safresh1 $SIG{'KILL'} = undef; 39*5759b3d2Safresh1 my $tmp = File::Spec->tmpdir(); 40*5759b3d2Safresh1 chdir $tmp; 41*5759b3d2Safresh1 my $dir = File::Spec->catdir( $tmp, "toberead$$" ); 42*5759b3d2Safresh1 mkdir $dir; 43*5759b3d2Safresh1 chdir $dir; 44*5759b3d2Safresh1 for ('a'..'e') { 45*5759b3d2Safresh1 open my $THING, ">$_"; 46*5759b3d2Safresh1 close $THING or die "$_: $!"; 47*5759b3d2Safresh1 } 48*5759b3d2Safresh1 chdir $cwd; 49*5759b3d2Safresh1 50*5759b3d2Safresh1 local $ARGV[0] = undef; 51*5759b3d2Safresh1 fresh_perl_is(<<'EOI', 'ok', { }, 'RT #77934: Case: Perl-false $ARGV[0]'); 52*5759b3d2Safresh1 local $@; 53*5759b3d2Safresh1 my $DIRH; 54*5759b3d2Safresh1 my $thr; 55*5759b3d2Safresh1 $thr = async { 56*5759b3d2Safresh1 # Thread 'cancellation' signal handler 57*5759b3d2Safresh1 $SIG{'KILL'} = sub { threads->exit(); }; 58*5759b3d2Safresh1 59*5759b3d2Safresh1 opendir $DIRH, "."; 60*5759b3d2Safresh1 my $start = telldir $DIRH; 61*5759b3d2Safresh1 while (1) { 62*5759b3d2Safresh1 readdir $DIRH or seekdir $DIRH, 0; 63*5759b3d2Safresh1 } 64*5759b3d2Safresh1 } if $ARGV[0]; 65*5759b3d2Safresh1 66*5759b3d2Safresh1 opendir $DIRH, "."; 67*5759b3d2Safresh1 for(1..5) { 68*5759b3d2Safresh1 select undef, undef, undef, .25; 69*5759b3d2Safresh1 } 70*5759b3d2Safresh1 71*5759b3d2Safresh1 if ($ARGV[0]) { 72*5759b3d2Safresh1 $thr->kill('KILL')->detach(); 73*5759b3d2Safresh1 } 74*5759b3d2Safresh1 print($@ ? 'not ok' : 'ok'); 75*5759b3d2Safresh1EOI 76*5759b3d2Safresh1 File::Path::rmtree($dir); 77*5759b3d2Safresh1} 78*5759b3d2Safresh1 79*5759b3d2Safresh1{ 80*5759b3d2Safresh1 $SIG{'KILL'} = undef; 81*5759b3d2Safresh1 my $tmp = File::Spec->tmpdir(); 82*5759b3d2Safresh1 chdir $tmp; 83*5759b3d2Safresh1 my $dir = File::Spec->catdir( $tmp, "shouldberead$$" ); 84*5759b3d2Safresh1 mkdir $dir; 85*5759b3d2Safresh1 chdir $dir; 86*5759b3d2Safresh1 for ('a'..'e') { 87*5759b3d2Safresh1 open my $THING, ">$_"; 88*5759b3d2Safresh1 close $THING or die "$_: $!"; 89*5759b3d2Safresh1 } 90*5759b3d2Safresh1 chdir $cwd; 91*5759b3d2Safresh1 92*5759b3d2Safresh1 local $ARGV[0] = 1; 93*5759b3d2Safresh1 fresh_perl_is(<<'EOI', 'ok', { }, 'RT #77934: Case: Perl-true $ARGV[0]'); 94*5759b3d2Safresh1 local $@; 95*5759b3d2Safresh1 my $DIRH; 96*5759b3d2Safresh1 my $thr; 97*5759b3d2Safresh1 $thr = async { 98*5759b3d2Safresh1 # Thread 'cancellation' signal handler 99*5759b3d2Safresh1 $SIG{'KILL'} = sub { threads->exit(); }; 100*5759b3d2Safresh1 101*5759b3d2Safresh1 opendir $DIRH, "."; 102*5759b3d2Safresh1 my $start = telldir $DIRH; 103*5759b3d2Safresh1 while (1) { 104*5759b3d2Safresh1 readdir $DIRH or seekdir $DIRH, 0; 105*5759b3d2Safresh1 } 106*5759b3d2Safresh1 } if $ARGV[0]; 107*5759b3d2Safresh1 108*5759b3d2Safresh1 opendir $DIRH, "."; 109*5759b3d2Safresh1 for(1..5) { 110*5759b3d2Safresh1 select undef, undef, undef, .25; 111*5759b3d2Safresh1 } 112*5759b3d2Safresh1 113*5759b3d2Safresh1 if ($ARGV[0]) { 114*5759b3d2Safresh1 $thr->kill('KILL')->detach(); 115*5759b3d2Safresh1 } 116*5759b3d2Safresh1 print($@ ? 'not ok' : 'ok'); 117*5759b3d2Safresh1EOI 118*5759b3d2Safresh1 File::Path::rmtree($dir); 119*5759b3d2Safresh1} 120*5759b3d2Safresh1 121*5759b3d2Safresh1exit(0); 122