X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/58cfad482a8c3ff22faee05a3f17bad26b8a5a0c..2f2db04b850386899392bc06568f17f071f8620f:/src/mc/mc_base.cpp diff --git a/src/mc/mc_base.cpp b/src/mc/mc_base.cpp index 236aab7468..c4004224f9 100644 --- a/src/mc/mc_base.cpp +++ b/src/mc/mc_base.cpp @@ -1,68 +1,42 @@ -/* Copyright (c) 2008-2022. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2008-2023. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ #include "src/mc/mc_base.hpp" -#include "mc/mc.h" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/activity/CommImpl.hpp" #include "src/kernel/activity/MutexImpl.hpp" #include "src/kernel/actor/SimcallObserver.hpp" -#include "src/mc/mc_config.hpp" +#include "src/mc/mc.h" #include "src/mc/mc_replay.hpp" -#include "xbt/random.hpp" - #if SIMGRID_HAVE_MC #include "src/mc/ModelChecker.hpp" -#include "src/mc/Session.hpp" -#include "src/mc/remote/RemoteProcess.hpp" - -using simgrid::mc::remote; +#include "src/mc/api/RemoteApp.hpp" +#include "src/mc/remote/AppSide.hpp" +#include "src/mc/sosp/RemoteProcessMemory.hpp" #endif XBT_LOG_NEW_DEFAULT_CATEGORY(mc, "All MC categories"); +bool simgrid_mc_replay_show_backtraces = false; -int MC_random(int min, int max) -{ -#if SIMGRID_HAVE_MC - xbt_assert(mc_model_checker == nullptr); -#endif - if (not MC_is_active() && not MC_record_replay_is_active()) { // no need to do a simcall in this case - static simgrid::xbt::random::XbtRandom prng; - return prng.uniform_int(min, max); - } - simgrid::kernel::actor::RandomSimcall observer{simgrid::kernel::actor::ActorImpl::self(), min, max}; - return simgrid::kernel::actor::simcall([&observer] { return observer.get_value(); }, &observer); -} - -namespace simgrid { -namespace mc { +namespace simgrid::mc { void execute_actors() { auto* engine = kernel::EngineImpl::get_instance(); -#if SIMGRID_HAVE_MC - xbt_assert(mc_model_checker == nullptr, "This must be called from the client"); -#endif + + XBT_DEBUG("execute_actors: %lu of %zu to run (%s)", engine->get_actor_to_run_count(), engine->get_actor_count(), + (MC_record_replay_is_active() ? "replay active" : "no replay")); while (engine->has_actors_to_run()) { engine->run_all_actors(); for (auto const& actor : engine->get_actors_that_ran()) { - const s_smx_simcall* req = &actor->simcall_; - if (req->call_ != simix::Simcall::NONE && not simgrid::mc::request_is_visible(req)) + const kernel::actor::Simcall* req = &actor->simcall_; + if (req->call_ != kernel::actor::Simcall::Type::NONE && not simgrid::mc::request_is_visible(req)) actor->simcall_handle(0); } } -#if SIMGRID_HAVE_MC - engine->reset_actor_dynar(); - for (auto const& kv : engine->get_actor_list()) { - auto actor = kv.second; - if (auto* observer = actor->simcall_.observer_) - actor->simcall_.mc_max_consider_ = observer->get_max_consider(); - engine->add_actor_to_dynar(actor); - } -#endif } /** @brief returns if there this transition can proceed in a finite amount of time @@ -76,25 +50,19 @@ void execute_actors() * transition for ever. * This is controlled in the is_enabled() method of the corresponding observers. */ -// Called from both MCer and MCed: -bool actor_is_enabled(smx_actor_t actor) +bool actor_is_enabled(kernel::actor::ActorImpl* actor) { -// #del #if SIMGRID_HAVE_MC - // If in the MCer, ask the client app since it has all the data - if (mc_model_checker != nullptr) { - return simgrid::mc::session_singleton->actor_is_enabled(actor->get_pid()); - } + xbt_assert(mc_model_checker == nullptr, "This should be called from the client side"); #endif -// # // Now, we are in the client app, no need for remote memory reading. - smx_simcall_t req = &actor->simcall_; + kernel::actor::Simcall* req = &actor->simcall_; if (req->observer_ != nullptr) return req->observer_->is_enabled(); - if (req->call_ == simix::Simcall::NONE) + if (req->call_ == kernel::actor::Simcall::Type::NONE) return false; else /* The rest of the requests are always enabled */ @@ -104,16 +72,14 @@ bool actor_is_enabled(smx_actor_t actor) /* This is the list of requests that are visible from the checker algorithm. * Any other requests are handled right away on the application side. */ -bool request_is_visible(const s_smx_simcall* req) +bool request_is_visible(const kernel::actor::Simcall* req) { #if SIMGRID_HAVE_MC xbt_assert(mc_model_checker == nullptr, "This should be called from the client side"); #endif - if (req->observer_ != nullptr) - return req->observer_->is_visible(); - else + if (req->observer_ == nullptr) return false; + return req->observer_->is_visible(); } -} // namespace mc -} // namespace simgrid +} // namespace simgrid::mc