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
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
if (config::get_value<bool>("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(" ");
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
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);
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());
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
}
maestro->simcall_.issuer_ = maestro;
- EngineImpl::get_instance()->set_maestro(maestro);
+ engine->set_maestro(maestro);
}
} // namespace actor
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);
}
}
auto cpu_model_pm = std::make_shared<simgrid::kernel::resource::CpuCas01Model>("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 {
void CpuTiModel::create_pm_models()
{
auto cpu_model_pm = std::make_shared<CpuTiModel>("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<double>& speed_per_pstate)
void surf_disk_model_init_default()
{
auto disk_model = std::make_shared<simgrid::kernel::resource::DiskS19Model>("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 {
void surf_host_model_init_current_default()
{
- auto host_model = std::make_shared<simgrid::surf::HostCLM03Model>("Host_CLM03");
simgrid::config::set_default<bool>("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<simgrid::surf::HostCLM03Model>("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();
}
void surf_host_model_init_compound()
{
auto host_model = std::make_shared<simgrid::surf::HostCLM03Model>("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 {
void surf_network_model_init_LegrandVelho()
{
auto net_model = std::make_shared<simgrid::kernel::resource::NetworkCm02Model>("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<double>("network/latency-factor", 13.01);
simgrid::config::set_default<double>("network/bandwidth-factor", 0.97);
simgrid::config::set_default<double>("network/weight-S", 0.0);
auto net_model = std::make_shared<simgrid::kernel::resource::NetworkCm02Model>("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 {
void surf_network_model_init_Constant()
{
auto net_model = std::make_shared<simgrid::kernel::resource::NetworkConstantModel>("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 {
using simgrid::kernel::resource::NetworkIBModel;
auto net_model = std::make_shared<NetworkIBModel>("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);
void surf_network_model_init_NS3()
{
auto net_model = std::make_shared<simgrid::kernel::resource::NetworkNS3Model>("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<std::string>
void surf_network_model_init_SMPI()
{
auto net_model = std::make_shared<simgrid::kernel::resource::NetworkSmpiModel>("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<double>("network/weight-S", 8775);
}
XBT_CINFO(xbt_cfg, "Switching to the L07 model to handle parallel tasks.");
auto host_model = std::make_shared<simgrid::surf::HostL07Model>("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 {
auto net_model = std::make_shared<NetworkL07Model>("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<CpuL07Model>("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)