-
-void xbt_os_mutex_timedacquire(xbt_os_mutex_t mutex, double delay)
-{
- int errcode;
-
- if (delay < 0) {
- xbt_os_mutex_acquire(mutex);
-
- } else if (delay == 0) {
- errcode = pthread_mutex_trylock(&(mutex->m));
-
- switch (errcode) {
- case 0:
- return;
- case ETIMEDOUT:
- THROWF(timeout_error, 0, "mutex %p not ready", mutex);
- default:
- THROWF(system_error, errcode,
- "xbt_os_mutex_timedacquire(%p) failed: %s", mutex,
- strerror(errcode));
- }
-
-
- } else {
-
-#ifdef HAVE_MUTEX_TIMEDLOCK
- struct timespec ts_end;
- double end = delay + xbt_os_time();
-
- ts_end.tv_sec = (time_t) floor(end);
- ts_end.tv_nsec = (long) ((end - ts_end.tv_sec) * 1000000000);
- XBT_DEBUG("pthread_mutex_timedlock(%p,%p)", &(mutex->m), &ts_end);
-
- int errcode = pthread_mutex_timedlock(&(mutex->m), &ts_end);
-
-#else /* reimplement it since those lazy libc dudes didn't (Mac OSX, hu?) */
- double start = xbt_os_time();
- do {
- errcode = pthread_mutex_trylock(&(mutex->m));
- if (errcode == EBUSY)
- xbt_os_thread_yield();
- } while (errcode == EBUSY && xbt_os_time() - start < delay);
-
- if (errcode == EBUSY)
- errcode = ETIMEDOUT;
-
-#endif /* HAVE_MUTEX_TIMEDLOCK */
-
- switch (errcode) {
- case 0:
- return;
-
- case ETIMEDOUT:
- THROWF(timeout_error, delay,
- "mutex %p wasn't signaled before timeout (%f)", mutex, delay);
-
- default:
- THROWF(system_error, errcode,
- "pthread_mutex_timedlock(%p,%f) failed: %s", mutex, delay,
- strerror(errcode));
- }
- }
-}
-