From 8fdc63525563f9a130b8356811a13746ab013f0f Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 17 Oct 2010 11:01:55 +0100 Subject: [PATCH] Use fast SRWLOCK locks under Windows 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 --- src/lock.h | 22 +++++++++++++--------- src/search.cpp | 19 ++++++------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/lock.h b/src/lock.h index 82726517..489a5663 100644 --- a/src/lock.h +++ b/src/lock.h @@ -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 #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 diff --git a/src/search.cpp b/src/search.cpp index b3d54fb0..b303d31f 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -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++) -- 2.39.2