From: Marco Costalba Date: Sun, 25 Mar 2012 15:31:50 +0000 (+0100) Subject: Fix race in ThreadsManager::sleep() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=58c2fe391d869e417e568cd47eea77d46a408f9b;hp=c483ffc773c012b49f4ea2f5bd1d788c1f0dc4ac Fix race in ThreadsManager::sleep() We cannot set do_sleep flag of main thread before "bestmove" is sent to GUI, otherwise GUI could send immediately the next "go" command that triggers start_thinking() and because do_sleep is set UI thread resets the flag to launch a new search. But when shortly after main thread returns to main_loop() flag is incorrectly reset and main thread goes to sleep hanging the engine. No functional change. Signed-off-by: Marco Costalba --- diff --git a/src/thread.cpp b/src/thread.cpp index d67b9fcd..ab20d781 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -227,7 +227,7 @@ void ThreadsManager::read_uci_options() { void ThreadsManager::wake_up() { - for (int i = 0; i < size(); i++) + for (int i = 1; i < size(); i++) // Main thread is already running { threads[i]->do_sleep = false; @@ -237,12 +237,13 @@ void ThreadsManager::wake_up() { } -// sleep() is called after the search to ask threads to wait on sleep condition +// sleep() is called after the search to ask all the threads but the main to go +// waiting on a sleep condition. void ThreadsManager::sleep() { - for (int i = 0; i < size(); i++) - threads[i]->do_sleep = true; + for (int i = 1; i < size(); i++) // Main thread will go to sleep by itself + threads[i]->do_sleep = true; // to avoid a race with start_thinking() }