From: navarrop Date: Fri, 5 Nov 2010 15:09:13 +0000 (+0000) Subject: Add function xbt_dynar_compare X-Git-Tag: v3_5~324 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/74eba548bff1168594c39c3b483ee6db94acd808 Add function xbt_dynar_compare arg1 : dynar arg2 : dynar arg3 : the function used to compare git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@8501 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/include/xbt/dynar.h b/include/xbt/dynar.h index 49d2334617..aa03316140 100644 --- a/include/xbt/dynar.h +++ b/include/xbt/dynar.h @@ -105,6 +105,8 @@ XBT_PUBLIC(unsigned int) xbt_dynar_search(xbt_dynar_t const dynar, XBT_PUBLIC(int) xbt_dynar_member(xbt_dynar_t const dynar, void *elem); XBT_PUBLIC(void) xbt_dynar_sort(xbt_dynar_t const dynar, int_f_cpvoid_cpvoid_t compar_fn); +XBT_INLINE int xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2, + int(*compar)(const void *, const void *)); /** @} */ /** @defgroup XBT_dynar_perl Perl-like use of dynars diff --git a/src/surf/surf_routing.c b/src/surf/surf_routing.c index 51eeb16d1d..4f5b42a8d9 100644 --- a/src/surf/surf_routing.c +++ b/src/surf/surf_routing.c @@ -2507,12 +2507,13 @@ static void generic_set_route(routing_component_t rc, const char *src, "Invalid count of links, must be greater than zero (%s,%s)", src, dst); - if( compare_routes(route,xbt_dict_get_or_null(_parse_routes, route_name)) ) - xbt_die(bprintf("The route between \"%s\" and \"%s\" already exist", src,dst)); - -// xbt_assert2(!xbt_dict_get_or_null(_parse_routes, route_name), -// "The route between \"%s\" and \"%s\" already exist", src, -// dst); + route_t route_to_test = xbt_dict_get_or_null(_parse_routes, route_name); + if(route_to_test) + xbt_assert2(xbt_dynar_compare( + (void*)route->link_list, + (void*)route_to_test->link_list, + (int_f_cpvoid_cpvoid_t) strcmp), + "The route between \"%s\" and \"%s\" already exist", src,dst); xbt_dict_set(_parse_routes, route_name, route, NULL); xbt_free(route_name); @@ -2529,8 +2530,13 @@ static void generic_set_route(routing_component_t rc, const char *src, xbt_dynar_push_as(route_sym->link_list ,char *, link_name); } DEBUG2("Load Route from \"%s\" to \"%s\"", dst, src); - if( compare_routes(route_sym,xbt_dict_get_or_null(_parse_routes, bprintf("%d#%d",*dst_id, *src_id))) ) - xbt_die(bprintf("The route between \"%s\" and \"%s\" already exist", dst,src)); + route_to_test = xbt_dict_get_or_null(_parse_routes, bprintf("%d#%d",*dst_id, *src_id)); + if(route_to_test) + xbt_assert2(xbt_dynar_compare( + (void*)route_sym->link_list, + (void*)route_to_test->link_list, + (int_f_cpvoid_cpvoid_t) strcmp), + "The route between \"%s\" and \"%s\" already exist", dst,src); xbt_dict_set(_parse_routes, bprintf("%d#%d",*dst_id, *src_id), route_sym, NULL); } } @@ -2560,9 +2566,14 @@ static void generic_set_ASroute(routing_component_t rc, const char *src, "Invalid count of links, must be greater than zero (%s,%s)", src, dst); - if( compare_routes((route_t) &(e_route->generic_route),xbt_dict_get_or_null(_parse_routes, route_name)) ) - xbt_die(bprintf("The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", - src, e_route->src_gateway, dst, e_route->dst_gateway)); + route_t route_to_test = xbt_dict_get_or_null(_parse_routes, route_name); + if(route_to_test) + xbt_assert4(xbt_dynar_compare( + (void*) (&e_route->generic_route)->link_list, + (void*) route_to_test->link_list, + (int_f_cpvoid_cpvoid_t) strcmp), + "The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", + src, e_route->src_gateway, dst, e_route->dst_gateway); xbt_dict_set(_parse_routes, route_name, e_route, NULL); xbt_free(route_name); @@ -2585,9 +2596,14 @@ static void generic_set_ASroute(routing_component_t rc, const char *src, route_sym->dst_gateway = bprintf("%s",e_route->src_gateway); DEBUG4("Load ASroute from \"%s(%s)\" to \"%s(%s)\"",dst, route_sym->src_gateway,src,route_sym->dst_gateway); - if( compare_routes((route_t) &(route_sym->generic_route),xbt_dict_get_or_null(_parse_routes,bprintf("%d#%d", *dst_id, *src_id))) ) - xbt_die(bprintf("The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", - dst, route_sym->src_gateway, src, route_sym->dst_gateway)); + route_to_test = xbt_dict_get_or_null(_parse_routes, bprintf("%d#%d", *dst_id, *src_id)); + if(route_to_test) + xbt_assert4(xbt_dynar_compare( + (void*) (&route_sym->generic_route)->link_list, + (void*) route_to_test->link_list, + (int_f_cpvoid_cpvoid_t) strcmp), + "The route between \"%s\"(\"%s\") and \"%s\"(\"%s\") already exist", + dst, route_sym->src_gateway, src, route_sym->dst_gateway); xbt_dict_set(_parse_routes, bprintf("%d#%d", *dst_id, *src_id), route_sym, NULL); } @@ -3294,26 +3310,3 @@ void routing_store_route(void) { parse_E_route_store_route(); } - -/* - * Compare two routes to know if the second route is in the table. - * route1 : route to store - * route2 : old route in the table - */ -int compare_routes(route_t route1, route_t route2) -{ - if(!route2) return 0; - if(xbt_dynar_length(route1->link_list) == xbt_dynar_length(route2->link_list)) - { - int i; - int nb_links = xbt_dynar_length(route1->link_list); - for(i=0 ; ilink_list, i, char *); - char *link_name2 = xbt_dynar_get_as(route2->link_list, i, char *); - if(strcmp(link_name1,link_name2)) return 1; - } - return 0; - } - return 1; -} diff --git a/src/xbt/dynar.c b/src/xbt/dynar.c index bead04b141..2984820ab9 100644 --- a/src/xbt/dynar.c +++ b/src/xbt/dynar.c @@ -725,6 +725,29 @@ XBT_INLINE void xbt_dynar_sort(xbt_dynar_t dynar, _dynar_unlock(dynar); } +/* + * Return 0 if d1 and d2 are equal and 1 if not equal + */ +XBT_INLINE int xbt_dynar_compare(xbt_dynar_t d1, xbt_dynar_t d2, + int(*compar)(const void *, const void *)) +{ + int i ; + int size; + if((!d1) && (!d2)) return 0; + if((!d1) || (!d2)) return 1; + if((d1->elmsize)!=(d2->elmsize)) return 1; // xbt_die + if(xbt_dynar_length(d1) != xbt_dynar_length(d2)) return 1; + + size = xbt_dynar_length(d1); + for(i=0;i