From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-4.0 required=3.0 tests=ALL_TRUSTED,BAYES_00 shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 734DE1F4B9 for ; Wed, 25 Dec 2019 07:51:05 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Subject: [PATCH 04/30] qspawn: disambiguate command vs PSGI env Date: Wed, 25 Dec 2019 07:50:38 +0000 Message-Id: <20191225075104.22184-5-e@80x24.org> In-Reply-To: <20191225075104.22184-1-e@80x24.org> References: <20191225075104.22184-1-e@80x24.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Make things easier-to-follow and paves the way for future work to reduce dependencies on anonymous subs capturing local variables. --- lib/PublicInbox/Qspawn.pm | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm index 22603ca7..ba980e73 100644 --- a/lib/PublicInbox/Qspawn.pm +++ b/lib/PublicInbox/Qspawn.pm @@ -36,17 +36,17 @@ my $def_limiter; # declares a command to spawn (but does not spawn it). # $cmd is the command to spawn -# $env is the environ for the child process +# $cmd_env is the environ for the child process (not PSGI env) # $opt can include redirects and perhaps other process spawning options sub new ($$$;) { - my ($class, $cmd, $env, $opt) = @_; - bless { args => [ $cmd, $env, $opt ] }, $class; + my ($class, $cmd, $cmd_env, $opt) = @_; + bless { args => [ $cmd, $cmd_env, $opt ] }, $class; } sub _do_spawn { my ($self, $start_cb, $limiter) = @_; my $err; - my ($cmd, $env, $opts) = @{$self->{args}}; + my ($cmd, $cmd_env, $opts) = @{$self->{args}}; my %opts = %{$opts || {}}; $self->{limiter} = $limiter; foreach my $k (PublicInbox::Spawn::RLIMITS()) { @@ -55,7 +55,7 @@ sub _do_spawn { } } - ($self->{rpipe}, $self->{pid}) = popen_rd($cmd, $env, \%opts); + ($self->{rpipe}, $self->{pid}) = popen_rd($cmd, $cmd_env, \%opts); # drop any IO handles opt was holding open via $opt->{hold} # No need to hold onto the descriptor once the child process has it. @@ -94,7 +94,7 @@ sub waitpid_err ($$) { $err = "W: waitpid($xpid, 0) => $pid: $!"; } # else should not be called with pid == 0 - my $env = delete $self->{env}; + my $env = delete $self->{psgi_env}; # done, spawn whatever's in the queue my $limiter = $self->{limiter}; @@ -118,9 +118,8 @@ sub waitpid_err ($$) { } sub do_waitpid ($;$$) { - my ($self, $env, $fin_cb) = @_; + my ($self, $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) }; @@ -132,10 +131,10 @@ sub do_waitpid ($;$$) { } } -sub finish ($;$$) { - my ($self, $env, $fin_cb) = @_; +sub finish ($;$) { + my ($self, $fin_cb) = @_; if (delete $self->{rpipe}) { - do_waitpid($self, $env, $fin_cb); + do_waitpid($self, $fin_cb); } elsif ($fin_cb) { eval { $fin_cb->() }; } @@ -156,12 +155,13 @@ sub start { # and safe to slurp. sub psgi_qx { my ($self, $env, $limiter, $qx_cb, $cb_arg) = @_; + $self->{psgi_env} = $env; my $scalar = ''; open(my $qx, '+>', \$scalar) or die; # PerlIO::scalar my $end = sub { my $err = $_[0]; # $! log_err($env, "psgi_qx: $err") if defined($err); - finish($self, $env, sub { $qx_cb->(\$scalar, $cb_arg) }); + finish($self, sub { $qx_cb->(\$scalar, $cb_arg) }); $qx = undef; }; my $rpipe; # comes from popen_rd @@ -230,11 +230,12 @@ sub filter_fh ($$) { # immediately (or streamed via ->getline (pull-based)). sub psgi_return { my ($self, $env, $limiter, $parse_hdr) = @_; + $self->{psgi_env} = $env; my ($fh, $rpipe); my $end = sub { my $err = $_[0]; # $! log_err($env, "psgi_return: $err") if defined($err); - finish($self, $env); + finish($self); $fh->close if $fh; # async-only };