if ($ret == $pid) {
if ($cb) {
eval { $cb->($arg, $pid) };
- warn "E: dwaitpid($pid) !in_loop: $@" if $@;
+ carp "E: dwaitpid($pid) !in_loop: $@" if $@;
}
} else {
- warn "waitpid($pid, 0) = $ret, \$!=$!, \$?=$?";
+ carp "waitpid($pid, 0) = $ret, \$!=$!, \$?=$?";
}
}
}
# 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__;
$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);
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
}
my ($in_r, $p) = popen_rd(\@cmd, undef, $redir);
$self->{$pid} = $p;
+ $self->{"$pid.owner"} = $$;
$out_w->autoflush(1);
if ($^O eq 'linux') { # 1031: F_SETPIPE_SZ
fcntl($out_w, 1031, 4096);
# GitAsyncCat::event_step may delete {pid}
my $p = delete $self->{$pid} or return;
- dwaitpid $p;
+ dwaitpid($p) if $$ == $self->{"$pid.owner"};
}
sub cat_async_abort ($) {