+ xbt_assert(isfinite(timeout), "timeout is not finite!");
+
+ smx_simcall_t simcall = SIMIX_simcall_mine();
+
+ simcall->call = SIMCALL_COND_WAIT_TIMEOUT;
+ simcall->cond_wait_timeout.cond = cond;
+ simcall->cond_wait_timeout.mutex = mutex;
+ simcall->cond_wait_timeout.timeout = timeout;
+
+ SIMIX_simcall_push(simcall->issuer);
+}
+
+void simcall_cond_broadcast(smx_cond_t cond)
+{
+ smx_simcall_t simcall = SIMIX_simcall_mine();
+
+ simcall->call = SIMCALL_COND_BROADCAST;
+ simcall->cond_broadcast.cond = cond;
+
+ SIMIX_simcall_push(simcall->issuer);
+}
+
+
+smx_sem_t simcall_sem_init(int capacity)
+{
+ smx_simcall_t simcall = SIMIX_simcall_mine();
+
+ simcall->call = SIMCALL_SEM_INIT;
+ simcall->sem_init.capacity = capacity;
+
+ SIMIX_simcall_push(simcall->issuer);
+ return simcall->sem_init.result;
+}
+
+void simcall_sem_destroy(smx_sem_t sem)
+{
+ smx_simcall_t simcall = SIMIX_simcall_mine();
+
+ simcall->call = SIMCALL_SEM_DESTROY;
+ simcall->sem_destroy.sem = sem;
+
+ SIMIX_simcall_push(simcall->issuer);
+}
+
+void simcall_sem_release(smx_sem_t sem)
+{
+ smx_simcall_t simcall = SIMIX_simcall_mine();