Как передать полезную нагрузку в обработчик Aeron?
Я использую библиотеку Aeron. Она предоставляет мне функцию aeron_fragment_assembler_create, которая одним из параметров принимает Callback.
Для примера:
void poll_handler(void *clientd, const uint8_t *buffer, size_t length, aeron_header_t *header)
{
aeron_subscription_t* subscription = (aeron_subscription_t*)clientd;
aeron_subscription_constants_t subscription_constants;
aeron_header_values_t header_values;
// How to get some_data here?
}
void some_func(int some_data)
{
aeron_fragment_assembler_create(fragment_assembler, poll_handler, subscription)
}
Мне необходимо получить в обработчике poll_handler некоторые локальные данные (some_data), т.е. мне нужно реализовать замыкание.
Как я могу это сделать?
Ответы (1 шт):
Автор решения: nomnoms12
→ Ссылка
Функция aeron_fragment_assembler_create третьим параметром принимает указатель на любую структуру. Необязательно на aeron_subscription_t.
Можно создать свою структуру, инициализировать нужными данными и передать указатель на неё. А для удобства можно сохранить в структуре и указатель на aeron_subscription_t.
Примерно так:
typedef struct some_data_t {
aeron_subscription_t* subscription;
// ...
} some_data_t ;
void poll_handler(void *clientd, const uint8_t *buffer, size_t length, aeron_header_t *header)
{
some_data_t * some_data = (some_data_t *) clientd;
aeron_subscription_t* subscription = some_data->subscription;
// ...
}
void some_func(some_data_t* some_data)
{
aeron_fragment_assembler_create(fragment_assembler, poll_handler, some_data)
}