about summary refs log tree commit homepage
path: root/lib/PublicInbox/GitAsyncCat.pm
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-07-06 06:11:02 +0000
committerEric Wong <e@yhbt.net>2020-07-06 20:01:15 +0000
commit2c6e8b10e3f9f3b047009126426ce634c8f29a23 (patch)
tree81d81d92320de52fbe432e719622d2fc26789819 /lib/PublicInbox/GitAsyncCat.pm
parent89ac7eca5e1d17d7dc949b2fd0a59a5e83abf90f (diff)
downloadpublic-inbox-2c6e8b10e3f9f3b047009126426ce634c8f29a23.tar.gz
git_async_cat: unref pipes on EOF from git->cleanup
We avoided a managed circular reference in 10ee3548084c125f
but introduced a pipe FD leak, instead.  So handle the EOF
we get when the "git cat-file --batch" process exits and
closes its stdout FD.

v2: remove ->close entirely.  PublicInbox::Git->cleanup
handles all cleanup.  This prevents us from inadvertantly
deleting the {async_cat} field associated with a different
pipe than the one GAC is monitoring.

Fixes: 10ee3548084c125f ("git_async_cat: remove circular reference")
Diffstat (limited to 'lib/PublicInbox/GitAsyncCat.pm')
-rw-r--r--lib/PublicInbox/GitAsyncCat.pm11
1 files changed, 2 insertions, 9 deletions
diff --git a/lib/PublicInbox/GitAsyncCat.pm b/lib/PublicInbox/GitAsyncCat.pm
index 0b777204..e618d366 100644
--- a/lib/PublicInbox/GitAsyncCat.pm
+++ b/lib/PublicInbox/GitAsyncCat.pm
@@ -24,7 +24,8 @@ sub _add {
 
 sub event_step {
         my ($self) = @_;
-        my $git = $self->{git} or return; # ->close-ed
+        my $git = $self->{git};
+        return $self->close if ($git->{in} // 0) != ($self->{sock} // 1);
         my $inflight = $git->{inflight};
         if ($inflight && @$inflight) {
                 $git->cat_async_step($inflight);
@@ -32,14 +33,6 @@ sub event_step {
         }
 }
 
-sub close {
-        my ($self) = @_;
-        if (my $git = delete $self->{git}) {
-                delete $git->{async_cat};
-        }
-        $self->SUPER::close; # PublicInbox::DS::close
-}
-
 sub git_async_cat ($$$$) {
         my ($git, $oid, $cb, $arg) = @_;
         $git->cat_async($oid, $cb, $arg);