Lines Matching refs:cond
140 int cnd_init(cnd_t *cond)
143 cond->mWaitersCount = 0;
146 InitializeCriticalSection(&cond->mWaitersCountLock);
149 cond->mEvents[_CONDITION_EVENT_ONE] = CreateEvent(NULL, FALSE, FALSE, NULL);
150 if (cond->mEvents[_CONDITION_EVENT_ONE] == NULL)
152 cond->mEvents[_CONDITION_EVENT_ALL] = NULL;
155 cond->mEvents[_CONDITION_EVENT_ALL] = CreateEvent(NULL, TRUE, FALSE, NULL);
156 if (cond->mEvents[_CONDITION_EVENT_ALL] == NULL)
158 CloseHandle(cond->mEvents[_CONDITION_EVENT_ONE]);
159 cond->mEvents[_CONDITION_EVENT_ONE] = NULL;
165 return pthread_cond_init(cond, NULL) == 0 ? thrd_success : thrd_error;
169 void cnd_destroy(cnd_t *cond)
172 if (cond->mEvents[_CONDITION_EVENT_ONE] != NULL)
174 CloseHandle(cond->mEvents[_CONDITION_EVENT_ONE]);
176 if (cond->mEvents[_CONDITION_EVENT_ALL] != NULL)
178 CloseHandle(cond->mEvents[_CONDITION_EVENT_ALL]);
180 DeleteCriticalSection(&cond->mWaitersCountLock);
182 pthread_cond_destroy(cond);
186 int cnd_signal(cnd_t *cond)
192 EnterCriticalSection(&cond->mWaitersCountLock);
193 haveWaiters = (cond->mWaitersCount > 0);
194 LeaveCriticalSection(&cond->mWaitersCountLock);
199 if (SetEvent(cond->mEvents[_CONDITION_EVENT_ONE]) == 0)
207 return pthread_cond_signal(cond) == 0 ? thrd_success : thrd_error;
211 int cnd_broadcast(cnd_t *cond)
217 EnterCriticalSection(&cond->mWaitersCountLock);
218 haveWaiters = (cond->mWaitersCount > 0);
219 LeaveCriticalSection(&cond->mWaitersCountLock);
224 if (SetEvent(cond->mEvents[_CONDITION_EVENT_ALL]) == 0)
232 return pthread_cond_signal(cond) == 0 ? thrd_success : thrd_error;
237 static int _cnd_timedwait_win32(cnd_t *cond, mtx_t *mtx, DWORD timeout)
242 EnterCriticalSection(&cond->mWaitersCountLock);
243 ++ cond->mWaitersCount;
244 LeaveCriticalSection(&cond->mWaitersCountLock);
252 result = WaitForMultipleObjects(2, cond->mEvents, FALSE, timeout);
263 EnterCriticalSection(&cond->mWaitersCountLock);
264 -- cond->mWaitersCount;
266 (cond->mWaitersCount == 0);
267 LeaveCriticalSection(&cond->mWaitersCountLock);
272 if (ResetEvent(cond->mEvents[_CONDITION_EVENT_ALL]) == 0)
285 int cnd_wait(cnd_t *cond, mtx_t *mtx)
288 return _cnd_timedwait_win32(cond, mtx, INFINITE);
290 return pthread_cond_wait(cond, mtx) == 0 ? thrd_success : thrd_error;
294 int cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts)
302 return _cnd_timedwait_win32(cond, mtx, delta);
308 ret = pthread_cond_timedwait(cond, mtx, ts);