summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
authorJP Camara <jp@jpcamara.com>2023-12-06 20:01:14 -0500
committerKoichi Sasada <ko1@atdot.net>2023-12-20 16:23:38 +0900
commit8782e02138e6fe18b6c0dcc29bb877d6cdae57e5 (patch)
treeb77e899dc4cd1ac14c496bc0fdcf034261451667 /process.c
parent7ef90b3978dad057ad6360a94d2d64e8ca5e9c38 (diff)
KQueue support for M:N threads
* Allows macOS users to use M:N threads (and technically FreeBSD, though it has not been verified on FreeBSD) * Include sys/event.h header check for macros, and include sys/event.h when present * Rename epoll_fd to more generic kq_fd (Kernel event Queue) for use by both epoll and kqueue * MAP_STACK is not available on macOS so conditionall apply it to mmap flags * Set fd to close on exec * Log debug messages specific to kqueue and epoll on creation * close_invalidate raises an error for the kqueue fd on child process fork. It's unclear rn if that's a bug, or if it's kqueue specific behavior Use kq with rb_thread_wait_for_single_fd * Only platforms with `USE_POLL` (linux) had changes applied to take advantage of kernel event queues. It needed to be applied to the `select` so that kqueue could be properly applied * Clean up kqueue specific code and make sure only flags that were actually set are removed (or an error is raised) * Also handle kevent specific errnos, since most don't apply from epoll to kqueue * Use the more platform standard close-on-exec approach of `fcntl` and `FD_CLOEXEC`. The io-event gem uses `ioctl`, but fcntl seems to be the recommended choice. It is also what Go, Bun, and Libuv use * We're making changes in this file anyways - may as well fix a couple spelling mistakes while here Make sure FD_CLOEXEC carries over in dup * Otherwise the kqueue descriptor should have FD_CLOEXEC, but doesn't and fails in assert_close_on_exec
Diffstat (limited to 'process.c')
-rw-r--r--process.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/process.c b/process.c
index 395c69e08f..3b254ddecb 100644
--- a/process.c
+++ b/process.c
@@ -3354,6 +3354,13 @@ run_exec_dup2(VALUE ary, VALUE tmpbuf, struct rb_execarg *sargp, char *errmsg, s
ERRMSG("dup");
goto fail;
}
+ // without this, kqueue timer_th.event_fd fails with a reserved FD did not have close-on-exec
+ // in #assert_close_on_exec because the FD_CLOEXEC is not dup'd by default
+ if (fd_get_cloexec(pairs[i].oldfd, errmsg, errmsg_buflen)) {
+ if (fd_set_cloexec(extra_fd, errmsg, errmsg_buflen)) {
+ goto fail;
+ }
+ }
rb_update_max_fd(extra_fd);
}
else {