From: Marco Costalba Date: Mon, 2 Jan 2012 13:37:44 +0000 (+0100) Subject: Revert cond_signal() fix X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=cb1709ef5e6f96d8db44854b42b67fb524214717;hp=67338e6f322b8f8ec0d897815e16a87937efc9b0 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 --- 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); }