Skip to content
  • JP Camara's avatar
    8782e021
    KQueue support for M:N threads · 8782e021
    JP Camara authored
    * 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
    8782e021
    KQueue support for M:N threads
    JP Camara authored
    * 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
Loading