From cb1709ef5e6f96d8db44854b42b67fb524214717 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 2 Jan 2012 14:37:44 +0100 Subject: [PATCH 1/1] Revert cond_signal() fix It seems it yields to missing wake-up events with the result of SF loosing on time as reported by many people. So revert the patch and use a more robust approach: assume there can be spurious wake ups events and make the code to work also in those cases. While debugging I found that WaitForSingleObject() had wrong parameter 0 instead of INFINITE yielding to a crash while exiting under Windows, strangely unnoticed til now. No functional change. Signed-off-by: Marco Costalba --- src/lock.h | 4 ++-- src/thread.cpp | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/lock.h b/src/lock.h index 0af1443d..3b3de1ac 100644 --- a/src/lock.h +++ b/src/lock.h @@ -75,8 +75,8 @@ typedef HANDLE WaitCondition; # define cond_init(x) { *x = CreateEvent(0, FALSE, FALSE, 0); } # define cond_destroy(x) CloseHandle(*x) # define cond_signal(x) SetEvent(*x) -# define cond_wait(x,y) { ResetEvent(*x); lock_release(y); WaitForSingleObject(*x, INFINITE); lock_grab(y); } -# define cond_timedwait(x,y,z) { ResetEvent(*x); lock_release(y); WaitForSingleObject(*x,z); lock_grab(y); } +# define cond_wait(x,y) { lock_release(y); WaitForSingleObject(*x, INFINITE); lock_grab(y); } +# define cond_timedwait(x,y,z) { lock_release(y); WaitForSingleObject(*x,z); lock_grab(y); } #endif diff --git a/src/thread.cpp b/src/thread.cpp index bc26d4df..394e0698 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -202,7 +202,7 @@ void ThreadsManager::exit() { // Wait for thread termination #if defined(_MSC_VER) - WaitForSingleObject(threads[i].handle, 0); + WaitForSingleObject(threads[i].handle, INFINITE); CloseHandle(threads[i].handle); #else pthread_join(threads[i].handle, NULL); @@ -452,7 +452,8 @@ void ThreadsManager::start_thinking(const Position& pos, const LimitsType& limit cond_signal(&main.sleepCond); // Wake up main thread and start searching if (!asyncMode) - cond_wait(&sleepCond, &main.sleepLock); + while (!main.do_sleep) + cond_wait(&sleepCond, &main.sleepLock); lock_release(&main.sleepLock); } -- 2.39.2