dispatch_block()

Заблокировать процесс-сервер в ожидании сообщений

Прототип:

#include <sys/iofunc.h>
#include <sys/dispatch.h>
dispatch_context_t * dispatch_block( dispatch_context_t *ctp );

Аргументы:

ctp
Указатель на структуру dispatch_context_t, определяющую контекст диспетчера.

Библиотека:

libc

Описание:

Функция dispatch_block() блокируется в ожидании события (например, сообщения или сигнала), зарегистрированного с помощью какой-либо функции присоединения, message_attach(), pulse_attach(), resmgr_attach() или select_attach(). (На данный момент функция sigwait_attach() не реализована.)

Тип блокировки: dispatch_block() выполняет:
сообщение (resmgr, message, select) MsgReceive()
сигнал SignalWaitinfo()

Эта функция является частью уровня диспетчеризации менеджера ресурсов.

Возвращаемое значение:

Контекст диспетчера, переданный в dispatch_context_alloc(). Если возникла ошибка, функция возвращает NULL, код ошибки записывается в errno.

Ошибки могут возникнуть, когда блокирующий вызов ядра возвращается с ошибкой, например, из-за доставки сигнала.


Note: В случае таймаута возвращается корректный контекст диспетчера, но либо ctp->message_context.rcvid, либо ctp->sigwait_context.signo устанавливаются в -1.

Если возвращается отличный от NULL указатель на контекст, он может отличаться от переданного в функцию, так как для ctp возможно перераспределение в сторону большего размера. В этом случае, старый ctp более недействителен. Однако, если возвращается NULL (например, MsgReceive() был прерван сигналом), старый указатель контекста все еще действителен. Обычно менеджер ресурсов направляет сигналы в поток, предназначенный для обработки сигналов. Однако, если сигнал направляется в поток, выполняющий dispatch_block(), можно использовать следующий код:

dispatch_context_t *ctp, *new_ctp;
ctp = dispatch_context_alloc( ... );
while( 1 )
{
new_ctp = dispatch_block( ctp );
if ( new_ctp )
{
ctp = new_ctp
} else {
/* handle the error condition */
...
}
}

Коды ошибок:

EFAULT
Ошибка во время попытки ядра получить доступ к буферам.
EINTR
Вызов был прерван сигналом.
EINVAL
В dispatch_block() переданы некорректные аргументы.
ENOMEM
Недостаточно памяти для размещения внутренних структур данных.

Смотрите также константы ошибок, возвращаемые MsgReceive() и SignalWaitinfo().

Примеры:

#include <sys/dispatch.h>
int main( int argc, char **argv )
{
dispatch_context_t *ctp;
...
for ( ; ; )
{
if ( ctp = dispatch_block( ctp ) )
{
dispatch_handler( ctp );
}
}
}

Для примера использования интерфейса диспетчеризации смотрите dispatch_create(), message_attach(), resmgr_attach() и thread_pool_create().

Классификация:

ЗОСРВ «Нейтрино»

Точка остановки потока
Да
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

dispatch_context_alloc(), dispatch_create(), dispatch_create_channel(), dispatch_handler(), dispatch_timeout(), dispatch_unblock(), MsgReceive()




Предыдущий раздел: Описание API системной библиотеки