1 # Copyright (C) all contributors <meta@public-inbox.org>
2 # Licensed the same as Danga::Socket (and Perl5)
3 # License: GPL-1.0+ or Artistic-1.0-Perl
4 # <https://www.gnu.org/licenses/gpl-1.0.txt>
5 # <https://dev.perl.org/licenses/artistic.html>
8 unless (eval { require IO::KQueue }) {
9 my $m = ($^O =~ /bsd/ || $^O eq 'dragonfly') ?
10 "no IO::KQueue, skipping $0: $@" :
11 'DSKQXS is only for *BSD systems';
15 if ('ensure nested kqueue works for signalfd emulation') {
17 my $new = POSIX::SigSet->new(POSIX::SIGHUP());
18 my $old = POSIX::SigSet->new;
20 local $SIG{HUP} = sub { $hup++ };
21 POSIX::sigprocmask(POSIX::SIG_SETMASK(), $new, $old) or die;
22 my $kqs = IO::KQueue->new or die;
23 $kqs->EV_SET(POSIX::SIGHUP(), IO::KQueue::EVFILT_SIGNAL(),
24 IO::KQueue::EV_ADD());
25 kill('HUP', $$) or die;
26 my @events = $kqs->kevent(3000);
27 is(scalar(@events), 1, 'got one event');
28 is($events[0]->[0], POSIX::SIGHUP(), 'got SIGHUP');
29 my $parent = IO::KQueue->new or die;
31 $parent->EV_SET($kqfd, IO::KQueue::EVFILT_READ(), IO::KQueue::EV_ADD());
32 kill('HUP', $$) or die;
33 @events = $parent->kevent(3000);
34 is(scalar(@events), 1, 'got one event');
35 is($events[0]->[0], $kqfd, 'got kqfd');
36 is($hup, 0, '$SIG{HUP} did not fire');
37 POSIX::sigprocmask(POSIX::SIG_SETMASK(), $old) or die;
38 defined(POSIX::close($kqfd)) or die;
39 defined(POSIX::close($$parent)) or die;
42 local $ENV{TEST_IOPOLLER} = 'PublicInbox::DSKQXS';
43 require './t/ds-poll.t';