diff --git a/src/haproxy.c b/src/haproxy.c index 64da497b0..df3b9a6c7 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -146,6 +146,7 @@ unsigned long pid_bit = 1; /* bit corresponding to the process id */ unsigned long all_proc_mask = 1; /* mask of all processes */ volatile unsigned long sleeping_thread_mask = 0; /* Threads that are about to sleep in poll() */ +volatile unsigned long stopping_thread_mask = 0; /* Threads acknowledged stopping */ /* global options */ struct global global = { @@ -2810,8 +2811,12 @@ void run_poll_loop() if (tid == 0) signal_process_queue(); + if (stopping && tasks_run_queue == 0) + _HA_ATOMIC_OR(&stopping_thread_mask, tid_bit); + /* stop when there's nothing left to do */ - if ((jobs - unstoppable_jobs) == 0) + if ((jobs - unstoppable_jobs) == 0 && tasks_run_queue == 0 && + (stopping_thread_mask & all_threads_mask) == all_threads_mask) break; /* also stop if we failed to cleanly stop all tasks */