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_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
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user