perl/dist/threads/t/kill2.t

111 lines
2.4 KiB
Perl

use strict;
use warnings;
BEGIN {
require($ENV{PERL_CORE} ? '../../t/test.pl' : './t/test.pl');
use Config;
if (! $Config{'useithreads'}) {
skip_all(q/Perl not compiled with 'useithreads'/);
}
}
use ExtUtils::testlib;
use threads;
BEGIN {
if (! eval 'use threads::shared; 1') {
skip_all('threads::shared not available');
}
local $SIG{'HUP'} = sub {};
my $thr = threads->create(sub {});
eval { $thr->kill('HUP') };
$thr->join();
if ($@ && $@ =~ /safe signals/) {
skip_all('Not using safe signals');
}
plan(4);
};
fresh_perl_is(<<'EOI', 'ok', { }, 'No signal handler in thread');
use threads;
use Thread::Semaphore;
my $sema = Thread::Semaphore->new(0);
my $test = sub {
my $sema = shift;
$sema->up();
while(1) { sleep(1); }
};
my $thr = threads->create($test, $sema);
$sema->down();
$thr->detach();
eval {
$thr->kill('STOP');
};
print(($@ =~ /no signal handler set/) ? 'ok' : 'not ok');
EOI
fresh_perl_is(<<'EOI', 'ok', { }, 'Handler to signal mismatch');
use threads;
use Thread::Semaphore;
my $sema = Thread::Semaphore->new(0);
my $test = sub {
my $sema = shift;
$SIG{'TERM'} = sub { threads->exit() };
$sema->up();
while(1) { sleep(1); }
};
my $thr = threads->create($test, $sema);
$sema->down();
$thr->detach();
eval {
$thr->kill('STOP');
};
print(($@ =~ /no signal handler set/) ? 'ok' : 'not ok');
EOI
fresh_perl_is(<<'EOI', 'ok', { }, 'Handler and signal match');
use threads;
use Thread::Semaphore;
my $sema = Thread::Semaphore->new(0);
my $test = sub {
my $sema = shift;
$SIG{'STOP'} = sub { threads->exit() };
$sema->up();
while(1) { sleep(1); }
};
my $thr = threads->create($test, $sema);
$sema->down();
$thr->detach();
eval {
$thr->kill('STOP');
};
print((! $@) ? 'ok' : 'not ok');
EOI
fresh_perl_is(<<'EOI', 'ok', { }, 'Ignore signal after thread finishes');
use threads;
my $thr = threads->create(sub {
$SIG{KILL} = sub {
threads->exit();
};
return 0;
});
until ($thr->is_joinable()) {
threads->yield();
}
$thr->kill('SIGKILL');
$thr->join();
print((! $@) ? 'ok' : 'not ok');
EOI
exit(0);
# EOF