diff --git a/src/transport_layer/etcp.h b/src/transport_layer/etcp.h index 65e06e74..fcbf0728 100644 --- a/src/transport_layer/etcp.h +++ b/src/transport_layer/etcp.h @@ -280,18 +280,19 @@ void etcp_conn_queue_set_ready(struct ETCP_CONN* conn); // переиндекс * @param conn connection * @return 0 on success, -1 if conn is NULL, closing or already deleted (state 2). * - * Increments ref_count. While ref_count > 0, etcp_connection_close() - * will detach but defer resource cleanup until all references are released. + * Increments ref_count and retains the connection object and phase-2 resources. + * Close still frees the normalizer and physical links during phase 1; this reference + * does not keep those pointers valid. Active callbacks defer phase 1 via callbacks_running. * Always pair with etcp_conn_ref_free(). */ int etcp_conn_ref_take(struct ETCP_CONN* conn); /** - * @brief Release a reference. Triggers deferred resource free if last ref and state==2. + * @brief Release a reference. Schedules phase-2 free after close completes and the last ref/callback exits. * @param conn connection * - * Decrements ref_count. If ref_count reaches 0 and the connection has been closed - * (state == 2), schedules deferred resource cleanup via uasync_call_soon. + * Decrements ref_count. If close phase 1 is complete, no references/callbacks remain, + * and free has not been scheduled, schedules phase-2 cleanup via uasync_call_soon. * Safe to call on NULL. */ void etcp_conn_ref_free(struct ETCP_CONN* conn); diff --git a/src/transport_layer/pkt_normalizer_doc.md b/src/transport_layer/pkt_normalizer_doc.md index 0d9eca3c..24441b95 100644 --- a/src/transport_layer/pkt_normalizer_doc.md +++ b/src/transport_layer/pkt_normalizer_doc.md @@ -43,7 +43,7 @@ queue_data_put(pn->input, entry); Неверный заголовок/длина и OOM после принятия данных вызывают `etcp_conn_fatal_reinit()`: новая локальная эпоха, очистка старого потока и согласование с пиром при сохранённых физических линках. Старые кодограммы не воспроизводятся; после согласования владельцы получают REINIT и восстанавливают операции своего протокола. До сохранения RX DATA в `recv_q` OOM обрабатывает сам ETCP: отбрасывает фрагмент без ACK. -Normalizеr не удерживает отдельную OOM-очередь или retry-таймер. После reset/close из пользовательского callback обработчик прекращает старый разбор; извлечённый им фрагмент остаётся его собственностью до однократного освобождения. Счётчик активных callbacks откладывает освобождение normalizer при закрытии. +Normalizer не удерживает отдельную OOM-очередь или retry-таймер. После reset/close из пользовательского callback обработчик прекращает старый разбор; извлечённый им фрагмент остаётся его собственностью до однократного освобождения. Счётчик активных callbacks откладывает освобождение normalizer при закрытии. ## 3. API