diff options
author | Eric Wong <e@80x24.org> | 2016-06-21 02:39:27 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2016-06-21 02:40:44 +0000 |
commit | b04e5cf1bc8969cca74ef764f2de960b1ea821a4 (patch) | |
tree | 2be20349c2691c020e1e5e901081b87d38383823 /lib/PublicInbox/Spawn.pm | |
parent | a07ac38854c1308c4b58e13253527ec3b5e7e1f9 (diff) | |
download | public-inbox-b04e5cf1bc8969cca74ef764f2de960b1ea821a4.tar.gz |
fork failures are unfortunately common when Xapian has gigabytes and gigabytes mmapped.
Diffstat (limited to 'lib/PublicInbox/Spawn.pm')
-rw-r--r-- | lib/PublicInbox/Spawn.pm | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/lib/PublicInbox/Spawn.pm b/lib/PublicInbox/Spawn.pm index 83730302..41b08a33 100644 --- a/lib/PublicInbox/Spawn.pm +++ b/lib/PublicInbox/Spawn.pm @@ -84,7 +84,7 @@ int public_inbox_fork_exec(int in, int out, int err, char **argv, **envp; I32 max; sigset_t set, old; - int ret; + int ret, errnum; argv = AV_ALLOCA(cmd, max); av2c_copy(argv, cmd, max); @@ -112,8 +112,10 @@ int public_inbox_fork_exec(int in, int out, int err, execve(filename, argv, envp); xerr("execve failed"); } + errnum = errno; ret = sigprocmask(SIG_SETMASK, &old, NULL); assert(ret == 0 && "BUG calling sigprocmask to restore"); + errno = errnum; return (int)pid; } @@ -180,7 +182,8 @@ sub spawn ($;$$) { my $in = $opts->{0} || 0; my $out = $opts->{1} || 1; my $err = $opts->{2} || 2; - public_inbox_fork_exec($in, $out, $err, $f, $cmd, \@env); + my $pid = public_inbox_fork_exec($in, $out, $err, $f, $cmd, \@env); + $pid < 0 ? undef : $pid; } sub popen_rd { @@ -191,6 +194,7 @@ sub popen_rd { IO::Handle::blocking($r, $blocking) if defined $blocking; $opts->{1} = fileno($w); my $pid = spawn($cmd, $env, $opts); + return unless defined $pid; return ($r, $pid) if wantarray; my $ret = gensym; tie *$ret, 'PublicInbox::ProcessPipe', $pid, $r; |