socketry / io-event

MIT License
66 stars 15 forks source link

NetBSD/OpenBSD compatibility for KQueue selector, some FreeBSD fixes #72

Closed Math2 closed 1 year ago

Math2 commented 1 year ago

NetBSD/OpenBSD do not support EVFILT_USER. Use self-pipe trick already implemented for EPoll.

Fix two tests on NetBSD. One failed because NetBSD does not have bidirectional pipes (and did not return the expected errno). The other seems related to SIGCHLD timing.

Fix #process_wait failing erratically on BSDs. kevent() can return an EVFILT_PROC/NOTE_EXIT event before the process is ready to be picked up by a WNOHANG wait.

Types of Changes

Contribution

Notes

This is on top of the "main" branch, but it works well on top of "fix-file-descriptor-race" too.

There's a REALLY annoying issue with kevent() waiting on processes that are terminating but not "fully" terminated apparently. And the fix I found isn't pretty (but it works). I think it would be cleaner if ruby did a wait without WNOHANG later on for processes that we know are terminating. But that would be a lot more changes (right now WNOHANG is what makes it choose to not call back into the scheduler...).