]> git.ipfire.org Git - thirdparty/public-inbox.git/commitdiff
t/sigfd: test EVFILT_SIGNAL vs signalfd differences
authorEric Wong <e@80x24.org>
Mon, 4 Sep 2023 10:35:59 +0000 (10:35 +0000)
committerEric Wong <e@80x24.org>
Tue, 5 Sep 2023 03:01:36 +0000 (03:01 +0000)
Verify that observed OpenBSD and FreeBSD EVFILT_SIGNAL behavior
works differently than what Linux signalfd does to ease upcoming
changes to PublicInbox::DS.

t/sigfd.t

index 0070ca73a843900eba0f3f9beba9d00ed6c4b943..15fc818a118dd27465aaaf9e8a0fbda17a916ac6 100644 (file)
--- a/t/sigfd.t
+++ b/t/sigfd.t
@@ -7,6 +7,7 @@ use POSIX qw(:signal_h);
 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 }) {
@@ -16,16 +17,21 @@ SKIP: {
        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 $!";
@@ -39,8 +45,14 @@ SKIP: {
                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;
 
@@ -63,7 +75,14 @@ SKIP: {
        } 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;