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/stream.c b/src/stream.c
index 522441f..8cb9bfb 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -19,6 +19,7 @@
#include <common/buffer.h>
#include <common/debug.h>
#include <common/memory.h>
+#include <common/hathreads.h>
#include <types/applet.h>
#include <types/capture.h>
@@ -477,7 +478,7 @@
objt_server(s->target)->counters.bytes_in += bytes;
if (sess->listener && sess->listener->counters)
- sess->listener->counters->bytes_in += bytes;
+ HA_ATOMIC_ADD(&sess->listener->counters->bytes_in, bytes);
for (i = 0; i < MAX_SESS_STKCTR; i++) {
struct stkctr *stkctr = &s->stkctr[i];
@@ -514,7 +515,7 @@
objt_server(s->target)->counters.bytes_out += bytes;
if (sess->listener && sess->listener->counters)
- sess->listener->counters->bytes_out += bytes;
+ HA_ATOMIC_ADD(&sess->listener->counters->bytes_out, bytes);
for (i = 0; i < MAX_SESS_STKCTR; i++) {
struct stkctr *stkctr = &s->stkctr[i];
@@ -986,7 +987,7 @@
strm_fe(s)->fe_counters.failed_req++;
if (strm_li(s) && strm_li(s)->counters)
- strm_li(s)->counters->failed_req++;
+ HA_ATOMIC_ADD(&strm_li(s)->counters->failed_req, 1);
s->flags |= SF_FINST_R;
}