diff --git a/src/transport_layer/etcp_api.h b/src/transport_layer/etcp_api.h index 77037b52..11b3bb47 100644 --- a/src/transport_layer/etcp_api.h +++ b/src/transport_layer/etcp_api.h @@ -81,7 +81,7 @@ extern "C" { // Connection status events (instance-level callback). // NEW начинает жизнь объекта, UP/DOWN отражают доступность, DELETE завершает её. -// NEW — один раз при создании соединения. +// NEW — один раз после new-connection callbacks, если они не отменили создание. // UP — переход links_up 0→1 (UP после UP не вызывается). // DOWN — переход links_up 1→0 (DOWN после DOWN не вызывается). // DELETE — один раз при закрытии, финальный; единственный статус, допустимый при state==2. @@ -196,6 +196,9 @@ void etcp_conn_remove_cbk(struct ETCP_CONN* conn, etcp_cbk_fn fn, void* arg); */ void etcp_conn_update_cbk_mask(struct ETCP_CONN* conn, etcp_cbk_fn fn, void* arg, int event_mask); +/* Instance-подписки new/conn-status/link-status/socket можно снимать из callback, включая себя и следующий. + * Снятие немедленно отключает запись, память освобождается после внешней рассылки. Добавленные записи + * не участвуют в уже начатом обходе, но видны отдельной вложенной рассылке. Destroy instance внутри callback запрещён. */ // ---- Instance-level callbacks ---- /** * @brief Зарегистрировать instance-level коллбэк «создано новое соединение» diff --git a/src/transport_layer/stcp_link_doc.md b/src/transport_layer/stcp_link_doc.md index e09a5274..55c8aabe 100644 --- a/src/transport_layer/stcp_link_doc.md +++ b/src/transport_layer/stcp_link_doc.md @@ -59,6 +59,12 @@ ETCP закрывает соединение с диагностикой вме соседний линк или всё соединение; повторный close уже закрываемого линка игнорируется. Поэтому через callback нельзя сохранять следующий элемент списка и продолжать обход по старому указателю. +Конструкторы ETCP_CONN/ETCP_LINK возвращают NULL, если callback отменил создание. +До завершения конструктора линка память остаётся у него: close снимает ресурсы и помечает отмену, +после чего конструктор освобождает объект. Входящий STCP при отказе его присоединения закрывается. +Instance-подписки можно снимать внутри callbacks: запись сразу отключается, освобождение ждёт выхода +из внешней рассылки. Новая подписка не попадает в начатый обход, но доступна вложенному событию. + ## Проверки `test_transport` проверяет передачу, неверный ключ, ранний отказ connect, таймаут handshake, @@ -67,3 +73,6 @@ ETCP закрывает соединение с диагностикой вме закрытие из READY/DOWN для клиента и сервера, plain STCP и REALITY, отсутствие поздних READY, backoff, его сброс после восстановления и отмену повторного подключения. Проверяется баланс сокетов, таймеров и учитываемых выделений памяти. +Дополнительно проверяются отмена создания из callbacks и снятие подписки для обеих ролей STCP/REALITY. +`test_etcp_lifecycle` проверяет снятие себя/следующей записи, добавление подписки и вложенную рассылку +для всех четырёх instance-цепочек ETCP.