From: Willy Tarreau Date: Tue, 30 Jun 2020 09:19:23 +0000 (+0200) Subject: MINOR: mux-h1: avoid taking the toremove_lock in on dying tasks X-Git-Tag: v2.2-dev12~46 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=68d4ee9e261e6a6a921e2107b43a36ed5299e8f3;p=thirdparty%2Fhaproxy.git MINOR: mux-h1: avoid taking the toremove_lock in on dying tasks If the owning task is already dying (context was destroyed by h1_takeover) there's no point taking the lock then removing it later since all the code in between is conditionned by a non-null context. Let's simplify this. --- diff --git a/src/mux_h1.c b/src/mux_h1.c index 8c7b21c494..3b21731a3d 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -2300,26 +2300,28 @@ static struct task *h1_timeout_task(struct task *t, void *context, unsigned shor TRACE_POINT(H1_EV_H1C_WAKE, h1c ? h1c->conn : NULL); - if (!expired && h1c) { - TRACE_DEVEL("leaving (not expired)", H1_EV_H1C_WAKE, h1c->conn); - return t; - } + if (h1c) { + if (!expired) { + TRACE_DEVEL("leaving (not expired)", H1_EV_H1C_WAKE, h1c->conn); + return t; + } - /* 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); + /* 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 (h1c && h1c->conn->flags & CO_FL_LIST_MASK) - MT_LIST_DEL(&h1c->conn->list); + if (h1c->conn->flags & CO_FL_LIST_MASK) + MT_LIST_DEL(&h1c->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) - h1c = NULL; + /* Somebody already stole the connection from us, so we should not + * free it, we just have to free the task. + */ + if (!t->context) + h1c = NULL; - HA_SPIN_UNLOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock); + HA_SPIN_UNLOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock); + } task_destroy(t);