Lines Matching refs:cond

171 static void impl_cond_do_signal(cnd_t *cond, int broadcast)
175 EnterCriticalSection(&cond->monitor);
176 if (cond->to_unblock != 0) {
177 if (cond->blocked == 0) {
178 LeaveCriticalSection(&cond->monitor);
182 cond->to_unblock += nsignal = cond->blocked;
183 cond->blocked = 0;
186 cond->to_unblock++;
187 cond->blocked--;
189 } else if (cond->blocked > cond->gone) {
190 WaitForSingleObject(cond->sem_gate, INFINITE);
191 if (cond->gone != 0) {
192 cond->blocked -= cond->gone;
193 cond->gone = 0;
196 nsignal = cond->to_unblock = cond->blocked;
197 cond->blocked = 0;
199 nsignal = cond->to_unblock = 1;
200 cond->blocked--;
203 LeaveCriticalSection(&cond->monitor);
206 ReleaseSemaphore(cond->sem_queue, nsignal, NULL);
209 static int impl_cond_do_wait(cnd_t *cond, mtx_t *mtx, const xtime *xt)
216 WaitForSingleObject(cond->sem_gate, INFINITE);
217 cond->blocked++;
218 ReleaseSemaphore(cond->sem_gate, 1, NULL);
222 w = WaitForSingleObject(cond->sem_queue, xt ? impl_xtime2msec(xt) : INFINITE);
225 EnterCriticalSection(&cond->monitor);
226 if ((nleft = cond->to_unblock) != 0) {
228 if (cond->blocked != 0) {
229 cond->blocked--;
231 cond->gone++;
234 if (--cond->to_unblock == 0) {
235 if (cond->blocked != 0) {
236 ReleaseSemaphore(cond->sem_gate, 1, NULL);
239 else if ((ngone = cond->gone) != 0) {
240 cond->gone = 0;
243 } else if (++cond->gone == INT_MAX/2) {
244 WaitForSingleObject(cond->sem_gate, INFINITE);
245 cond->blocked -= cond->gone;
246 ReleaseSemaphore(cond->sem_gate, 1, NULL);
247 cond->gone = 0;
249 LeaveCriticalSection(&cond->monitor);
253 WaitForSingleObject(cond->sem_queue, INFINITE);
254 ReleaseSemaphore(cond->sem_gate, 1, NULL);
323 cnd_broadcast(cnd_t *cond)
325 if (!cond) return thrd_error;
327 WakeAllConditionVariable(&cond->condvar);
329 impl_cond_do_signal(cond, 1);
336 cnd_destroy(cnd_t *cond)
338 assert(cond);
342 CloseHandle(cond->sem_queue);
343 CloseHandle(cond->sem_gate);
344 DeleteCriticalSection(&cond->monitor);
350 cnd_init(cnd_t *cond)
352 if (!cond) return thrd_error;
354 InitializeConditionVariable(&cond->condvar);
356 cond->blocked = 0;
357 cond->gone = 0;
358 cond->to_unblock = 0;
359 cond->sem_queue = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
360 cond->sem_gate = CreateSemaphore(NULL, 1, 1, NULL);
361 InitializeCriticalSection(&cond->monitor);
368 cnd_signal(cnd_t *cond)
370 if (!cond) return thrd_error;
372 WakeConditionVariable(&cond->condvar);
374 impl_cond_do_signal(cond, 0);
381 cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt)
383 if (!cond || !mtx || !xt) return thrd_error;
385 if (SleepConditionVariableCS(&cond->condvar, mtx, impl_xtime2msec(xt)))
389 return impl_cond_do_wait(cond, mtx, xt);
395 cnd_wait(cnd_t *cond, mtx_t *mtx)
397 if (!cond || !mtx) return thrd_error;
399 SleepConditionVariableCS(&cond->condvar, mtx, INFINITE);
401 impl_cond_do_wait(cond, mtx, NULL);