Lines Matching refs:cond
175 static void impl_cond_do_signal(cnd_t *cond, int broadcast)
179 EnterCriticalSection(&cond->monitor);
180 if (cond->to_unblock != 0) {
181 if (cond->blocked == 0) {
182 LeaveCriticalSection(&cond->monitor);
186 cond->to_unblock += nsignal = cond->blocked;
187 cond->blocked = 0;
190 cond->to_unblock++;
191 cond->blocked--;
193 } else if (cond->blocked > cond->gone) {
194 WaitForSingleObject(cond->sem_gate, INFINITE);
195 if (cond->gone != 0) {
196 cond->blocked -= cond->gone;
197 cond->gone = 0;
200 nsignal = cond->to_unblock = cond->blocked;
201 cond->blocked = 0;
203 nsignal = cond->to_unblock = 1;
204 cond->blocked--;
207 LeaveCriticalSection(&cond->monitor);
210 ReleaseSemaphore(cond->sem_queue, nsignal, NULL);
213 static int impl_cond_do_wait(cnd_t *cond, mtx_t *mtx, const struct timespec *ts)
220 WaitForSingleObject(cond->sem_gate, INFINITE);
221 cond->blocked++;
222 ReleaseSemaphore(cond->sem_gate, 1, NULL);
226 w = WaitForSingleObject(cond->sem_queue, ts ? impl_timespec2msec(ts) : INFINITE);
229 EnterCriticalSection(&cond->monitor);
230 if ((nleft = cond->to_unblock) != 0) {
232 if (cond->blocked != 0) {
233 cond->blocked--;
235 cond->gone++;
238 if (--cond->to_unblock == 0) {
239 if (cond->blocked != 0) {
240 ReleaseSemaphore(cond->sem_gate, 1, NULL);
243 else if ((ngone = cond->gone) != 0) {
244 cond->gone = 0;
247 } else if (++cond->gone == INT_MAX/2) {
248 WaitForSingleObject(cond->sem_gate, INFINITE);
249 cond->blocked -= cond->gone;
250 ReleaseSemaphore(cond->sem_gate, 1, NULL);
251 cond->gone = 0;
253 LeaveCriticalSection(&cond->monitor);
257 WaitForSingleObject(cond->sem_queue, INFINITE);
258 ReleaseSemaphore(cond->sem_gate, 1, NULL);
327 cnd_broadcast(cnd_t *cond)
329 if (!cond) return thrd_error;
331 WakeAllConditionVariable(&cond->condvar);
333 impl_cond_do_signal(cond, 1);
340 cnd_destroy(cnd_t *cond)
342 assert(cond);
346 CloseHandle(cond->sem_queue);
347 CloseHandle(cond->sem_gate);
348 DeleteCriticalSection(&cond->monitor);
354 cnd_init(cnd_t *cond)
356 if (!cond) return thrd_error;
358 InitializeConditionVariable(&cond->condvar);
360 cond->blocked = 0;
361 cond->gone = 0;
362 cond->to_unblock = 0;
363 cond->sem_queue = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
364 cond->sem_gate = CreateSemaphore(NULL, 1, 1, NULL);
365 InitializeCriticalSection(&cond->monitor);
372 cnd_signal(cnd_t *cond)
374 if (!cond) return thrd_error;
376 WakeConditionVariable(&cond->condvar);
378 impl_cond_do_signal(cond, 0);
385 cnd_timedwait(cnd_t *cond, mtx_t *mtx, const struct timespec *abs_time)
387 if (!cond || !mtx || !abs_time) return thrd_error;
389 if (SleepConditionVariableCS(&cond->condvar, mtx, impl_timespec2msec(abs_time)))
393 return impl_cond_do_wait(cond, mtx, abs_time);
399 cnd_wait(cnd_t *cond, mtx_t *mtx)
401 if (!cond || !mtx) return thrd_error;
403 SleepConditionVariableCS(&cond->condvar, mtx, INFINITE);
405 impl_cond_do_wait(cond, mtx, NULL);