From d3824dae47984bd97bb28345d532ac5f021631fd Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Fri, 7 Jun 2024 07:50:50 +0000 Subject: [PATCH] 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 --- js/src/tests/lib/tasks_unix.py | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/js/src/tests/lib/tasks_unix.py b/js/src/tests/lib/tasks_unix.py index 36761f30f5a7..204f7025a257 100644 --- a/js/src/tests/lib/tasks_unix.py +++ b/js/src/tests/lib/tasks_unix.py @@ -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):