1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-29 08:13:08 +00:00

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 <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2010-10-17 11:01:55 +01:00
parent 472971f851
commit 8fdc635255
2 changed files with 18 additions and 21 deletions

View 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;
typedef SRWLOCK Lock;
typedef CONDITION_VARIABLE 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);
# 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

View 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++)