X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FQspawn.pm;h=5e4fd5cb8541a2a8202d188ae1fd73c88fe64188;hb=HEAD;hp=78afe718d26dd21ce0d49ec60d86679d92a5f146;hpb=6bb2079cf610585176d23344047a048f4f8bf3dc;p=public-inbox.git diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm index 78afe718..5e4fd5cb 100644 --- a/lib/PublicInbox/Qspawn.pm +++ b/lib/PublicInbox/Qspawn.pm @@ -28,7 +28,6 @@ package PublicInbox::Qspawn; use v5.12; use PublicInbox::Spawn qw(popen_rd); use PublicInbox::GzipFilter; -use PublicInbox::DS qw(awaitpid); use Scalar::Util qw(blessed); # n.b.: we get EAGAIN with public-inbox-httpd, and EINTR on other PSGI servers @@ -57,7 +56,8 @@ sub _do_spawn { $o{$k} = $rlimit; } } - $self->{cmd} = $o{quiet} ? undef : $cmd; + $self->{cmd} = $cmd; + $self->{-quiet} = 1 if $o{quiet}; $o{cb_arg} = [ \&waitpid_err, $self ]; eval { # popen_rd may die on EMFILE, ENFILE @@ -85,7 +85,7 @@ sub finalize ($) { if (my $dst = $self->{qsp_err}) { $$dst .= $$dst ? " $err" : "; $err"; } - warn "@{$self->{cmd}}: $err" if $self->{cmd}; + warn "@{$self->{cmd}}: $err\n" if !$self->{-quiet}; } my ($env, $qx_cb, $qx_arg, $qx_buf) = @@ -141,20 +141,20 @@ sub start ($$$) { sub psgi_qx_init_cb { # this may be PublicInbox::HTTPD::Async {cb} my ($self) = @_; - my $async = delete $self->{async}; # PublicInbox::HTTPD::Async my ($r, $buf); - my $qx_fh = $self->{qx_fh}; reread: $r = sysread($self->{rpipe}, $buf, 65536); - if ($async) { - $async->async_pass($self->{psgi_env}->{'psgix.io'}, - $qx_fh, \$buf); - } elsif (defined $r) { - $r ? (print $qx_fh $buf) : event_step($self, undef); - } else { + if (!defined($r)) { return if $! == EAGAIN; # try again when notified goto reread if $! == EINTR; event_step($self, $!); + } elsif (my $as = delete $self->{async}) { # PublicInbox::HTTPD::Async + $as->async_pass($self->{psgi_env}->{'psgix.io'}, + $self->{qx_fh}, \$buf); + } elsif ($r) { # generic PSGI: + print { $self->{qx_fh} } $buf; + } else { # EOF + event_step($self, undef); } } @@ -216,9 +216,8 @@ sub rd_hdr ($) { warn "parse_hdr: $@"; $ret = [ 500, [], [ "Internal error\n" ] ]; } elsif (!defined($ret) && !$r) { - my $cmd = $self->{cmd} // [ '(?)' ]; warn <{psgi_env}->{REQUEST_URI}) +EOF parsing headers from @{$self->{cmd}} ($self->{psgi_env}->{REQUEST_URI}) EOM $ret = [ 500, [], [ "Internal error\n" ] ]; }