X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/12789d134b3ae0061164cf1658bfdd42abd27574..45e426637aefc9860afe15b75812d48898975fe3:/src/s4u/s4u_Engine.cpp diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index c30e3ef10f..c140382196 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -1,6 +1,6 @@ /* s4u::Engine Simulation Engine and global functions. */ -/* Copyright (c) 2006-2020. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2006-2021. 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. */ @@ -13,16 +13,15 @@ #include "simgrid/s4u/Host.hpp" #include "simgrid/s4u/Mailbox.hpp" #include "simgrid/s4u/NetZone.hpp" -#include "simgrid/s4u/Storage.hpp" #include "simgrid/simix.h" #include "src/instr/instr_private.hpp" #include "src/kernel/EngineImpl.hpp" #include "src/simix/smx_private.hpp" // For access to simix_global->process_list -#include "src/surf/StorageImpl.hpp" #include "src/surf/network_interface.hpp" #include "surf/surf.hpp" // routing_platf. FIXME:KILLME. SOON #include +#include #include XBT_LOG_NEW_CATEGORY(s4u, "Log channels of the S4U (Simgrid for you) interface"); @@ -41,7 +40,7 @@ Engine* Engine::instance_ = nullptr; /* That singleton is awful, but I don't see Engine::Engine(int* argc, char** argv) : pimpl(new kernel::EngineImpl()) { xbt_assert(Engine::instance_ == nullptr, "It is currently forbidden to create more than one instance of s4u::Engine"); - TRACE_global_init(); + instr::init(); SIMIX_global_init(argc, argv); Engine::instance_ = this; @@ -57,7 +56,7 @@ Engine::~Engine() Engine* Engine::get_instance() { if (Engine::instance_ == nullptr) { - auto e = new Engine(0, nullptr); + auto e = new Engine(nullptr, nullptr); xbt_assert(Engine::instance_ == e); } return Engine::instance_; @@ -81,7 +80,7 @@ double Engine::get_clock() * See also: :ref:`platform`. * \endrst */ -void Engine::load_platform(const std::string& platf) +void Engine::load_platform(const std::string& platf) const { double start = xbt_os_time(); parse_platform_file(platf); @@ -90,33 +89,41 @@ void Engine::load_platform(const std::string& platf) XBT_DEBUG("PARSE TIME: %g", (end - start)); } -void Engine::register_function(const std::string& name, int (*code)(int, char**)) // deprecated +void Engine::register_function(const std::string& name, int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v329 { - register_function(name, [code](std::vector args) { return xbt::wrap_main(code, std::move(args)); }); + kernel::actor::ActorCodeFactory code_factory = [code](std::vector args) { + return xbt::wrap_main(code, std::move(args)); + }; + register_function(name, code_factory); } -void Engine::register_default(int (*code)(int, char**)) // deprecated +void Engine::register_default(int (*code)(int, char**)) // XBT_ATTRIB_DEPRECATED_v329 { register_default([code](std::vector args) { return xbt::wrap_main(code, std::move(args)); }); } /** Registers the main function of an actor that will be launched from the deployment file */ -void Engine::register_function(const std::string& name, void (*code)(int, char**)) +void Engine::register_function(const std::string& name, const std::function& code) { - register_function(name, [code](std::vector args) { return xbt::wrap_main(code, std::move(args)); }); + kernel::actor::ActorCodeFactory code_factory = [code](std::vector args) { + return xbt::wrap_main(code, std::move(args)); + }; + register_function(name, code_factory); } /** Registers the main function of an actor that will be launched from the deployment file */ -void Engine::register_function(const std::string& name, void (*code)(std::vector)) +void Engine::register_function(const std::string& name, const std::function)>& code) { - register_function(name, - [code](std::vector args) { return std::bind(std::move(code), std::move(args)); }); + kernel::actor::ActorCodeFactory code_factory = [code{code}](std::vector args) mutable { + return std::bind(std::move(code), std::move(args)); + }; + register_function(name, code_factory); } /** Registers a function as the default main function of actors * * It will be used as fallback when the function requested from the deployment file was not registered. * It is used for trace-based simulations (see examples/s4u/replay-comms and similar). */ -void Engine::register_default(void (*code)(int, char**)) +void Engine::register_default(const std::function& code) { register_default([code](std::vector args) { return xbt::wrap_main(code, std::move(args)); }); } @@ -136,18 +143,18 @@ void Engine::register_function(const std::string& name, const kernel::actor::Act * See also: :ref:`deploy`. * \endrst */ -void Engine::load_deployment(const std::string& deploy) +void Engine::load_deployment(const std::string& deploy) const { pimpl->load_deployment(deploy); } /** Returns the amount of hosts in the platform */ -size_t Engine::get_host_count() +size_t Engine::get_host_count() const { return pimpl->hosts_.size(); } -std::vector Engine::get_all_hosts() +std::vector Engine::get_all_hosts() const { std::vector res; for (auto const& kv : pimpl->hosts_) @@ -155,7 +162,7 @@ std::vector Engine::get_all_hosts() return res; } -std::vector Engine::get_filtered_hosts(const std::function& filter) +std::vector Engine::get_filtered_hosts(const std::function& filter) const { std::vector hosts; for (auto const& kv : pimpl->hosts_) { @@ -180,15 +187,16 @@ void Engine::host_unregister(const std::string& name) * * @throw std::invalid_argument if the searched host does not exist. */ -Host* Engine::host_by_name(const std::string& name) +Host* Engine::host_by_name(const std::string& name) const { - if (pimpl->hosts_.find(name) == pimpl->hosts_.end()) + auto host = pimpl->hosts_.find(name); + if (host == pimpl->hosts_.end()) throw std::invalid_argument(std::string("Host not found: '") + name + std::string("'")); - return pimpl->hosts_.at(name); + return host->second; } /** @brief Find a host from its name (or nullptr if that host does not exist) */ -Host* Engine::host_by_name_or_null(const std::string& name) +Host* Engine::host_by_name_or_null(const std::string& name) const { auto host = pimpl->hosts_.find(name); return host == pimpl->hosts_.end() ? nullptr : host->second; @@ -198,16 +206,16 @@ Host* Engine::host_by_name_or_null(const std::string& name) * * @throw std::invalid_argument if the searched link does not exist. */ -Link* Engine::link_by_name(const std::string& name) +Link* Engine::link_by_name(const std::string& name) const { - if (pimpl->links_.find(name) == pimpl->links_.end()) + auto link = pimpl->links_.find(name); + if (link == pimpl->links_.end()) throw std::invalid_argument(std::string("Link not found: ") + name); - - return pimpl->links_.at(name)->get_iface(); + return link->second->get_iface(); } -/** @brief Find an link from its name (or nullptr if that link does not exist) */ -Link* Engine::link_by_name_or_null(const std::string& name) +/** @brief Find a link from its name (or nullptr if that link does not exist) */ +Link* Engine::link_by_name_or_null(const std::string& name) const { auto link = pimpl->links_.find(name); return link == pimpl->links_.end() ? nullptr : link->second->get_iface(); @@ -223,58 +231,14 @@ void Engine::link_unregister(const std::string& name) pimpl->links_.erase(name); } -/** @brief Returns the amount of storages in the platform */ -size_t Engine::get_storage_count() -{ - return pimpl->storages_.size(); -} - -/** @brief Returns the list of all storages found in the platform */ -std::vector Engine::get_all_storages() -{ - std::vector res; - for (auto const& kv : pimpl->storages_) - res.push_back(kv.second->get_iface()); - return res; -} - -/** @brief Find a storage from its name. - * - * @throw std::invalid_argument if the searched storage does not exist. - */ -Storage* Engine::storage_by_name(const std::string& name) -{ - if (pimpl->storages_.find(name) == pimpl->storages_.end()) - throw std::invalid_argument(std::string("Storage not found: ") + name); - - return pimpl->storages_.at(name)->get_iface(); -} - -/** @brief Find a storage from its name (or nullptr if that storage does not exist) */ -Storage* Engine::storage_by_name_or_null(const std::string& name) -{ - auto storage = pimpl->storages_.find(name); - return storage == pimpl->storages_.end() ? nullptr : storage->second->get_iface(); -} - -void Engine::storage_register(const std::string& name, const Storage* storage) -{ - pimpl->storages_[name] = storage->get_impl(); -} - -void Engine::storage_unregister(const std::string& name) -{ - pimpl->storages_.erase(name); -} - /** @brief Returns the amount of links in the platform */ -size_t Engine::get_link_count() +size_t Engine::get_link_count() const { return pimpl->links_.size(); } /** @brief Returns the list of all links found in the platform */ -std::vector Engine::get_all_links() +std::vector Engine::get_all_links() const { std::vector res; for (auto const& kv : pimpl->links_) @@ -282,7 +246,7 @@ std::vector Engine::get_all_links() return res; } -std::vector Engine::get_filtered_links(const std::function& filter) +std::vector Engine::get_filtered_links(const std::function& filter) const { std::vector filtered_list; for (auto const& kv : pimpl->links_) { @@ -293,32 +257,31 @@ std::vector Engine::get_filtered_links(const std::function& return filtered_list; } -size_t Engine::get_actor_count() +size_t Engine::get_actor_count() const { return simix_global->process_list.size(); } -std::vector Engine::get_all_actors() +std::vector Engine::get_all_actors() const { std::vector actor_list; - actor_list.push_back(simgrid::s4u::Actor::self()); for (auto const& kv : simix_global->process_list) { - actor_list.push_back(kv.second->iface()); + actor_list.push_back(kv.second->get_iface()); } return actor_list; } -std::vector Engine::get_filtered_actors(const std::function& filter) +std::vector Engine::get_filtered_actors(const std::function& filter) const { std::vector actor_list; for (auto const& kv : simix_global->process_list) { - if (filter(kv.second->iface())) - actor_list.push_back(kv.second->iface()); + if (filter(kv.second->get_iface())) + actor_list.push_back(kv.second->get_iface()); } return actor_list; } -void Engine::run() +void Engine::run() const { /* Clean IO before the run */ fflush(stdout); @@ -332,7 +295,7 @@ void Engine::run() } /** @brief Retrieve the root netzone, containing all others */ -s4u::NetZone* Engine::get_netzone_root() +s4u::NetZone* Engine::get_netzone_root() const { return pimpl->netzone_root_->get_iface(); } @@ -358,19 +321,19 @@ static NetZone* netzone_by_name_recursive(NetZone* current, const std::string& n } /** @brief Retrieve the NetZone of the given name (or nullptr if not found) */ -NetZone* Engine::netzone_by_name_or_null(const std::string& name) +NetZone* Engine::netzone_by_name_or_null(const std::string& name) const { return netzone_by_name_recursive(get_netzone_root(), name); } /** @brief Retrieve the netpoint of the given name (or nullptr if not found) */ -kernel::routing::NetPoint* Engine::netpoint_by_name_or_null(const std::string& name) +kernel::routing::NetPoint* Engine::netpoint_by_name_or_null(const std::string& name) const { auto netp = pimpl->netpoints_.find(name); return netp == pimpl->netpoints_.end() ? nullptr : netp->second; } -std::vector Engine::get_all_netpoints() +std::vector Engine::get_all_netpoints() const { std::vector res; for (auto const& kv : pimpl->netpoints_) @@ -401,6 +364,23 @@ void Engine::set_config(const std::string& str) { config::set_parse(str); } +void Engine::set_config(const std::string& name, int value) +{ + config::set_value(name.c_str(), value); +} +void Engine::set_config(const std::string& name, double value) +{ + config::set_value(name.c_str(), value); +} +void Engine::set_config(const std::string& name, bool value) +{ + config::set_value(name.c_str(), value); +} +void Engine::set_config(const std::string& name, const std::string& value) +{ + config::set_value(name.c_str(), value); +} + } // namespace s4u } // namespace simgrid @@ -434,7 +414,8 @@ double simgrid_get_clock() { return simgrid::s4u::Engine::get_clock(); } -int simgrid_get_actor_count() + +int simgrid_get_actor_count() // XBT_ATTRIB_DEPRECATED_v330 { return simgrid::s4u::Engine::get_instance()->get_actor_count(); }