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-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00, URIBL_BLOCKED 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 ABE761FB05 for ; Mon, 31 Aug 2020 04:41:42 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 11/11] replace ParentPipe with EOFpipe Date: Mon, 31 Aug 2020 04:41:40 +0000 Message-Id: <20200831044140.17027-12-e@80x24.org> In-Reply-To: <20200831044140.17027-1-e@80x24.org> References: <20200831044140.17027-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: ParentPipe was a subset of EOFpipe, except EOFpipe correctly accounts for theoretical(*) spurious wakeups on the pipe. (*) AFAIK, spurious wakeups are/were more likely on TCP sockets due to checksum failures, something that's not a problem on local pipes. We're also not sharing pipes like we do with listen sockets on accept(2), so there's no chance of another process grabbing bytes (unless we have bugs in our code). --- MANIFEST | 1 - lib/PublicInbox/Daemon.pm | 6 ++---- lib/PublicInbox/ParentPipe.pm | 23 ----------------------- 3 files changed, 2 insertions(+), 28 deletions(-) delete mode 100644 lib/PublicInbox/ParentPipe.pm diff --git a/MANIFEST b/MANIFEST index 0b3835d8..b65e96b0 100644 --- a/MANIFEST +++ b/MANIFEST @@ -169,7 +169,6 @@ lib/PublicInbox/NNTPdeflate.pm lib/PublicInbox/NewsWWW.pm lib/PublicInbox/Over.pm lib/PublicInbox/OverIdx.pm -lib/PublicInbox/ParentPipe.pm lib/PublicInbox/ProcessPipe.pm lib/PublicInbox/Qspawn.pm lib/PublicInbox/Reply.pm diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm index 45475183..000ba169 100644 --- a/lib/PublicInbox/Daemon.pm +++ b/lib/PublicInbox/Daemon.pm @@ -17,7 +17,7 @@ STDERR->autoflush(1); use PublicInbox::DS qw(now); use PublicInbox::Syscall qw($SFD_NONBLOCK); require PublicInbox::Listener; -require PublicInbox::ParentPipe; +use PublicInbox::EOFpipe; use PublicInbox::Sigfd; my @CMD; my ($set_user, $oldset); @@ -468,8 +468,6 @@ sub master_quit ($) { sub master_loop { pipe(my ($p0, $p1)) or die "failed to create parent-pipe: $!"; - # 1031: F_SETPIPE_SZ, 4096: page size - fcntl($p1, 1031, 4096) if $^O eq 'linux'; my $set_workers = $worker_processes; reopen_logs(); my $ignore_winch; @@ -603,7 +601,7 @@ sub daemon_loop ($$$$) { if ($worker_processes > 0) { $refresh->(); # preload by default my $fh = master_loop(); # returns if in child process - PublicInbox::ParentPipe->new($fh, \&worker_quit); + PublicInbox::EOFpipe->new($fh, \&worker_quit, undef); } else { reopen_logs(); $set_user->() if $set_user; diff --git a/lib/PublicInbox/ParentPipe.pm b/lib/PublicInbox/ParentPipe.pm deleted file mode 100644 index 538b5632..00000000 --- a/lib/PublicInbox/ParentPipe.pm +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2016-2020 all contributors -# License: AGPL-3.0+ - -# only for PublicInbox::Daemon, allows worker processes to be -# notified if the master process dies. -package PublicInbox::ParentPipe; -use strict; -use parent qw(PublicInbox::DS); -use PublicInbox::Syscall qw(EPOLLIN EPOLLONESHOT); - -sub new ($$$) { - my ($class, $pipe, $worker_quit) = @_; - my $self = bless { cb => $worker_quit }, $class; - $self->SUPER::new($pipe, EPOLLIN|EPOLLONESHOT); -} - -# master process died, time to call worker_quit ourselves -sub event_step { - $_[0]->close; # PublicInbox::DS::close - $_[0]->{cb}->(); -} - -1;