From 83d8fe2d59bad718de70b00ac2c8fddfadda76b5 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 26 Sep 2011 06:07:11 +0100 Subject: [PATCH 1/1] When exiting wake up all threads at once It seems we have a very rare crash under Linux, once every 10K games without this patch. Is faster to wake up all the threads, especially on SMP, where the threads can then exit in parallel while the main thread is waiting for the next one to terminate. Signed-off-by: Marco Costalba --- src/thread.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/thread.cpp b/src/thread.cpp index 8269dcf3..d845fdf2 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -192,14 +192,19 @@ void ThreadsManager::init() { void ThreadsManager::exit() { + // Wake up all the slave threads at once. This is faster than "wake and wait" + // for each thread and avoids a rare crash once every 10K games under Linux. + for (int i = 1; i < MAX_THREADS; i++) + { + threads[i].do_terminate = true; + threads[i].wake_up(); + } + for (int i = 0; i < MAX_THREADS; i++) { - // Wake up all the slave threads and wait for termination if (i != 0) { - threads[i].do_terminate = true; - threads[i].wake_up(); - + // Wait for slave termination #if defined(_MSC_VER) WaitForSingleObject(threads[i].handle, 0); CloseHandle(threads[i].handle); -- 2.39.2