From 6dcf401843cc57efeb4adbef4849a7373e08e44f Mon Sep 17 00:00:00 2001 From: barracuda156 Date: Mon, 31 Jul 2023 05:34:02 +0800 Subject: [PATCH] Support EV_TRIGGER fallback; disable KJ_USE_KQUEUE on old macOS Fixes: https://github.com/capnproto/capnproto/issues/1735 --- c++/src/kj/async-unix.c++ | 4 ++++ c++/src/kj/async-unix.h | 10 ++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git c++/src/kj/async-unix.c++ c++/src/kj/async-unix.c++ index a8179ea5..67489e46 100644 --- src/kj/async-unix.c++ +++ src/kj/async-unix.c++ @@ -1065,7 +1065,11 @@ void UnixEventPort::captureChildExit() { void UnixEventPort::wake() const { // Trigger our user event. struct kevent event; +#if defined(NOTE_TRIGGER) EV_SET(&event, 0, EVFILT_USER, 0, NOTE_TRIGGER, 0, nullptr); +#elif defined(EV_TRIGGER) + EV_SET(&event, 0, EVFILT_USER, EV_TRIGGER, 0, 0, nullptr); +#endif KJ_SYSCALL(kevent(kqueueFd, &event, 1, nullptr, 0, nullptr)); } diff --git c++/src/kj/async-unix.h c++/src/kj/async-unix.h index 665305ea..a647820f 100644 --- src/kj/async-unix.h +++ src/kj/async-unix.h @@ -31,15 +31,21 @@ #include #include +#ifdef __APPLE__ +#include +#endif + KJ_BEGIN_HEADER #if !defined(KJ_USE_EPOLL) && !defined(KJ_USE_KQUEUE) #if __linux__ // Default to epoll on Linux. #define KJ_USE_EPOLL 1 -#elif __APPLE__ || __FreeBSD__ || __NetBSD__ || __DragonFly__ +#elif (__APPLE__ && (MAC_OS_X_VERSION_MIN_REQUIRED >= 1060)) \ + || __FreeBSD__ || __NetBSD__ || __DragonFly__ // MacOS and most BSDs prefer kqueue() for event notification. -// (Note that OpenBSD's kqueue(2) doesn't support user event filters yet) +// (Note that OpenBSD's kqueue(2) doesn't support user event filters yet. +// And macOS < 10.6 does not have NOTE_TRIGGER or EV_TRIGGER.) #define KJ_USE_KQUEUE 1 #endif #endif