Мне трудно понять, как использовать kqueue для событий пользовательского пространства.
Я ищу 2 варианта использования.
Вариант использования 1: событие ручного сброса
Вариант использования 2: событие автоматического сброса
Я думаю, что понимаю, как использовать kqueue() и kevent(), но я не совсем понимаю, как события, переданные в kevent(), ищут связанные операции:
Пусть будет переменная struct kevent с именем "event".
Предположим, у нас нет проблем с поиском нового идентификатора события, который не конфликтует с другими идентификаторами событий для этого экземпляра kqueue с именем "eventId".
- Создать пользовательское событие: EV_SET(&event, eventId, EVFILT_USER, EV_ADD, NOTE_FFNOP, 0, NULL)
- Уничтожить пользовательское событие: EV_SET(&event, eventId, EVFILT_USER, EV_DESTROY, NOTE_FFNOP, 0, NULL)
- Установите пользовательское событие: EV_SET(&event, eventId, EVFILT_USER, ?????, NOTE_FFNOP, 0, NULL)
- Сбросить пользовательское событие: EV_SET(&event, eventId, EVFILT_USER, ??EV_CLEAR???, NOTE_FFNOP, 0, NULL )
- Импульсное пользовательское событие: EV_SET(&event, eventId, EVFILT_USER, 0, NOTE_TRIGGER, 0, NULL )
- Я думаю, что в цикле ожидания будет вырезано: if( event.filter == EVFILT_USER && event.ident == eventId ) { // это мое событие! Сделай что-нибудь! }
Смотрите ???? в приведенных выше вызовах EV_SET(), чтобы увидеть, где мне нужна помощь.
Для варианта использования 1 (событие ручного сброса) операция (1) Create может выглядеть иначе, чем вариант использования 2 (событие автоматического сброса).
Операции (3) и (4) Я полностью в темноте. Могу ли я нуждаться в EV_ENABLE/EV_DISABLE для них? Где вписывается EV_CLEAR?
Пока я предполагаю, что мне не нужно делать ничего в операции (6), кроме "диспетчеризации". Я совершенно уверен, что операция (5) может работать так, как я описал выше.
Я провел большую часть дня, пытаясь найти документацию или образцы, показывающие, как это делается. Я нашел в кодовой базе Apple тестовую программу kqueue, но я сомневаюсь, что она делает это правильно. Кроме того, он отправляет только 1 событие в тесте, и это событие завершает цикл принимающего потока. Так что это не помогает мне понять детали для моих двух вариантов использования.
Я планирую использовать его под FreeBsd 9.1 на машине x86... пока.