Мне нужно спроектировать объект "wait-for-event-objects", который мог бы принимать непрозрачные объекты события и мог блокировать, пока один из них не будет сигнализирован. Это должно работать на MacOS / Linux / Windows. Так что для Linux / Windows все очень хорошо:
- В Windows я могу переносить нативное событие из
CreateEvent
в своем псевдоклассе и в классе, который выполняет ожидающий вызов WaitForMultipleObjects
.
- В Linux я могу смешать
eventfd()
с poll()/epoll()
и добиться того же.
- В MacOS я могу использовать
kqueue
и kevent
с EVFILT_USER
НО проблема в том, что я не могу вызвать событие, не зная очередь / добавив событие в очередь, что не является проблемой в Windows / Linux, где я могу установить событие или записать в дескриптор.
У меня вопрос: есть ли вероятность, что я что-то пропустил, и я действительно мог бы использовать kevent
и вызвать его как-нибудь так, чтобы при добавлении в очередь это стало сигналом? Я не говорю о написании кода пользовательского пространства, который, скажем, знает, что событие было установлено без очереди, а затем просто сигнализирует об этом при добавлении в очередь, я знаю, что могу это сделать, но я бы очень хотел используйте примитивы ядра ОС, если таковые имеются. Конечно, это выдержка из справочной страницы:
EVFILT_USER Устанавливает пользовательское событие, идентифицированное идентификатором , которое не является
связан с любым механизмом ядра , но вызывается
код уровня пользователя.
отчасти очищает все надежды. Тогда последующий вопрос - есть ли какой-нибудь другой механизм ядра MacOS, который ведет себя подобно событиям и eventfd()
?