| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| void cl_event_construct(IN cl_event_t * p_event) |
| { |
| CL_ASSERT(p_event); |
| |
| p_event->state = CL_UNINITIALIZED; |
| } |
| |
| cl_status_t cl_event_init(IN cl_event_t * const p_event, |
| IN const boolean_t manual_reset) |
| { |
| CL_ASSERT(p_event); |
| |
| cl_event_construct(p_event); |
| |
| pthread_cond_init(&p_event->condvar, NULL); |
| pthread_mutex_init(&p_event->mutex, NULL); |
| p_event->signaled = FALSE; |
| p_event->manual_reset = manual_reset; |
| p_event->state = CL_INITIALIZED; |
| |
| return CL_SUCCESS; |
| } |
| |
| void cl_event_destroy(IN cl_event_t * const p_event) |
| { |
| CL_ASSERT(cl_is_state_valid(p_event->state)); |
| |
| |
| if (p_event->state == CL_INITIALIZED) { |
| pthread_cond_broadcast(&p_event->condvar); |
| pthread_cond_destroy(&p_event->condvar); |
| pthread_mutex_destroy(&p_event->mutex); |
| } |
| |
| p_event->state = CL_UNINITIALIZED; |
| } |
| |
| cl_status_t cl_event_signal(IN cl_event_t * const p_event) |
| { |
| |
| CL_ASSERT(p_event->state == CL_INITIALIZED); |
| |
| pthread_mutex_lock(&p_event->mutex); |
| p_event->signaled = TRUE; |
| |
| if (p_event->manual_reset) |
| pthread_cond_broadcast(&p_event->condvar); |
| else |
| pthread_cond_signal(&p_event->condvar); |
| |
| pthread_mutex_unlock(&p_event->mutex); |
| |
| return CL_SUCCESS; |
| } |
| |
| cl_status_t cl_event_reset(IN cl_event_t * const p_event) |
| { |
| |
| CL_ASSERT(p_event->state == CL_INITIALIZED); |
| |
| pthread_mutex_lock(&p_event->mutex); |
| p_event->signaled = FALSE; |
| pthread_mutex_unlock(&p_event->mutex); |
| |
| return CL_SUCCESS; |
| } |
| |
| cl_status_t cl_event_wait_on(IN cl_event_t * const p_event, |
| IN const uint32_t wait_us, |
| IN const boolean_t interruptible) |
| { |
| cl_status_t status; |
| int wait_ret; |
| struct timespec timeout; |
| struct timeval curtime; |
| |
| |
| CL_ASSERT(p_event->state == CL_INITIALIZED); |
| |
| pthread_mutex_lock(&p_event->mutex); |
| |
| |
| if (p_event->signaled) { |
| if (!p_event->manual_reset) |
| p_event->signaled = FALSE; |
| |
| pthread_mutex_unlock(&p_event->mutex); |
| return CL_SUCCESS; |
| } |
| |
| |
| if (wait_us == 0) { |
| pthread_mutex_unlock(&p_event->mutex); |
| return CL_TIMEOUT; |
| } |
| |
| if (wait_us == EVENT_NO_TIMEOUT) { |
| |
| if (pthread_cond_wait(&p_event->condvar, &p_event->mutex)) |
| status = CL_NOT_DONE; |
| else |
| status = CL_SUCCESS; |
| } else { |
| |
| if (gettimeofday(&curtime, NULL) == 0) { |
| unsigned long n_sec = |
| (curtime.tv_usec + (wait_us % 1000000)) * 1000; |
| timeout.tv_sec = curtime.tv_sec + (wait_us / 1000000) |
| + (n_sec / 1000000000); |
| timeout.tv_nsec = n_sec % 1000000000; |
| |
| wait_ret = pthread_cond_timedwait(&p_event->condvar, |
| &p_event->mutex, |
| &timeout); |
| if (wait_ret == 0) |
| status = |
| (p_event-> |
| signaled ? CL_SUCCESS : CL_NOT_DONE); |
| else if (wait_ret == ETIMEDOUT) |
| status = CL_TIMEOUT; |
| else |
| status = CL_NOT_DONE; |
| } else |
| status = CL_ERROR; |
| } |
| if (!p_event->manual_reset) |
| p_event->signaled = FALSE; |
| |
| pthread_mutex_unlock(&p_event->mutex); |
| return status; |
| } |