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:
@@ -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){ \
|
||||
|
||||
+22
-5
@@ -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 <sys/event.h>
|
||||
|
||||
#include <StackOrHeapArray.h>
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user