-void xbt_os_sem_timedacquire(xbt_os_sem_t sem,double timeout)
-{
- int errcode;
- struct timespec ts_end;
- double end = timeout + xbt_os_time();
-
- if(!sem)
- THROW0(arg_error,EINVAL,"Cannot acquire of the NULL semaphore");
-
- if (timeout < 0)
- {
- xbt_os_sem_acquire(sem);
- }
- else if(!timeout)
- {
- #ifndef HAVE_SEM_TIMEDWAIT
- if(sem_trywait(sem->s) < 0)
- THROW2(system_error,errno,"sem_trywait(%p) failed: %s",sem,strerror(errno));
- #else
- if(sem_trywait(&(sem->s) < 0)
- THROW2(system_error,errno,"sem_trywait(%p) failed: %s",sem,strerror(errno));
- #endif
- }
- else
- {
- ts_end.tv_sec = (time_t) floor(end);
- ts_end.tv_nsec = (long) ( ( end - ts_end.tv_sec) * 1000000000);
- DEBUG2("sem_timedwait(%p,%p)",&(sem->s),&ts_end);
-
- #ifndef HAVE_SEM_WAIT
- switch ((errcode = sem_timedwait(sem->s,&ts_end)))
- #else
- switch ((errcode = sem_timedwait(&(sem->s),&ts_end)))
- #endif
- {
- case 0:
- return;
-
- case ETIMEDOUT:
- THROW2(timeout_error,errcode,"semaphore %p wasn't signaled before timeout (%f)",sem,timeout);
-
- default:
- THROW3(system_error,errcode,"sem_timedwait(%p,%f) failed: %s",sem,timeout, strerror(errcode));
- }
- }
-
-}
-
-void
-xbt_os_sem_release(xbt_os_sem_t sem)
-{
- if(!sem)
- THROW0(arg_error,EINVAL,"Cannot release of the NULL semaphore");
-
- #ifndef HAVE_SEM_WAIT
- if(sem_post((sem->s)) < 0)
- THROW1(system_error,errno,"sem_post() failed: %s",
- strerror(errno));
- #else
- if(sem_post(&(sem->s)) < 0)
- THROW1(system_error,errno,"sem_post() failed: %s",
- strerror(errno));
- #endif
-}
-
-void
-xbt_os_sem_destroy(xbt_os_sem_t sem)
-{
- if(!sem)
- THROW0(arg_error,EINVAL,"Cannot destroy the NULL sempahore");
-
- #ifndef HAVE_SEM_WAIT
- /* MAC OS X does not implement the sem_init() function so,
- * we use the named semaphore (sem_open)
- */
- if(sem_close((sem->s)) < 0)
- THROW1(system_error,errno,"sem_close() failed: %s",
- strerror(errno));
-
- xbt_free(sem->name);
-
- #else
- if(sem_destroy(&(sem->s)) < 0)
- THROW1(system_error,errno,"sem_destroy() failed: %s",
- strerror(errno));
- #endif
-
- xbt_free(sem);
-}
-
-void
-xbt_os_sem_get_value(xbt_os_sem_t sem, int* svalue)
-{
- if(!sem)
- THROW0(arg_error,EINVAL,"Cannot get the value of the NULL semaphore");
-
- #ifndef HAVE_SEM_WAIT
- if(sem_getvalue((sem->s),svalue) < 0)
- THROW1(system_error,errno,"sem_getvalue() failed: %s",
- strerror(errno));
- #else
- if(sem_getvalue(&(sem->s),svalue) < 0)
- THROW1(system_error,errno,"sem_getvalue() failed: %s",
- strerror(errno));
- #endif