diff --git a/src/mux_h2.c b/src/mux_h2.c index c6634c5b7..5fad272e7 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -3705,35 +3705,37 @@ static struct task *h2_timeout_task(struct task *t, void *context, unsigned shor TRACE_ENTER(H2_EV_H2C_WAKE, h2c ? h2c->conn : NULL); - if (!expired && h2c) { - TRACE_DEVEL("leaving (not expired)", H2_EV_H2C_WAKE, h2c->conn); - return t; - } + if (h2c) { + if (!expired) { + TRACE_DEVEL("leaving (not expired)", H2_EV_H2C_WAKE, h2c->conn); + return t; + } - if (h2c && !h2c_may_expire(h2c)) { - /* we do still have streams but all of them are idle, waiting - * for the data layer, so we must not enforce the timeout here. + if (!h2c_may_expire(h2c)) { + /* we do still have streams but all of them are idle, waiting + * for the data layer, so we must not enforce the timeout here. + */ + t->expire = TICK_ETERNITY; + return t; + } + + /* We're about to destroy the connection, so make sure nobody attempts + * to steal it from us. */ - t->expire = TICK_ETERNITY; - return t; + HA_SPIN_LOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock); + + if (h2c->conn->flags & CO_FL_LIST_MASK) + MT_LIST_DEL(&h2c->conn->list); + + /* Somebody already stole the connection from us, so we should not + * free it, we just have to free the task. + */ + if (!t->context) + h2c = NULL; + + HA_SPIN_UNLOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock); } - /* We're about to destroy the connection, so make sure nobody attempts - * to steal it from us. - */ - HA_SPIN_LOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock); - - if (h2c && h2c->conn->flags & CO_FL_LIST_MASK) - MT_LIST_DEL(&h2c->conn->list); - - /* Somebody already stole the connection from us, so we should not - * free it, we just have to free the task. - */ - if (!t->context) - h2c = NULL; - - HA_SPIN_UNLOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock); - task_destroy(t); if (!h2c) {