-/***** condition related functions *****/
-typedef struct xbt_os_cond_ {
- pthread_cond_t c;
-} s_xbt_os_cond_t;
-
-xbt_os_cond_t xbt_os_cond_init(void)
-{
- xbt_os_cond_t res = xbt_new(s_xbt_os_cond_t, 1);
- int errcode = pthread_cond_init(&(res->c), NULL);
- xbt_assert(errcode==0, "pthread_cond_init() failed: %s", strerror(errcode));
- return res;
-}
-
-void xbt_os_cond_wait(xbt_os_cond_t cond, xbt_os_mutex_t mutex)
-{
- int errcode = pthread_cond_wait(&(cond->c), &(mutex->m));
- xbt_assert(errcode==0, "pthread_cond_wait(%p,%p) failed: %s", cond, mutex, strerror(errcode));
-}
-
-
-void xbt_os_cond_timedwait(xbt_os_cond_t cond, xbt_os_mutex_t mutex, double delay)
-{
- int errcode;
- struct timespec ts_end;
- double end = delay + xbt_os_time();
-
- if (delay < 0) {
- xbt_os_cond_wait(cond, mutex);
- } else {
- ts_end.tv_sec = (time_t) floor(end);
- ts_end.tv_nsec = (long) ((end - ts_end.tv_sec) * 1000000000);
- XBT_DEBUG("pthread_cond_timedwait(%p,%p,%p)", &(cond->c), &(mutex->m), &ts_end);
- switch ((errcode = pthread_cond_timedwait(&(cond->c), &(mutex->m), &ts_end))) {
- case 0:
- return;
- case ETIMEDOUT:
- THROWF(timeout_error, errcode,
- "condition %p (mutex %p) wasn't signaled before timeout (%f)",
- cond, mutex, delay);
- default:
- THROWF(system_error, errcode, "pthread_cond_timedwait(%p,%p,%f) failed: %s", cond, mutex, delay, strerror(errcode));
- }
- }
-}
-
-void xbt_os_cond_signal(xbt_os_cond_t cond)
-{
- int errcode = pthread_cond_signal(&(cond->c));
- xbt_assert(errcode==0, "pthread_cond_signal(%p) failed: %s", cond, strerror(errcode));
-}
-
-void xbt_os_cond_broadcast(xbt_os_cond_t cond)
-{
- int errcode = pthread_cond_broadcast(&(cond->c));
- xbt_assert(errcode==0, "pthread_cond_broadcast(%p) failed: %s", cond, strerror(errcode));
-}
-
-void xbt_os_cond_destroy(xbt_os_cond_t cond)
-{
- if (!cond)
- return;
-
- int errcode = pthread_cond_destroy(&(cond->c));
- xbt_assert(errcode==0, "pthread_cond_destroy(%p) failed: %s", cond, strerror(errcode));
- free(cond);
-}
-