Implement pthread_cond_t with Win32 CONDITION_VARIABLE

Win32 CONDITION_VARIABLE has better performance and is easier to
maintain.

Since CONDITION_VARIABLE is not available in Windows XP and below,
old implementation of pthread_cond_t is kept under define guard
'GIT_WIN_XP_SUPPORT'. To enable old implementation, build with
make CFLAGS="-DGIT_WIN_XP_SUPPORT".

Signed-off-by: Loo Rong Jie <loorongjie@gmail.com>

fast-forwarded.
This commit is contained in:
Loo Rong Jie
2017-06-22 09:03:29 +08:00
committed by Jameson Miller
parent 0d848d696a
commit 034a23fac9
2 changed files with 44 additions and 0 deletions

View File

@@ -57,6 +57,8 @@ pthread_t pthread_self(void)
return t;
}
#ifdef GIT_WIN_XP_SUPPORT
int pthread_cond_init(pthread_cond_t *cond, const void *unused)
{
cond->waiters = 0;
@@ -194,3 +196,41 @@ int pthread_cond_broadcast(pthread_cond_t *cond)
}
return 0;
}
#else // GIT_WIN_XP_SUPPORT
WINBASEAPI VOID WINAPI InitializeConditionVariable (PCONDITION_VARIABLE ConditionVariable);
WINBASEAPI VOID WINAPI WakeConditionVariable (PCONDITION_VARIABLE ConditionVariable);
WINBASEAPI VOID WINAPI WakeAllConditionVariable (PCONDITION_VARIABLE ConditionVariable);
WINBASEAPI WINBOOL WINAPI SleepConditionVariableCS (PCONDITION_VARIABLE ConditionVariable, PCRITICAL_SECTION CriticalSection, DWORD dwMilliseconds);
int pthread_cond_init(pthread_cond_t *cond, const void *unused)
{
InitializeConditionVariable(cond);
return 0;
}
int pthread_cond_destroy(pthread_cond_t *cond)
{
return 0;
}
int pthread_cond_wait(pthread_cond_t *cond, CRITICAL_SECTION *mutex)
{
SleepConditionVariableCS(cond, mutex, INFINITE);
return 0;
}
int pthread_cond_signal(pthread_cond_t *cond)
{
WakeConditionVariable(cond);
return 0;
}
int pthread_cond_broadcast(pthread_cond_t *cond)
{
WakeAllConditionVariable(cond);
return 0;
}
#endif // GIT_WIN_XP_SUPPORT

View File

@@ -32,6 +32,7 @@ typedef int pthread_mutexattr_t;
#define pthread_mutexattr_settype(a, t) 0
#define PTHREAD_MUTEX_RECURSIVE 0
#ifdef GIT_WIN_XP_SUPPORT
/*
* Implement simple condition variable for Windows threads, based on ACE
* implementation.
@@ -47,6 +48,9 @@ typedef struct {
HANDLE sema;
HANDLE continue_broadcast;
} pthread_cond_t;
#else
typedef CONDITION_VARIABLE pthread_cond_t;
#endif
extern int pthread_cond_init(pthread_cond_t *cond, const void *unused);
extern int pthread_cond_destroy(pthread_cond_t *cond);