Обработать события, полученные dispatch_block()
#include <sys/iofunc.h>
#include <sys/dispatch.h>
int dispatch_handler( dispatch_context_t *ctp );
- ctp
- Указатель на структуру
dispatch_context_t
, выделенную с помощью dispatch_context_alloc().
libc
Функция dispatch_handler() обрабатывает события, полученные dispatch_block(). Эта функция является частью уровня диспетчера менеджера ресурсов.
В зависимости от типа блокировки dispatch_handler() выполняет одно из следующих действий:
- Вызывается функция семейства message_*(). Выполняется поиск, основанный на типе сообщения или коде импульса, для поиска обработчика, присоединенного с помощью message_attach() или pulse_attach()). Если совпадение найдено, то вызывается найденная функция.
- Если тип сообщения находится в диапазоне, обрабатываемом менеджером ресурсов (например, сообщения ввода/вывода), и путь был присоединен с помощью resmgr_attach(), то вызывается функция семейства resmgr_*(), обрабатывающая сообщения менеджера ресурсов.
- Если получен импульс, то он может быть обработан функцией семейства resmgr_*(), если его код (импульс разблокировки и отключения) обрабатывается менеджером ресурсов. Если была выполнена функция select_attach(), и импульс совпадает с импульсом, используемым select_attach(), вызывается функция семейства select_*() для обработки этого события.
- Если получено сообщение, но для данного типа сообщений не найден обработчик, MsgError() возвращает
ENOSYS
отправителю.
- Если используется тип блокировки SignalWaitinfo(), то выполняется поиск функции, присоединенной (с использованием функции sigwait_attach(), которая на данный момент не реализована), на основе номера сигнала. Если совпадение найдено, вызывается эта функция.
- 0
- Успешное завершение.
- -1
- Произошло что-то одно из списка:
- Сообщение представляет собой импульс _PULSE_CODE_THREADDEATH (смотрите ChannelCreate()), для которого не определена функция обработки по умолчанию.
- Длина сообщения меньше 2 байт. Сообщение должно начинаться с двухбайтового типа сообщения, чтобы можно было найти или определить функцию обработки.
- Сообщение получено с неестественным для данной системы порядком байт, и ни одна функция обработки не установила флаг
MSG_FLAG_CROSS_ENDIAN
в этом диапазоне, даже если обработчик был зарегистрирован с использованием функции message_attach(). Флаг MSG_FLAG_CROSS_ENDIAN
не был установлен для message_attach(). - Для сообщения найден обработчик, но он определил, что возникла проблема.
В других случаях, если сообщение не является импульсом, клиенту будет отправлен соответствующее значение errno.
#include <stdlib.h>
#include <sys/dispatch.h>
int main( int argc, char **argv )
{
dispatch_context_t *ctp;
...
for ( ; ; )
{
if ( ctp = dispatch_block( ctp ) )
{
dispatch_handler( ctp );
}
}
return (EXIT_SUCCESS);
}
Другие примеры, использующие интерфейс диспетчера см. на страницах dispatch_create(), message_attach(), resmgr_attach() и thread_pool_create().
ЗОСРВ «Нейтрино»
- Смотри ниже
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
Данная функция может являться, а может и не являться точкой остановки потока в завизимости от реализации обработчика.
select_attach(), dispatch_block(), dispatch_create(), dispatch_create_channel(), dispatch_timeout()
Предыдущий раздел: Описание API системной библиотеки