From d59a9cb667f106b29363795539b55116077bcd80 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 31 Dec 2020 13:51:49 +0000 Subject: use PublicInbox::DS for dwaitpid This simplifies our code and provides a more consistent API for error handling. PublicInbox::DS can be loaded nowadays on all *BSDs and Linux distros easily without extra packages to install. The downside is possibly increased startup time, but it's probably not as a big problem with lei being a daemon (and -mda possibly following suite). --- lib/PublicInbox/Gcf2Client.pm | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) (limited to 'lib/PublicInbox/Gcf2Client.pm') diff --git a/lib/PublicInbox/Gcf2Client.pm b/lib/PublicInbox/Gcf2Client.pm index 4bda5520..10820852 100644 --- a/lib/PublicInbox/Gcf2Client.pm +++ b/lib/PublicInbox/Gcf2Client.pm @@ -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 -- cgit v1.2.3-24-ge0c7