X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/9cbdbf1d739774e5c49488d42a2b5d535c7a8465..5f1c0df379bb5f92fee1193d413c8bd57b89e3a5:/src/surf/surf_routing_full.cpp diff --git a/src/surf/surf_routing_full.cpp b/src/surf/surf_routing_full.cpp index 427af14b3f..35468f1ca0 100644 --- a/src/surf/surf_routing_full.cpp +++ b/src/surf/surf_routing_full.cpp @@ -4,7 +4,6 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "src/surf/surf_routing_private.hpp" #include "src/surf/surf_routing_full.hpp" #include "src/surf/network_interface.hpp" @@ -15,7 +14,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_route_full, surf, "Routing part of surf"); namespace simgrid { namespace surf { AsFull::AsFull(const char*name) - : AsGeneric(name) + : AsRoutedGraph(name) { } @@ -31,15 +30,15 @@ void AsFull::Seal() { routingTable_ = xbt_new0(sg_platf_route_cbarg_t, table_size * table_size); /* Add the loopback if needed */ - if (routing_platf->loopback_ && hierarchy_ == SURF_ROUTING_BASE) { + if (routing_platf->loopback_ && hierarchy_ == s4u::As::ROUTING_BASE) { for (i = 0; i < table_size; i++) { e_route = TO_ROUTE_FULL(i, i); if (!e_route) { e_route = xbt_new0(s_sg_platf_route_cbarg_t, 1); e_route->gw_src = NULL; e_route->gw_dst = NULL; - e_route->link_list = xbt_dynar_new(sizeof(Link*), NULL); - xbt_dynar_push(e_route->link_list, &routing_platf->loopback_); + e_route->link_list = new std::vector(); + e_route->link_list->push_back(routing_platf->loopback_); TO_ROUTE_FULL(i, i) = e_route; } } @@ -54,7 +53,7 @@ AsFull::~AsFull(){ for (i = 0; i < table_size; i++) for (j = 0; j < table_size; j++) { if (TO_ROUTE_FULL(i,j)){ - xbt_dynar_free(&TO_ROUTE_FULL(i,j)->link_list); + delete TO_ROUTE_FULL(i,j)->link_list; xbt_free(TO_ROUTE_FULL(i,j)); } } @@ -62,82 +61,37 @@ AsFull::~AsFull(){ } } -xbt_dynar_t AsFull::getOneLinkRoutes() -{ - xbt_dynar_t ret = xbt_dynar_new(sizeof(Onelink*), xbt_free_f); - - int src, dst; - int table_size = xbt_dynar_length(vertices_); - - for(src=0; src < table_size; src++) { - for(dst=0; dst< table_size; dst++) { - sg_platf_route_cbarg_t route = TO_ROUTE_FULL(src,dst); - if (route) { - if (xbt_dynar_length(route->link_list) == 1) { - void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0); - Onelink *onelink; - if (hierarchy_ == SURF_ROUTING_BASE) { - NetCard *tmp_src = xbt_dynar_get_as(vertices_, src, sg_netcard_t); - tmp_src->setId(src); - NetCard *tmp_dst = xbt_dynar_get_as(vertices_, dst, sg_netcard_t); - tmp_dst->setId(dst); - onelink = new Onelink(link, tmp_src, tmp_dst); - } else if (hierarchy_ == SURF_ROUTING_RECURSIVE) - onelink = new Onelink(link, route->gw_src, route->gw_dst); - else - onelink = new Onelink(link, NULL, NULL); - xbt_dynar_push(ret, &onelink); - XBT_DEBUG("Push route from '%d' to '%d'", - src, - dst); - } - } - } - } - return ret; -} - void AsFull::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t res, double *lat) { XBT_DEBUG("full_get_route_and_latency from %s[%d] to %s[%d]", - src->name(), - src->id(), - dst->name(), - dst->id()); + src->name(), src->id(), dst->name(), dst->id()); /* set utils vars */ size_t table_size = xbt_dynar_length(vertices_); sg_platf_route_cbarg_t e_route = NULL; - void *link; - unsigned int cpt = 0; e_route = TO_ROUTE_FULL(src->id(), dst->id()); if (e_route) { res->gw_src = e_route->gw_src; res->gw_dst = e_route->gw_dst; - xbt_dynar_foreach(e_route->link_list, cpt, link) { - xbt_dynar_push(res->link_list, &link); + for (auto link : *e_route->link_list) { + res->link_list->push_back(link); if (lat) *lat += static_cast(link)->getLatency(); } } } -static int full_pointer_resource_cmp(const void *a, const void *b) -{ - return a != b; -} - -void AsFull::parseRoute(sg_platf_route_cbarg_t route) +void AsFull::addRoute(sg_platf_route_cbarg_t route) { const char *src = route->src; const char *dst = route->dst; NetCard *src_net_elm = sg_netcard_by_name_or_null(src); NetCard *dst_net_elm = sg_netcard_by_name_or_null(dst); - parseRouteCheckParams(route); + addRouteCheckParams(route); size_t table_size = xbt_dynar_length(vertices_); @@ -155,40 +109,25 @@ void AsFull::parseRoute(sg_platf_route_cbarg_t route) /* Add the route to the base */ TO_ROUTE_FULL(src_net_elm->id(), dst_net_elm->id()) = newExtendedRoute(hierarchy_, route, 1); - xbt_dynar_shrink(TO_ROUTE_FULL(src_net_elm->id(), dst_net_elm->id())->link_list, 0); + TO_ROUTE_FULL(src_net_elm->id(), dst_net_elm->id())->link_list->shrink_to_fit(); - if (route->symmetrical == TRUE) { + if (route->symmetrical == TRUE && src_net_elm != dst_net_elm) { if (route->gw_dst && route->gw_src) { NetCard* gw_tmp = route->gw_src; route->gw_src = route->gw_dst; route->gw_dst = gw_tmp; } - if (TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id())) { - char *link_name; - unsigned int i; - xbt_dynar_t link_route_to_test = xbt_dynar_new(sizeof(Link*), NULL); - for (i = xbt_dynar_length(route->link_list); i > 0; i--) { - link_name = xbt_dynar_get_as(route->link_list, i - 1, char *); - void *link = Link::byName(link_name); - xbt_assert(link, "Link : '%s' doesn't exists.", link_name); - xbt_dynar_push(link_route_to_test, &link); - } - xbt_assert(!xbt_dynar_compare(TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id())->link_list, - link_route_to_test, - full_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exists", src, - dst); - } else { - if (!route->gw_dst && !route->gw_src) - XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst, src); - else - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", - dst, route->gw_src->name(), src, route->gw_dst->name()); - TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id()) = newExtendedRoute(hierarchy_, route, 0); - xbt_dynar_shrink(TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id())->link_list, 0); - } + if (route->gw_dst) // AS route (to adapt the error message, if any) + xbt_assert(nullptr == TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id()), + "The route between %s@%s and %s@%s already exists. You should not declare the reverse path as symmetrical.", + dst,route->gw_dst->name(),src,route->gw_src->name()); + else + xbt_assert(nullptr == TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id()), + "The route between %s and %s already exists. You should not declare the reverse path as symmetrical.", dst,src); + + TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id()) = newExtendedRoute(hierarchy_, route, 0); + TO_ROUTE_FULL(dst_net_elm->id(), src_net_elm->id())->link_list->shrink_to_fit(); } - xbt_dynar_free(&route->link_list); } }