* [PATCH] qspawn: psgi_qx: delay callback until waitpid returns
@ 2019-10-31 5:36 Eric Wong
0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2019-10-31 5:36 UTC (permalink / raw)
To: meta
We need to detect "git apply" failures reliably when patches
fail. This is necessary for solving for blob 81c1164ae5 in
https://public-inbox.org/git/ when at least two messages can
solve for it (and one of them fails):
1. https://public-inbox.org/git/b9fb52b8-8168-6bf0-9a72-1e6c44a281a5@oracle.com/
2. https://public-inbox.org/git/56664222-6c29-09dc-ef78-7b380b113c4a@oracle.com/
---
lib/PublicInbox/Qspawn.pm | 30 ++++++++++++++++++------------
1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm
index cb3dc51..651fa39 100644
--- a/lib/PublicInbox/Qspawn.pm
+++ b/lib/PublicInbox/Qspawn.pm
@@ -106,17 +106,22 @@ sub waitpid_err ($$) {
}
}
- return unless $err;
- $self->{err} = $err;
- if ($env && !$env->{'qspawn.quiet'}) {
- log_err($env, join(' ', @{$self->{args}}) . ": $err");
+ if ($err) {
+ $self->{err} = $err;
+ if ($env && !$env->{'qspawn.quiet'}) {
+ log_err($env, join(' ', @{$self->{args}}) . ": $err");
+ }
+ }
+ if (my $fin_cb = delete $self->{fin_cb}) {
+ eval { $fin_cb->() }
}
}
-sub do_waitpid ($;$) {
- my ($self, $env) = @_;
+sub do_waitpid ($;$$) {
+ my ($self, $env, $fin_cb) = @_;
my $pid = $self->{pid};
$self->{env} = $env;
+ $self->{fin_cb} = $fin_cb;
# PublicInbox::DS may not be loaded
eval { PublicInbox::DS::dwaitpid($pid, \&waitpid_err, $self) };
# done if we're running in PublicInbox::DS::EventLoop
@@ -127,10 +132,12 @@ sub do_waitpid ($;$) {
}
}
-sub finish ($;$) {
- my ($self, $env) = @_;
+sub finish ($;$$) {
+ my ($self, $env, $fin_cb) = @_;
if (delete $self->{rpipe}) {
- do_waitpid($self, $env);
+ do_waitpid($self, $env, $fin_cb);
+ } elsif ($fin_cb) {
+ eval { $fin_cb->() };
}
}
@@ -154,9 +161,8 @@ sub psgi_qx {
my $end = sub {
my $err = $_[0]; # $!
log_err($env, "psgi_qx: $err") if defined($err);
- finish($self, $env);
- eval { $qx_cb->(\$scalar) };
- $qx = $scalar = undef;
+ finish($self, $env, sub { $qx_cb->(\$scalar) });
+ $qx = undef;
};
my $rpipe; # comes from popen_rd
my $async = $env->{'pi-httpd.async'};
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2019-10-31 5:36 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-10-31 5:36 [PATCH] qspawn: psgi_qx: delay callback until waitpid returns Eric Wong
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).