xref: /openbsd-src/gnu/usr.bin/perl/dist/threads/t/kill3.t (revision 5759b3d249badf144a6240f7eec4dcf9df003e6b)
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