This commit is contained in:
Evgeny committed 2026-06-02 21:05:06 +03:00
1 parent 226a5744b5
commit 4556f327c2
10 files changed
+63 -94

No files matched your search

+11 -16
View File
@@ -99,6 +99,8 @@ typedef void (*queue_threshold_callback_fn)(struct ll_queue* q, void* arg);
struct queue_waiter {
struct queue_waiter* next; ///< Следующий в списке ожидающих
struct queue_waiter_handle* handle; ///< Обратная ссылка на публичную структуру
queue_threshold_callback_fn callback;
void* callback_arg;
};
/**
@@ -106,15 +108,12 @@ struct queue_waiter {
* @brief Публичная управляющая структура (встраивается в структуру вызывающей стороны).
*
* Вызывающая сторона:
* 1. Объявляет поле struct queue_waiter_handle в своей структуре
* 2. Вызывает queue_waiter_handle_init() один раз при инициализации
* 1. Объявляет поле struct queue_waiter_handle в своей структуре (= {0} или u_calloc)
* 3. Вызывает queue_waiter_wait() когда хочет дождаться освобождения очереди
* 4. Вызывает queue_waiter_cancel() при деинициализации для отмены ожидания
*/
struct queue_waiter_handle {
struct queue_waiter* internal; ///< NULL = не ждём; иначе — внутренний узел
queue_threshold_callback_fn callback;
void* callback_arg;
};
/**
@@ -223,22 +222,18 @@ void queue_resume_callback(struct ll_queue* q);
*/
void queue_set_threshold(struct ll_queue* q, int max_packets, size_t max_bytes);
/**
* @brief Инициализирует публичную управляющую структуру waiter.
* @param h указатель на handle (встраивается в структуру вызывающей стороны)
* @param callback функция, вызываемая при достижении порога
* @param arg аргумент коллбэка
*/
void queue_waiter_handle_init(struct queue_waiter_handle* h,
queue_threshold_callback_fn callback, void* arg);
/**
* @brief Регистрирует ожидание освобождения очереди до общего порога.
* @param q очередь
* @param h указатель на инициализированный handle
* @return 1 — условие уже выполнено (callback вызван немедленно), 0 — зарегистрирован в списке
* @param h указатель на handle (создаётся как `struct queue_waiter_handle h = {0}` или `h.internal = NULL`)
* @param callback функция, вызываемая при достижении порога
* @param arg аргумент коллбэка
* @return 1 — условие уже выполнено (callback вызван немедленно), 0 — зарегистрирован в списке, -1 — ошибка
*
* Если handle уже ожидает (h->internal != NULL) — старый waiter отменяется и создаётся новый.
*/
int queue_waiter_wait(struct ll_queue* q, struct queue_waiter_handle* h);
int queue_waiter_wait(struct ll_queue* q, struct queue_waiter_handle* h,
queue_threshold_callback_fn callback, void* arg);
/**
* @brief Отменяет ожидание (удаляет из списка, если зарегистрирован).