kqueue: Add support for Haiku-specific object types.

Apple Darwin also extends kqueue to support other object types,
like Mach ports, so we might as well do the same for Haiku (Be)
object types.

Fixes #19974.
This commit is contained in:
Augustin Cavalier
2026-07-15 20:01:11 -04:00
parent 2cbf45bc81
commit f03c1740a5
2 changed files with 26 additions and 5 deletions
+4
View File
@@ -41,6 +41,10 @@
#define EVFILT_WRITE (-2) #define EVFILT_WRITE (-2)
#define EVFILT_PROC (-5) #define EVFILT_PROC (-5)
#define EVFILT_HAIKU_SEM (-11)
#define EVFILT_HAIKU_PORT_READ (-12)
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define EV_SET(kevp_, a, b, c, d, e, f) do { \ #define EV_SET(kevp_, a, b, c, d, e, f) do { \
*(kevp_) = (struct kevent){ \ *(kevp_) = (struct kevent){ \
+22 -5
View File
@@ -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. * Distributed under the terms of the MIT License.
*/ */
#include <sys/event.h> #include <sys/event.h>
#include <StackOrHeapArray.h> #include <StackOrHeapArray.h>
@@ -35,6 +36,12 @@ filter_from_info(const event_wait_info& info)
case B_OBJECT_TYPE_THREAD: case B_OBJECT_TYPE_THREAD:
return EVFILT_PROC; return EVFILT_PROC;
case B_OBJECT_TYPE_SEMAPHORE:
return EVFILT_HAIKU_SEM;
case B_OBJECT_TYPE_PORT:
return EVFILT_HAIKU_PORT_READ;
} }
return 0; return 0;
@@ -77,6 +84,16 @@ kevent(int kq,
events |= B_EVENT_INVALID; events |= B_EVENT_INVALID;
break; 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: default:
__set_errno(EINVAL); __set_errno(EINVAL);
return -1; return -1;
@@ -255,10 +272,6 @@ kevent(int kq,
data = waitInfos[i].events; data = waitInfos[i].events;
} else if ((waitInfos[i].events & B_EVENT_INVALID) != 0) { } else if ((waitInfos[i].events & B_EVENT_INVALID) != 0) {
switch (waitInfos[i].type) { switch (waitInfos[i].type) {
case B_OBJECT_TYPE_FD:
// File descriptor was closed. Silently discard the event.
continue;
case B_OBJECT_TYPE_THREAD: { case B_OBJECT_TYPE_THREAD: {
fflags |= NOTE_EXIT; fflags |= NOTE_EXIT;
@@ -270,6 +283,10 @@ kevent(int kq,
data = -1; data = -1;
break; break;
} }
default:
// Object was closed. Silently discard the event.
continue;
} }
} else if ((waitInfos[i].events & B_EVENT_DISCONNECTED) != 0) { } else if ((waitInfos[i].events & B_EVENT_DISCONNECTED) != 0) {
flags |= EV_EOF; flags |= EV_EOF;