From 38f246c4c46920a78ea0af8233449f402c178f04 Mon Sep 17 00:00:00 2001 From: SUTER Frederic Date: Mon, 20 Sep 2021 11:55:46 +0200 Subject: [PATCH] simplify writing in model setup + may fix issue with unit-tests --- src/kernel/EngineImpl.cpp | 15 ++++++--------- src/kernel/EngineImpl.hpp | 5 ++++- src/kernel/actor/ActorImpl.cpp | 7 ++++--- src/s4u/s4u_Engine.cpp | 4 ++-- src/surf/cpu_cas01.cpp | 5 +++-- src/surf/cpu_ti.cpp | 5 +++-- src/surf/disk_s19.cpp | 5 +++-- src/surf/host_clm03.cpp | 12 +++++++----- src/surf/network_cm02.cpp | 10 ++++++---- src/surf/network_constant.cpp | 5 +++-- src/surf/network_ib.cpp | 5 +++-- src/surf/network_ns3.cpp | 5 +++-- src/surf/network_smpi.cpp | 5 +++-- src/surf/ptask_L07.cpp | 9 +++++---- 14 files changed, 55 insertions(+), 42 deletions(-) diff --git a/src/kernel/EngineImpl.cpp b/src/kernel/EngineImpl.cpp index d79c21f43b..f38a4ab37b 100644 --- a/src/kernel/EngineImpl.cpp +++ b/src/kernel/EngineImpl.cpp @@ -128,11 +128,6 @@ static void install_segvhandler() namespace simgrid { namespace kernel { -EngineImpl::EngineImpl(int* argc, char** argv) -{ - EngineImpl::instance_ = this; -} - EngineImpl::~EngineImpl() { /* Since hosts_ is a std::map, the hosts are destroyed in the lexicographic order, which ensures that the output is @@ -164,6 +159,9 @@ EngineImpl::~EngineImpl() void EngineImpl::initialize(int* argc, char** argv) { + xbt_assert(EngineImpl::instance_ == nullptr, + "It is currently forbidden to create more than one instance of kernel::EngineImpl"); + EngineImpl::instance_ = this; #if SIMGRID_HAVE_MC // The communication initialization is done ASAP, as we need to get some init parameters from the MC for different // layers. But simix_global needs to be created, as we send the address of some of its fields to the MC that wants to @@ -189,12 +187,11 @@ void EngineImpl::initialize(int* argc, char** argv) if (config::get_value("debug/clean-atexit")) atexit(shutdown); } + void EngineImpl::shutdown() { - static bool already_cleaned_up = false; - if (already_cleaned_up) - return; // to avoid double cleaning by java and C - already_cleaned_up = true; + if (EngineImpl::instance_ == nullptr) + return; XBT_DEBUG("EngineImpl::shutdown() called. Simulation's over."); if (instance_->has_actors_to_run() && simgrid_get_clock() <= 0.0) { XBT_CRITICAL(" "); diff --git a/src/kernel/EngineImpl.hpp b/src/kernel/EngineImpl.hpp index 3cd04d41bb..febb9db3d0 100644 --- a/src/kernel/EngineImpl.hpp +++ b/src/kernel/EngineImpl.hpp @@ -78,7 +78,7 @@ class EngineImpl { friend s4u::Engine; public: - explicit EngineImpl(int* argc, char** argv); + EngineImpl() = default; /* Currently, only one instance is allowed to exist. This is why you can't copy or move it */ #ifndef DOXYGEN @@ -137,6 +137,9 @@ public: else return res->second; } + + routing::NetZoneImpl* get_netzone_root() const { return netzone_root_; } + void add_daemon(actor::ActorImpl* d) { daemons_.insert(d); } void remove_daemon(actor::ActorImpl* d); void add_actor_to_run_list(actor::ActorImpl* actor); diff --git a/src/kernel/actor/ActorImpl.cpp b/src/kernel/actor/ActorImpl.cpp index f50964b8f5..93549a5e87 100644 --- a/src/kernel/actor/ActorImpl.cpp +++ b/src/kernel/actor/ActorImpl.cpp @@ -234,7 +234,8 @@ void ActorImpl::exit() void ActorImpl::kill(ActorImpl* actor) const { - xbt_assert(not EngineImpl::get_instance()->is_maestro(actor), "Killing maestro is a rather bad idea"); + auto* engine = EngineImpl::get_instance(); + xbt_assert(not engine->is_maestro(actor), "Killing maestro is a rather bad idea"); if (actor->finished_) { XBT_DEBUG("Ignoring request to kill actor %s@%s that is already dead", actor->get_cname(), actor->host_->get_cname()); @@ -249,7 +250,7 @@ void ActorImpl::kill(ActorImpl* actor) const if (actor == this) { XBT_DEBUG("Go on, this is a suicide,"); } else - EngineImpl::get_instance()->add_actor_to_run_list(actor); + engine->add_actor_to_run_list(actor); } void ActorImpl::kill_all() const @@ -518,7 +519,7 @@ void create_maestro(const std::function& code) } maestro->simcall_.issuer_ = maestro; - EngineImpl::get_instance()->set_maestro(maestro); + engine->set_maestro(maestro); } } // namespace actor diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index 04f51664ec..f9d5e1a0c9 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -52,14 +52,14 @@ void Engine::initialize(int* argc, char** argv) kernel::actor::create_maestro(maestro_code); } -Engine::Engine(std::string name) : pimpl(new kernel::EngineImpl(nullptr, nullptr)) +Engine::Engine(std::string name) : pimpl(new kernel::EngineImpl()) { int argc = 1; char* argv = &name[0]; initialize(&argc, &argv); } -Engine::Engine(int* argc, char** argv) : pimpl(new kernel::EngineImpl(argc, argv)) +Engine::Engine(int* argc, char** argv) : pimpl(new kernel::EngineImpl()) { initialize(argc, argv); } diff --git a/src/surf/cpu_cas01.cpp b/src/surf/cpu_cas01.cpp index b3b215b3de..47b539702a 100644 --- a/src/surf/cpu_cas01.cpp +++ b/src/surf/cpu_cas01.cpp @@ -46,8 +46,9 @@ void surf_cpu_model_init_Cas01() } auto cpu_model_pm = std::make_shared("Cpu_Cas01"); - simgrid::kernel::EngineImpl::get_instance()->add_model(cpu_model_pm); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_cpu_pm_model(cpu_model_pm); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(cpu_model_pm); + engine->get_netzone_root()->set_cpu_pm_model(cpu_model_pm); } namespace simgrid { diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index 7df0d784ae..d183dc3f49 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -270,8 +270,9 @@ long CpuTiProfile::binary_search(const std::vector& array, double a) void CpuTiModel::create_pm_models() { auto cpu_model_pm = std::make_shared("Cpu_TI"); - simgrid::kernel::EngineImpl::get_instance()->add_model(cpu_model_pm); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_cpu_pm_model(cpu_model_pm); + auto* engine = EngineImpl::get_instance(); + engine->add_model(cpu_model_pm); + engine->get_netzone_root()->set_cpu_pm_model(cpu_model_pm); } CpuImpl* CpuTiModel::create_cpu(s4u::Host* host, const std::vector& speed_per_pstate) diff --git a/src/surf/disk_s19.cpp b/src/surf/disk_s19.cpp index 16860851c7..c1edbdab7e 100644 --- a/src/surf/disk_s19.cpp +++ b/src/surf/disk_s19.cpp @@ -23,8 +23,9 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_disk); void surf_disk_model_init_default() { auto disk_model = std::make_shared("Disk"); - simgrid::kernel::EngineImpl::get_instance()->add_model(disk_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_disk_model(disk_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(disk_model); + engine->get_netzone_root()->set_disk_model(disk_model); } namespace simgrid { diff --git a/src/surf/host_clm03.cpp b/src/surf/host_clm03.cpp index 5e49c86e2f..f58719d544 100644 --- a/src/surf/host_clm03.cpp +++ b/src/surf/host_clm03.cpp @@ -15,10 +15,11 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_host); void surf_host_model_init_current_default() { - auto host_model = std::make_shared("Host_CLM03"); simgrid::config::set_default("network/crosstraffic", true); - simgrid::kernel::EngineImpl::get_instance()->add_model(host_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_host_model(host_model); + auto host_model = std::make_shared("Host_CLM03"); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(host_model); + engine->get_netzone_root()->set_host_model(host_model); surf_cpu_model_init_Cas01(); surf_network_model_init_LegrandVelho(); } @@ -26,8 +27,9 @@ void surf_host_model_init_current_default() void surf_host_model_init_compound() { auto host_model = std::make_shared("Host_CLM03"); - simgrid::kernel::EngineImpl::get_instance()->add_model(host_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_host_model(host_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(host_model); + engine->get_netzone_root()->set_host_model(host_model); } namespace simgrid { diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index 398a61b558..753f2a62fc 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -40,8 +40,9 @@ double sg_weight_S_parameter = 0.0; /* default value; can be set by model or fro void surf_network_model_init_LegrandVelho() { auto net_model = std::make_shared("Network_LegrandVelho"); - simgrid::kernel::EngineImpl::get_instance()->add_model(net_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(net_model); + engine->get_netzone_root()->set_network_model(net_model); simgrid::config::set_default("network/latency-factor", 13.01); simgrid::config::set_default("network/bandwidth-factor", 0.97); @@ -66,8 +67,9 @@ void surf_network_model_init_CM02() simgrid::config::set_default("network/weight-S", 0.0); auto net_model = std::make_shared("Network_CM02"); - simgrid::kernel::EngineImpl::get_instance()->add_model(net_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(net_model); + engine->get_netzone_root()->set_network_model(net_model); } namespace simgrid { diff --git a/src/surf/network_constant.cpp b/src/surf/network_constant.cpp index 5bd7210ba1..7d36babf7f 100644 --- a/src/surf/network_constant.cpp +++ b/src/surf/network_constant.cpp @@ -18,8 +18,9 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_network); void surf_network_model_init_Constant() { auto net_model = std::make_shared("Network_Constant"); - simgrid::kernel::EngineImpl::get_instance()->add_model(net_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(net_model); + engine->get_netzone_root()->set_network_model(net_model); } namespace simgrid { diff --git a/src/surf/network_ib.cpp b/src/surf/network_ib.cpp index c62ea553cc..47d7ef6302 100644 --- a/src/surf/network_ib.cpp +++ b/src/surf/network_ib.cpp @@ -35,8 +35,9 @@ void surf_network_model_init_IB() using simgrid::kernel::resource::NetworkIBModel; auto net_model = std::make_shared("Network_IB"); - simgrid::kernel::EngineImpl::get_instance()->add_model(net_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(net_model); + engine->get_netzone_root()->set_network_model(net_model); simgrid::s4u::Link::on_communication_state_change.connect(NetworkIBModel::IB_action_state_changed_callback); simgrid::s4u::Link::on_communicate.connect(NetworkIBModel::IB_action_init_callback); diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index cc893351fa..1a80fe61b0 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -275,8 +275,9 @@ static void routeCreation_cb(bool symmetrical, simgrid::kernel::routing::NetPoin void surf_network_model_init_NS3() { auto net_model = std::make_shared("NS3 network model"); - simgrid::kernel::EngineImpl::get_instance()->add_model(net_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(net_model); + engine->get_netzone_root()->set_network_model(net_model); } static simgrid::config::Flag diff --git a/src/surf/network_smpi.cpp b/src/surf/network_smpi.cpp index 6dd0e429f1..4fcd646267 100644 --- a/src/surf/network_smpi.cpp +++ b/src/surf/network_smpi.cpp @@ -33,8 +33,9 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(res_network); void surf_network_model_init_SMPI() { auto net_model = std::make_shared("Network_SMPI"); - simgrid::kernel::EngineImpl::get_instance()->add_model(net_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(net_model); + engine->get_netzone_root()->set_network_model(net_model); simgrid::config::set_default("network/weight-S", 8775); } diff --git a/src/surf/ptask_L07.cpp b/src/surf/ptask_L07.cpp index 5af0e52831..cc27a24688 100644 --- a/src/surf/ptask_L07.cpp +++ b/src/surf/ptask_L07.cpp @@ -24,8 +24,9 @@ void surf_host_model_init_ptask_L07() XBT_CINFO(xbt_cfg, "Switching to the L07 model to handle parallel tasks."); auto host_model = std::make_shared("Host_Ptask"); - simgrid::kernel::EngineImpl::get_instance()->add_model(host_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_host_model(host_model); + auto* engine = simgrid::kernel::EngineImpl::get_instance(); + engine->add_model(host_model); + engine->get_netzone_root()->set_host_model(host_model); } namespace simgrid { @@ -39,11 +40,11 @@ HostL07Model::HostL07Model(const std::string& name) : HostModel(name) auto net_model = std::make_shared("Network_Ptask", this, maxmin_system); auto engine = simgrid::kernel::EngineImpl::get_instance(); engine->add_model(net_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_network_model(net_model); + engine->get_netzone_root()->set_network_model(net_model); auto cpu_model = std::make_shared("Cpu_Ptask", this, maxmin_system); engine->add_model(cpu_model); - simgrid::s4u::Engine::get_instance()->get_netzone_root()->get_impl()->set_cpu_pm_model(cpu_model); + engine->get_netzone_root()->set_cpu_pm_model(cpu_model); } CpuL07Model::CpuL07Model(const std::string& name, HostL07Model* hmodel, kernel::lmm::System* sys) -- 2.20.1