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:
parent
472971f851
commit
8fdc635255
2 changed files with 18 additions and 21 deletions
20
src/lock.h
20
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 <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
|
||||
|
||||
|
|
|
@ -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++)
|
||||
|
|
Loading…
Add table
Reference in a new issue