From: Amaury Denoyelle Date: Thu, 23 Dec 2021 14:06:56 +0000 (+0100) Subject: MINOR: quic: delete timer task on quic_close() X-Git-Tag: v2.6-dev1~224 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0a29e138358afb503967edf2f8508912ee58ccd7;p=thirdparty%2Fhaproxy.git MINOR: quic: delete timer task on quic_close() The timer task is attached to the connection-pinned thread. Only this thread can delete it. With the future refcount implementation of quic_conn, every thread can be responsible to remove the quic_conn via quic_conn_free(). Thus, the timer task deletion is moved from the calling function quic_close(). --- diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 05f87a546f..4fd7d9f694 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -637,7 +637,7 @@ static inline void qc_set_timer(struct quic_conn *qc) if (tick_isset(pto)) qc->timer = pto; out: - if (qc->timer != TICK_ETERNITY) + if (qc->timer_task && qc->timer != TICK_ETERNITY) task_schedule(qc->timer_task, qc->timer); TRACE_LEAVE(QUIC_EV_CONN_STIMER, qc, pktns); } @@ -3213,8 +3213,7 @@ static void quic_conn_free(struct quic_conn *qc) for (i = 0; i < QUIC_TLS_ENC_LEVEL_MAX; i++) quic_conn_enc_level_uninit(&qc->els[i]); - if (qc->timer_task) - task_destroy(qc->timer_task); + pool_free(pool_head_quic_conn_rxbuf, qc->rx.buf.area); pool_free(pool_head_quic_conn, qc); } @@ -3223,6 +3222,13 @@ void quic_close(struct connection *conn, void *xprt_ctx) { struct ssl_sock_ctx *conn_ctx = xprt_ctx; struct quic_conn *qc = conn_ctx->conn->qc; + + /* This task must be deleted by the connection-pinned thread. */ + if (qc->timer_task) { + task_destroy(qc->timer_task); + qc->timer_task = NULL; + } + quic_conn_free(qc); }