Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Use xbt_XXX_is_empty() instead of testing xbt_XXX_length() against 0.
[simgrid.git] / src / simdag / sd_dotloader.c
index c9c34ce..006a682 100644 (file)
@@ -27,17 +27,23 @@ xbt_dynar_t SD_dotload_generic(const char * filename);
 
 static double dot_parse_double(const char *string)
 {
-  if (string == NULL)
-    return -1;
-  int ret = 0;
-  double value = -1;
-
-  ret = sscanf(string, "%lg", &value);
-  if (ret != 1)
-    WARN1("%s is not a double", string);
-  return value;
+    if (string == NULL)
+          return -1;
+      double value = -1;
+        char *err;
+
+          //ret = sscanf(string, "%lg", &value);
+          errno = 0;
+            value = strtod(string,&err);
+              if(errno)
+                  {
+                        XBT_WARN("Failed to convert string to double: %s\n",strerror(errno));
+                            return -1;
+                              }
+                return value;
 }
 
+
 static int dot_parse_int(const char *string)
 {
   if (string == NULL)
@@ -47,7 +53,7 @@ static int dot_parse_int(const char *string)
 
   ret = sscanf(string, "%d", &value);
   if (ret != 1)
-    WARN1("%s is not an integer", string);
+    XBT_WARN("%s is not an integer", string);
   return value;
 }
 
@@ -64,7 +70,7 @@ static void dump_res()
   unsigned int cursor;
   SD_task_t task;
   xbt_dynar_foreach(result, cursor, task) {
-    INFO1("Task %d", cursor);
+    XBT_INFO("Task %d", cursor);
     SD_task_dump(task);
   }
 }
@@ -138,17 +144,19 @@ xbt_dynar_t SD_dotload_with_sched(const char *filename){
     if(acyclic_graph_detail(result))
       return result;
     else
-      WARN0("There is at least one cycle in the provided task graph");
+      XBT_WARN("There is at least one cycle in the provided task graph");
   }else{
-    WARN0("The scheduling is ignored");
+    XBT_WARN("The scheduling is ignored");
   }
   return NULL;
 }
 
 xbt_dynar_t SD_dotload_generic(const char * filename)
 {
-  xbt_assert0(filename, "Unable to use a null file descriptor\n");
-  dag_dot =  agopen((char*)filename,Agstrictdirected,0);
+  xbt_assert(filename, "Unable to use a null file descriptor\n");
+//dag_dot =  agopen((char*)filename,Agstrictdirected,0);
+  FILE *in_file = fopen(filename, "r");
+  dag_dot = agread(in_file, NIL(Agdisc_t *));
 
   result = xbt_dynar_new(sizeof(SD_task_t), dot_task_free);
   files = xbt_dict_new();
@@ -189,7 +197,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename)
     unsigned int cpt1, cpt2;
     SD_task_t newfile = NULL;
     SD_dependency_t depbefore, depafter;
