about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-01-10 12:15:14 +0000
committerEric Wong <e@80x24.org>2021-01-12 03:51:42 +0000
commita1e00c6bca403ffea74a5e169fa0d2f715c69051 (patch)
tree23e66c568af96285289eba80301a9f6f50763271
parent4e54b398ad511e5177ae2cc2243eba9408f840a8 (diff)
downloadpublic-inbox-a1e00c6bca403ffea74a5e169fa0d2f715c69051.tar.gz
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.
-rw-r--r--lib/PublicInbox/IPC.pm9
1 files 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);
 }