Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Clean callbacks for the host parsing.
[simgrid.git] / src / surf / surf_routing.c
index 9c7b5fb..e5e66a0 100644 (file)
@@ -186,11 +186,9 @@ static void parse_E_host(void)
 /*
  * \brief Add a host to the network element list from XML
  */
-static void parse_S_host_XML(void)
+static void parse_S_host_XML(surf_parsing_host_arg_t h)
 {
-//     XBT_INFO("parse_S_host_XML");
-//     XBT_INFO("'%s'  '%s'",struct_host->V_host_id, struct_host->V_host_coord);
-       parse_S_host(struct_host->V_host_id, struct_host->V_host_coord);
+       parse_S_host(h->V_host_id, h->V_host_coord);
 }
 static void parse_E_host_XML(void)
 {
@@ -972,7 +970,7 @@ void routing_model_create(size_t size_of_links, void *loopback, double_f_cpvoid_
   current_routing = NULL;
 
   /* parse generic elements */
-  surfxml_add_callback(STag_surfxml_host_cb_list, &parse_S_host_XML);
+  surf_parse_host_add_cb(parse_S_host_XML);
   surfxml_add_callback(ETag_surfxml_host_cb_list, &parse_E_host_XML);
   surfxml_add_callback(STag_surfxml_router_cb_list, &parse_S_router_XML);
 
@@ -1504,6 +1502,8 @@ static void routing_parse_Econfig(void)
 static void parse_create_host_link(int i)
 {
        char *host_id, *link_id = NULL;
+       s_surf_parsing_host_arg_t host;
+       memset(&host,0,sizeof(host));
 
        host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, i, struct_cluster->V_cluster_suffix);
        link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, i);
@@ -1511,14 +1511,13 @@ static void parse_create_host_link(int i)
        A_surfxml_host_state = A_surfxml_host_state_ON;
 
        XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, struct_cluster->S_cluster_power);
-       struct_host = xbt_new0(s_surf_parsing_host_arg_t, 1);
-       struct_host->V_host_id = xbt_strdup(host_id);
+       host.V_host_id = xbt_strdup(host_id);
        if(strcmp(struct_cluster->V_cluster_availability_file,"")){
          xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free);
          char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file);
          xbt_str_varsubst(tmp_availability_file,patterns);
          XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file);
-         struct_host->V_host_power_trace = tmgr_trace_new(tmp_availability_file);
+         host.V_host_power_trace = tmgr_trace_new(tmp_availability_file);
          xbt_free(tmp_availability_file);
        }
        else
@@ -1529,7 +1528,7 @@ static void parse_create_host_link(int i)
          char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file);
          xbt_str_varsubst(tmp_state_file,patterns);
          XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file);
-         struct_host->V_host_state_trace = tmgr_trace_new(tmp_state_file);
+         host.V_host_state_trace = tmgr_trace_new(tmp_state_file);
          xbt_free(tmp_state_file);
        }
        else
@@ -1537,12 +1536,12 @@ static void parse_create_host_link(int i)
          XBT_DEBUG("\tstate_file=\"\"");
        }
 
-       struct_host->V_host_power_peak = struct_cluster->S_cluster_power;
-       struct_host->V_host_power_scale = 1.0;
-       struct_host->V_host_core = struct_cluster->S_cluster_core;
-       struct_host->V_host_state_initial = SURF_RESOURCE_ON;
-       struct_host->V_host_coord = "";
-       STag_surfxml_host_cluster();
+       host.V_host_power_peak = struct_cluster->S_cluster_power;
+       host.V_host_power_scale = 1.0;
+       host.V_host_core = struct_cluster->S_cluster_core;
+       host.V_host_state_initial = SURF_RESOURCE_ON;
+       host.V_host_coord = "";
+       surf_parse_host(&host);
        XBT_DEBUG("</host>");
 
        A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
@@ -1572,7 +1571,7 @@ static void parse_create_host_link(int i)
         else if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX)
                 struct_lnk->V_policy_initial_link = SURF_LINK_FULLDUPLEX;
        }
-       STag_surfxml_link_cluster();
+       surf_parse_link();
 
        ETag_surfxml_host();
        ETag_surfxml_link();
@@ -1604,6 +1603,8 @@ void routing_parse_Scluster(void)
   static int AX_ptr = 0;
   char *host_id, *groups, *link_id = NULL;
 
