|
commit 4805c249aabc45cd59386694f962e19ab50e8ca9
|
|
Author: Willy Tarreau <w@1wt.eu>
|
|
Date: Tue Oct 16 16:57:40 2018 +0200
|
|
|
|
BUG/MEDIUM: threads: make sure threads_want_sync is marked volatile
|
|
|
|
The threads_want_sync variable is not volatile, which allows the compiler
|
|
to cache old copies of it for long parts of code and possibly optimize
|
|
some tests away. This could result in deadlocks when using heavy queue
|
|
activity or health check state changes.
|
|
|
|
There is no upstream commit for this fix because the sync point was
|
|
completely removed from 1.9. This fix is exclusively for 1.8.
|
|
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
|
|
diff --git a/src/hathreads.c b/src/hathreads.c
|
|
index 0a7c12f7..730ebee4 100644
|
|
--- a/src/hathreads.c
|
|
+++ b/src/hathreads.c
|
|
@@ -29,7 +29,7 @@ void thread_sync_io_handler(int fd)
|
|
|
|
static HA_SPINLOCK_T sync_lock;
|
|
static int threads_sync_pipe[2] = {-1, -1};
|
|
-static unsigned long threads_want_sync = 0;
|
|
+volatile static unsigned long threads_want_sync = 0;
|
|
volatile unsigned long threads_want_rdv_mask = 0;
|
|
volatile unsigned long threads_harmless_mask = 0;
|
|
volatile unsigned long all_threads_mask = 1; // nbthread 1 assumed by default
|