XBT_PUBLIC void simcall_mutex_unlock(smx_mutex_t mutex);
XBT_PUBLIC smx_cond_t simcall_cond_init();
-XBT_PUBLIC void simcall_cond_signal(smx_cond_t cond);
XBT_PUBLIC void simcall_cond_wait(smx_cond_t cond, smx_mutex_t mutex);
XBT_PUBLIC void simcall_cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double max_duration);
-XBT_PUBLIC void simcall_cond_broadcast(smx_cond_t cond);
XBT_PUBLIC void SIMIX_sem_destroy(smx_sem_t sem);
XBT_PUBLIC void simcall_sem_acquire(smx_sem_t sem);
} // namespace activity
} // namespace kernel
}
-
-XBT_PRIVATE void simcall_HANDLER_cond_signal(smx_simcall_t simcall, smx_cond_t cond)
-{
- cond->signal();
-}
-
-XBT_PRIVATE void simcall_HANDLER_cond_broadcast(smx_simcall_t simcall, smx_cond_t cond)
-{
- cond->broadcast();
-}
} // namespace simgrid
XBT_PRIVATE smx_cond_t SIMIX_cond_init();
-// simcall handlers
-XBT_PRIVATE void simcall_HANDLER_cond_signal(smx_simcall_t simcall, smx_cond_t cond);
-XBT_PRIVATE void simcall_HANDLER_cond_broadcast(smx_simcall_t simcall, smx_cond_t cond);
-
#endif
* Notify functions
*/
void ConditionVariable::notify_one() {
- simcall_cond_signal(cond_);
+ simgrid::simix::kernelImmediate([this]() { cond_->signal(); });
}
void ConditionVariable::notify_all() {
- simcall_cond_broadcast(cond_);
+ simgrid::simix::kernelImmediate([this]() { cond_->broadcast(); });
}
void intrusive_ptr_add_ref(ConditionVariable* cond)
return simcall_BODY_cond_init();
}
-/**
- * \ingroup simix_synchro_management
- *
- */
-void simcall_cond_signal(smx_cond_t cond)
-{
- simcall_BODY_cond_signal(cond);
-}
-
/**
* \ingroup simix_synchro_management
*
simcall_BODY_cond_wait_timeout(cond, mutex, timeout);
}
-/**
- * \ingroup simix_synchro_management
- *
- */
-void simcall_cond_broadcast(smx_cond_t cond)
-{
- simcall_BODY_cond_broadcast(cond);
-}
-
/**
* \ingroup simix_synchro_management
*
simgrid::simix::marshal<smx_cond_t>(simcall->result, result);
}
-static inline smx_cond_t simcall_cond_signal__get__cond(smx_simcall_t simcall)
-{
- return simgrid::simix::unmarshal<smx_cond_t>(simcall->args[0]);
-}
-static inline smx_cond_t simcall_cond_signal__getraw__cond(smx_simcall_t simcall)
-{
- return simgrid::simix::unmarshal_raw<smx_cond_t>(simcall->args[0]);
-}
-static inline void simcall_cond_signal__set__cond(smx_simcall_t simcall, smx_cond_t arg)
-{
- simgrid::simix::marshal<smx_cond_t>(simcall->args[0], arg);
-}
-
static inline smx_cond_t simcall_cond_wait__get__cond(smx_simcall_t simcall)
{
return simgrid::simix::unmarshal<smx_cond_t>(simcall->args[0]);
simgrid::simix::marshal<double>(simcall->args[2], arg);
}
-static inline smx_cond_t simcall_cond_broadcast__get__cond(smx_simcall_t simcall)
-{
- return simgrid::simix::unmarshal<smx_cond_t>(simcall->args[0]);
-}
-static inline smx_cond_t simcall_cond_broadcast__getraw__cond(smx_simcall_t simcall)
-{
- return simgrid::simix::unmarshal_raw<smx_cond_t>(simcall->args[0]);
-}
-static inline void simcall_cond_broadcast__set__cond(smx_simcall_t simcall, smx_cond_t arg)
-{
- simgrid::simix::marshal<smx_cond_t>(simcall->args[0], arg);
-}
-
static inline smx_sem_t simcall_sem_acquire__get__sem(smx_simcall_t simcall)
{
return simgrid::simix::unmarshal<smx_sem_t>(simcall->args[0]);
XBT_PRIVATE void simcall_HANDLER_mutex_lock(smx_simcall_t simcall, smx_mutex_t mutex);
XBT_PRIVATE int simcall_HANDLER_mutex_trylock(smx_simcall_t simcall, smx_mutex_t mutex);
XBT_PRIVATE void simcall_HANDLER_mutex_unlock(smx_simcall_t simcall, smx_mutex_t mutex);
-XBT_PRIVATE void simcall_HANDLER_cond_signal(smx_simcall_t simcall, smx_cond_t cond);
XBT_PRIVATE void simcall_HANDLER_cond_wait(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex);
XBT_PRIVATE void simcall_HANDLER_cond_wait_timeout(smx_simcall_t simcall, smx_cond_t cond, smx_mutex_t mutex, double timeout);
-XBT_PRIVATE void simcall_HANDLER_cond_broadcast(smx_simcall_t simcall, smx_cond_t cond);
XBT_PRIVATE void simcall_HANDLER_sem_acquire(smx_simcall_t simcall, smx_sem_t sem);
XBT_PRIVATE void simcall_HANDLER_sem_acquire_timeout(smx_simcall_t simcall, smx_sem_t sem, double timeout);
XBT_PRIVATE void simcall_HANDLER_storage_read(smx_simcall_t simcall, surf_storage_t st, sg_size_t size);
return simcall<smx_cond_t>(SIMCALL_COND_INIT);
}
-inline static void simcall_BODY_cond_signal(smx_cond_t cond)
-{
- if (0) /* Go to that function to follow the code flow through the simcall barrier */
- simcall_HANDLER_cond_signal(&SIMIX_process_self()->simcall, cond);
- return simcall<void, smx_cond_t>(SIMCALL_COND_SIGNAL, cond);
-}
-
inline static void simcall_BODY_cond_wait(smx_cond_t cond, smx_mutex_t mutex)
{
if (0) /* Go to that function to follow the code flow through the simcall barrier */
return simcall<void, smx_cond_t, smx_mutex_t, double>(SIMCALL_COND_WAIT_TIMEOUT, cond, mutex, timeout);
}
-inline static void simcall_BODY_cond_broadcast(smx_cond_t cond)
-{
- if (0) /* Go to that function to follow the code flow through the simcall barrier */
- simcall_HANDLER_cond_broadcast(&SIMIX_process_self()->simcall, cond);
- return simcall<void, smx_cond_t>(SIMCALL_COND_BROADCAST, cond);
-}
-
inline static void simcall_BODY_sem_acquire(smx_sem_t sem)
{
if (0) /* Go to that function to follow the code flow through the simcall barrier */
SIMCALL_MUTEX_TRYLOCK,
SIMCALL_MUTEX_UNLOCK,
SIMCALL_COND_INIT,
- SIMCALL_COND_SIGNAL,
SIMCALL_COND_WAIT,
SIMCALL_COND_WAIT_TIMEOUT,
- SIMCALL_COND_BROADCAST,
SIMCALL_SEM_ACQUIRE,
SIMCALL_SEM_ACQUIRE_TIMEOUT,
SIMCALL_STORAGE_READ,
"SIMCALL_MUTEX_TRYLOCK",
"SIMCALL_MUTEX_UNLOCK",
"SIMCALL_COND_INIT",
- "SIMCALL_COND_SIGNAL",
"SIMCALL_COND_WAIT",
"SIMCALL_COND_WAIT_TIMEOUT",
- "SIMCALL_COND_BROADCAST",
"SIMCALL_SEM_ACQUIRE",
"SIMCALL_SEM_ACQUIRE_TIMEOUT",
"SIMCALL_STORAGE_READ",
SIMIX_simcall_answer(simcall);
break;
-case SIMCALL_COND_SIGNAL:
- simcall_HANDLER_cond_signal(simcall, simgrid::simix::unmarshal<smx_cond_t>(simcall->args[0]));
- SIMIX_simcall_answer(simcall);
- break;
-
case SIMCALL_COND_WAIT:
simcall_HANDLER_cond_wait(simcall, simgrid::simix::unmarshal<smx_cond_t>(simcall->args[0]), simgrid::simix::unmarshal<smx_mutex_t>(simcall->args[1]));
break;
simcall_HANDLER_cond_wait_timeout(simcall, simgrid::simix::unmarshal<smx_cond_t>(simcall->args[0]), simgrid::simix::unmarshal<smx_mutex_t>(simcall->args[1]), simgrid::simix::unmarshal<double>(simcall->args[2]));
break;
-case SIMCALL_COND_BROADCAST:
- simcall_HANDLER_cond_broadcast(simcall, simgrid::simix::unmarshal<smx_cond_t>(simcall->args[0]));
- SIMIX_simcall_answer(simcall);
- break;
-
case SIMCALL_SEM_ACQUIRE:
simcall_HANDLER_sem_acquire(simcall, simgrid::simix::unmarshal<smx_sem_t>(simcall->args[0]));
break;
void mutex_unlock(smx_mutex_t mutex);
smx_cond_t cond_init() [[nohandler]];
-void cond_signal(smx_cond_t cond);
void cond_wait(smx_cond_t cond, smx_mutex_t mutex) [[block]];
void cond_wait_timeout(smx_cond_t cond, smx_mutex_t mutex, double timeout) [[block]];
-void cond_broadcast(smx_cond_t cond);
void sem_acquire(smx_sem_t sem) [[block]];
void sem_acquire_timeout(smx_sem_t sem, double timeout) [[block]];
void xbt_cond_signal(xbt_cond_t cond)
{
- simcall_cond_signal((smx_cond_t)cond);
+ // FIXME: this should use s4u
+ simgrid::simix::kernelImmediate([cond]() { cond->signal(); });
}
void xbt_cond_broadcast(xbt_cond_t cond)
{
- simcall_cond_broadcast((smx_cond_t)cond);
+ // FIXME: this should use s4u
+ simgrid::simix::kernelImmediate([cond]() { cond->broadcast(); });
}
void xbt_cond_destroy(xbt_cond_t cond)