|
|
|
|
@ -282,6 +282,7 @@ static void stcp_link_close_impl(void *arg) {
|
|
|
|
|
stcp_conn_do_close(conn, 0); |
|
|
|
|
link->conn = NULL; |
|
|
|
|
} |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "stcp_link_close_impl: link=%p cli=%p conn=%p conn_pre_closed=%d", (void*)link, (void*)link->cli, (void*)link->conn, link->conn_pre_closed); |
|
|
|
|
u_free(link); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -289,6 +290,9 @@ void stcp_link_close(struct stcp_link *link) {
|
|
|
|
|
if (!link) return; |
|
|
|
|
if (link->closing) return; |
|
|
|
|
link->closing = 1; |
|
|
|
|
/* Обрыв вперёд-ссылки родителя: после отложенного free (close_impl)
|
|
|
|
|
* etcp_link->tcp_link не должен остаться висячим. */ |
|
|
|
|
if (link->etcp_link && link->etcp_link->tcp_link == link) link->etcp_link->tcp_link = NULL; |
|
|
|
|
link->etcp_conn = NULL; |
|
|
|
|
link->etcp_link = NULL; |
|
|
|
|
/* Явный teardown гасит «внезапное» уведомление: отложенный stcp_link_close_impl
|
|
|
|
|
@ -296,6 +300,7 @@ void stcp_link_close(struct stcp_link *link) {
|
|
|
|
|
* on_close_cb с уже освобождённым ETCP_LINK. */ |
|
|
|
|
link->on_close_cb = NULL; |
|
|
|
|
link->close_arg = NULL; |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_ETCP, "stcp_link_close: link=%p closing=%d", (void*)link, link->closing); |
|
|
|
|
|
|
|
|
|
if (link->cli) { |
|
|
|
|
struct stcp_conn *c = stcp_client_get_conn(link->cli); |
|
|
|
|
|