X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/02a0b077329593921105001a7f27463ba2d82ced..5843ccab4e336d47ca34f54e68760ac78d242f36:/src/kernel/EngineImpl.cpp diff --git a/src/kernel/EngineImpl.cpp b/src/kernel/EngineImpl.cpp index c27e814ea9..8b7b60a0cd 100644 --- a/src/kernel/EngineImpl.cpp +++ b/src/kernel/EngineImpl.cpp @@ -8,26 +8,28 @@ #include #include #include -#include -#include "mc/mc.h" #include "src/kernel/EngineImpl.hpp" #include "src/kernel/resource/StandardLinkImpl.hpp" #include "src/kernel/resource/profile/Profile.hpp" +#include "src/kernel/xml/platf.hpp" +#include "src/mc/mc.h" +#include "src/mc/mc_config.hpp" #include "src/mc/mc_record.hpp" #include "src/mc/mc_replay.hpp" +#include "src/simgrid/math_utils.h" +#include "src/simgrid/sg_config.hpp" #include "src/smpi/include/smpi_actor.hpp" -#include "src/surf/xml/platf.hpp" -#include "xbt/module.h" -#include "xbt/xbt_modinter.h" /* whether initialization was already done */ - -#include -#include #if SIMGRID_HAVE_MC #include "src/mc/remote/AppSide.hpp" #endif +#include "xbt/log.hpp" + +#include +#include + XBT_LOG_NEW_DEFAULT_CATEGORY(ker_engine, "Logging specific to Engine (kernel)"); namespace simgrid::kernel { @@ -138,6 +140,9 @@ static void install_signal_handlers() } } +static simgrid::config::Flag cfg_dbg_clean_atexit{ + "debug/clean-atexit", "Whether to cleanup SimGrid at exit. Disable it if your code segfaults after its end.", true}; + namespace simgrid::kernel { EngineImpl::~EngineImpl() @@ -150,6 +155,9 @@ EngineImpl::~EngineImpl() for (auto const& [_, mailbox] : mailboxes_) delete mailbox; + for (auto const& [_, queue] : mqueues_) + delete queue; + /* Kill all actors (but maestro) */ maestro_->kill_all(); run_all_actors(); @@ -171,23 +179,25 @@ 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::get(); // To ensure that it's initialized #endif - if (xbt_initialized == 0) { - xbt_init(argc, argv); + if (static bool inited = false; not inited) { + inited = true; + xbt_log_init(argc, argv); + + simgrid::xbt::install_exception_handler(); sg_config_init(argc, argv); } + cmdline_.assign(argv, argv + *argc); + instance_->context_mod_init(); install_signal_handlers(); - /* register a function to be called by SURF after the environment creation */ - s4u::Engine::on_platform_created_cb([this]() { this->presolve(); }); - - if (config::get_value("debug/clean-atexit")) + if (cfg_dbg_clean_atexit) atexit(shutdown); } @@ -313,9 +323,9 @@ void EngineImpl::load_deployment(const std::string& file) const { sg_platf_parser_finalize(); - surf_parse_open(file); - surf_parse(); - surf_parse_close(); + simgrid_parse_open(file); + simgrid_parse(false); + simgrid_parse_close(); } void EngineImpl::register_function(const std::string& name, const actor::ActorCodeFactory& code) @@ -341,7 +351,7 @@ void EngineImpl::add_model(std::shared_ptr model, const std::ve models_prio_[model_name] = std::move(model); } -/** Wake up all actors waiting for a Surf action to finish */ +/** Wake up all actors waiting for an action to finish */ void EngineImpl::handle_ended_actions() const { for (auto const& model : models_) { @@ -349,24 +359,27 @@ void EngineImpl::handle_ended_actions() const while (auto* action = model->extract_failed_action()) { XBT_DEBUG(" Handling Action %p", action); if (action->get_activity() != nullptr) { // Skip vcpu actions + activity::ActivityImplPtr activity(action->get_activity()); // Action failures are not automatically reported when the action is started by maestro (as in SimDAG) - if (action->get_activity()->get_actor() == maestro_) - action->get_activity()->get_iface()->complete(s4u::Activity::State::FAILED); + if (activity->get_actor() == maestro_) + activity->get_iface()->complete(s4u::Activity::State::FAILED); - activity::ActivityImplPtr(action->get_activity())->post(); + activity->finish(); } } XBT_DEBUG("Handling the terminated actions (if any)"); while (auto* action = model->extract_done_action()) { XBT_DEBUG(" Handling Action %p", action); if (action->get_activity() != nullptr) { + activity::ActivityImplPtr activity(action->get_activity()); + // Action termination are not automatically reported when the action is started by maestro (as in SimDAG) - action->get_activity()->set_finish_time(action->get_finish_time()); + activity->set_finish_time(action->get_finish_time()); - if (action->get_activity()->get_actor() == maestro_) - action->get_activity()->get_iface()->complete(s4u::Activity::State::FINISHED); + if (activity->get_actor() == maestro_) + activity->get_iface()->complete(s4u::Activity::State::FINISHED); - activity::ActivityImplPtr(action->get_activity())->post(); + activity->finish(); } } } @@ -443,6 +456,9 @@ void EngineImpl::display_all_actor_status() const if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) synchro_description = "communication"; + if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) + synchro_description = "message"; + if (boost::dynamic_pointer_cast(actor->waiting_synchro_) != nullptr) synchro_description = "sleeping"; @@ -467,27 +483,6 @@ void EngineImpl::display_all_actor_status() const } } -void EngineImpl::presolve() const -{ - XBT_DEBUG("Consume all trace events occurring before the starting time."); - double next_event_date; - while ((next_event_date = profile::future_evt_set.next_date()) != -1.0) { - if (next_event_date > now_) - break; - - double value = -1.0; - resource::Resource* resource = nullptr; - while (auto* event = profile::future_evt_set.pop_leq(next_event_date, &value, &resource)) { - if (value >= 0) - resource->apply_event(event, value); - } - } - - XBT_DEBUG("Set every models in the right state by updating them to 0."); - for (auto const& model : models_) - model->update_actions_state(now_, 0.0); -} - double EngineImpl::solve(double max_date) const { double time_delta = -1.0; /* duration */ @@ -501,10 +496,10 @@ double EngineImpl::solve(double max_date) const } XBT_DEBUG("Looking for next event in all models"); - for (auto model : models_) { - if (not model->next_occurring_event_is_idempotent()) { + for (auto* model : models_) { + if (not model->next_occurring_event_is_idempotent()) continue; - } + double next_event = model->next_occurring_event(now_); if ((time_delta < 0.0 || next_event < time_delta) && next_event >= 0.0) { time_delta = next_event; @@ -519,7 +514,7 @@ double EngineImpl::solve(double max_date) const double next_event_date = profile::future_evt_set.next_date(); XBT_DEBUG("Next TRACE event: %f", next_event_date); - for (auto model : models_) { + for (auto* model : models_) { /* Skip all idempotent models, they were already treated above * NS3 is the one to handled here */ if (model->next_occurring_event_is_idempotent()) @@ -551,13 +546,12 @@ double EngineImpl::solve(double max_date) const while (auto* event = profile::future_evt_set.pop_leq(next_event_date, &value, &resource)) { if(value<0) continue; - if (resource->is_used() || (watched_hosts().find(resource->get_cname()) != watched_hosts().end())) { + if (resource->is_used()) { time_delta = next_event_date - now_; XBT_DEBUG("This event invalidates the next_occurring_event() computation of models. Next event set to %f", time_delta); } - // FIXME: I'm too lame to update now_ live, so I change it and restore it so that the real update with surf_min - // will work + // FIXME: I'm too lame to update now_ live, so I change it and restore it so that the real update works double round_start = now_; now_ = next_event_date; /* update state of the corresponding resource to the new value. Does not touch lmm. @@ -596,6 +590,9 @@ void EngineImpl::run(double max_date) { seal_platform(); + XBT_DEBUG("Running the main loop until t=%.3f in mode %s", max_date, + to_c_str(simgrid::mc::get_model_checking_mode())); + if (MC_is_active()) { #if SIMGRID_HAVE_MC mc::AppSide::get()->main_loop();