From c967cf616fe1b1eb28db36f9b1e823b5f6e6e8b9 Mon Sep 17 00:00:00 2001 From: Martin Quinson Date: Thu, 14 May 2020 21:04:15 +0200 Subject: [PATCH] Save the src_wifi_link and dst_wifi_link in a subclass of NetCm02Action This way, interested parties won't have to recompute that information and possibly miscompute it. --- src/surf/network_cm02.cpp | 49 ++++++++++++++++++++++----------------- src/surf/network_wifi.hpp | 17 ++++++++++++++ 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index a0e1b11197..a6b00b46f9 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -186,7 +186,28 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz std::any_of(back_route.begin(), back_route.end(), [](const LinkImpl* link) { return not link->is_on(); }); } - auto* action = new NetworkCm02Action(this, *src, *dst, size, failed); + NetworkWifiLink* src_wifi_link = nullptr; + NetworkWifiLink* dst_wifi_link = nullptr; + if (not route.empty() && route.at(0)->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) { + src_wifi_link = static_cast(route.at(0)); + xbt_assert(src_wifi_link->get_host_rate(src) != -1, + "The route from %s to %s begins with the WIFI link %s, but the host %s does not seem attached to that " + "WIFI link. Did you call link->set_host_rate()?", + src->get_cname(), dst->get_cname(), src_wifi_link->get_cname(), src->get_cname()); + } + if (route.size() > 1 && route.at(route.size() - 1)->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) { + dst_wifi_link = static_cast(route.at(route.size() - 1)); + xbt_assert(dst_wifi_link->get_host_rate(dst) != -1, + "The route from %s to %s ends with the WIFI link %s, but the host %s does not seem attached to that " + "WIFI link. Did you call link->set_host_rate()?", + src->get_cname(), dst->get_cname(), dst_wifi_link->get_cname(), dst->get_cname()); + } + + NetworkCm02Action* action; + if (src_wifi_link == nullptr && dst_wifi_link == nullptr) + action = new NetworkCm02Action(this, *src, *dst, size, failed); + else + action = new NetworkWifiAction(this, *src, *dst, size, failed, src_wifi_link, dst_wifi_link); action->sharing_penalty_ = latency; action->latency_ = latency; action->rate_ = rate; @@ -238,26 +259,12 @@ Action* NetworkCm02Model::communicate(s4u::Host* src, s4u::Host* dst, double siz : action->rate_); } - NetworkWifiLink* src_wifi_link = nullptr; - NetworkWifiLink* dst_wifi_link = nullptr; - if (not route.empty() && route.at(0)->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) { - src_wifi_link = static_cast(route.at(0)); - double rate = src_wifi_link->get_host_rate(src); - xbt_assert(rate != -1, - "The route from %s to %s begins with the WIFI link %s, but the host %s does not seem attached to that " - "WIFI link. Did you call link->set_host_rate()?", - src->get_cname(), dst->get_cname(), src_wifi_link->get_cname(), src->get_cname()); - get_maxmin_system()->expand(src_wifi_link->get_constraint(), action->get_variable(), 1.0 / rate); - } - if (route.size() > 1 && route.at(route.size() - 1)->get_sharing_policy() == s4u::Link::SharingPolicy::WIFI) { - dst_wifi_link = static_cast(route.at(route.size() - 1)); - double rate = dst_wifi_link->get_host_rate(dst); - xbt_assert(rate != -1, - "The route from %s to %s ends with the WIFI link %s, but the host %s does not seem attached to that " - "WIFI link. Did you call link->set_host_rate()?", - src->get_cname(), dst->get_cname(), dst_wifi_link->get_cname(), dst->get_cname()); - get_maxmin_system()->expand(dst_wifi_link->get_constraint(), action->get_variable(), 1.0 / rate); - } + if (src_wifi_link != nullptr) + get_maxmin_system()->expand(src_wifi_link->get_constraint(), action->get_variable(), + 1.0 / src_wifi_link->get_host_rate(src)); + if (dst_wifi_link != nullptr) + get_maxmin_system()->expand(dst_wifi_link->get_constraint(), action->get_variable(), + 1.0 / dst_wifi_link->get_host_rate(dst)); for (auto const& link : route) { // WIFI links are handled manually just above, so skip them now diff --git a/src/surf/network_wifi.hpp b/src/surf/network_wifi.hpp index ef07cb4d4f..26165793d6 100644 --- a/src/surf/network_wifi.hpp +++ b/src/surf/network_wifi.hpp @@ -19,6 +19,8 @@ namespace simgrid { namespace kernel { namespace resource { +class XBT_PRIVATE NetworkWifiAction; + class NetworkWifiLink : public LinkImpl { /** @brief Hold every rates association between host and links (host name, rates id) */ std::map host_rates_; @@ -55,6 +57,21 @@ public: bool toggle_decay_model(); }; +class NetworkWifiAction : public NetworkCm02Action { + NetworkWifiLink* src_wifi_link_; + NetworkWifiLink* dst_wifi_link_; + +public: + NetworkWifiAction(Model* model, s4u::Host& src, s4u::Host& dst, double cost, bool failed, + NetworkWifiLink* src_wifi_link, NetworkWifiLink* dst_wifi_link) + : NetworkCm02Action(model, src, dst, cost, failed) + , src_wifi_link_(src_wifi_link) + , dst_wifi_link_(dst_wifi_link){}; + + NetworkWifiLink* get_src_link() { return src_wifi_link_; } + NetworkWifiLink* get_dst_link() { return dst_wifi_link_; } +}; + } // namespace resource } // namespace kernel } // namespace simgrid -- 2.20.1