Bug 1900847 - Use posix_spawnp instead of fork/execvp for JS shell tests. r=mgaudet

`fork` can be slow, especially for jstests. This reduces our jstests time from
~140 seconds to ~100 seconds on my machine.

`os.posix_spawnp` is available since Python 3.8 and conveniently that's also the
minimum Python version we currently require.

Differential Revision: https://phabricator.services.mozilla.com/D212777
This commit is contained in:
Jan de Mooij 2024-06-07 07:50:50 +00:00
parent 8d1c9d2b83
commit d3824dae47

View file

@ -35,26 +35,24 @@ def spawn_test(test, prefix, tempdir, passthrough, run_skipped, show_cmd):
if show_cmd:
print(escape_cmdline(cmd))
if not passthrough:
(rout, wout) = os.pipe()
(rerr, werr) = os.pipe()
if passthrough:
os.execvp(cmd[0], cmd)
return
rv = os.fork()
(rout, wout) = os.pipe()
(rerr, werr) = os.pipe()
# Parent.
if rv:
os.close(wout)
os.close(werr)
return Task(test, prefix, tempdir, rv, rout, rerr)
file_actions = [
(os.POSIX_SPAWN_CLOSE, rout),
(os.POSIX_SPAWN_CLOSE, rerr),
(os.POSIX_SPAWN_DUP2, wout, 1),
(os.POSIX_SPAWN_DUP2, werr, 2),
]
pid = os.posix_spawnp(cmd[0], cmd, os.environ, file_actions=file_actions)
# Child.
os.close(rout)
os.close(rerr)
os.dup2(wout, 1)
os.dup2(werr, 2)
os.execvp(cmd[0], cmd)
os.close(wout)
os.close(werr)
return Task(test, prefix, tempdir, pid, rout, rerr)
def get_max_wait(tasks, timeout):