static THREAD_FN wait_for_condition(void *arg) { struct alerted_record *rec = arg; int r; EVLOCK_LOCK(rec->cond->lock, 0); if (rec->delay.tv_sec || rec->delay.tv_usec) { r = EVTHREAD_COND_WAIT_TIMED(rec->cond->cond, rec->cond->lock, &rec->delay); } else { r = EVTHREAD_COND_WAIT(rec->cond->cond, rec->cond->lock); } EVLOCK_UNLOCK(rec->cond->lock, 0); evutil_gettimeofday(&rec->alerted_at, NULL); if (r == 1) rec->timed_out = 1; THREAD_RETURN(); }
static int count_wait_for(int i, int ms) { struct timeval tv; DWORD elapsed; int rv = -1; EVLOCK_LOCK(count_lock, 0); while (ms > 0 && count != i) { tv.tv_sec = 0; tv.tv_usec = ms * 1000; elapsed = GetTickCount(); EVTHREAD_COND_WAIT_TIMED(count_cond, count_lock, &tv); elapsed = GetTickCount() - elapsed; ms -= elapsed; } if (count == i) rv = 0; EVLOCK_UNLOCK(count_lock, 0); return rv; }