MEDIUM: threads/listeners: Make listeners thread-safe
First, we use atomic operations to update jobs/totalconn/actconn variables,
listener's nbconn variable and listener's counters. Then we add a lock on
listeners to protect access to their information. And finally, listener queues
(global and per proxy) are also protected by a lock. Here, because access to
these queues are unusal, we use the same lock for all queues instead of a global
one for the global queue and a lock per proxy for others.
diff --git a/src/session.c b/src/session.c
index 54a879b..3753a2c 100644
--- a/src/session.c
+++ b/src/session.c
@@ -57,8 +57,8 @@
fe->fe_counters.conn_max = fe->feconn;
if (li)
proxy_inc_fe_conn_ctr(li, fe);
- totalconn++;
- jobs++;
+ HA_ATOMIC_ADD(&totalconn, 1);
+ HA_ATOMIC_ADD(&jobs, 1);
}
return sess;
}
@@ -69,7 +69,7 @@
session_store_counters(sess);
vars_prune_per_sess(&sess->vars);
pool_free2(pool2_session, sess);
- jobs--;
+ HA_ATOMIC_SUB(&jobs, 1);
}
/* perform minimal intializations, report 0 in case of error, 1 if OK. */