]> git.sesse.net Git - stockfish/commitdiff
Use fast SRWLOCK locks under Windows
authorMarco Costalba <mcostalba@gmail.com>
Sun, 17 Oct 2010 10:01:55 +0000 (11:01 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Sun, 17 Oct 2010 10:04:52 +0000 (11:04 +0100)
They are fast and also have the same semantic of Linux ones.

This allow to simplify the code and especially to use
SleepConditionVariableSRW() to wait on a condition releaseing the lock,
this has the same semantic as pthread_cond_wait().

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/lock.h
src/search.cpp

index 82726517317764f77abbf5a68020f53e043c45aa..489a5663ab123071d5bb468d1301a620a33f3a5f 100644 (file)
@@ -34,7 +34,9 @@ typedef pthread_cond_t WaitCondition;
 #  define lock_release(x) pthread_mutex_unlock(x)
 #  define lock_destroy(x) pthread_mutex_destroy(x)
 #  define cond_destroy(x) pthread_cond_destroy(x);
+#  define cond_init(x) pthread_cond_init(x, NULL);
 #  define cond_signal(x) pthread_cond_signal(x);
+#  define cond_wait(x,y) pthread_cond_wait(x,y);
 
 #else
 
@@ -42,15 +44,17 @@ typedef pthread_cond_t WaitCondition;
 #include <windows.h>
 #undef WIN32_LEAN_AND_MEAN
 
-typedef CRITICAL_SECTION Lock;
-typedef HANDLE WaitCondition;
-
-#  define lock_init(x) InitializeCriticalSection(x)
-#  define lock_grab(x) EnterCriticalSection(x)
-#  define lock_release(x) LeaveCriticalSection(x)
-#  define lock_destroy(x) DeleteCriticalSection(x)
-#  define cond_destroy(x) CloseHandle(*x);
-#  define cond_signal(x) SetEvent(*x);
+typedef SRWLOCK Lock;
+typedef CONDITION_VARIABLE WaitCondition;
+
+#  define lock_init(x) InitializeSRWLock(x)
+#  define lock_grab(x) AcquireSRWLockExclusive(x)
+#  define lock_release(x) ReleaseSRWLockExclusive(x)
+#  define lock_destroy(x) (x)
+#  define cond_destroy(x) (x);
+#  define cond_init(x) InitializeConditionVariable(x);
+#  define cond_signal(x) WakeConditionVariable(x);
+#  define cond_wait(x,y) SleepConditionVariableSRW(x, y, INFINITE,0);
 
 #endif
 
index b3d54fb0c71328b8ca337c485589088106358683..b303d31f521e61a6bf61f690cc9b3de3391401fd 100644 (file)
@@ -2224,8 +2224,7 @@ split_point_start: // At split points actual search starts from here
 
         // If we are not thinking, wait for a condition to be signaled
         // instead of wasting CPU time polling for work.
-        while (   threadID >= ActiveThreads
-               || threads[threadID].state == THREAD_INITIALIZING)
+        while (threadID >= ActiveThreads || threads[threadID].state == THREAD_INITIALIZING)
         {
             assert(!sp);
             assert(threadID != 0);
@@ -2235,14 +2234,12 @@ split_point_start: // At split points actual search starts from here
 
             threads[threadID].state = THREAD_AVAILABLE;
 
-#if !defined(_MSC_VER)
             lock_grab(&WaitLock);
-            if (threadID >= ActiveThreads)
-                pthread_cond_wait(&WaitCond[threadID], &WaitLock);
+
+            if (threadID >= ActiveThreads || threads[threadID].state == THREAD_INITIALIZING)
+                cond_wait(&WaitCond[threadID], &WaitLock);
+
             lock_release(&WaitLock);
-#else
-            WaitForSingleObject(WaitCond[threadID], INFINITE);
-#endif
         }
 
         // If this thread has been assigned work, launch a search
@@ -2305,11 +2302,7 @@ split_point_start: // At split points actual search starts from here
     lock_init(&WaitLock);
 
     for (i = 0; i < MAX_THREADS; i++)
-#if !defined(_MSC_VER)
-        pthread_cond_init(&WaitCond[i], NULL);
-#else
-        WaitCond[i] = CreateEvent(0, FALSE, FALSE, 0);
-#endif
+        cond_init(&WaitCond[i]);
 
     // Initialize splitPoints[] locks
     for (i = 0; i < MAX_THREADS; i++)