diff --git a/headers/compatibility/bsd/sys/event.h b/headers/compatibility/bsd/sys/event.h index 3a2b524ed0..3faa1c3a69 100644 --- a/headers/compatibility/bsd/sys/event.h +++ b/headers/compatibility/bsd/sys/event.h @@ -41,6 +41,10 @@ #define EVFILT_WRITE (-2) #define EVFILT_PROC (-5) +#define EVFILT_HAIKU_SEM (-11) +#define EVFILT_HAIKU_PORT_READ (-12) + + #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define EV_SET(kevp_, a, b, c, d, e, f) do { \ *(kevp_) = (struct kevent){ \ diff --git a/src/libs/bsd/kqueue.cpp b/src/libs/bsd/kqueue.cpp index 4d3e2abc71..a0d5e35023 100644 --- a/src/libs/bsd/kqueue.cpp +++ b/src/libs/bsd/kqueue.cpp @@ -1,7 +1,8 @@ /* - * Copyright 2023, Haiku, Inc. All rights reserved. + * Copyright 2023-2026, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ + #include #include @@ -35,6 +36,12 @@ filter_from_info(const event_wait_info& info) case B_OBJECT_TYPE_THREAD: return EVFILT_PROC; + + case B_OBJECT_TYPE_SEMAPHORE: + return EVFILT_HAIKU_SEM; + + case B_OBJECT_TYPE_PORT: + return EVFILT_HAIKU_PORT_READ; } return 0; @@ -77,6 +84,16 @@ kevent(int kq, events |= B_EVENT_INVALID; break; + case EVFILT_HAIKU_SEM: + waitInfo->type = B_OBJECT_TYPE_SEMAPHORE; + events = B_EVENT_ACQUIRE_SEMAPHORE; + break; + + case EVFILT_HAIKU_PORT_READ: + waitInfo->type = B_OBJECT_TYPE_PORT; + events = B_EVENT_READ; + break; + default: __set_errno(EINVAL); return -1; @@ -255,10 +272,6 @@ kevent(int kq, data = waitInfos[i].events; } else if ((waitInfos[i].events & B_EVENT_INVALID) != 0) { switch (waitInfos[i].type) { - case B_OBJECT_TYPE_FD: - // File descriptor was closed. Silently discard the event. - continue; - case B_OBJECT_TYPE_THREAD: { fflags |= NOTE_EXIT; @@ -270,6 +283,10 @@ kevent(int kq, data = -1; break; } + + default: + // Object was closed. Silently discard the event. + continue; } } else if ((waitInfos[i].events & B_EVENT_DISCONNECTED) != 0) { flags |= EV_EOF;