]> Sergey Matveev's repositories - public-inbox.git/commitdiff
gcf2client: reap process on DESTROY
authorEric Wong <e@80x24.org>
Thu, 31 Dec 2020 13:51:45 +0000 (13:51 +0000)
committerEric Wong <e@80x24.org>
Fri, 1 Jan 2021 05:00:39 +0000 (05:00 +0000)
We don't want to leave Xapcmd waitpid(-1, ...) call to hit it.

lib/PublicInbox/Gcf2Client.pm

index ab486de5895ad9e5190d3438b7adb029414dfa90..4bda5520edcc94816099d93a605bf909b3d2982b 100644 (file)
@@ -12,8 +12,8 @@ use PublicInbox::Syscall qw(EPOLLONESHOT);
 # fields:
 #      async_cat => GitAsyncCat ref (read-only pipe)
 #      sock => writable pipe to Gcf2::loop
-
-
+#      in => pipe we read from
+#      pid => PID of Gcf2::loop process
 sub new  {
        my ($rdr) = @_;
        my $self = bless {}, __PACKAGE__;
@@ -63,6 +63,22 @@ sub event_step {
 
 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);
+       }
+}
+
 # used by GitAsyncCat
 *cat_async_step = \&PublicInbox::Git::cat_async_step;