MINOR: mux-h2: avoid taking the toremove_lock in on dying tasks
If the owning task is already dying (context was destroyed by h2_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_h2.c b/src/mux_h2.c
index c6634c5..5fad272 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -3705,34 +3705,36 @@
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.
- */
- t->expire = TICK_ETERNITY;
- return t;
- }
+ 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.
- */
- 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 (h2c && h2c->conn->flags & CO_FL_LIST_MASK)
- MT_LIST_DEL(&h2c->conn->list);
+ 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;
+ /* 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);
+ HA_SPIN_UNLOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock);
+ }
task_destroy(t);