Как передать полезную нагрузку в обработчик 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)
}
→ Ссылка