X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e2bc3b5da67548cb7210dbdf6297650a429c8836..ed6dd6d6767dcd55696f847b7436ff28f9dbd664:/src/kernel/EngineImpl.cpp diff --git a/src/kernel/EngineImpl.cpp b/src/kernel/EngineImpl.cpp index f2d531df8b..39f49ee81b 100644 --- a/src/kernel/EngineImpl.cpp +++ b/src/kernel/EngineImpl.cpp @@ -44,15 +44,6 @@ config::Flag cfg_breakpoint{"debug/breakpoint", "When non-negative, raise a SIGTRAP after given (simulated) time", -1.0}; config::Flag cfg_verbose_exit{"debug/verbose-exit", "Display the actor status at exit", true}; -xbt_dynar_t get_actors_addr() -{ -#if SIMGRID_HAVE_MC - return EngineImpl::get_instance()->get_actors_vector(); -#else - xbt_die("This function is intended to be used when compiling with MC"); -#endif -} - constexpr std::initializer_list> context_factories = { #if HAVE_RAW_CONTEXTS {"raw", &context::raw_factory}, @@ -211,7 +202,7 @@ void EngineImpl::initialize(int* argc, char** argv) // The communication initialization is done ASAP, as we need to get some init parameters from the MC for different // layers. But instance_ needs to be created, as we send the address of some of its fields to the MC that wants to // read them directly. - simgrid::mc::AppSide::initialize(); + simgrid::mc::AppSide::initialize(actors_vector_); #endif if (xbt_initialized == 0) { @@ -342,6 +333,12 @@ void EngineImpl::shutdown() void EngineImpl::seal_platform() const { + /* Seal only once */ + static bool sealed = false; + if (sealed) + return; + sealed = true; + /* sealing resources before run: links */ for (auto const& kv : links_) kv.second->get_iface()->seal(); @@ -456,6 +453,10 @@ void EngineImpl::run_all_actors() { instance_->get_context_factory()->run_all(); + for (auto const& actor : actors_to_run_) + if (actor->context_->to_be_freed()) + actor->cleanup_from_kernel(); + actors_to_run_.swap(actors_that_ran_); actors_to_run_.clear(); } @@ -690,6 +691,15 @@ void EngineImpl::run(double max_date) { seal_platform(); + if (MC_is_active()) { +#if SIMGRID_HAVE_MC + mc::AppSide::get()->main_loop(); +#else + xbt_die("MC_is_active() is not supposed to return true in non-MC settings"); +#endif + THROW_IMPOSSIBLE; // main_loop never returns + } + if (MC_record_replay_is_active()) { mc::RecordTrace::replay(MC_record_path()); empty_trash(); @@ -743,11 +753,9 @@ void EngineImpl::run(double max_date) * and would thus be a pure waste of time. */ - for (auto const& actor : actors_that_ran_) { - if (actor->simcall_.call_ != actor::Simcall::Type::NONE) { + for (auto const& actor : actors_that_ran_) + if (actor->simcall_.call_ != actor::Simcall::Type::NONE) actor->simcall_handle(0); - } - } execute_tasks(); do {