Revert cond_signal() fix
authorMarco Costalba <mcostalba@gmail.com>
Mon, 2 Jan 2012 13:37:44 +0000 (14:37 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 2 Jan 2012 15:44:04 +0000 (16:44 +0100)
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 <mcostalba@gmail.com>
src/lock.h
src/thread.cpp

index 0af1443d740f47a81532da075916955e58d4bd64..3b3de1ac122718843e261597823a3f8661d31bc5 100644 (file)
@@ -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
 
index bc26d4df3462ffe354085bc6c2fe00688b2739a6..394e06980c7f83f1b9b30e810b016bd726e4ce81 100644 (file)
@@ -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);
 }