X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2e6a2f4d67dd98932d53dade7d9f4a01ded1401d..db5adf7439201fb67d1d697b86806d58ace9fe85:/src/mc/Session.cpp?ds=sidebyside diff --git a/src/mc/Session.cpp b/src/mc/Session.cpp index 162dfc060d..d29fbeb707 100644 --- a/src/mc/Session.cpp +++ b/src/mc/Session.cpp @@ -15,6 +15,8 @@ #include "xbt/log.h" #include "xbt/system_error.hpp" +#include + #include #ifdef __linux__ #include @@ -25,7 +27,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_Session, mc, "Model-checker session"); namespace simgrid { namespace mc { -static void run_child_process(int socket, const std::function& code) +template void run_child_process(int socket, Code code) { /* On startup, simix_global_init() calls simgrid::mc::Client::initialize(), which checks whether the MC_ENV_SOCKET_FD * env variable is set. If so, MC mode is assumed, and the client is setup from its side @@ -64,7 +66,7 @@ Session::Session(const std::function& code) "Please use the dlopen privatization schema when model-checking SMPI code"); #endif - // Create a AF_LOCAL socketpair used for exchanging messages + // Create an AF_LOCAL socketpair used for exchanging messages // between the model-checker process (ourselves) and the model-checked // process: int sockets[2]; @@ -85,8 +87,8 @@ Session::Session(const std::function& code) xbt_assert(mc_model_checker == nullptr, "Did you manage to start the MC twice in this process?"); - auto process = std::unique_ptr(new simgrid::mc::RemoteClient(pid, sockets[1])); - model_checker_.reset(new simgrid::mc::ModelChecker(std::move(process))); + auto process = std::make_unique(pid); + model_checker_ = std::make_unique(std::move(process), sockets[1]); mc_model_checker = model_checker_.get(); model_checker_->start(); @@ -105,18 +107,18 @@ void Session::initialize() initial_snapshot_ = std::make_shared(0); } -void Session::execute(Transition const& transition) +void Session::execute(Transition const& transition) const { model_checker_->handle_simcall(transition); model_checker_->wait_for_requests(); } -void Session::restore_initial_state() +void Session::restore_initial_state() const { - this->initial_snapshot_->restore(&model_checker_->process()); + this->initial_snapshot_->restore(&model_checker_->get_remote_simulation()); } -void Session::log_state() +void Session::log_state() const { model_checker_->getChecker()->log_state(); @@ -141,12 +143,12 @@ void Session::close() } } -bool Session::actor_is_enabled(aid_t pid) +bool Session::actor_is_enabled(aid_t pid) const { s_mc_message_actor_enabled_t msg{MC_MESSAGE_ACTOR_ENABLED, pid}; - model_checker_->process().get_channel().send(msg); + model_checker_->channel().send(msg); char buff[MC_MESSAGE_LENGTH]; - ssize_t received = model_checker_->process().get_channel().receive(buff, MC_MESSAGE_LENGTH, true); + ssize_t received = model_checker_->channel().receive(buff, MC_MESSAGE_LENGTH, true); xbt_assert(received == sizeof(s_mc_message_int_t), "Unexpected size in answer to ACTOR_ENABLED"); return ((s_mc_message_int_t*)buff)->value; }