From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 141ED1FB07 for ; Fri, 1 Oct 2021 09:54:46 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 5/9] ds: simplify signalfd use Date: Fri, 1 Oct 2021 09:54:41 +0000 Message-Id: <20211001095445.9326-6-e@80x24.org> In-Reply-To: <20211001095445.9326-1-e@80x24.org> References: <20211001095445.9326-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Since signalfd is often combined with our event loop, give it a convenient API and reduce the code duplication required to use it. EventLoop is replaced with ::event_loop to allow consistent parameter passing and avoid needlessly passing the package name on stack. We also avoid exporting SFD_NONBLOCK since it's the only flag we support. There's no sense in having the memory overhead of a constant function when it's in cold code. --- lib/PublicInbox/ConfigIter.pm | 2 +- lib/PublicInbox/DS.pm | 64 ++++++++++++++++++--------------- lib/PublicInbox/DSKQXS.pm | 10 +++--- lib/PublicInbox/Daemon.pm | 14 ++------ lib/PublicInbox/ExtMsg.pm | 2 +- lib/PublicInbox/ExtSearchIdx.pm | 12 ++----- lib/PublicInbox/Gcf2Client.pm | 4 +-- lib/PublicInbox/IPC.pm | 3 +- lib/PublicInbox/LEI.pm | 17 ++------- lib/PublicInbox/Qspawn.pm | 2 +- lib/PublicInbox/Sigfd.pm | 10 +++--- lib/PublicInbox/Syscall.pm | 12 +++---- lib/PublicInbox/Watch.pm | 3 +- script/public-inbox-watch | 9 ----- t/dir_idle.t | 6 ++-- t/ds-leak.t | 4 +-- t/imapd.t | 6 ++-- t/nntpd.t | 2 +- t/sigfd.t | 7 ++-- t/watch_maildir.t | 2 +- xt/mem-imapd-tls.t | 6 ++-- xt/net_writer-imap.t | 2 +- 22 files changed, 82 insertions(+), 117 deletions(-) diff --git a/lib/PublicInbox/ConfigIter.pm b/lib/PublicInbox/ConfigIter.pm index 24cb09bfdc44..14fcef83f229 100644 --- a/lib/PublicInbox/ConfigIter.pm +++ b/lib/PublicInbox/ConfigIter.pm @@ -1,7 +1,7 @@ # Copyright (C) 2020-2021 all contributors # License: AGPL-3.0+ -# Intended for PublicInbox::DS->EventLoop in read-only daemons +# Intended for PublicInbox::DS::event_loop in read-only daemons # to avoid each_inbox() monopolizing the event loop when hundreds/thousands # of inboxes are in play. package PublicInbox::ConfigIter; diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm index 37cd6087cafb..ba6c74d0ea97 100644 --- a/lib/PublicInbox/DS.pm +++ b/lib/PublicInbox/DS.pm @@ -155,13 +155,6 @@ sub _InitPoller } } -=head2 C<< CLASS->EventLoop() >> - -Start processing IO events. In most daemon programs this never exits. See -C below for how to exit the loop. - -=cut - sub now () { clock_gettime(CLOCK_MONOTONIC) } sub next_tick () { @@ -277,26 +270,41 @@ sub PostEventLoop () { $PostLoopCallback ? $PostLoopCallback->(\%DescriptorMap) : 1; } -sub EventLoop { - $Epoll //= _InitPoller(); - local $in_loop = 1; - my @events; - do { - my $timeout = RunTimers(); - - # get up to 1000 events - epoll_wait($Epoll, 1000, $timeout, \@events); - for my $fd (@events) { - # it's possible epoll_wait returned many events, including some at the end - # that ones in the front triggered unregister-interest actions. if we - # can't find the %sock entry, it's because we're no longer interested - # in that event. - - # guard stack-not-refcounted w/ Carp + @DB::args - my $obj = $DescriptorMap{$fd}; - $obj->event_step; - } - } while (PostEventLoop()); +# Start processing IO events. In most daemon programs this never exits. See +# C for how to exit the loop. +sub event_loop (;$$) { + my ($sig, $oldset) = @_; + $Epoll //= _InitPoller(); + require PublicInbox::Sigfd if $sig; + my $sigfd = PublicInbox::Sigfd->new($sig, 1) if $sig; + local @SIG{keys %$sig} = values(%$sig) if $sig && !$sigfd; + local $SIG{PIPE} = 'IGNORE'; + if (!$sigfd && $sig) { + # wake up every second to accept signals if we don't + # have signalfd or IO::KQueue: + sig_setmask($oldset); + PublicInbox::DS->SetLoopTimeout(1000); + } + $_[0] = $sigfd = $sig = undef; # $_[0] == sig + local $in_loop = 1; + my @events; + do { + my $timeout = RunTimers(); + + # get up to 1000 events + epoll_wait($Epoll, 1000, $timeout, \@events); + for my $fd (@events) { + # it's possible epoll_wait returned many events, + # including some at the end that ones in the front + # triggered unregister-interest actions. if we can't + # find the %sock entry, it's because we're no longer + # interested in that event. + + # guard stack-not-refcounted w/ Carp + @DB::args + my $obj = $DescriptorMap{$fd}; + $obj->event_step; + } + } while (PostEventLoop()); } =head2 C<< CLASS->SetPostLoopCallback( CODEREF ) >> @@ -326,7 +334,7 @@ sub SetPostLoopCallback { =head2 C<< CLASS->new( $socket ) >> Create a new PublicInbox::DS subclass object for the given I which will -react to events on it during the C. +react to events on it during the C. This is normally (always?) called from your subclass via: diff --git a/lib/PublicInbox/DSKQXS.pm b/lib/PublicInbox/DSKQXS.pm index acc31d9baa22..eccfa56d72cb 100644 --- a/lib/PublicInbox/DSKQXS.pm +++ b/lib/PublicInbox/DSKQXS.pm @@ -18,7 +18,7 @@ use Symbol qw(gensym); use IO::KQueue; use Errno qw(EAGAIN); use PublicInbox::Syscall qw(EPOLLONESHOT EPOLLIN EPOLLOUT EPOLLET - EPOLL_CTL_ADD EPOLL_CTL_MOD EPOLL_CTL_DEL SFD_NONBLOCK); + EPOLL_CTL_ADD EPOLL_CTL_MOD EPOLL_CTL_DEL); our @EXPORT_OK = qw(epoll_ctl epoll_wait); sub EV_DISPATCH () { 0x0080 } @@ -48,16 +48,16 @@ sub new { # It's wasteful in that it uses another FD, but it simplifies # our epoll-oriented code. sub signalfd { - my ($class, $signo, $flags) = @_; + my ($class, $signo, $nonblock) = @_; my $sym = gensym; - tie *$sym, $class, $signo, $flags; # calls TIEHANDLE + tie *$sym, $class, $signo, $nonblock; # calls TIEHANDLE $sym } sub TIEHANDLE { # similar to signalfd() - my ($class, $signo, $flags) = @_; + my ($class, $signo, $nonblock) = @_; my $self = $class->new; - $self->{timeout} = ($flags & SFD_NONBLOCK) ? 0 : -1; + $self->{timeout} = $nonblock ? 0 : -1; my $kq = $self->{kq}; $kq->EV_SET($_, EVFILT_SIGNAL, EV_ADD) for @$signo; $self; diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm index 24dc7791b43d..5be474fa8754 100644 --- a/lib/PublicInbox/Daemon.pm +++ b/lib/PublicInbox/Daemon.pm @@ -15,7 +15,6 @@ use Socket qw(IPPROTO_TCP SOL_SOCKET); STDOUT->autoflush(1); STDERR->autoflush(1); use PublicInbox::DS qw(now); -use PublicInbox::Syscall qw(SFD_NONBLOCK); require PublicInbox::Listener; use PublicInbox::EOFpipe; use PublicInbox::Sigfd; @@ -513,7 +512,7 @@ EOF }, CHLD => \&reap_children, }; - my $sigfd = PublicInbox::Sigfd->new($sig, 0); + my $sigfd = PublicInbox::Sigfd->new($sig); local @SIG{keys %$sig} = values(%$sig) unless $sigfd; PublicInbox::DS::sig_setmask($oldset) if !$sigfd; while (1) { # main loop @@ -630,20 +629,11 @@ sub daemon_loop ($$$$) { # this calls epoll_create: PublicInbox::Listener->new($_, $tls_cb || $post_accept) } @listeners; - my $sigfd = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK); - local @SIG{keys %$sig} = values(%$sig) unless $sigfd; - if (!$sigfd) { - # wake up every second to accept signals if we don't - # have signalfd or IO::KQueue: - PublicInbox::DS::sig_setmask($oldset); - PublicInbox::DS->SetLoopTimeout(1000); - } - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop($sig, $oldset); } sub run ($$$;$) { my ($default, $refresh, $post_accept, $tlsd) = @_; - local $SIG{PIPE} = 'IGNORE'; daemon_prepare($default); my $af_default = $default =~ /:8080\z/ ? 'httpready' : undef; my $for_destroy = daemonize(); diff --git a/lib/PublicInbox/ExtMsg.pm b/lib/PublicInbox/ExtMsg.pm index c134de55d16c..72cae005da5a 100644 --- a/lib/PublicInbox/ExtMsg.pm +++ b/lib/PublicInbox/ExtMsg.pm @@ -150,7 +150,7 @@ sub ext_msg { }; } -# called via PublicInbox::DS->EventLoop +# called via PublicInbox::DS::event_loop sub event_step { my ($ctx, $sync) = @_; # can't find a partial match in current inbox, try the others: diff --git a/lib/PublicInbox/ExtSearchIdx.pm b/lib/PublicInbox/ExtSearchIdx.pm index 6b29789a2ed8..c34225b29d9a 100644 --- a/lib/PublicInbox/ExtSearchIdx.pm +++ b/lib/PublicInbox/ExtSearchIdx.pm @@ -1305,19 +1305,11 @@ sub eidx_watch { # public-inbox-extindex --watch main loop }; my $quit = PublicInbox::SearchIdx::quit_cb($sync); $sig->{QUIT} = $sig->{INT} = $sig->{TERM} = $quit; - my $sigfd = PublicInbox::Sigfd->new($sig, - $PublicInbox::Syscall::SFD_NONBLOCK); - @SIG{keys %$sig} = values(%$sig) if !$sigfd; local $self->{-watch_sync} = $sync; # for ->on_inbox_unlock - if (!$sigfd) { - # wake up every second to accept signals if we don't - # have signalfd or IO::KQueue: - PublicInbox::DS::sig_setmask($oldset); - PublicInbox::DS->SetLoopTimeout(1000); - } PublicInbox::DS->SetPostLoopCallback(sub { !$sync->{quit} }); $pr->("initial scan complete, entering event loop\n") if $pr; - PublicInbox::DS->EventLoop; # calls InboxIdle->event_step + # calls InboxIdle->event_step: + PublicInbox::DS::event_loop($sig, $oldset); done($self); } diff --git a/lib/PublicInbox/Gcf2Client.pm b/lib/PublicInbox/Gcf2Client.pm index 397774f90bf2..c5695db140cd 100644 --- a/lib/PublicInbox/Gcf2Client.pm +++ b/lib/PublicInbox/Gcf2Client.pm @@ -57,7 +57,7 @@ sub gcf2_async ($$$;$) { # ensure PublicInbox::Git::cat_async_step never calls cat_async_retry sub alternates_changed {} -# DS->EventLoop will call this +# DS::event_loop will call this sub event_step { my ($self) = @_; $self->flush_write; @@ -74,7 +74,7 @@ sub event_step { sub DESTROY { my ($self) = @_; - delete $self->{sock}; # if outside EventLoop + delete $self->{sock}; # if outside event_loop PublicInbox::Git::DESTROY($self); } diff --git a/lib/PublicInbox/IPC.pm b/lib/PublicInbox/IPC.pm index 205b5b92cf71..6c189b6410aa 100644 --- a/lib/PublicInbox/IPC.pm +++ b/lib/PublicInbox/IPC.pm @@ -251,7 +251,7 @@ sub wq_worker_loop ($$) { my $wqw = PublicInbox::WQWorker->new($self, $self->{-wq_s2}); PublicInbox::WQWorker->new($self, $bcast2) if $bcast2; PublicInbox::DS->SetPostLoopCallback(sub { $wqw->{sock} }); - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); PublicInbox::DS->Reset; } @@ -353,7 +353,6 @@ sub _wq_worker_start ($$$$) { delete @$self{qw(-wq_s1 -wq_ppid)}; $self->{-wq_worker_nr} = keys %{delete($self->{-wq_workers}) // {}}; - $SIG{$_} = 'IGNORE' for (qw(PIPE)); $SIG{$_} = 'DEFAULT' for (qw(TTOU TTIN TERM QUIT INT CHLD)); local $0 = $one ? $self->{-wq_ident} : "$self->{-wq_ident} $self->{-wq_worker_nr}"; diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm index df0bfab6dfb7..fd59235846ae 100644 --- a/lib/PublicInbox/LEI.pm +++ b/lib/PublicInbox/LEI.pm @@ -18,8 +18,7 @@ use POSIX qw(strftime); use IO::Handle (); use Fcntl qw(SEEK_SET); use PublicInbox::Config; -use PublicInbox::Syscall qw(SFD_NONBLOCK EPOLLIN EPOLLET); -use PublicInbox::Sigfd; +use PublicInbox::Syscall qw(EPOLLIN EPOLLET); use PublicInbox::DS qw(now dwaitpid); use PublicInbox::Spawn qw(spawn popen_rd); use PublicInbox::Lock; @@ -1291,23 +1290,11 @@ sub lazy_start { USR1 => \&noop, USR2 => \&noop, }; - my $sigfd = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK); - local @SIG{keys %$sig} = values(%$sig) unless $sigfd; - undef $sig; - local $SIG{PIPE} = 'IGNORE'; require PublicInbox::DirIdle; local $dir_idle = PublicInbox::DirIdle->new([$sock_dir], sub { # just rely on wakeup to hit PostLoopCallback set below dir_idle_handler($_[0]) if $_[0]->fullname ne $path; }, 1); - if ($sigfd) { - undef $sigfd; # unref, already in DS::DescriptorMap - } else { - # wake up every second to accept signals if we don't - # have signalfd or IO::KQueue: - PublicInbox::DS::sig_setmask($oldset); - PublicInbox::DS->SetLoopTimeout(1000); - } PublicInbox::DS->SetPostLoopCallback(sub { my ($dmap, undef) = @_; if (@st = defined($path) ? stat($path) : ()) { @@ -1344,7 +1331,7 @@ sub lazy_start { open STDERR, '>&STDIN' or die "redirect stderr failed: $!"; open STDOUT, '>&STDIN' or die "redirect stdout failed: $!"; # $daemon pipe to `lei' closed, main loop begins: - eval { PublicInbox::DS->EventLoop }; + eval { PublicInbox::DS::event_loop($sig, $oldset) }; warn "event loop error: $@\n" if $@; # exit() may trigger waitpid via various DESTROY, ensure interruptible PublicInbox::DS::sig_setmask($oldset); diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm index 7e50a59ae49e..b1285eda4a83 100644 --- a/lib/PublicInbox/Qspawn.pm +++ b/lib/PublicInbox/Qspawn.pm @@ -12,7 +12,7 @@ # operate in. This can be useful to ensure smaller inboxes can # be cloned while cloning of large inboxes is maxed out. # -# This does not depend on the PublicInbox::DS->EventLoop or any +# This does not depend on the PublicInbox::DS::event_loop or any # other external scheduling mechanism, you just need to call # start() and finish() appropriately. However, public-inbox-httpd # (which uses PublicInbox::DS) will be able to schedule this diff --git a/lib/PublicInbox/Sigfd.pm b/lib/PublicInbox/Sigfd.pm index d91ea0e7ac78..81e5a1b1dd88 100644 --- a/lib/PublicInbox/Sigfd.pm +++ b/lib/PublicInbox/Sigfd.pm @@ -6,13 +6,13 @@ package PublicInbox::Sigfd; use strict; use parent qw(PublicInbox::DS); -use PublicInbox::Syscall qw(signalfd EPOLLIN EPOLLET SFD_NONBLOCK); +use PublicInbox::Syscall qw(signalfd EPOLLIN EPOLLET); use POSIX (); # returns a coderef to unblock signals if neither signalfd or kqueue # are available. sub new { - my ($class, $sig, $flags) = @_; + my ($class, $sig, $nonblock) = @_; my %signo = map {; my $cb = $sig->{$_}; # SIGWINCH is 28 on FreeBSD, NetBSD, OpenBSD @@ -24,15 +24,15 @@ sub new { } keys %$sig; my $self = bless { sig => \%signo }, $class; my $io; - my $fd = signalfd(-1, [keys %signo], $flags); + my $fd = signalfd([keys %signo], $nonblock); if (defined $fd && $fd >= 0) { open($io, '+<&=', $fd) or die "open: $!"; } elsif (eval { require PublicInbox::DSKQXS }) { - $io = PublicInbox::DSKQXS->signalfd([keys %signo], $flags); + $io = PublicInbox::DSKQXS->signalfd([keys %signo], $nonblock); } else { return; # wake up every second to check for signals } - if ($flags & SFD_NONBLOCK) { # it can go into the event loop + if ($nonblock) { # it can go into the event loop $self->SUPER::new($io, EPOLLIN | EPOLLET); } else { # master main loop $self->{sock} = $io; diff --git a/lib/PublicInbox/Syscall.pm b/lib/PublicInbox/Syscall.pm index a8a6f42a2e2d..7ab4291119ea 100644 --- a/lib/PublicInbox/Syscall.pm +++ b/lib/PublicInbox/Syscall.pm @@ -22,7 +22,7 @@ our @EXPORT_OK = qw(epoll_ctl epoll_create epoll_wait EPOLLIN EPOLLOUT EPOLLET EPOLL_CTL_ADD EPOLL_CTL_DEL EPOLL_CTL_MOD EPOLLONESHOT EPOLLEXCLUSIVE - signalfd SFD_NONBLOCK); + signalfd); our %EXPORT_TAGS = (epoll => [qw(epoll_ctl epoll_create epoll_wait EPOLLIN EPOLLOUT EPOLL_CTL_ADD EPOLL_CTL_DEL EPOLL_CTL_MOD @@ -67,7 +67,6 @@ our ( ); my $SFD_CLOEXEC = 02000000; # Perl does not expose O_CLOEXEC -sub SFD_NONBLOCK () { O_NONBLOCK } our $no_deprecated = 0; if ($^O eq "linux") { @@ -266,14 +265,15 @@ sub epoll_wait_mod8 { } } -sub signalfd ($$$) { - my ($fd, $signos, $flags) = @_; +sub signalfd ($$) { + my ($signos, $nonblock) = @_; if ($SYS_signalfd4) { my $set = POSIX::SigSet->new(@$signos); - syscall($SYS_signalfd4, $fd, "$$set", + syscall($SYS_signalfd4, -1, "$$set", # $Config{sig_count} is NSIG, so this is NSIG/8: int($Config{sig_count}/8), - $flags|$SFD_CLOEXEC); + # SFD_NONBLOCK == O_NONBLOCK for every architecture + ($nonblock ? O_NONBLOCK : 0) |$SFD_CLOEXEC); } else { $! = ENOSYS; undef; diff --git a/lib/PublicInbox/Watch.pm b/lib/PublicInbox/Watch.pm index 0523ad03f871..c6bebce32edb 100644 --- a/lib/PublicInbox/Watch.pm +++ b/lib/PublicInbox/Watch.pm @@ -12,7 +12,6 @@ use PublicInbox::MdirReader; use PublicInbox::NetReader; use PublicInbox::Filter::Base qw(REJECT); use PublicInbox::Spamcheck; -use PublicInbox::Sigfd; use PublicInbox::DS qw(now add_timer); use PublicInbox::MID qw(mids); use PublicInbox::ContentHash qw(content_hash); @@ -570,7 +569,7 @@ sub watch { # main entry point } watch_fs_init($self) if $self->{mdre}; PublicInbox::DS->SetPostLoopCallback(sub { !$self->quit_done }); - PublicInbox::DS->EventLoop; # calls ->event_step + PublicInbox::DS::event_loop($sig, $oldset); # calls ->event_step _done_for_now($self); } diff --git a/script/public-inbox-watch b/script/public-inbox-watch index 86349d71d415..af02d8f358f7 100755 --- a/script/public-inbox-watch +++ b/script/public-inbox-watch @@ -13,8 +13,6 @@ use IO::Handle; # ->autoflush use PublicInbox::Watch; use PublicInbox::Config; use PublicInbox::DS; -use PublicInbox::Sigfd; -use PublicInbox::Syscall qw(SFD_NONBLOCK); my $do_scan = 1; GetOptions('scan!' => \$do_scan, # undocumented, testing only 'help|h' => \(my $show_help)) or do { print STDERR $help; exit 1 }; @@ -56,12 +54,5 @@ if ($watch) { # --no-scan is only intended for testing atm, undocumented. PublicInbox::DS::requeue($scan) if $do_scan; - - my $sigfd = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK); - local @SIG{keys %$sig} = values(%$sig) unless $sigfd; - if (!$sigfd) { - PublicInbox::DS::sig_setmask($oldset); - PublicInbox::DS->SetLoopTimeout(1000); - } $watch->watch($sig, $oldset) while ($watch); } diff --git a/t/dir_idle.t b/t/dir_idle.t index 0bb3b7585328..8e7f3b70eec4 100644 --- a/t/dir_idle.t +++ b/t/dir_idle.t @@ -15,7 +15,7 @@ my $end = 3 + now; PublicInbox::DS->SetPostLoopCallback(sub { scalar(@x) == 0 && now < $end }); tick(0.011); rmdir("$tmpdir/a/b") or xbail "rmdir $!"; -PublicInbox::DS->EventLoop; +PublicInbox::DS::event_loop(); is(scalar(@x), 1, 'got an event') and is($x[0]->[0]->fullname, "$tmpdir/a/b", 'got expected fullname') and ok($x[0]->[0]->IN_DELETE, 'IN_DELETE set'); @@ -24,7 +24,7 @@ tick(0.011); rmdir("$tmpdir/a") or xbail "rmdir $!"; @x = (); $end = 3 + now; -PublicInbox::DS->EventLoop; +PublicInbox::DS::event_loop(); is(scalar(@x), 1, 'got an event') and is($x[0]->[0]->fullname, "$tmpdir/a", 'got expected fullname') and ok($x[0]->[0]->IN_DELETE_SELF, 'IN_DELETE_SELF set'); @@ -33,7 +33,7 @@ tick(0.011); rename("$tmpdir/c", "$tmpdir/j") or xbail "rmdir $!"; @x = (); $end = 3 + now; -PublicInbox::DS->EventLoop; +PublicInbox::DS::event_loop(); is(scalar(@x), 1, 'got an event') and is($x[0]->[0]->fullname, "$tmpdir/c", 'got expected fullname') and ok($x[0]->[0]->IN_DELETE_SELF || $x[0]->[0]->IN_MOVE_SELF, diff --git a/t/ds-leak.t b/t/ds-leak.t index 4c211639ed16..4e8d76cdf2ea 100644 --- a/t/ds-leak.t +++ b/t/ds-leak.t @@ -19,7 +19,7 @@ if ('close-on-exec for epoll and kqueue') { pipe($r, $w) or die "pipe: $!"; PublicInbox::DS::add_timer(0, sub { $pid = spawn([qw(sleep 10)]) }); - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); ok($pid, 'subprocess spawned'); # wait for execve, we need to ensure lsof sees sleep(1) @@ -56,7 +56,7 @@ SKIP: { for my $i (0..$n) { PublicInbox::DS->SetLoopTimeout(0); PublicInbox::DS->SetPostLoopCallback($cb); - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); PublicInbox::DS->Reset; } ok(1, "Reset works and doesn't hit RLIMIT_NOFILE ($n)"); diff --git a/t/imapd.t b/t/imapd.t index bd8ad7e5162d..80757a9d4071 100644 --- a/t/imapd.t +++ b/t/imapd.t @@ -466,7 +466,7 @@ SKIP: { my $w = start_script(['-watch'], undef, { 2 => $err_wr }); diag 'waiting for initial fetch...'; - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); diag 'inbox unlocked on initial fetch, waiting for IDLE'; tick until (grep(/I: \S+ idling/, <$err>)); @@ -477,7 +477,7 @@ SKIP: { diag "mda error \$?=$?"; diag 'waiting for IMAP IDLE wakeup'; PublicInbox::DS->SetPostLoopCallback(undef); - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); diag 'inbox unlocked on IDLE wakeup'; # try again with polling @@ -494,7 +494,7 @@ SKIP: { diag 'waiting for PollInterval wakeup'; PublicInbox::DS->SetPostLoopCallback(undef); - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); diag 'inbox unlocked (poll)'; $w->kill; $w->join; diff --git a/t/nntpd.t b/t/nntpd.t index 3c171a3b88b9..cf1c44f80b23 100644 --- a/t/nntpd.t +++ b/t/nntpd.t @@ -439,7 +439,7 @@ sub test_watch { my $w = start_script(['-watch'], undef, { 2 => $err_wr }); diag 'waiting for initial fetch...'; - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); diag 'inbox unlocked on initial fetch'; $w->kill; $w->join; diff --git a/t/sigfd.t b/t/sigfd.t index a1ab222c0c4d..a68b12a65f01 100644 --- a/t/sigfd.t +++ b/t/sigfd.t @@ -4,7 +4,6 @@ use Test::More; use IO::Handle; use POSIX qw(:signal_h); use Errno qw(ENOSYS); -use PublicInbox::Syscall qw(SFD_NONBLOCK); require_ok 'PublicInbox::Sigfd'; use PublicInbox::DS; @@ -40,18 +39,18 @@ SKIP: { } $sigfd = undef; - my $nbsig = PublicInbox::Sigfd->new($sig, SFD_NONBLOCK); + my $nbsig = PublicInbox::Sigfd->new($sig, 1); ok($nbsig, 'Sigfd->new SFD_NONBLOCK works'); is($nbsig->wait_once, undef, 'nonblocking ->wait_once'); ok($! == Errno::EAGAIN, 'got EAGAIN'); kill('HUP', $$) or die "kill $!"; PublicInbox::DS->SetPostLoopCallback(sub {}); # loop once - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); is($hit->{HUP}->{sigfd}, 2, 'HUP sigfd fired in event loop') or diag explain($hit); # sometimes fails on FreeBSD 11.x kill('TERM', $$) or die "kill $!"; kill('HUP', $$) or die "kill $!"; - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); PublicInbox::DS->Reset; is($hit->{TERM}->{sigfd}, 1, 'TERM sigfd fired in event loop'); is($hit->{HUP}->{sigfd}, 3, 'HUP sigfd fired in event loop'); diff --git a/t/watch_maildir.t b/t/watch_maildir.t index e74b512f2192..6399fb7cc15f 100644 --- a/t/watch_maildir.t +++ b/t/watch_maildir.t @@ -199,7 +199,7 @@ More majordomo info at http://vger.kernel.org/majordomo-info.html\n); $em->commit; # wake -watch up diag 'waiting for -watch to import new message'; - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); $wm->kill; $wm->join; $ii->close; diff --git a/xt/mem-imapd-tls.t b/xt/mem-imapd-tls.t index bd75ef452984..8992a6fc0d8d 100644 --- a/xt/mem-imapd-tls.t +++ b/xt/mem-imapd-tls.t @@ -95,7 +95,7 @@ foreach my $n (1..$nfd) { # one step through the event loop # do a little work as we connect: - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); # try not to overflow the listen() backlog: if (!($n % 128) && $DONE != $n) { @@ -104,7 +104,7 @@ foreach my $n (1..$nfd) { PublicInbox::DS->SetPostLoopCallback(sub { $DONE != $n }); # clear the backlog: - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); # resume looping PublicInbox::DS->SetLoopTimeout(0); @@ -117,7 +117,7 @@ diag "done?: @".time." $DONE/$nfd"; if ($DONE != $nfd) { PublicInbox::DS->SetLoopTimeout(-1); PublicInbox::DS->SetPostLoopCallback(sub { $DONE != $nfd }); - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); } is($nfd, $DONE, "$nfd/$DONE done"); if ($^O eq 'linux' && open(my $f, '<', "/proc/$pid/status")) { diff --git a/xt/net_writer-imap.t b/xt/net_writer-imap.t index 41438cf79b15..cb2ea61ff8e3 100644 --- a/xt/net_writer-imap.t +++ b/xt/net_writer-imap.t @@ -228,7 +228,7 @@ EOM $pub_cfg->each_inbox(sub { $_[0]->subscribe_unlock('ident', $obj) }); my $w = start_script(['-watch'], undef, { 2 => $err_wr }); diag 'waiting for initial fetch...'; - PublicInbox::DS->EventLoop; + PublicInbox::DS::event_loop(); my $ibx = $pub_cfg->lookup_name('wtest'); my $mm = $ibx->mm; ok(defined($mm->num_for('Seen@test.example.com')),