Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
unPERLifies a bit the routing: use the object, not its name
authorMartin Quinson <martin.quinson@loria.fr>
Thu, 3 Nov 2016 21:49:17 +0000 (22:49 +0100)
committerMartin Quinson <martin.quinson@loria.fr>
Thu, 3 Nov 2016 21:49:17 +0000 (22:49 +0100)
include/simgrid/s4u/As.hpp
src/kernel/routing/AsImpl.cpp
src/s4u/s4u_as.cpp

index 35eb03b..72921f9 100644 (file)
@@ -66,7 +66,7 @@ private:
 
   bool sealed_ = false; // We cannot add more content when sealed
 
-  std::map<std::pair<std::string, std::string>, std::vector<surf::Link*>*> bypassRoutes_; // src x dst -> route
+  std::map<std::pair<kernel::routing::NetCard*, kernel::routing::NetCard*>, std::vector<surf::Link*>*> bypassRoutes_; // src x dst -> route
   xbt_dict_t children_ = xbt_dict_new_homogeneous(nullptr);                               // sub-ASes
 };
 
index 1509825..30fe085 100644 (file)
@@ -158,8 +158,8 @@ namespace simgrid {
 
     /* Base case, no recursion is needed */
     if (dst->containingAS() == this && src->containingAS() == this) {
-      if (bypassRoutes_.find({src->name(), dst->name()}) != bypassRoutes_.end()) {
-        std::vector<surf::Link*>* bypassedRoute = bypassRoutes_.at({src->name(), dst->name()});
+      if (bypassRoutes_.find({src, dst}) != bypassRoutes_.end()) {
+        std::vector<surf::Link*>* bypassedRoute = bypassRoutes_.at({src, dst});
         for (surf::Link* link : *bypassedRoute) {
           links->push_back(link);
           if (latency)
@@ -176,17 +176,17 @@ namespace simgrid {
     std::vector<surf::Link*>* bypassedRoute = nullptr;
 
     /* (1) find the path to the root routing component */
-    std::vector<As*> path_src;
+    std::vector<AsImpl*> path_src;
     As* current = src->containingAS();
     while (current != nullptr) {
-      path_src.push_back(current);
+      path_src.push_back(static_cast<AsImpl*>(current));
       current = current->father_;
     }
 
-    std::vector<As*> path_dst;
+    std::vector<AsImpl*> path_dst;
     current = dst->containingAS();
     while (current != nullptr) {
-      path_dst.push_back(current);
+      path_dst.push_back(static_cast<AsImpl*>(current));
       current = current->father_;
     }
 
@@ -202,17 +202,18 @@ namespace simgrid {
 
     int max_index = std::max(max_index_src, max_index_dst);
 
+    std::pair<kernel::routing::NetCard*, kernel::routing::NetCard*> key;
     for (int max = 0; max <= max_index; max++) {
       for (int i = 0; i < max; i++) {
         if (i <= max_index_src && max <= max_index_dst) {
-          const std::pair<std::string, std::string> key = {path_src.at(i)->name(), path_dst.at(max)->name()};
+          key = {path_src.at(i)->netcard_, path_dst.at(max)->netcard_};
           if (bypassRoutes_.find(key) != bypassRoutes_.end()) {
             bypassedRoute = bypassRoutes_.at(key);
             break;
           }
         }
         if (max <= max_index_src && i <= max_index_dst) {
-          const std::pair<std::string, std::string> key = {path_src.at(max)->name(), path_dst.at(i)->name()};
+          key = {path_src.at(max)->netcard_, path_dst.at(i)->netcard_};
           if (bypassRoutes_.find(key) != bypassRoutes_.end()) {
             bypassedRoute = bypassRoutes_.at(key);
             break;
@@ -224,7 +225,7 @@ namespace simgrid {
         break;
 
       if (max <= max_index_src && max <= max_index_dst) {
-        const std::pair<std::string, std::string> key = {path_src.at(max)->name(), path_dst.at(max)->name()};
+        key = {path_src.at(max)->netcard_, path_dst.at(max)->netcard_};
         if (bypassRoutes_.find(key) != bypassRoutes_.end()) {
           bypassedRoute = bypassRoutes_.at(key);
           break;
index 6a6f4ca..0a14f8d 100644 (file)
@@ -82,14 +82,14 @@ namespace simgrid {
       xbt_assert(!e_route->link_list->empty(), "Bypass route between %s@%s and %s@%s cannot be empty.",
                  e_route->src->name().c_str(), e_route->gw_src->name().c_str(), e_route->dst->name().c_str(),
                  e_route->gw_dst->name().c_str());
-      xbt_assert(bypassRoutes_.find({e_route->src->name(), e_route->dst->name()}) == bypassRoutes_.end(),
+      xbt_assert(bypassRoutes_.find({e_route->src, e_route->dst}) == bypassRoutes_.end(),
                  "The bypass route between %s@%s and %s@%s already exists.", e_route->src->name().c_str(),
                  e_route->gw_src->name().c_str(), e_route->dst->name().c_str(), e_route->gw_dst->name().c_str());
     } else {
       XBT_DEBUG("Load bypassRoute from %s to %s", e_route->src->name().c_str(), e_route->dst->name().c_str());
       xbt_assert(!e_route->link_list->empty(), "Bypass route between %s and %s cannot be empty.",
                  e_route->src->name().c_str(), e_route->dst->name().c_str());
-      xbt_assert(bypassRoutes_.find({e_route->src->name(), e_route->dst->name()}) == bypassRoutes_.end(),
+      xbt_assert(bypassRoutes_.find({e_route->src, e_route->dst}) == bypassRoutes_.end(),
                  "The bypass route between %s and %s already exists.", e_route->src->name().c_str(),
                  e_route->dst->name().c_str());
     }
@@ -100,6 +100,6 @@ namespace simgrid {
       newRoute->push_back(link);
 
     /* Store it */
-    bypassRoutes_.insert({{e_route->src->name(), e_route->dst->name()}, newRoute});
+    bypassRoutes_.insert({{e_route->src, e_route->dst}, newRoute});
   }
 }  }; // namespace simgrid::s4u