- xbt_dict_cursor_t cursor_w;
- int symmetric;
- unsigned int cpt, cpt2, cursor;
- char *src_host_name, *dst_host_name, *key, *src, *dst, *val, *key_w, *data_w;
- const char* sep="#";
- xbt_dynar_t src_names = NULL, dst_names = NULL, links;
-
- if (!route_multi_elements) return;
-
- old_buff = surfxml_bufferstack;
- /* Get all routes in the exact order they were entered in the platform file */
- xbt_dynar_foreach(route_multi_elements, cursor, key) {
- /* Get links for the route */
- links = (xbt_dynar_t)xbt_dict_get_or_null(route_multi_table, key);
- keys = xbt_str_split_str(key, sep);
- /* Get route ends */
- src = xbt_dynar_get_as(keys, 0, char*);
- dst = xbt_dynar_get_as(keys, 1, char*);
- route_action = atoi(xbt_dynar_get_as(keys, 2, char*));
- symmetric = atoi(xbt_dynar_get_as(keys, 3, char*));
-
- /* Create the dynar of src and dst hosts for the new routes */
- /* NOTE: src and dst can be either set names or simple host names */
- src_names = (xbt_dynar_t)xbt_dict_get_or_null(set_list, src);
- dst_names = (xbt_dynar_t)xbt_dict_get_or_null(set_list, dst);
- /* Add to dynar even if they are simple names */
- if (src_names == NULL) {
- src_names = xbt_dynar_new(sizeof(char *), &free_string);
- val = xbt_strdup(src);
- xbt_dynar_push(src_names, &val);
- }
- if (dst_names == NULL) {
- dst_names = xbt_dynar_new(sizeof(char *), &free_string);
- val = xbt_strdup(dst);
- xbt_dynar_push(dst_names, &val);
- }
- /* Build the routes */
- DEBUG2("ADDING MULTI ROUTE: %s -> %s", xbt_dynar_get_as(keys, 0, char*), xbt_dynar_get_as(keys, 1, char*));
- xbt_dynar_foreach(src_names, cpt, src_host_name) {
- xbt_dynar_foreach(dst_names, cpt2, dst_host_name) {
- /* If dst is $* then set this route to have its dst point to all hosts */
- if (strcmp(src_host_name,"$*") != 0 && strcmp(dst_host_name,"$*") == 0){
- xbt_dict_foreach(cpu_set, cursor_w, key_w, data_w) {
- //int n = xbt_dynar_member(src_names, (char*)key_w);
- add_multi_links(src, dst, links, src_host_name, key_w);
- }
- }
- /* If src is $* then set this route to have its dst point to all hosts */
- if (strcmp(src_host_name,"$*") == 0 && strcmp(dst_host_name,"$*") != 0){
- xbt_dict_foreach(cpu_set, cursor_w, key_w, data_w) {
- // if (!symmetric || (symmetric && !contains(dst_names, key_w)))
- add_multi_links(src, dst, links, key_w, dst_host_name);
- }
- }
- /* if none of them are equal to $* */
- if (strcmp(src_host_name,"$*") != 0 && strcmp(dst_host_name,"$*") != 0) {
- add_multi_links(src, dst, links, src_host_name, dst_host_name);
- }
- }
- }
- }
- surfxml_bufferstack = old_buff;
- xbt_dict_free(&route_multi_table);
- xbt_dynar_free(&route_multi_elements);