mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-23 14:51:27 +02:00
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.
This commit is contained in:
parent
68d4ee9e26
commit
bd42e9257d
52
src/mux_h2.c
52
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);
|
TRACE_ENTER(H2_EV_H2C_WAKE, h2c ? h2c->conn : NULL);
|
||||||
|
|
||||||
if (!expired && h2c) {
|
if (h2c) {
|
||||||
TRACE_DEVEL("leaving (not expired)", H2_EV_H2C_WAKE, h2c->conn);
|
if (!expired) {
|
||||||
return t;
|
TRACE_DEVEL("leaving (not expired)", H2_EV_H2C_WAKE, h2c->conn);
|
||||||
}
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
if (h2c && !h2c_may_expire(h2c)) {
|
if (!h2c_may_expire(h2c)) {
|
||||||
/* we do still have streams but all of them are idle, waiting
|
/* we do still have streams but all of them are idle, waiting
|
||||||
* for the data layer, so we must not enforce the timeout here.
|
* 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;
|
HA_SPIN_LOCK(OTHER_LOCK, &idle_conns[tid].toremove_lock);
|
||||||
return t;
|
|
||||||
|
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);
|
task_destroy(t);
|
||||||
|
|
||||||
if (!h2c) {
|
if (!h2c) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user