31 pthread_mutex_init(&waiter->mutex, NULL);
32 pthread_cond_init(&waiter->ready_cond, NULL);
38 pthread_mutex_lock(&waiter->mutex);
41 if (waiter->num_waiting > 0) {
42 pthread_cond_signal(&waiter->ready_cond);
45 pthread_mutex_unlock(&waiter->mutex);
51 pthread_mutex_lock(&waiter->mutex);
53 waiter->num_waiting++;
55 struct timeval tv_current_time;
56 gettimeofday(&tv_current_time, NULL);
57 struct timespec ts_expire_time = {
58 .tv_sec = tv_current_time.tv_sec + max_wait_sec,
59 .tv_nsec = tv_current_time.tv_usec * 1000,
63 while (!waiter->ready && rc == 0) {
64 rc = pthread_cond_timedwait(&waiter->ready_cond, &waiter->mutex, &ts_expire_time);
66 waiter->num_waiting--;
68 pthread_mutex_unlock(&waiter->mutex);
76 pthread_mutex_destroy(&waiter->mutex);
77 pthread_cond_destroy(&waiter->ready_cond);
void KineticResourceWaiter_SetAvailable(KineticResourceWaiter *const waiter)
#define KINETIC_ASSERT(cond)
bool KineticResourceWaiter_WaitTilAvailable(KineticResourceWaiter *const waiter, uint32_t max_wait_sec)
void KineticResourceWaiter_Init(KineticResourceWaiter *const waiter)
void KineticResourceWaiter_Destroy(KineticResourceWaiter *const waiter)