-    if (xbt_dynar_length(file->tasks_before) == 0) {
+    if (xbt_dynar_is_empty(file->tasks_before)) {
       xbt_dynar_foreach(file->tasks_after, cpt2, depafter) {
         SD_task_t newfile =
             SD_task_create_comm_e2e(file->name, NULL, file->amount);
@@ -197,7 +205,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename)
         SD_task_dependency_add(NULL, NULL, newfile, depafter->dst);
         xbt_dynar_push(result, &newfile);
       }
-    } else if (xbt_dynar_length(file->tasks_after) == 0) {
+    } else if (xbt_dynar_is_empty(file->tasks_after)) {
       xbt_dynar_foreach(file->tasks_before, cpt2, depbefore) {
         SD_task_t newfile =
             SD_task_create_comm_e2e(file->name, NULL, file->amount);
@@ -209,7 +217,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename)
       xbt_dynar_foreach(file->tasks_before, cpt1, depbefore) {
         xbt_dynar_foreach(file->tasks_after, cpt2, depafter) {
           if (depbefore->src == depafter->dst) {
-            WARN2
+            XBT_WARN
                 ("File %s is produced and consumed by task %s. This loop dependency will prevent the execution of the task.",
                  file->name, depbefore->src->name);
           }
@@ -228,6 +236,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename)
 
   /* Free previous copy of the files */
   xbt_dict_free(&files);
+  fclose(in_file);
   if(acyclic_graph_detail(result))
     return result;
   acyclic_graph_detail(result);
@@ -244,7 +253,7 @@ void dot_add_task(Agnode_t * dag_node)
   SD_task_t current_job;
   double runtime = dot_parse_double(agget(dag_node, (char *) "size"));
 
-  DEBUG3("See <job id=%s runtime=%s %.0f>", name,
+  XBT_DEBUG("See <job id=%s runtime=%s %.0f>", name,
         agget(dag_node, (char *) "size"), runtime);
   current_job = xbt_dict_get_or_null(jobs, name);
   if (current_job == NULL) {
@@ -301,7 +310,7 @@ void dot_add_task(Agnode_t * dag_node)
     if (char_order != NULL)
       order = (long) dot_parse_int(char_order);
     xbt_dynar_t computer = NULL;
-    //INFO2("performer = %d, order=%d",performer,order);
+    //XBT_INFO("performer = %d, order=%d",performer,order);
     if(performer != -1 && order != -1){
       //necessary parameters are given
       computer = xbt_dict_get_or_null(computers, char_performer);
@@ -309,7 +318,7 @@ void dot_add_task(Agnode_t * dag_node)
         computer = xbt_dynar_new(sizeof(SD_task_t), NULL);
         xbt_dict_set(computers, char_performer, computer, NULL);
       }
-      if(performer < sd_global->workstation_count){
+      if(performer < xbt_lib_length(host_lib)){
         // the  wanted computer is available
         SD_task_t *task_test = NULL;
         if(order < computer->used)
@@ -317,7 +326,7 @@ void dot_add_task(Agnode_t * dag_node)
         if(task_test != NULL && *task_test != NULL && *task_test != current_job){
           /*the user gives the same order to several tasks*/
           schedule = false;
-          VERB4("The task %s starts on the computer %s at the position : %s like the task %s",
+          XBT_VERB("The task %s starts on the computer %s at the position : %s like the task %s",
                  (*task_test)->name, char_performer, char_order, current_job->name);
         }else{
           //the parameter seems to be ok
@@ -327,13 +336,13 @@ void dot_add_task(Agnode_t * dag_node)
         /*the platform has not enough processors to schedule the DAG like
         *the user wants*/
         schedule = false;
-        VERB0("The schedule is ignored, there are not enough computers");
+        XBT_VERB("The schedule is ignored, there are not enough computers");
       }
     }
     else {
       //one of necessary parameters are not given
       schedule = false;
-      VERB1("The schedule is ignored, the task %s is not correctly schedule", current_job->name);
+      XBT_VERB("The schedule is ignored, the task %s is not correctly schedule", current_job->name);
     }
   }
 }
@@ -345,11 +354,12 @@ void dot_add_task(Agnode_t * dag_node)
 void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge)
 {
   SD_task_t file;
-
-  char name[80];
-  sprintf(name, "%s->%s", agnameof(agtail(edge)), agnameof(aghead(edge)));
+  char *name_tail=agnameof(agtail(edge));
+  char *name_head=agnameof(aghead(edge));
+  char *name = malloc((strlen(name_head)+strlen(name_tail)+3)*sizeof(char));
+  sprintf(name, "%s->%s", name_tail, name_head);
   double size = dot_parse_double(agget(edge, (char *) "size"));
-  DEBUG2("size : %e, get size : %s", size, agget(edge, (char *) "size"));
+  XBT_DEBUG("size : %e, get size : %s", size, agget(edge, (char *) "size"));
 
   if (size > 0) {
     file = xbt_dict_get_or_null(files, name);
@@ -361,7 +371,7 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge)
       xbt_dict_set(files, name, file, &dot_task_free);
     } else {
       if (SD_task_get_amount(file) != size) {
-        WARN3("Ignoring file %s size redefinition from %.0f to %.0f",
+        XBT_WARN("Ignoring file %s size redefinition from %.0f to %.0f",
               name, SD_task_get_amount(file), size);
       }
     }
@@ -372,6 +382,7 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge)
       SD_task_dependency_add(NULL, NULL, file, current_job);
     }
   }
+  free(name);
 }
 
 /* dot_add_output_dependencies create the dependencies between a
@@ -381,10 +392,12 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge)
 void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge)
 {
   SD_task_t file;
-  char name[80];
-  sprintf(name, "%s->%s", agnameof(agtail(edge)), agnameof(aghead(edge)));
+  char *name_tail=agnameof(agtail(edge));
+  char *name_head=agnameof(aghead(edge));
+  char *name = malloc((strlen(name_head)+strlen(name_tail)+3)*sizeof(char));
+  sprintf(name, "%s->%s", name_tail, name_head);
   double size = dot_parse_double(agget(edge, (char *) "size"));
-  DEBUG2("size : %e, get size : %s", size, agget(edge, (char *) "size"));
+  XBT_DEBUG("size : %e, get size : %s", size, agget(edge, (char *) "size"));
 
   if (size > 0) {
     file = xbt_dict_get_or_null(files, name);
@@ -396,13 +409,13 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge)
       xbt_dict_set(files, name, file, &dot_task_free);
     } else {
       if (SD_task_get_amount(file) != size) {
-        WARN3("Ignoring file %s size redefinition from %.0f to %.0f",
+        XBT_WARN("Ignoring file %s size redefinition from %.0f to %.0f",
               name, SD_task_get_amount(file), size);
       }
     }
     SD_task_dependency_add(NULL, NULL, current_job, file);
     if (xbt_dynar_length(file->tasks_before) > 1) {
-      WARN1("File %s created at more than one location...", file->name);
+      XBT_WARN("File %s created at more than one location...", file->name);
     }
   } else {
     file = xbt_dict_get_or_null(jobs, agnameof(aghead(edge)));
@@ -410,4 +423,5 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge)
       SD_task_dependency_add(NULL, NULL, current_job, file);
     }
   }
+  free(name);
 }