Naming $start_cb consistently helps avoid confusing new readers,
and some comments will help with understanding flow
$env{PATH_TRANSLATED} = "$git->{git_dir}/$path";
my $rdr = input_prepare($env) or return r(500);
my $qsp = PublicInbox::Qspawn->new([qw(git http-backend)], \%env, $rdr);
$env{PATH_TRANSLATED} = "$git->{git_dir}/$path";
my $rdr = input_prepare($env) or return r(500);
my $qsp = PublicInbox::Qspawn->new([qw(git http-backend)], \%env, $rdr);
- $qsp->psgi_return($env, $limiter, sub {
+ $qsp->psgi_return($env, $limiter, sub { # parse_hdr
my ($r, $bref) = @_;
my $res = parse_cgi_headers($r, $bref) or return; # incomplete
$res->[0] == 403 ? serve_dumb($env, $git, $path) : $res;
my ($r, $bref) = @_;
my $res = parse_cgi_headers($r, $bref) or return; # incomplete
$res->[0] == 403 ? serve_dumb($env, $git, $path) : $res;
- my ($self, $cb, $limiter) = @_;
+ my ($self, $start_cb, $limiter) = @_;
my $err;
my ($cmd, $env, $opts) = @{$self->{args}};
my %opts = %{$opts || {}};
my $err;
my ($cmd, $env, $opts) = @{$self->{args}};
my %opts = %{$opts || {}};
} else {
$self->{err} = $!;
}
} else {
$self->{err} = $!;
}
+ $start_cb->($self->{rpipe});
- my ($self, $limiter, $cb) = @_;
+ my ($self, $limiter, $start_cb) = @_;
if ($limiter->{running} < $limiter->{max}) {
if ($limiter->{running} < $limiter->{max}) {
- _do_spawn($self, $cb, $limiter);
+ _do_spawn($self, $start_cb, $limiter);
- push @{$limiter->{run_queue}}, [ $self, $cb ];
+ push @{$limiter->{run_queue}}, [ $self, $start_cb ];
}
};
$limiter ||= $def_limiter ||= PublicInbox::Qspawn::Limiter->new(32);
}
};
$limiter ||= $def_limiter ||= PublicInbox::Qspawn::Limiter->new(32);
- $self->start($limiter, sub { # may run later, much later...
+ $self->start($limiter, sub { # start_cb, may run later, much later...
($rpipe) = @_; # popen_rd result
if ($async) {
# PublicInbox::HTTPD::Async->new($rpipe, $cb, $end)
$async = $async->($rpipe, $cb, $end);
($rpipe) = @_; # popen_rd result
if ($async) {
# PublicInbox::HTTPD::Async->new($rpipe, $cb, $end)
$async = $async->($rpipe, $cb, $end);
+ # $cb will call ->async_pass or ->close
} else { # generic PSGI
$cb->() while $qx;
}
} else { # generic PSGI
$cb->() while $qx;
}
- my $wcb = delete $env->{'qspawn.wcb'};
+ my $wcb = delete $env->{'qspawn.wcb'}; # or PSGI server supplies it
my $async = $env->{'pi-httpd.async'};
my $cb = sub {
my $async = $env->{'pi-httpd.async'};
my $cb = sub {
if ($async) {
# PublicInbox::HTTPD::Async->new($rpipe, $cb, $end)
$async = $async->($rpipe, $cb, $end);
if ($async) {
# PublicInbox::HTTPD::Async->new($rpipe, $cb, $end)
$async = $async->($rpipe, $cb, $end);
+ # $cb will call ->async_pass or ->close
} else { # generic PSGI
$cb->() while $rd_hdr;
}
} else { # generic PSGI
$cb->() while $rd_hdr;
}