mirror of
https://github.com/mpv-player/mpv
synced 2025-03-30 15:29:56 +00:00
This code runs posix_spawnp() within a fork() in some cases, in order to "disown" processes which are meant as being started detached. But posix_spawnp() is not marked as async-signal-safe, so what we do is not allowed. It could for example cause deadlocks, depending on implementation and luck at runtime. Turns out posix_spawnp() is useless crap. Replace it with "classic" fork() to ensure correctness. We could probably use another mechanism to start a process "disowned" than doing a double-fork(). The only problem with "disowning" a process is calling setsid() (which posix_spawnp() didn't support, but maybe will in newer revisions), and removing as as parent from the child process (the double-fork() will make PID 1 the parent). But there is no good way to either remove us as parent, or to "reap" the PID in a way that is safe and less of a mess than the current code. This is because POSIX/UNIX is a miserable heap of shit. (Less shit than "alternatives" like win32, no doubt.) Because POSIX/UNIX is a miserable heap of shit, execvp() is also not specified as async-signal-safe. It's funny how you can run a full fledged HTTP server in an async-signal-safe context, but not start a shitty damn process. Unix is really, really, really extremely bad at this process management stuff. So we reimplement execvp() in an async-signal-safe way. The new code assumes that CLOEXEC is a thing. Since POSIX/UNIX is such a heap of shit, O_CLOEXEC and FD_CLOEXEC were (probably) added at different times, but both must be present. io.h defines them to 0 if they don't exist, and in this case the code will error out at runtime. Surely we could do without CLOEXEC via fallback, but I'll do that only if at least 1 bug is reported wrt. this issue. The idea how to report exec() failure or success is from musl. The way as_execvpe() is also inspired by musl (for example, the list of error codes that should make it fail is the same as in musl's code). |
||
---|---|---|
.. | ||
android | ||
macos | ||
win32 | ||
atomic.h | ||
compiler.h | ||
endian.h | ||
getpid.h | ||
glob-win.c | ||
io.c | ||
io.h | ||
macOS_swift_bridge.h | ||
macosx_application_objc.h | ||
macosx_application.h | ||
macosx_application.m | ||
macosx_compat.h | ||
macosx_events_objc.h | ||
macosx_events.h | ||
macosx_events.m | ||
macosx_menubar_objc.h | ||
macosx_menubar.h | ||
macosx_menubar.m | ||
macosx_touchbar.h | ||
macosx_touchbar.m | ||
macosx_versions.h | ||
main-fn-cocoa.c | ||
main-fn-unix.c | ||
main-fn-win.c | ||
main-fn.h | ||
mpv.exe.manifest | ||
mpv.rc | ||
path-macosx.m | ||
path-unix.c | ||
path-uwp.c | ||
path-win.c | ||
path.h | ||
polldev.c | ||
polldev.h | ||
posix-spawn.h | ||
semaphore_osx.c | ||
semaphore.h | ||
strnlen.h | ||
subprocess-dummy.c | ||
subprocess-posix.c | ||
subprocess-win.c | ||
subprocess.c | ||
subprocess.h | ||
terminal-dummy.c | ||
terminal-unix.c | ||
terminal-win.c | ||
terminal.h | ||
threads.c | ||
threads.h | ||
timer-darwin.c | ||
timer-linux.c | ||
timer-win2.c | ||
timer.c | ||
timer.h | ||
w32_keyboard.c | ||
w32_keyboard.h | ||
win32-console-wrapper.c | ||
windows_utils.c | ||
windows_utils.h |