]> Sergey Matveev's repositories - public-inbox.git/commitdiff
qspawn: psgi_return_start: hoist out from psgi_return
authorEric Wong <e@80x24.org>
Wed, 25 Dec 2019 07:50:44 +0000 (07:50 +0000)
committerEric Wong <e@80x24.org>
Thu, 26 Dec 2019 10:48:19 +0000 (10:48 +0000)
Instead of just passing the rpipe to the start_cb, pass the
entire qspawn ref to start_cb.  Update existing callers to
avoid circular refs.

lib/PublicInbox/Qspawn.pm
t/qspawn.t

index 0967bcfad35c05af1ff95ca3bfce1902e1d7e600..33e20147bbb9bad6acc18c621bc42a0e91c69d54 100644 (file)
@@ -66,7 +66,7 @@ sub _do_spawn {
        } else {
                $self->{err} = $!;
        }
-       $start_cb->($self->{rpipe});
+       $start_cb->($self);
 }
 
 sub child_err ($) {
@@ -140,7 +140,7 @@ sub finish ($) {
        }
 }
 
-sub start {
+sub start ($$$) {
        my ($self, $limiter, $start_cb) = @_;
        if ($limiter->{running} < $limiter->{max}) {
                _do_spawn($self, $start_cb, $limiter);
@@ -275,6 +275,17 @@ sub psgi_return_init_cb {
        $wcb = undef;
 }
 
+sub psgi_return_start { # may run later, much later...
+       my ($self) = @_;
+       if (my $async = $self->{psgi_env}->{'pi-httpd.async'}) {
+               # PublicInbox::HTTPD::Async->new(rpipe, $cb, $cb_arg, $end_obj)
+               $self->{async} = $async->($self->{rpipe},
+                                       \&psgi_return_init_cb, $self, $self);
+       } else { # generic PSGI
+               psgi_return_init_cb($self) while $self->{parse_hdr};
+       }
+}
+
 # Used for streaming the stdout of one process as a PSGI response.
 #
 # $env is the PSGI env.
@@ -303,30 +314,20 @@ sub psgi_return {
        $self->{hdr_buf} = \(my $hdr_buf = '');
        $self->{parse_hdr} = $parse_hdr;
        $limiter ||= $def_limiter ||= PublicInbox::Qspawn::Limiter->new(32);
-       my $start_cb = sub { # may run later, much later...
-               if (my $async = $env->{'pi-httpd.async'}) {
-                       # PublicInbox::HTTPD::Async->new(rpipe, $cb, $cb_arg,
-                       #                                $end_obj)
-                       $self->{async} = $async->($self->{rpipe},
-                                               \&psgi_return_init_cb, $self,
-                                               $self);
-               } else { # generic PSGI
-                       psgi_return_init_cb($self) while $self->{parse_hdr};
-               }
-       };
 
        # the caller already captured the PSGI write callback from
        # the PSGI server, so we can call ->start, here:
-       return $self->start($limiter, $start_cb) if $env->{'qspawn.wcb'};
+       $env->{'qspawn.wcb'} and
+               return start($self, $limiter, \&psgi_return_start);
 
        # the caller will return this sub to the PSGI server, so
-       # it can set the response callback (that is, for PublicInbox::HTTP,
-       # the chunked_wcb or identity_wcb callback), but other HTTP servers
-       # are supported:
+       # it can set the response callback (that is, for
+       # PublicInbox::HTTP, the chunked_wcb or identity_wcb callback),
+       # but other HTTP servers are supported:
        sub {
-               $self->{psgi_env}->{'qspawn.wcb'} = $_[0];
-               $self->start($limiter, $start_cb);
-       };
+               $env->{'qspawn.wcb'} = $_[0];
+               start($self, $limiter, \&psgi_return_start);
+       }
 }
 
 package PublicInbox::Qspawn::Limiter;
index fc288a2de0bc32ce6be585b4b2dcb23b288001df..8bc88e0e0469f439c78cb31482955ee64ace56b1 100644 (file)
@@ -23,9 +23,9 @@ my $limiter = PublicInbox::Qspawn::Limiter->new(1);
        my $x = PublicInbox::Qspawn->new([qw(true)]);
        my $run = 0;
        $x->start($limiter, sub {
-               my ($rpipe) = @_;
-               is(0, sysread($rpipe, my $buf, 1), 'read zero bytes');
-               ok(!finish_err($x), 'no error on finish');
+               my ($self) = @_;
+               is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes');
+               ok(!finish_err($self), 'no error on finish');
                $run = 1;
        });
        is($run, 1, 'callback ran alright');
@@ -35,9 +35,10 @@ my $limiter = PublicInbox::Qspawn::Limiter->new(1);
        my $x = PublicInbox::Qspawn->new([qw(false)]);
        my $run = 0;
        $x->start($limiter, sub {
-               my ($rpipe) = @_;
-               is(0, sysread($rpipe, my $buf, 1), 'read zero bytes from false');
-               ok(finish_err($x), 'error on finish');
+               my ($self) = @_;
+               is(0, sysread($self->{rpipe}, my $buf, 1),
+                               'read zero bytes from false');
+               ok(finish_err($self), 'error on finish');
                $run = 1;
        });
        is($run, 1, 'callback ran alright');
@@ -47,16 +48,16 @@ foreach my $cmd ([qw(sleep 1)], [qw(sh -c), 'sleep 1; false']) {
        my $s = PublicInbox::Qspawn->new($cmd);
        my @run;
        $s->start($limiter, sub {
-               my ($rpipe) = @_;
+               my ($self) = @_;
                push @run, 'sleep';
-               is(0, sysread($rpipe, my $buf, 1), 'read zero bytes');
+               is(0, sysread($self->{rpipe}, my $buf, 1), 'read zero bytes');
        });
        my $n = 0;
        my @t = map {
                my $i = $n++;
                my $x = PublicInbox::Qspawn->new([qw(true)]);
                $x->start($limiter, sub {
-                       my ($rpipe) = @_;
+                       my ($self) = @_;
                        push @run, $i;
                });
                [$x, $i]