|
|
- commit 14844e448b637fea2770bcb03a43a010c4c8176d
- Author: Olivier Houchard <ohouchard@haproxy.com>
- Date: Thu Sep 27 14:55:34 2018 +0200
-
- MINOR: threads: Make sure threads_sync_pipe is initialized before using it.
-
- thread_want_sync() might be called before thread_sync_init() was called,
- at least when reading the server state file, as apply_server_state() is called
- before thread_sync_init(). So make sure the threads_sync_pipe was initialized
- before writing to it, if it was not, there's no thread, so no need to sync
- anything anyway, and if we don't check it we'll end up writing a 'S' on
- stdin.
-
- this only applies to 1.8.
-
- diff --git a/src/hathreads.c b/src/hathreads.c
- index 97ed31c5..9dba4356 100644
- --- a/src/hathreads.c
- +++ b/src/hathreads.c
- @@ -28,7 +28,7 @@ void thread_sync_io_handler(int fd)
- #ifdef USE_THREAD
-
- static HA_SPINLOCK_T sync_lock;
- -static int threads_sync_pipe[2];
- +static int threads_sync_pipe[2] = {-1, -1};
- static unsigned long threads_want_sync = 0;
- volatile unsigned long threads_want_rdv_mask = 0;
- volatile unsigned long threads_harmless_mask = 0;
- @@ -76,7 +76,8 @@ void thread_want_sync()
- if (all_threads_mask & (all_threads_mask - 1)) {
- if (threads_want_sync & tid_bit)
- return;
- - if (HA_ATOMIC_OR(&threads_want_sync, tid_bit) == tid_bit)
- + if (HA_ATOMIC_OR(&threads_want_sync, tid_bit) == tid_bit &&
- + threads_sync_pipe[1] != -1)
- shut_your_big_mouth_gcc(write(threads_sync_pipe[1], "S", 1));
- }
- else {
|