X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6e1ee31032175125b3dc8a19e7df58c80784dfab..fc8be6494932e66a359ae5d47103a566cc8234f4:/src/kernel/routing/DijkstraZone.cpp diff --git a/src/kernel/routing/DijkstraZone.cpp b/src/kernel/routing/DijkstraZone.cpp index b06189fa15..37cd82d3d0 100644 --- a/src/kernel/routing/DijkstraZone.cpp +++ b/src/kernel/routing/DijkstraZone.cpp @@ -15,11 +15,25 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_dijkstra, surf, "Routing part of surf -- dijkstra routing logic"); -/* Free functions */ +namespace simgrid { +namespace kernel { +namespace routing { + +class GraphNodeData { +public: + explicit GraphNodeData(int id) : id_(id) {} + int id_; + int graph_id_ = -1; /* used for caching internal graph id's */ +}; + +DijkstraZone::DijkstraZone(NetZoneImpl* father, std::string name, resource::NetworkModel* netmodel, bool cached) + : RoutedZone(father, name, netmodel), cached_(cached) +{ +} static void graph_node_data_free(void* n) { - delete static_cast(n); + delete static_cast(n); } static void graph_edge_data_free(void* e) @@ -27,29 +41,28 @@ static void graph_edge_data_free(void* e) delete static_cast(e); } -/* Utility functions */ +DijkstraZone::~DijkstraZone() +{ + xbt_graph_free_graph(route_graph_, &graph_node_data_free, &graph_edge_data_free, nullptr); +} -namespace simgrid { -namespace kernel { -namespace routing { void DijkstraZone::seal() { unsigned int cursor; xbt_node_t node = nullptr; - /* Create the topology graph */ if (not route_graph_) route_graph_ = xbt_graph_new_graph(1, nullptr); /* Add the loopback if needed */ if (surf_network_model->loopback_ && hierarchy_ == RoutingMode::base) { - xbt_dynar_foreach (xbt_graph_get_nodes(route_graph_), cursor, node) { + xbt_dynar_foreach (xbt_graph_get_nodes(route_graph_), cursor, node) { bool found = false; xbt_edge_t edge = nullptr; unsigned int cursor2; xbt_dynar_foreach (xbt_graph_node_get_outedges(node), cursor2, edge) { - if (xbt_graph_edge_get_target(edge) == node) { + if (xbt_graph_edge_get_target(edge) == node) { // There is an edge from node to itself found = true; break; } @@ -67,18 +80,14 @@ void DijkstraZone::seal() xbt_dynar_t nodes = xbt_graph_get_nodes(route_graph_); xbt_dynar_foreach (nodes, cursor, node) { - graph_node_data_t data = static_cast(xbt_graph_node_get_data(node)); - data->graph_id = cursor; + GraphNodeData* data = static_cast(xbt_graph_node_get_data(node)); + data->graph_id_ = cursor; } } xbt_node_t DijkstraZone::route_graph_new_node(int id) { - graph_node_data_t data = new s_graph_node_data_t; - data->id = id; - data->graph_id = -1; - - xbt_node_t node = xbt_graph_new_node(route_graph_, data); + xbt_node_t node = xbt_graph_new_node(route_graph_, new GraphNodeData(id)); graph_node_map_.emplace(id, node); return node; @@ -104,8 +113,8 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationAr xbt_node_t src_elm = node_map_search(src_id); xbt_node_t dst_elm = node_map_search(dst_id); - int src_node_id = static_cast(xbt_graph_node_get_data(src_elm))->graph_id; - int dst_node_id = static_cast(xbt_graph_node_get_data(dst_elm))->graph_id; + int src_node_id = static_cast(xbt_graph_node_get_data(src_elm))->graph_id_; + int dst_node_id = static_cast(xbt_graph_node_get_data(dst_elm))->graph_id_; /* if the src and dst are the same */ if (src_node_id == dst_node_id) { @@ -160,8 +169,8 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationAr xbt_dynar_foreach (xbt_graph_node_get_outedges(v_node), cursor, edge) { xbt_node_t u_node = xbt_graph_edge_get_target(edge); - graph_node_data_t data = static_cast(xbt_graph_node_get_data(u_node)); - int u_id = data->graph_id; + GraphNodeData* data = static_cast(xbt_graph_node_get_data(u_node)); + int u_id = data->graph_id_; RouteCreationArgs* tmp_e_route = static_cast(xbt_graph_edge_get_data(edge)); int cost_v_u = tmp_e_route->link_list.size(); /* count of links, old model assume 1 */ @@ -175,9 +184,8 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationAr } /* compose route path with links */ - NetPoint* gw_src = nullptr; - NetPoint* gw_dst; - NetPoint* first_gw = nullptr; + NetPoint* gw_src = nullptr; + NetPoint* first_gw = nullptr; for (int v = dst_node_id; v != src_node_id; v = pred_arr[v]) { xbt_node_t node_pred_v = xbt_dynar_get_as(nodes, pred_arr[v], xbt_node_t); @@ -189,9 +197,9 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationAr RouteCreationArgs* e_route = static_cast(xbt_graph_edge_get_data(edge)); - NetPoint* prev_gw_src = gw_src; - gw_src = e_route->gw_src; - gw_dst = e_route->gw_dst; + NetPoint* prev_gw_src = gw_src; + gw_src = e_route->gw_src; + NetPoint* gw_dst = e_route->gw_dst; if (v == dst_node_id) first_gw = gw_dst; @@ -227,18 +235,6 @@ void DijkstraZone::get_local_route(NetPoint* src, NetPoint* dst, RouteCreationAr route_cache_.clear(); } -DijkstraZone::~DijkstraZone() -{ - xbt_graph_free_graph(route_graph_, &graph_node_data_free, &graph_edge_data_free, nullptr); -} - -/* Creation routing model functions */ - -DijkstraZone::DijkstraZone(NetZoneImpl* father, std::string name, bool cached) - : RoutedZone(father, name), cached_(cached) -{ -} - void DijkstraZone::add_route(NetPoint* src, NetPoint* dst, NetPoint* gw_src, NetPoint* gw_dst, std::vector& link_list, bool symmetrical) { @@ -260,11 +256,11 @@ void DijkstraZone::new_edge(int src_id, int dst_id, simgrid::kernel::routing::Ro // Get the extremities, or create them if they don't exist yet xbt_node_t src = node_map_search(src_id); if (src == nullptr) - src = this->route_graph_new_node(src_id); + src = route_graph_new_node(src_id); xbt_node_t dst = node_map_search(dst_id); if (dst == nullptr) - dst = this->route_graph_new_node(dst_id); + dst = route_graph_new_node(dst_id); // Make sure that this graph edge was not already added to the graph if (xbt_graph_get_edge(route_graph_, src, dst) != nullptr) {