#include "mc/mc.h"
#include "src/mc/mc_replay.h"
#include "src/mc/Client.hpp"
-#include "src/simix/smx_private.hpp"
#include "src/msg/msg_private.h"
#include "src/simix/SynchroSleep.hpp"
{
smx_context_t self_context = SIMIX_context_self();
- return self_context ? SIMIX_context_get_process(self_context) : NULL;
+ return self_context ? self_context->process() : NULL;
}
/**
comm->src_proc = NULL;
/* I'm not supposed to destroy a detached comm from the sender side, */
- if (!comm->detached)
- SIMIX_comm_destroy(comm);
+ if (comm->detached)
+ XBT_DEBUG("Don't destroy it since it's a detached comm and I'm the sender");
else
- XBT_DEBUG("Don't destroy it since it's a detached comm");
+ SIMIX_comm_destroy(comm);
}
else if (comm->dst_proc == process){
while ((process = (smx_process_t) xbt_swag_extract(simix_global->process_to_destroy))) {
XBT_DEBUG("Getting rid of %p",process);
- SIMIX_context_free(process->context);
+ delete process->context;
/* Free the exception allocated at creation time */
free(process->running_ctx);
arg->auto_restart);
}
XBT_DEBUG("Process %s (%s) is dead",arg->name,sg_host_get_name(arg->host));
- /* stop the context */
- SIMIX_context_stop(arg->context);
+ arg->context->stop();
}
/**
smx_synchro_t SIMIX_process_suspend(smx_process_t process, smx_process_t issuer)
{
- xbt_assert((process != NULL), "Invalid parameters");
-
if (process->suspended) {
XBT_DEBUG("Process '%s' is already suspended", process->name);
return NULL;
process->suspended = 1;
- /* If we are suspending another process, and it is waiting on a sync, suspend its synchronization. */
+ /* If we are suspending another process that is waiting on a sync, suspend its synchronization. */
if (process != issuer) {
- if (process->waiting_synchro) {
-
- simgrid::simix::Exec *exec = dynamic_cast<simgrid::simix::Exec*>(process->waiting_synchro);
- if (exec != nullptr) {
- SIMIX_execution_suspend(process->waiting_synchro);
- }
-
- simgrid::simix::Comm *comm = dynamic_cast<simgrid::simix::Comm*>(process->waiting_synchro);
- if (comm != nullptr) {
- SIMIX_comm_suspend(process->waiting_synchro);
- }
-
- simgrid::simix::Sleep *sleep = dynamic_cast<simgrid::simix::Sleep*>(process->waiting_synchro);
- if (sleep != nullptr) {
- SIMIX_process_sleep_suspend(process->waiting_synchro);
- }
+ if (process->waiting_synchro)
+ process->waiting_synchro->suspend();
+ /* If the other process is not waiting, its suspension is delayed to when the process is rescheduled. */
- /* The suspension of raw synchros is delayed to when the process is rescheduled. */
- return NULL;
- } else {
- /* If the other process is not waiting, its suspension is delayed to when the process is rescheduled. */
- return NULL;
- }
+ return NULL;
} else {
/* FIXME: computation size is zero. Is it okay that bound is zero ? */
return SIMIX_execution_start(process, "suspend", 0.0, 1.0, 0.0, 0);
if (process != issuer) {
if (process->waiting_synchro) {
- simgrid::simix::Exec *exec = dynamic_cast<simgrid::simix::Exec*>(process->waiting_synchro);
- if (exec != nullptr) {
- SIMIX_execution_resume(process->waiting_synchro);
- }
-
- simgrid::simix::Comm *comm = dynamic_cast<simgrid::simix::Comm*>(process->waiting_synchro);
- if (comm != nullptr) {
- SIMIX_comm_resume(process->waiting_synchro);
- }
-
- simgrid::simix::Sleep *sleep = dynamic_cast<simgrid::simix::Sleep*>(process->waiting_synchro);
- if (sleep != nullptr) {
- SIMIX_process_sleep_resume(process->waiting_synchro);
- }
-
- /* I cannot resume raw synchros now. This is delayed to when the process is rescheduled at
- * the end of the synchro. */
-
+ process->waiting_synchro->resume();
}
} else XBT_WARN("Strange. Process %p is trying to resume himself.", issuer);
}
}
-void SIMIX_process_sleep_suspend(smx_synchro_t synchro)
-{
- simgrid::simix::Sleep *sleep = static_cast<simgrid::simix::Sleep*>(synchro);
- sleep->surf_sleep->suspend();
-}
-
-void SIMIX_process_sleep_resume(smx_synchro_t synchro)
-{
- XBT_DEBUG("Synchro state is %d on process_sleep_resume.", synchro->state);
- simgrid::simix::Sleep *sleep = static_cast<simgrid::simix::Sleep*>(synchro);
-
- sleep->surf_sleep->resume();
-}
-
/**
* \brief Calling this function makes the process to yield.
*
XBT_DEBUG("Yield process '%s'", self->name);
/* Go into sleep and return control to maestro */
- SIMIX_context_suspend(self->context);
+ self->context->suspend();
/* Ok, maestro returned control to us */
XBT_DEBUG("Control returned to me: '%s'", self->name);