From 5178f7abc6f2afb4d6c0f8d0cf574f279464c9a4 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 23 Oct 2026 22:39:06 +0200 Subject: [PATCH] Define instance callback dispatch lifetime for safe unsubscription --- src/transport_layer/etcp_api.h | 5 +++++ src/utun_instance.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/transport_layer/etcp_api.h b/src/transport_layer/etcp_api.h index 61912567..77037b52 100644 --- a/src/transport_layer/etcp_api.h +++ b/src/transport_layer/etcp_api.h @@ -161,6 +161,11 @@ struct etcp_inst_cbk_entry { struct etcp_inst_cbk_entry* next; }; +/* Внутренняя очистка снятых instance-подписок после рассылки; при depth>0 ничего не освобождает. + * Во время callbacks remove сразу отключает запись, память сохраняется до выхода из внешней рассылки. + * Новые подписки добавляются в голову и не участвуют в уже начатом обходе. */ +void etcp_instance_callbacks_collect(struct UTUN_INSTANCE* inst); + // ---- Per-connection unified callback API ---- /** * @brief Зарегистрировать per-connection коллбэк с маской событий diff --git a/src/utun_instance.h b/src/utun_instance.h index 049c3e14..fd0c3fb7 100644 --- a/src/utun_instance.h +++ b/src/utun_instance.h @@ -173,6 +173,7 @@ struct UTUN_INSTANCE { struct etcp_link_status_cbk_entry* link_status_cbks; struct etcp_status_cbk_entry* conn_status_cbks; // instance-level: NEW/UP/DOWN/DELETE struct etcp_socket_cbk_entry* socket_cbks; // instance-level: socket ADDR/STATUS changes + unsigned etcp_callbacks_depth; // Вложенность ETCP-рассылок: снятые подписки освобождаются при выходе из внешней struct nodeinfo_cbk_entry* nodeinfo_cbks; // глобальная подписка на изменения nodeinfo void* test_user_ptr; // Generic user pointer (used by tests)