BUG/MEDIUM: listener: make sure we don't pick stopped threads
Dragan Dosen reported that after the multi-queue changes, appending
"process 1/even" on a bind line can make the process immediately crash
when delivering a first connection. This is due to the fact that I
believed that thread_mask(mask) applied the all_threads_mask value,
but it doesn't. And in case of even/odd the bits cover more than the
available threads, resulting in too high a thread number being selected
and a non-existing task to be woken up.
No backport is needed.
diff --git a/src/listener.c b/src/listener.c
index 4299761..a023e59 100644
--- a/src/listener.c
+++ b/src/listener.c
@@ -845,7 +845,7 @@
next_actconn = 0;
#if defined(USE_THREAD)
- mask = thread_mask(l->bind_conf->bind_thread);
+ mask = thread_mask(l->bind_conf->bind_thread) & all_threads_mask;
if (atleast2(mask) && (global.tune.options & GTUNE_LISTENER_MQ)) {
struct accept_queue_ring *ring;
unsigned int t, t0, t1, t2;