about summary refs log tree commit homepage
path: root/lib/PublicInbox/Git.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-12-25 07:50:35 +0000
committerEric Wong <e@80x24.org>2019-12-26 10:48:19 +0000
commit5c94a55c24a17c8250cf80d78246851c0a7c4087 (patch)
tree394f9939a451083fda347430c151bef9695f697c /lib/PublicInbox/Git.pm
parent3647997eaf49410bbf3e33bfb3874c611ab0c38b (diff)
downloadpublic-inbox-5c94a55c24a17c8250cf80d78246851c0a7c4087.tar.gz
This allows callers to avoid allocating several KB for for every
call to ->async_cat.
Diffstat (limited to 'lib/PublicInbox/Git.pm')
-rw-r--r--lib/PublicInbox/Git.pm14
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index 90595840..af3a5712 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -148,16 +148,18 @@ sub read_cat_in_full ($$$) {
 
 sub _cat_async_step ($$$) {
         my ($self, $inflight, $in) = @_;
-        my $cb = shift @$inflight or die 'BUG: inflight empty';
+        my $pair = shift @$inflight or die 'BUG: inflight empty';
+        my ($cb, $arg) = @$pair;
         local $/ = "\n";
         my $head = $in->getline;
-        return eval { $cb->(undef) } if $head =~ / missing$/;
+        $head =~ / missing$/ and return
+                eval { $cb->(undef, undef, undef, undef, $arg) };
 
         $head =~ /^([0-9a-f]{40}) (\S+) ([0-9]+)$/ or
                 fail($self, "Unexpected result from async git cat-file: $head");
         my ($oid_hex, $type, $size) = ($1, $2, $3 + 0);
         my $bref = read_cat_in_full($self, $in, $size);
-        eval { $cb->($bref, $oid_hex, $type, $size) };
+        eval { $cb->($bref, $oid_hex, $type, $size, $arg) };
 }
 
 sub cat_async_wait ($) {
@@ -319,15 +321,15 @@ sub cat_async_begin {
         $self->{inflight} = [];
 }
 
-sub cat_async ($$$) {
-        my ($self, $oid, $cb) = @_;
+sub cat_async ($$$;$) {
+        my ($self, $oid, $cb, $arg) = @_;
         my $inflight = $self->{inflight} or die 'BUG: not in async';
         if (scalar(@$inflight) >= MAX_INFLIGHT) {
                 _cat_async_step($self, $inflight, $self->{in});
         }
 
         $self->{out}->print($oid, "\n") or fail($self, "write error: $!");
-        push @$inflight, $cb;
+        push(@$inflight, [ $cb, $arg ]);
 }
 
 sub commit_title ($$) {