+
+ 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:
+ THROW1(timeout_error,0,"mutex %p not ready",mutex);
+ default:
+ THROW2(system_error,errcode,"xbt_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);
+ DEBUG2("pthread_mutex_timedlock(%p,%p)",&(mutex->m), &ts_end);
+
+ errcode=pthread_mutex_timedlock(&(mutex->m),&ts_end);
+
+#else /* Well, let's reimplement it since those lazy libc dudes didn't */
+ 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:
+ THROW2(timeout_error,delay,"mutex %p wasn't signaled before timeout (%f)",mutex,delay);
+
+ default:
+ THROW3(system_error,errcode,"pthread_mutex_timedlock(%p,%f) failed: %s",mutex,delay, strerror(errcode));
+ }
+ }
+}
+
+void xbt_os_mutex_release(xbt_os_mutex_t mutex) {
+ int errcode;
+