]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: mux-fcgi: 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 fcgi_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_fcgi.c

index 0e3ab3f1ad112591f6e9e66ba51541228db06f0a..b09ad566c21f492bd576c9490ae174ac2a1084a4 100644 (file)
@@ -3084,26 +3084,28 @@ static struct task *fcgi_timeout_task(struct task *t, void *context, unsigned sh
 
        TRACE_ENTER(FCGI_EV_FCONN_WAKE, (fconn ? fconn->conn : NULL));
 
-       if (!expired && fconn) {
-               TRACE_DEVEL("leaving (not expired)", FCGI_EV_FCONN_WAKE, fconn->conn);
-               return t;
-       }
+       if (fconn) {
+               if (!expired) {
+                       TRACE_DEVEL("leaving (not expired)", FCGI_EV_FCONN_WAKE, fconn->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 (fconn && fconn->conn->flags & CO_FL_LIST_MASK)
-               MT_LIST_DEL(&fconn->conn->list);
+               if (fconn->conn->flags & CO_FL_LIST_MASK)
+                       MT_LIST_DEL(&fconn->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)
-               fconn = NULL;
+               /* Somebody already stole the connection from us, so we should not
+                * free it, we just have to free the task.
+                */
+               if (!t->context)
+                       fconn = NULL;
 
-       HA_SPIN_UNLOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock);
+               HA_SPIN_UNLOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock);
+       }
 
        task_destroy(t);