You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is a complete rewrite `posix/runProcess.c`. There are a few goals
of this rewrite:
* fix a long-standing and serious bug in the `execvpe` fallback path, which
uses non-reentrant functions after `fork`ing. This is of course undefined
behavior and has been causing failures under Darwin's Rosetta binary
translation engine (see GHC #19994).
* eliminate code duplication in the `fork/exec` implementation.
* introduce support for `posix_spawn`, allowing us to unload a significant
amount of complexity in some cases. This is particularly desireable as the
cost of `fork` has increased considerably in some cases on recent Darwin
releases (namely when `MAP_JIT` mappings are used; see [1])
While `posix_spawn` is often a win, there are unfortunately several cases where
it cannot be used:
* `posix_spawn_file_actions_addchdir_np` is broken on Darwin
* `POSIX_SPAWN_SETSID` is only supported on mac 10.15 and later, but doesn't
return a proper error code when not supported
* the originally-specified semantics of `posix_spawn_file_actions_adddup2` are
unsafe and have been amended (see [3]) but not all implementations have
caught up (musl has [4], glibc did later [5], Darwin seemingly hasn't) there appears
to be no support at all for setuid and setgid
* `spawn` is significantly slower than fork on some Darwin releases (see [6])
To address this we first try using `posix_spawn`, falling back on `fork/exec`
if we encounter a case which the former cannot handle.
[1]: libuv/libuv#3064
[2]: https://www.austingroupbugs.net/view.php?id=411
[3]: rust-lang/rust#80537
[4]: https://git.musl-libc.org/cgit/musl/commit/?id=6fc6ca1a323bc0b6b9e9cdc8fa72221ae18fe206
[5]: https://sourceware.org/bugzilla/show_bug.cgi?id=23640
[6]: https://discuss.python.org/t/multiprocessing-spawn-default-on-macos-since-python-3-8-is-slower-than-fork-method/5910/4
0 commit comments