Skip to content

Commit

Permalink
Implement pthread_cond_t with Win32 CONDITION_VARIABLE
Browse files Browse the repository at this point in the history
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 <[email protected]>

fast-forwarded.
  • Loading branch information
rongjiecomputer committed Jun 22, 2017
1 parent 8d91d34 commit db39ffd
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
40 changes: 40 additions & 0 deletions compat/win32/pthread.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
4 changes: 4 additions & 0 deletions compat/win32/pthread.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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);
Expand Down

0 comments on commit db39ffd

Please sign in to comment.