about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-01-01 19:13:44 -1400
committerEric Wong <e@80x24.org>2021-01-02 22:38:54 +0000
commit22e51bd9da476fa9f4d72d4ec25ed0ec4a1f636f (patch)
tree388ba0e9042bbe6ca4ad4ac35b479dd72ab66313
parent5f6739428f936c520188e6050f62cdd45f453fb3 (diff)
downloadpublic-inbox-22e51bd9da476fa9f4d72d4ec25ed0ec4a1f636f.tar.gz
ProcessPipe has a built-in mechanism to prevent siblings from
reaping children.
-rw-r--r--lib/PublicInbox/Qspawn.pm15
1 files changed, 6 insertions, 9 deletions
diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm
index 68b71112..7e50a59a 100644
--- a/lib/PublicInbox/Qspawn.pm
+++ b/lib/PublicInbox/Qspawn.pm
@@ -28,7 +28,6 @@ package PublicInbox::Qspawn;
 use strict;
 use PublicInbox::Spawn qw(popen_rd);
 use PublicInbox::GzipFilter;
-use PublicInbox::DS qw(dwaitpid); # doesn't need event loop
 
 # n.b.: we get EAGAIN with public-inbox-httpd, and EINTR on other PSGI servers
 use Errno qw(EAGAIN EINTR);
@@ -58,9 +57,9 @@ sub _do_spawn {
         $self->{cmd} = $o{quiet} ? undef : $cmd;
         eval {
                 # popen_rd may die on EMFILE, ENFILE
-                ($self->{rpipe}, $self->{pid}) = popen_rd($cmd, $cmd_env, \%o);
+                $self->{rpipe} = popen_rd($cmd, $cmd_env, \%o);
 
-                die "E: $!" unless defined($self->{pid});
+                die "E: $!" unless defined($self->{rpipe});
 
                 $limiter->{running}++;
                 $start_cb->($self); # EPOLL_CTL_ADD may ENOSPC/ENOMEM
@@ -117,16 +116,14 @@ sub finalize ($$) {
         }
 }
 
-# callback for dwaitpid
+# callback for dwaitpid or ProcessPipe
 sub waitpid_err { finalize($_[0], child_err($?)) }
 
 sub finish ($;$) {
         my ($self, $err) = @_;
-        if (delete $self->{rpipe}) {
-                dwaitpid $self->{pid}, \&waitpid_err, $self;
-        } else {
-                finalize($self, $err);
-        }
+        my $tied_pp = delete($self->{rpipe}) or return finalize($self, $err);
+        my PublicInbox::ProcessPipe $pp = tied *$tied_pp;
+        @$pp{qw(cb arg)} = (\&waitpid_err, $self); # for ->DESTROY
 }
 
 sub start ($$$) {