X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/eaab609e9b69f5b25d37d3f50ed92ef5ec1bdd1d..bd568bd51e676d804576f658d2b3ecc1c0330bbb:/src/surf/surf_routing_floyd.cpp diff --git a/src/surf/surf_routing_floyd.cpp b/src/surf/surf_routing_floyd.cpp index 2f297fd65a..c902ac3844 100644 --- a/src/surf/surf_routing_floyd.cpp +++ b/src/surf/surf_routing_floyd.cpp @@ -43,21 +43,19 @@ AsFloyd::~AsFloyd(){ xbt_dynar_t AsFloyd::getOneLinkRoutes() { xbt_dynar_t ret = xbt_dynar_new(sizeof(Onelink*), xbt_free_f); - sg_platf_route_cbarg_t route = xbt_new0(s_sg_platf_route_cbarg_t, 1); - route->link_list = xbt_dynar_new(sizeof(Link*), NULL); + sg_platf_route_cbarg_t route = xbt_new0(s_sg_platf_route_cbarg_t, 1); + route->link_list = new std::vector(); - int src,dst; - sg_netcard_t src_elm, dst_elm; int table_size = xbt_dynar_length(vertices_); - for(src=0; src < table_size; src++) { - for(dst=0; dst< table_size; dst++) { - xbt_dynar_reset(route->link_list); - src_elm = xbt_dynar_get_as(vertices_, src, NetCard*); - dst_elm = xbt_dynar_get_as(vertices_, dst, NetCard*); + for(int src=0; src < table_size; src++) { + for(int dst=0; dst< table_size; dst++) { + route->link_list->clear(); + NetCard *src_elm = xbt_dynar_get_as(vertices_, src, NetCard*); + NetCard *dst_elm = xbt_dynar_get_as(vertices_, dst, NetCard*); this->getRouteAndLatency(src_elm, dst_elm, route, NULL); - if (xbt_dynar_length(route->link_list) == 1) { - void *link = *(void **) xbt_dynar_get_ptr(route->link_list, 0); + if (route->link_list->size() == 1) { + void *link = route->link_list->at(0); Onelink *onelink; if (hierarchy_ == SURF_ROUTING_BASE) onelink = new Onelink(link, src_elm, dst_elm); @@ -73,7 +71,7 @@ xbt_dynar_t AsFloyd::getOneLinkRoutes() return ret; } -void AsFloyd::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t res, double *lat) +void AsFloyd::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbarg_t route, double *lat) { size_t table_size = xbt_dynar_length(vertices_); @@ -93,26 +91,22 @@ void AsFloyd::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbar } while (cur != src->id()); if (hierarchy_ == SURF_ROUTING_RECURSIVE) { - res->gw_src = xbt_dynar_getlast_as(route_stack, sg_platf_route_cbarg_t)->gw_src; - res->gw_dst = xbt_dynar_getfirst_as(route_stack, sg_platf_route_cbarg_t)->gw_dst; + route->gw_src = xbt_dynar_getlast_as(route_stack, sg_platf_route_cbarg_t)->gw_src; + route->gw_dst = xbt_dynar_getfirst_as(route_stack, sg_platf_route_cbarg_t)->gw_dst; } sg_netcard_t prev_dst_gw = NULL; while (!xbt_dynar_is_empty(route_stack)) { sg_platf_route_cbarg_t e_route = xbt_dynar_pop_as(route_stack, sg_platf_route_cbarg_t); - xbt_dynar_t links; - void *link; - unsigned int cpt; if (hierarchy_ == SURF_ROUTING_RECURSIVE && prev_dst_gw != NULL && strcmp(prev_dst_gw->name(), e_route->gw_src->name())) { - routing_platf->getRouteAndLatency(prev_dst_gw, e_route->gw_src, &res->link_list, lat); + routing_platf->getRouteAndLatency(prev_dst_gw, e_route->gw_src, route->link_list, lat); } - links = e_route->link_list; - xbt_dynar_foreach(links, cpt, link) { - xbt_dynar_push_as(res->link_list, Link*, (Link*)link); + for (auto link: *e_route->link_list) { + route->link_list->push_back(link); if (lat) - *lat += static_cast(link)->getLatency(); + *lat += link->getLatency(); } prev_dst_gw = e_route->gw_dst; @@ -120,10 +114,6 @@ void AsFloyd::getRouteAndLatency(NetCard *src, NetCard *dst, sg_platf_route_cbar xbt_dynar_free(&route_stack); } -static int floyd_pointer_resource_cmp(const void *a, const void *b) { - return a != b; -} - void AsFloyd::addRoute(sg_platf_route_cbarg_t route) { /* set the size of table routing */ @@ -160,53 +150,35 @@ void AsFloyd::addRoute(sg_platf_route_cbarg_t route) TO_FLOYD_LINK(src->id(), dst->id()) = newExtendedRoute(hierarchy_, route, 1); TO_FLOYD_PRED(src->id(), dst->id()) = src->id(); - TO_FLOYD_COST(src->id(), dst->id()) = ((TO_FLOYD_LINK(src->id(), dst->id()))->link_list)->used; + TO_FLOYD_COST(src->id(), dst->id()) = (TO_FLOYD_LINK(src->id(), dst->id()))->link_list->size(); if (route->symmetrical == TRUE) { - if(TO_FLOYD_LINK(dst->id(), src->id())) - { - if(!route->gw_dst && !route->gw_src) - XBT_DEBUG("See Route from \"%s\" to \"%s\"", dst->name(), src->name()); - else - XBT_DEBUG("See ASroute from \"%s(%s)\" to \"%s(%s)\"", dst->name(), route->gw_src->name(), src->name(), route->gw_dst->name()); - - char * link_name; - xbt_dynar_t link_route_to_test = xbt_dynar_new(sizeof(Link*), NULL); - for(int 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_FLOYD_LINK(dst->id(), src->id())->link_list, - link_route_to_test, - (int_f_cpvoid_cpvoid_t) floyd_pointer_resource_cmp), - "The route between \"%s\" and \"%s\" already exists", src->name(),dst->name()); + if (route->gw_dst) // AS route (to adapt the error message, if any) + xbt_assert(nullptr == TO_FLOYD_LINK(dst->id(), src->id()), + "The route between %s@%s and %s@%s already exists. You should not declare the reverse path as symmetrical.", + dst->name(),route->gw_dst->name(),src->name(),route->gw_src->name()); + else + xbt_assert(nullptr == TO_FLOYD_LINK(dst->id(), src->id()), + "The route between %s and %s already exists. You should not declare the reverse path as symmetrical.", + dst->name(),src->name()); + + if(route->gw_dst && route->gw_src) { + NetCard* gw_tmp = route->gw_src; + route->gw_src = route->gw_dst; + route->gw_dst = gw_tmp; } - else { - 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(!route->gw_src && !route->gw_dst) + XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst->name(), src->name()); + else + XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst->name(), + route->gw_src->name(), src->name(), route->gw_dst->name()); - if(!route->gw_src && !route->gw_dst) - XBT_DEBUG("Load Route from \"%s\" to \"%s\"", dst->name(), src->name()); - else - XBT_DEBUG("Load ASroute from \"%s(%s)\" to \"%s(%s)\"", dst->name(), - route->gw_src->name(), src->name(), route->gw_dst->name()); - - TO_FLOYD_LINK(dst->id(), src->id()) = - newExtendedRoute(hierarchy_, route, 0); - TO_FLOYD_PRED(dst->id(), src->id()) = dst->id(); - TO_FLOYD_COST(dst->id(), src->id()) = - ((TO_FLOYD_LINK(dst->id(), src->id()))->link_list)->used; /* count of links, old model assume 1 */ - } + TO_FLOYD_LINK(dst->id(), src->id()) = newExtendedRoute(hierarchy_, route, 0); + TO_FLOYD_PRED(dst->id(), src->id()) = dst->id(); + TO_FLOYD_COST(dst->id(), src->id()) = (TO_FLOYD_LINK(dst->id(), src->id()))->link_list->size(); /* count of links, old model assume 1 */ } - xbt_dynar_free(&route->link_list); } void AsFloyd::Seal(){ @@ -237,8 +209,8 @@ void AsFloyd::Seal(){ 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_FLOYD_LINK(i, i) = e_route; TO_FLOYD_PRED(i, i) = i; TO_FLOYD_COST(i, i) = 1;