bgamari · GitHub

@bgamari changed the title Refactoring of POSIX process logic WIP: Refactoring of POSIX process logic

Jun 28, 2021

snoyberg

Previously this was a separate argument despite the fact that we already
pass a flags argument.
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

@bgamari

@bgamari bgamari changed the title WIP: Refactoring of POSIX process logic efactoring of POSIX process logic

Jul 12, 2021

@bgamari bgamari changed the title efactoring of POSIX process logic Refactoring of POSIX process logic

Jul 12, 2021

@snoyberg

snoyberg added a commit that referenced this pull request

Jul 13, 2021

Closed

Merged

Closed

Closed

Read the original on github.com ↗