Обработать сообщение повторно в менеджере ресурсов
#include <sys/resmgr.h>
int resmgr_msg_again( resmgr_context_t *ctp,
int rcvid );
- ctp
- Указатель на структуру resmgr_context_t, которую библиотека менеджера ресурсов использует для передачи контекстной информации между функциями.
- rcvid
- Идентификатор получения сообщения, которое необходимо обработать снова.
libc
Функция resmgr_msg_again() повторно обрабатывает сообщение, соответствующее данному rcvid. Это достигается за счет:
- вызова MsgInfo() и MsgRead() для обновления полей структуры resmgr_context_t до того состояния, в котором они были на момент получения сообщения.
- вызова MsgCurrent() для настройки приоритета потоков сервера на приоритет заблокированного клиента
- обработки сообщения, как если бы оно только что пришло
Можно использовать данную функцию, если менеджер ресурсов не может сразу обработать сообщение. Например, если операция чтения заблокирована, обработчик io_read сохранит rcvid запроса, а затем вернет _RESMGR_NOREPLY
, оставив клиента заблокированным. Позже, когда менеджер ресурсов сможет обработать запрос, он может вызвать resmgr_msg_again() для повторной обработки сообщения.
- -1
- Возникла ошибка.
- 0
- Успешное завершение.
- EFAULT
- Произошла ошибка при попытке ядра получить доступ к предоставленным буферам.
- ESRCH
- Поток rcvid не существует, его соединение было прервано, либо он не находится в состоянии
STATE_REPLY
или STATE_NET_REPLY
, либо он не был заблокирован на соединении, связанном с rcvid. - ESRVRFAULT
- Принимающая сторона обнаружила ошибку памяти при доступе к буферу приема/ответа.
ЗОСРВ «Нейтрино»
- Нет
- Обработчик прерываний
- Нет
- Обработчик сигналов
- Нет
- В потоке
- Да
MsgCurrent(), MsgInfo(), MsgRead(), resmgr_context_t
Предыдущий раздел: Описание API системной библиотеки