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,AWL,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 C90FE1FFA5 for ; Sun, 10 Jan 2021 12:15:20 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 17/22] ipc: drop unused fields, default sighandlers for wq Date: Sun, 10 Jan 2021 12:15:14 +0000 Message-Id: <20210110121519.17044-18-e@80x24.org> In-Reply-To: <20210110121519.17044-1-e@80x24.org> References: <20210110121519.17044-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Relying on signal handlers to kill a particular worker was a laggy/racy idea and I gave up on the idea of targetting workers explicitly and instead chose to make wq_worker_decr stop the next idle worker ->wq_exit. We will however attempt to support sending signals to a process group. --- lib/PublicInbox/IPC.pm | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/PublicInbox/IPC.pm b/lib/PublicInbox/IPC.pm index e6a1082c..4db4b8ea 100644 --- a/lib/PublicInbox/IPC.pm +++ b/lib/PublicInbox/IPC.pm @@ -261,7 +261,7 @@ sub wq_worker_loop ($) { die(bless(\"$_[0]", __PACKAGE__.'::PIPE')) if $sub; }; my $rcv = $self->{-wq_recv_cmd} // $recv_cmd; - until ($self->{-wq_quit}) { + while (1) { my (@fds) = $rcv->($s2, $buf, $len) or return; # EOF my $i = 0; my @m = @{$self->{wq_open_modes} // [qw( +<&= >&= >&= )]}; @@ -305,10 +305,9 @@ sub _wq_worker_start ($$) { if ($pid == 0) { eval { PublicInbox::DS->Reset }; close(delete $self->{-wq_s1}); - delete $self->{qw(-wq_workers -wq_quit -wq_ppid)}; - my $quit = sub { $self->{-wq_quit} = 1 }; - $SIG{$_} = $quit for (qw(TERM INT QUIT)); + delete $self->{qw(-wq_workers -wq_ppid)}; $SIG{$_} = 'IGNORE' for (qw(TTOU TTIN)); + $SIG{$_} = 'DEFAULT' for (qw(TERM QUIT INT)); local $0 = $self->{-wq_ident}; PublicInbox::DS::sig_setmask($oldset); my $on_destroy = $self->ipc_atfork_child; @@ -360,7 +359,6 @@ sub wq_worker_decr { # SIGTTOU handler, kills first idle worker return unless wq_workers($self); my $s2 = $self->{-wq_s2} // die 'BUG: no wq_s2'; $self->wq_do('wq_exit', [ $s2, $s2, $s2 ]); - $self->{-wq_exit_pending}++; # caller must call wq_worker_decr_wait in main loop } @@ -374,7 +372,6 @@ sub wq_worker_decr_wait { recv($s1, my $pid, 64, 0) // croak "recv: $!"; my $workers = $self->{-wq_workers} // croak 'BUG: no wq_workers'; delete $workers->{$pid} // croak "BUG: PID:$pid invalid"; - $self->{-wq_exit_pending}--; dwaitpid($pid, \&ipc_worker_reap, $self); }