]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: mux-h1: avoid taking the toremove_lock in on dying tasks
authorWilly Tarreau <w@1wt.eu>
Tue, 30 Jun 2020 09:19:23 +0000 (11:19 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 30 Jun 2020 12:06:19 +0000 (14:06 +0200)
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.

src/mux_h1.c

index 8c7b21c494e1b5cdbb976636c5929a5717d45a24..3b21731a3d924a839dcc4e88a8c6c5154dfd9fd3 100644 (file)
@@ -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);