win: simplify uv_cond_t type
PR-URL: https://github.com/libuv/libuv/pull/989 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
This commit is contained in:
parent
058d94b2d1
commit
b3c9902dfc
@ -215,22 +215,7 @@ typedef HANDLE uv_sem_t;
|
||||
|
||||
typedef CRITICAL_SECTION uv_mutex_t;
|
||||
|
||||
/* This condition variable implementation is based on the SetEvent solution
|
||||
* (section 3.2) at http://www.cs.wustl.edu/~schmidt/win32-cv-1.html
|
||||
* We could not use the SignalObjectAndWait solution (section 3.4) because
|
||||
* it want the 2nd argument (type uv_mutex_t) of uv_cond_wait() and
|
||||
* uv_cond_timedwait() to be HANDLEs, but we use CRITICAL_SECTIONs.
|
||||
*/
|
||||
|
||||
typedef union {
|
||||
CONDITION_VARIABLE cond_var;
|
||||
struct {
|
||||
unsigned int waiters_count;
|
||||
CRITICAL_SECTION waiters_count_lock;
|
||||
HANDLE signal_event;
|
||||
HANDLE broadcast_event;
|
||||
} fallback;
|
||||
} uv_cond_t;
|
||||
typedef CONDITION_VARIABLE uv_cond_t;
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
|
||||
@ -353,9 +353,7 @@ int uv_sem_trywait(uv_sem_t* sem) {
|
||||
|
||||
|
||||
int uv_cond_init(uv_cond_t* cond) {
|
||||
uv__once_init();
|
||||
|
||||
InitializeConditionVariable(&cond->cond_var);
|
||||
InitializeConditionVariable(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -366,17 +364,17 @@ void uv_cond_destroy(uv_cond_t* cond) {
|
||||
|
||||
|
||||
void uv_cond_signal(uv_cond_t* cond) {
|
||||
WakeConditionVariable(&cond->cond_var);
|
||||
WakeConditionVariable(cond);
|
||||
}
|
||||
|
||||
|
||||
void uv_cond_broadcast(uv_cond_t* cond) {
|
||||
WakeAllConditionVariable(&cond->cond_var);
|
||||
WakeAllConditionVariable(cond);
|
||||
}
|
||||
|
||||
|
||||
void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) {
|
||||
if (!SleepConditionVariableCS(&cond->cond_var, mutex, INFINITE))
|
||||
if (!SleepConditionVariableCS(cond, mutex, INFINITE))
|
||||
abort();
|
||||
}
|
||||
|
||||
@ -384,7 +382,7 @@ void uv_cond_wait(uv_cond_t* cond, uv_mutex_t* mutex) {
|
||||
int uv_cond_timedwait(uv_cond_t* cond,
|
||||
uv_mutex_t* mutex,
|
||||
uint64_t timeout) {
|
||||
if (SleepConditionVariableCS(&cond->cond_var, mutex, (DWORD)(timeout / 1e6)))
|
||||
if (SleepConditionVariableCS(cond, mutex, (DWORD)(timeout / 1e6)))
|
||||
return 0;
|
||||
if (GetLastError() != ERROR_TIMEOUT)
|
||||
abort();
|
||||
|
||||
Loading…
Reference in New Issue
Block a user