about summary refs log tree commit
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-09-15 02:25:34 +0000
committerEric Wong <e@80x24.org>2019-09-15 06:27:12 +0000
commit68b8b7924cfc445e8fcd8cc58d6628d8f377ac53 (patch)
treeabfe751037a662c9139fe3bef57412c200852fc0
parent87189dac4ad8af93ffba00af47d12ad42fb6971e (diff)
downloadpublic-inbox-68b8b7924cfc445e8fcd8cc58d6628d8f377ac53.tar.gz
We don't need to hold onto the subprocess environ and
redirects/options for popen_rd after spawning the child process.

I do not expect this to fix problem of leaking unlinked regular
file descriptors (which I still can't reproduce), and it
definitely does not fix the problem of leaking pipe descriptors
(which I also can't reproduce).

This will save an FD sooner on non-public-inbox-httpd servers
which give a non-FD $env->{'psgi.input'}, however

Regardless, it's good to free up memory resources in our own
process ASAP we're done using them.
-rw-r--r--lib/PublicInbox/Qspawn.pm7
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/PublicInbox/Qspawn.pm b/lib/PublicInbox/Qspawn.pm
index 4b9bca5a..54976b00 100644
--- a/lib/PublicInbox/Qspawn.pm
+++ b/lib/PublicInbox/Qspawn.pm
@@ -56,6 +56,11 @@ sub _do_spawn {
         }
 
         ($self->{rpipe}, $self->{pid}) = popen_rd($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.
+        $self->{args} = $cmd; # keep this around for logging
+
         if (defined $self->{pid}) {
                 $limiter->{running}++;
         } else {
@@ -104,7 +109,7 @@ sub waitpid_err ($$) {
         $self->{err} = $err;
         my $env = $self->{env} or return;
         if (!$env->{'qspawn.quiet'}) {
-                log_err($env, join(' ', @{$self->{args}->[0]}) . ": $err");
+                log_err($env, join(' ', @{$self->{args}}) . ": $err");
         }
 }