feat: send_q backpressure + ll_queue on_get callback + consumer_ack flow control
etcp_router: ROUTER_MAX_SEND_Q_PACKETS=256, router_enqueue_send returns error when send_q full, etcp_route_send propagates -1 on backpressure. ll_queue: queue_set_on_get — deferred callback after each queue_data_get. Replaces manual consumer_ack polling with queue-driven notification. tcp_proxy_server: consumer_ack=1, write_on_get_cb triggers ACK on each write_queue dequeue. Full backpressure chain: write_queue full → no dequeue → no ACK → sender stops → all queues pause write_queue drains → dequeue → on_get → ACK → sender resumes
This commit is contained in:
1 parent
a0da29f1eb
commit
bbf39c091d
5 files changed
+69
-10
No files matched your search
@@ -148,6 +148,9 @@ struct ll_queue {
|
||||
void* empty_callback_arg;
|
||||
void* empty_call_soon_id; // handle от uasync_call_soon
|
||||
|
||||
queue_callback_fn on_get; // коллбэк после каждого queue_data_get (deferred)
|
||||
void* on_get_arg;
|
||||
|
||||
struct ll_entry** hash_table; // Хеш-таблица для поиска по id (если hash_size > 0)
|
||||
size_t hash_size; // Размер хеш-таблицы
|
||||
uint16_t index_offset; // Смещение индекса в data[] (для всех entry очереди)
|
||||
@@ -243,6 +246,14 @@ void queue_set_waiter_defer(struct ll_queue* q, int enable);
|
||||
*/
|
||||
void queue_set_empty_callback(struct ll_queue* q, queue_callback_fn cbk_fn, void* arg);
|
||||
|
||||
/**
|
||||
* @brief Устанавливает коллбэк вызываемый после каждого queue_data_get (deferred через call_soon).
|
||||
* @param q очередь
|
||||
* @param cbk_fn коллбэк (NULL для отмены)
|
||||
* @param arg пользовательский аргумент
|
||||
*/
|
||||
void queue_set_on_get(struct ll_queue* q, queue_callback_fn cbk_fn, void* arg);
|
||||
|
||||
/**
|
||||
* @brief Регистрирует ожидание освобождения очереди до общего порога.
|
||||
* @param q очередь
|
||||
|
||||
Reference in new issue
Block a user