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
|
import vars, jwack, state
|
||||||
from helpers import log, log_, debug2, err, unlink
|
from helpers import log, log_, debug2, err, unlink
|
||||||
|
|
||||||
|
|
@ -27,16 +27,6 @@ def _find_do_file(t):
|
||||||
return None,None,None
|
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):
|
def _nice(t):
|
||||||
return os.path.normpath(os.path.join(vars.PWD, 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)
|
jwack.start_job(t, self._do_subproc, self._after)
|
||||||
|
|
||||||
def _do_subproc(self):
|
def _do_subproc(self):
|
||||||
t = self.t
|
td = os.environ.get('REDO_PWD', '')
|
||||||
argv = self.argv
|
dn = os.path.dirname(self.t)
|
||||||
f = self.f
|
os.environ['REDO_PWD'] = os.path.join(td, dn)
|
||||||
return subprocess.call(argv, preexec_fn=lambda: _preexec(t),
|
os.environ['REDO_TARGET'] = os.path.basename(self.t)
|
||||||
stdout=f.fileno())
|
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):
|
def _after(self, t, rv):
|
||||||
f = self.f
|
f = self.f
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue