diff options
author | Eric Wong <e@80x24.org> | 2020-12-31 13:51:52 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2021-01-01 05:00:40 +0000 |
commit | fd71b2ab7a8d18c657ec27e15702ab3057419f02 (patch) | |
tree | 1964362f796d83b317d0ce3c3eea9cc6fe7b8363 /lib/PublicInbox/Gcf2Client.pm | |
parent | c3bdb8f03474d35ec8904f1758c4302159adfa57 (diff) | |
download | public-inbox-fd71b2ab7a8d18c657ec27e15702ab3057419f02.tar.gz |
Objects with DESTROY callbacks get propagated to children, so we must be careful to not invoke waitpid from children on their sibling processes. Only parents (and their parents...) can reap child processes.
Diffstat (limited to 'lib/PublicInbox/Gcf2Client.pm')
-rw-r--r-- | lib/PublicInbox/Gcf2Client.pm | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/PublicInbox/Gcf2Client.pm b/lib/PublicInbox/Gcf2Client.pm index 10820852..54957cf3 100644 --- a/lib/PublicInbox/Gcf2Client.pm +++ b/lib/PublicInbox/Gcf2Client.pm @@ -15,6 +15,7 @@ use PublicInbox::DS qw(dwaitpid); # sock => writable pipe to Gcf2::loop # in => pipe we read from # pid => PID of Gcf2::loop process +# owner_pid => process which spawned {pid} sub new { my ($rdr) = @_; my $self = bless {}, __PACKAGE__; @@ -25,6 +26,7 @@ sub new { $rdr //= {}; $rdr->{0} = $out_r; my $cmd = [$^X, qw[-MPublicInbox::Gcf2 -e PublicInbox::Gcf2::loop()]]; + $self->{owner_pid} = $$; @$self{qw(in pid)} = popen_rd($cmd, $env, $rdr); fcntl($out_w, 1031, 4096) if $^O eq 'linux'; # 1031: F_SETPIPE_SZ $out_w->autoflush(1); @@ -69,8 +71,10 @@ sub DESTROY { delete $self->{in}; # GitAsyncCat::event_step may reap us with WNOHANG, too my $pid = delete $self->{pid} or return; - PublicInbox::DS->in_loop ? $self->close : delete($self->{sock}); - dwaitpid $pid; + if ($$ == $self->{owner_pid}) { + PublicInbox::DS->in_loop ? $self->close : delete($self->{sock}); + dwaitpid $pid; + } } # used by GitAsyncCat |