From 997bba9ae87c486409f813912c27a64e5ed8c2cf Mon Sep 17 00:00:00 2001 From: Bruno Donassolo Date: Fri, 2 Apr 2021 17:21:23 +0200 Subject: [PATCH] Simplified methods to add routes Avoid using LinkImpl in s4u interface. Add method that raises and exception if netpoint isn't found Allows the implementation of a platform like small_platform.xml without using "internal" structures. --- include/simgrid/s4u/Engine.hpp | 7 +++++++ include/simgrid/s4u/NetZone.hpp | 34 +++++++++++++++++++++++++++++++++ src/s4u/s4u_Engine.cpp | 9 +++++++++ src/s4u/s4u_Netzone.cpp | 24 +++++++++++++++++++++++ 4 files changed, 74 insertions(+) diff --git a/include/simgrid/s4u/Engine.hpp b/include/simgrid/s4u/Engine.hpp index 9013733677..a608f2e03f 100644 --- a/include/simgrid/s4u/Engine.hpp +++ b/include/simgrid/s4u/Engine.hpp @@ -125,6 +125,13 @@ public: std::vector get_all_netpoints() const; kernel::routing::NetPoint* netpoint_by_name_or_null(const std::string& name) const; + /** + * @brief Get netpoint by its name + * + * @param name Netpoint name + * @throw std::invalid_argument if netpoint doesn't exist + */ + kernel::routing::NetPoint* netpoint_by_name(const std::string& name) const; NetZone* get_netzone_root() const; void set_netzone_root(const NetZone* netzone); diff --git a/include/simgrid/s4u/NetZone.hpp b/include/simgrid/s4u/NetZone.hpp index 1fc5dc81d8..2e23d7cb16 100644 --- a/include/simgrid/s4u/NetZone.hpp +++ b/include/simgrid/s4u/NetZone.hpp @@ -63,6 +63,36 @@ public: /* Add content to the netzone, at parsing time. It should be sealed afterward. */ int add_component(kernel::routing::NetPoint* elm); /* A host, a router or a netzone, whatever */ + + /** + * @brief Add a route between 2 netpoints + * + * Create a regular route between 2 netpoints. A netpoint can be a host + * or a router. + * + * @param src Source netpoint + * @param dst Destination netpoint + * @param link_list List of links used in this communication + * @param symmetrical Bi-directional communication + */ + void add_regular_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, + const std::vector& link_list, bool symmetrical = true); + /** + * @brief Add a route between 2 netzones + * + * Create a route between 2 netzones, connecting 2 gateways. + * + * @param src Source netzone's netpoint + * @param dst Destination netzone' netpoint + * @param src_gw Netpoint of the gateway in the source netzone + * @param dst_gw Netpoint of the gateway in the destination netzone + * @param link_list List of links used in this communication + * @param symmetrical Bi-directional communication + */ + void add_netzone_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, + kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst, + const std::vector& link_list, bool symmetrical = true); + void add_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst, std::vector& link_list, bool symmetrical); @@ -106,6 +136,10 @@ public: /** @brief Create a link (string version) */ s4u::Link* create_link(const std::string& name, const std::vector& bandwidths, Link::SharingPolicy policy = Link::SharingPolicy::SHARED); + +private: + /** @brief Auxiliary function to get list of LinkImpl */ + static std::vector get_link_list_impl(const std::vector link_list); }; // External constructors so that the types (and the types of their content) remain hidden diff --git a/src/s4u/s4u_Engine.cpp b/src/s4u/s4u_Engine.cpp index e904859fd7..2d94c66d87 100644 --- a/src/s4u/s4u_Engine.cpp +++ b/src/s4u/s4u_Engine.cpp @@ -346,6 +346,15 @@ kernel::routing::NetPoint* Engine::netpoint_by_name_or_null(const std::string& n return netp == pimpl->netpoints_.end() ? nullptr : netp->second; } +kernel::routing::NetPoint* Engine::netpoint_by_name(const std::string& name) const +{ + auto netp = netpoint_by_name_or_null(name); + if (netp == nullptr) { + throw std::invalid_argument(std::string("Netpoint not found: %s") + name); + } + return netp; +} + std::vector Engine::get_all_netpoints() const { std::vector res; diff --git a/src/s4u/s4u_Netzone.cpp b/src/s4u/s4u_Netzone.cpp index 2de7941cf1..0866435df9 100644 --- a/src/s4u/s4u_Netzone.cpp +++ b/src/s4u/s4u_Netzone.cpp @@ -99,6 +99,30 @@ int NetZone::add_component(kernel::routing::NetPoint* elm) return pimpl_->add_component(elm); } +std::vector NetZone::get_link_list_impl(const std::vector link_list) +{ + std::vector links; + for (const auto& link : link_list) { + links.push_back(link->get_impl()); + } + return links; +} + +void NetZone::add_regular_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, + const std::vector& link_list, bool symmetrical) +{ + auto links = NetZone::get_link_list_impl(link_list); + add_route(src, dst, nullptr, nullptr, links, symmetrical); +} + +void NetZone::add_netzone_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, + kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst, + const std::vector& link_list, bool symmetrical) +{ + auto links = NetZone::get_link_list_impl(link_list); + add_route(src, dst, gw_src, gw_dst, links, symmetrical); +} + void NetZone::add_route(kernel::routing::NetPoint* src, kernel::routing::NetPoint* dst, kernel::routing::NetPoint* gw_src, kernel::routing::NetPoint* gw_dst, std::vector& link_list, bool symmetrical) -- 2.20.1