From 8d0eba9c442c976f15fcae66c370c17067ebf02d Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Mon, 22 Nov 2010 00:12:56 -0800 Subject: [PATCH] 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. --- builder.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/builder.py b/builder.py index bfc174f..e3e66b0 100644 --- a/builder.py +++ b/builder.py @@ -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