use Errno qw(ENOSYS);
require_ok 'PublicInbox::Sigfd';
use PublicInbox::DS;
+my ($linux_sigfd, $has_sigfd);
SKIP: {
if ($^O ne 'linux' && !eval { require IO::KQueue }) {
my $old = PublicInbox::DS::block_signals();
my $hit = {};
my $sig = {};
+ local $SIG{USR2} = sub { $hit->{USR2}->{normal}++ };
local $SIG{HUP} = sub { $hit->{HUP}->{normal}++ };
local $SIG{TERM} = sub { $hit->{TERM}->{normal}++ };
local $SIG{INT} = sub { $hit->{INT}->{normal}++ };
local $SIG{WINCH} = sub { $hit->{WINCH}->{normal}++ };
- for my $s (qw(HUP TERM INT WINCH)) {
+ for my $s (qw(USR2 HUP TERM INT WINCH)) {
$sig->{$s} = sub { $hit->{$s}->{sigfd}++ };
}
+ kill 'USR2', $$ or die "kill $!";
+ ok(!defined($hit->{USR2}), 'no USR2 yet') or diag explain($hit);
PublicInbox::DS->Reset;
my $sigfd = PublicInbox::Sigfd->new($sig, 0);
if ($sigfd) {
+ $linux_sigfd = 1 if $^O eq 'linux';
+ $has_sigfd = 1;
ok($sigfd, 'Sigfd->new works');
kill('HUP', $$) or die "kill $!";
kill('INT', $$) or die "kill $!";
for my $s (qw(HUP INT)) {
is($hit->{$s}->{sigfd}, 1, "sigfd fired $s");
is($hit->{$s}->{normal}, undef,
- 'normal $SIG{$s} not fired');
+ "normal \$SIG{$s} not fired");
}
+ SKIP: {
+ skip 'Linux sigfd-only behavior', 1 if !$linux_sigfd;
+ is($hit->{USR2}->{sigfd}, 1,
+ 'USR2 sent before signalfd created received');
+ }
+ ok(!$hit->{USR2}->{normal}, 'USR2 not fired normally');
PublicInbox::DS->Reset;
$sigfd = undef;
} else {
skip('signalfd disabled?', 10);
}
- sigprocmask(SIG_SETMASK, $old) or die "sigprocmask $!";
+ ok(!$hit->{USR2}->{normal}, 'USR2 still not fired normally');
+ PublicInbox::DS::sig_setmask($old);
+ SKIP: {
+ ($has_sigfd && !$linux_sigfd) or
+ skip 'EVFILT_SIGNAL-only behavior check', 1;
+ is($hit->{USR2}->{normal}, 1,
+ "USR2 fired normally after unblocking on $^O");
+ }
}
done_testing;