Есть ли шанс запустить kevent без знания очереди-владельца?Есть альтернативы? - PullRequest
0 голосов
/ 24 мая 2019

Мне нужно спроектировать объект "wait-for-event-objects", который мог бы принимать непрозрачные объекты события и мог блокировать, пока один из них не будет сигнализирован. Это должно работать на MacOS / Linux / Windows. Так что для Linux / Windows все очень хорошо:

  1. В Windows я могу переносить нативное событие из CreateEvent в своем псевдоклассе и в классе, который выполняет ожидающий вызов WaitForMultipleObjects.
  2. В Linux я могу смешать eventfd() с poll()/epoll() и добиться того же.
  3. В MacOS я могу использовать kqueue и kevent с EVFILT_USER НО проблема в том, что я не могу вызвать событие, не зная очередь / добавив событие в очередь, что не является проблемой в Windows / Linux, где я могу установить событие или записать в дескриптор.

У меня вопрос: есть ли вероятность, что я что-то пропустил, и я действительно мог бы использовать kevent и вызвать его как-нибудь так, чтобы при добавлении в очередь это стало сигналом? Я не говорю о написании кода пользовательского пространства, который, скажем, знает, что событие было установлено без очереди, а затем просто сигнализирует об этом при добавлении в очередь, я знаю, что могу это сделать, но я бы очень хотел используйте примитивы ядра ОС, если таковые имеются. Конечно, это выдержка из справочной страницы:

EVFILT_USER Устанавливает пользовательское событие, идентифицированное идентификатором , которое не является связан с любым механизмом ядра , но вызывается код уровня пользователя.

отчасти очищает все надежды. Тогда последующий вопрос - есть ли какой-нибудь другой механизм ядра MacOS, который ведет себя подобно событиям и eventfd()?

...