]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Gcf2Client.pm
use PublicInbox::DS for dwaitpid
[public-inbox.git] / lib / PublicInbox / Gcf2Client.pm
index 4bda5520edcc94816099d93a605bf909b3d2982b..10820852b21d02761a49048b1dc31e8bc9f597cd 100644 (file)
@@ -9,6 +9,7 @@ use PublicInbox::Git;
 use PublicInbox::Spawn qw(popen_rd);
 use IO::Handle ();
 use PublicInbox::Syscall qw(EPOLLONESHOT);
+use PublicInbox::DS qw(dwaitpid);
 # fields:
 #      async_cat => GitAsyncCat ref (read-only pipe)
 #      sock => writable pipe to Gcf2::loop
@@ -65,18 +66,11 @@ no warnings 'once';
 
 sub DESTROY {
        my ($self) = @_;
-       my $pid = delete $self->{pid};
        delete $self->{in};
-       return unless $pid;
-       eval {
-               PublicInbox::DS::dwaitpid($pid, undef, undef);
-               $self->close; # we're still in the event loop
-       };
-       if ($@) { # wait synchronously if not in event loop
-               my $sock = delete $self->{sock};
-               close $sock if $sock;
-               waitpid($pid, 0);
-       }
+       # 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;
 }
 
 # used by GitAsyncCat