Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Save the src_wifi_link and dst_wifi_link in a subclass of NetCm02Action
authorMartin Quinson <martin.quinson@ens-rennes.fr>
Thu, 14 May 2020 19:04:15 +0000 (21:04 +0200)
committerMartin Quinson <martin.quinson@ens-rennes.fr>
Thu, 14 May 2020 19:04:20 +0000 (21:04 +0200)
This way, interested parties won't have to recompute that information
and possibly miscompute it.

src/surf/network_cm02.cpp
src/surf/network_wifi.hpp

index a0e1b11..a6b00b4 100644 (file)
@@ -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(); });
   }
 
           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<NetworkWifiLink*>(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<NetworkWifiLink*>(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;
   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_);
   }
 
                                     : 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<NetworkWifiLink*>(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<NetworkWifiLink*>(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
 
   for (auto const& link : route) {
     // WIFI links are handled manually just above, so skip them now
index ef07cb4..2616579 100644 (file)
@@ -19,6 +19,8 @@ namespace simgrid {
 namespace kernel {
 namespace resource {
 
 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<xbt::string, int> host_rates_;
 class NetworkWifiLink : public LinkImpl {
   /** @brief Hold every rates association between host and links (host name, rates id) */
   std::map<xbt::string, int> host_rates_;
@@ -55,6 +57,21 @@ public:
   bool toggle_decay_model();
 };
 
   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
 } // namespace resource
 } // namespace kernel
 } // namespace simgrid