+  s_surf_parsing_host_arg_t host;
+
   if( strcmp(struct_cluster->V_cluster_availability_file,"")
          || strcmp(struct_cluster->V_cluster_state_file,"") )
   {
@@ -1633,20 +1634,167 @@ void routing_parse_Scluster(void)
   //Make all hosts
   radical_elements = xbt_str_split(struct_cluster->V_cluster_radical, ",");
   xbt_dynar_foreach(radical_elements, iter, groups) {
+    memset(&host,0,sizeof(host));
+
     radical_ends = xbt_str_split(groups, "-");
     switch (xbt_dynar_length(radical_ends)) {
     case 1:
                surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char *));
-               parse_create_host_link(start);
+               host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, start, struct_cluster->V_cluster_suffix);
+               link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, start);
+
+               XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, struct_cluster->S_cluster_power);
+               host.V_host_id = host_id;
+               if(strcmp(struct_cluster->V_cluster_availability_file,"")){
+                 xbt_dict_set(patterns, "radical", bprintf("%d", start), xbt_free);
+                 char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file);
+                 xbt_str_varsubst(tmp_availability_file,patterns);
+                 XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file);
+                 host.V_host_power_trace = tmgr_trace_new(tmp_availability_file);
+                 xbt_free(tmp_availability_file);
+               }
+               else
+               {
+                 XBT_DEBUG("\tavailability_file=\"\"");
+               }
+               if(strcmp(struct_cluster->V_cluster_state_file,"")){
+                 char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file);
+                 xbt_str_varsubst(tmp_state_file,patterns);
+                 XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file);
+                 host.V_host_state_trace = tmgr_trace_new(tmp_state_file);
+                 xbt_free(tmp_state_file);
+               }
+               else
+               {
+                 XBT_DEBUG("\tstate_file=\"\"");
+               }
+
+               host.V_host_power_peak = struct_cluster->S_cluster_power;
+               host.V_host_power_scale = 1.0;
+               host.V_host_core = struct_cluster->S_cluster_core;
+               host.V_host_state_initial = SURF_RESOURCE_ON;
+               host.V_host_coord = "";
+               surf_parse_host(&host);
+               XBT_DEBUG("</host>");
+
+               A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+               if(struct_cluster->V_cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+               {A_surfxml_link_sharing_policy =  A_surfxml_link_sharing_policy_FULLDUPLEX;}
+               if(struct_cluster->V_cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE)
+               {A_surfxml_link_sharing_policy =  A_surfxml_link_sharing_policy_FATPIPE;}
+
+               XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,struct_cluster->S_cluster_bw, struct_cluster->S_cluster_lat);
+
+               struct_lnk = xbt_new0(s_surf_parsing_link_arg_t, 1);
+               struct_lnk->V_link_id = link_id;
+               struct_lnk->V_link_bandwidth = struct_cluster->S_cluster_bw;
+               struct_lnk->V_link_latency = struct_cluster->S_cluster_lat;
+               struct_lnk->V_link_bandwidth_file = NULL;
+               struct_lnk->V_link_latency_file = NULL;
+               struct_lnk->V_link_state_file = NULL;
+               struct_lnk->V_link_state = SURF_RESOURCE_ON;
+               struct_lnk->V_link_sharing_policy = A_surfxml_link_sharing_policy;
+
+               if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_SHARED)
+                       struct_lnk->V_policy_initial_link = SURF_LINK_SHARED;
+               else
+               {
+                if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FATPIPE)
+                        struct_lnk->V_policy_initial_link = SURF_LINK_FATPIPE;
+                else if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX)
+                        struct_lnk->V_policy_initial_link = SURF_LINK_FULLDUPLEX;
+               }
+               surf_parse_link();
+
+               xbt_dict_set(cluster_host_link,host_id,strdup(link_id),free);
+//             XBT_INFO("key '%s' Value '%s'",host_id,link_id);
+               ETag_surfxml_host();
+               ETag_surfxml_link();
+
                break;
 
     case 2:
-               surf_parse_get_int(&start, xbt_dynar_get_as(radical_ends, 0, char *));
-               surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *));
-               for (i = start; i <= end; i++) {
-                 parse_create_host_link(i);
+
+      surf_parse_get_int(&start,
+                         xbt_dynar_get_as(radical_ends, 0, char *));
+      surf_parse_get_int(&end, xbt_dynar_get_as(radical_ends, 1, char *));
+      for (i = start; i <= end; i++) {
+               host_id = bprintf("%s%d%s", struct_cluster->V_cluster_prefix, i, struct_cluster->V_cluster_suffix);
+               link_id = bprintf("%s_link_%d", struct_cluster->V_cluster_id, i);
+
+               A_surfxml_host_state = A_surfxml_host_state_ON;
+
+               XBT_DEBUG("<host\tid=\"%s\"\tpower=\"%f\">", host_id, struct_cluster->S_cluster_power);
+               host.V_host_id = host_id;
+               if(strcmp(struct_cluster->V_cluster_availability_file,"")){
+                 xbt_dict_set(patterns, "radical", bprintf("%d", i), xbt_free);
+                 char* tmp_availability_file = xbt_strdup(struct_cluster->V_cluster_availability_file);
+                 xbt_str_varsubst(tmp_availability_file,patterns);
+                 XBT_DEBUG("\tavailability_file=\"%s\"",tmp_availability_file);
+                 host.V_host_power_trace = tmgr_trace_new(tmp_availability_file);
+                 xbt_free(tmp_availability_file);
                }
-               break;
+               else
+               {
+                 XBT_DEBUG("\tavailability_file=\"\"");
+               }
+               if(strcmp(struct_cluster->V_cluster_state_file,"")){
+                 char *tmp_state_file = xbt_strdup(struct_cluster->V_cluster_state_file);
+                 xbt_str_varsubst(tmp_state_file,patterns);
+                 XBT_DEBUG("\tstate_file=\"%s\"",tmp_state_file);
+                 host.V_host_state_trace = tmgr_trace_new(tmp_state_file);
+                 xbt_free(tmp_state_file);
+               }
+               else
+               {
+                 XBT_DEBUG("\tstate_file=\"\"");
+               }
+
+               host.V_host_power_peak = struct_cluster->S_cluster_power;
+               host.V_host_power_scale = 1.0;
+               host.V_host_core = struct_cluster->S_cluster_core;
+               host.V_host_state_initial = SURF_RESOURCE_ON;
+               host.V_host_coord = "";
+               surf_parse_host(&host);
+               XBT_DEBUG("</host>");
+
+               A_surfxml_link_sharing_policy = A_surfxml_link_sharing_policy_SHARED;
+               if(struct_cluster->V_cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FULLDUPLEX)
+               {A_surfxml_link_sharing_policy =  A_surfxml_link_sharing_policy_FULLDUPLEX;}
+               if(struct_cluster->V_cluster_sharing_policy == A_surfxml_cluster_sharing_policy_FATPIPE)
+               {A_surfxml_link_sharing_policy =  A_surfxml_link_sharing_policy_FATPIPE;}
+
+               XBT_DEBUG("<link\tid=\"%s\"\tbw=\"%f\"\tlat=\"%f\"/>", link_id,struct_cluster->S_cluster_bw, struct_cluster->S_cluster_lat);
+
+               struct_lnk = xbt_new0(s_surf_parsing_link_arg_t, 1);
+               struct_lnk->V_link_id = link_id;
+               struct_lnk->V_link_bandwidth = struct_cluster->S_cluster_bw;
+               struct_lnk->V_link_latency = struct_cluster->S_cluster_lat;
+               struct_lnk->V_link_bandwidth_file = NULL;
+               struct_lnk->V_link_latency_file = NULL;
+               struct_lnk->V_link_state_file = NULL;
+               struct_lnk->V_link_state = SURF_RESOURCE_ON;
+               struct_lnk->V_link_sharing_policy = A_surfxml_link_sharing_policy;
+
+               if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_SHARED)
+                       struct_lnk->V_policy_initial_link = SURF_LINK_SHARED;
+               else
+               {
+                if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FATPIPE)
+                        struct_lnk->V_policy_initial_link = SURF_LINK_FATPIPE;
+                else if (A_surfxml_link_sharing_policy == A_surfxml_link_sharing_policy_FULLDUPLEX)
+                        struct_lnk->V_policy_initial_link = SURF_LINK_FULLDUPLEX;
+               }
+               surf_parse_link();
+
+               xbt_dict_set(cluster_host_link,host_id,strdup(link_id),free);
+//             XBT_INFO("key '%s' Value '%s'",host_id,link_id);
+
+               ETag_surfxml_host();
+               ETag_surfxml_link();
+
+      }
+      break;
 
     default:
       XBT_DEBUG("Malformed radical");
@@ -1689,7 +1837,7 @@ void routing_parse_Scluster(void)
          else
                  struct_lnk->V_policy_initial_link = SURF_LINK_FATPIPE;
 
-         STag_surfxml_link_cluster();
+         surf_parse_link();
          ETag_surfxml_link();
 
          surf_parsing_link_up_down_t info = xbt_new0(s_surf_parsing_link_up_down_t, 1);