diff options
author | Eric Wong <e@80x24.org> | 2021-01-01 19:13:44 -1400 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-01-02 22:38:54 +0000 |
commit | 22e51bd9da476fa9f4d72d4ec25ed0ec4a1f636f (patch) | |
tree | 388ba0e9042bbe6ca4ad4ac35b479dd72ab66313 | |
parent | 5f6739428f936c520188e6050f62cdd45f453fb3 (diff) | |
download | public-inbox-22e51bd9da476fa9f4d72d4ec25ed0ec4a1f636f.tar.gz |
ProcessPipe has a built-in mechanism to prevent siblings from reaping children.
-rw-r--r-- | lib/PublicInbox/Qspawn.pm | 15 |
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 ($$$) { |