Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Mix create_host and add_route during platf creation.
[simgrid.git] / src / kernel / routing / FullZone.cpp
index 3570508..4c47c46 100644 (file)
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_full, surf, "Routing part of surf");
 
-#define TO_ROUTE_FULL(i, j) routing_table_[(i) + (j)*table_size]
-
 namespace simgrid {
 namespace kernel {
 namespace routing {
 
-void FullZone::do_seal()
+void FullZone::check_routing_table()
 {
   unsigned int table_size = get_table_size();
+  /* assure routing_table is table_size X table_size */
+  if (routing_table_.size() != table_size) {
+    routing_table_.resize(table_size);
+    for (auto& j : routing_table_) {
+      j.resize(table_size);
+    }
+  }
+}
 
-  /* Create table if needed */
-  if (routing_table_.empty())
-    routing_table_.resize(table_size * table_size, nullptr);
-
+void FullZone::do_seal()
+{
+  check_routing_table();
   /* Add the loopback if needed */
   if (get_network_model()->loopback_ && get_hierarchy() == RoutingMode::base) {
-    for (unsigned int i = 0; i < table_size; i++) {
-      Route* route = TO_ROUTE_FULL(i, i);
+    for (unsigned int i = 0; i < get_table_size(); i++) {
+      auto& route = routing_table_[i][i];
       if (not route) {
-        route = new Route();
+        route.reset(new Route());
         route->link_list_.push_back(get_network_model()->loopback_);
-        TO_ROUTE_FULL(i, i) = route;
       }
     }
   }
 }
 
-FullZone::~FullZone()
-{
-  /* Delete routing table */
-  for (auto const* route : routing_table_)
-    delete route;
-}
-
 void FullZone::get_local_route(NetPoint* src, NetPoint* dst, Route* res, double* lat)
 {
   XBT_DEBUG("full getLocalRoute from %s[%u] to %s[%u]", src->get_cname(), src->id(), dst->get_cname(), dst->id());
 
-  unsigned int table_size          = get_table_size();
-  const Route* e_route             = TO_ROUTE_FULL(src->id(), dst->id());
+  const auto& e_route = routing_table_[src->id()][dst->id()];
 
   if (e_route != nullptr) {
     res->gw_src_ = e_route->gw_src_;
@@ -67,23 +63,21 @@ void FullZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoin
 {
   add_route_check_params(src, dst, gw_src, gw_dst, link_list, symmetrical);
 
-  unsigned int table_size = get_table_size();
-
-  if (routing_table_.empty())
-    routing_table_.resize(table_size * table_size, nullptr);
+  check_routing_table();
 
   /* Check that the route does not already exist */
   if (gw_dst && gw_src) // inter-zone route (to adapt the error message, if any)
-    xbt_assert(nullptr == TO_ROUTE_FULL(src->id(), dst->id()),
+    xbt_assert(nullptr == routing_table_[src->id()][dst->id()],
                "The route between %s@%s and %s@%s already exists (Rq: routes are symmetrical by default).",
                src->get_cname(), gw_src->get_cname(), dst->get_cname(), gw_dst->get_cname());
   else
-    xbt_assert(nullptr == TO_ROUTE_FULL(src->id(), dst->id()),
+    xbt_assert(nullptr == routing_table_[src->id()][dst->id()],
                "The route between %s and %s already exists (Rq: routes are symmetrical by default).", src->get_cname(),
                dst->get_cname());
 
   /* Add the route to the base */
-  TO_ROUTE_FULL(src->id(), dst->id()) = new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list, true);
+  routing_table_[src->id()][dst->id()] =
+      std::unique_ptr<Route>(new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list, true));
 
   if (symmetrical && src != dst) {
     if (gw_dst && gw_src) {
@@ -93,15 +87,16 @@ void FullZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoin
     }
     if (gw_dst && gw_src) // inter-zone route (to adapt the error message, if any)
       xbt_assert(
-          nullptr == TO_ROUTE_FULL(dst->id(), src->id()),
+          nullptr == routing_table_[dst->id()][src->id()],
           "The route between %s@%s and %s@%s already exists. You should not declare the reverse path as symmetrical.",
           dst->get_cname(), gw_dst->get_cname(), src->get_cname(), gw_src->get_cname());
     else
-      xbt_assert(nullptr == TO_ROUTE_FULL(dst->id(), src->id()),
+      xbt_assert(nullptr == routing_table_[dst->id()][src->id()],
                  "The route between %s and %s already exists. You should not declare the reverse path as symmetrical.",
                  dst->get_cname(), src->get_cname());
 
-    TO_ROUTE_FULL(dst->id(), src->id()) = new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list, false);
+    routing_table_[dst->id()][src->id()] =
+        std::unique_ptr<Route>(new_extended_route(get_hierarchy(), gw_src, gw_dst, link_list, false));
   }
 }
 } // namespace routing