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:
parent
dcc2edba0c
commit
8d0eba9c44
1 changed files with 12 additions and 16 deletions
28
builder.py
28
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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue