builder.py: use os.exec() instead of subprocess.call().

This avoids a second fork altogether, which apparently doesn't matter all
that much (5.3s -> 5.15s).  However, simply not importing the subprocess
module reduces us further to 4.6s.

And 'ps axf' now looks prettier because we have fewer stupid intermediate
processes.
This commit is contained in:
Avery Pennarun 2010-11-22 00:12:56 -08:00
commit 8d0eba9c44

View file

@ -1,4 +1,4 @@
import sys, os, subprocess, random
import sys, os, random
import vars, jwack, state
from helpers import log, log_, debug2, err, unlink
@ -27,16 +27,6 @@ def _find_do_file(t):
return None,None,None
def _preexec(t):
td = os.environ.get('REDO_PWD', '')
dn = os.path.dirname(t)
os.environ['REDO_PWD'] = os.path.join(td, dn)
os.environ['REDO_TARGET'] = os.path.basename(t)
os.environ['REDO_DEPTH'] = vars.DEPTH + ' '
if dn:
os.chdir(dn)
def _nice(t):
return os.path.normpath(os.path.join(vars.PWD, t))
@ -88,11 +78,17 @@ class BuildJob:
jwack.start_job(t, self._do_subproc, self._after)
def _do_subproc(self):
t = self.t
argv = self.argv
f = self.f
return subprocess.call(argv, preexec_fn=lambda: _preexec(t),
stdout=f.fileno())
td = os.environ.get('REDO_PWD', '')
dn = os.path.dirname(self.t)
os.environ['REDO_PWD'] = os.path.join(td, dn)
os.environ['REDO_TARGET'] = os.path.basename(self.t)
os.environ['REDO_DEPTH'] = vars.DEPTH + ' '
if dn:
os.chdir(dn)
os.dup2(self.f.fileno(), 1)
os.close(self.f.fileno())
os.execvp(self.argv[0], self.argv)
# returns only if there's an exception
def _after(self, t, rv):
f = self.f