asyncmsg_channel_create()

Создать канал асинхронных сообщений


Note: Асинхронный обмен сообщениями не работает с прозрачной распределенной обработкой (т.е. не работает в Qnet).

Прототип:

#include <sys/neutrino.h>
#include <sys/asyncmsg.h>
int asyncmsg_channel_create( unsigned flags,
mode_t mode,
size_t buffer_size,
unsigned max_num_buffer,
const struct sigevent *ev,
int (*recvbuf_callback)( size_t bufsize,
unsigned num_bufs,
void *bufs[],
int flags,
void *handle ),
void *recvbuf_callback_handle );

Аргументы:

flags
Флаги, определяющие атрибуты канала:
_NTO_CHF_ASYNC_NONBLOCK
сделать asyncmsg_get() неблокирующим, когда нет доступных сообщений.
Данная функция автоматически устанавливает _NTO_CHF_ASYNC.
mode
Разрешения для канала. Для получения дополнительной информации см. struct stat.
buffer_size
Размер в байтах каждого буфера, используемого для хранения сообщений.
max_num_buffer
Максимальное количество выделяемых буферов или 0, если не требуется, чтобы функция выделяла какие-либо буферы.
ev
NULL, или указатель на структуру struct sigevent которая определяет событие, которое требуется доставить, когда сообщение станет доступным для приема в ранее пустой очереди.
recvbuf_callback
NULL, или указатель на функцию обратного вызова, которую библиотека может использовать для выделения буфера для входящего сообщения или для освобождения буферов при уничтожении канала. Если обратный вызов задан как NULL, библиотека использует malloc() и free().
recvbuf_callback_handle
NULL, или указатель на произвольные данные, которые требуется передать функции обратного вызова.

Библиотека:

libasyncmsg

Описание:

Функция asyncmsg_channel_create() function создает канал асинхронных сообщений.

Callback function

Если аргумент recvbuf_callback не равен NULL, библиотека обмена асинхронными сообщениями вызывает данную функцию при вызовах:

asyncmsg_get()
Обратный вызов вызывается один раз для каждого получаемого буфера, а для аргумента flags устанавливается значение ASYNCMSG_RECVBUF_ALLOC. Ожидается, что обратный вызов выделит место для сообщения, поместит указатель на буфер в таблице bufs, а затем вернет 1, если требуется, чтобы библиотека получила другой буфер, или 0, если требуется, чтобы он остановился.
asyncmsg_channel_destroy()
В этом случае обратный вызов вызывается один или несколько раз, чтобы освободить ожидающие буферы приема; аргумент flags устанавливается в ASYNCMSG_RECVBUF_FREE, а возвращаемое значение игнорируется.

Аргументы функции обратного вызова recvbuf_callback():

size_t bufsize
Размер буфера для сообщения, которое в настоящее время принимается, включая заголовки.
unsigned num_bufs
void* bufs[]
Таблица указателей на буферы приема. Количество буферов задается num_bufs.
int flags
ASYNCMSG_RECVBUF_ALLOC когда asyncmsg_get() вызывает функцию обратного вызова, и ASYNCMSG_RECVBUF_FREE когда asyncmsg_channel_destroy() вызывает ее.
handle
NULL,или указатель на произвольные данные (указанные в аргументе recvbuf_callback_handle asyncmsg_channel_create()) который требуется передать функции обратного вызова.

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

Идентификатор созданного канала. Если возникла ошибка функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EAGAIN
Все каналы ядра используются.
EINVAL
Попытка подключиться к синхронному каналу сообщений.

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

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

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

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

struct stat, asyncmsg_channel_destroy(), asyncmsg_connect_attach(), asyncmsg_connect_attr(), asyncmsg_connect_detach(), asyncmsg_flush(), asyncmsg_free(), asyncmsg_get(), asyncmsg_malloc(), asyncmsg_put(), asyncmsg_putv(), ChannelCreate(), struct sigevent

Примеры использования и сведения об архитектуре библиотеки доступны в разделе общие сведения.




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