Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
better to close file
[simgrid.git] / src / simdag / sd_dotloader.c
index 194f79e..79f8642 100644 (file)
@@ -75,6 +75,7 @@ static void TRACE_sd_dotloader (SD_task_t task, const char *category) {
  */
 xbt_dynar_t SD_dotload(const char *filename) {
   computers = xbt_dict_new_homogeneous(NULL);
+  schedule = false;
   SD_dotload_generic(filename, sequential);
   xbt_dynar_t computer = NULL;
   xbt_dict_cursor_t dict_cursor;
@@ -168,9 +169,17 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){
     if (seq_or_par == sequential){
       XBT_DEBUG("See <job id=%s amount =%.0f>", name, amount);
     } else {
-      alpha = atof(agget(node, (char *) "alpha"));
-      if (alpha == -1.)
+      if (!strcmp(agget(node, (char *) "alpha"), "")){
+        alpha = atof(agget(node, (char *) "alpha"));
+        if (alpha == -1.){
+          XBT_DEBUG("negative alpha value provided. Set to 0.");
+          alpha = 0.0 ;
+        }
+      } else {
+        XBT_DEBUG("no alpha value provided. Set to 0");
         alpha = 0.0 ;
+      }
+
       XBT_DEBUG("See <job id=%s amount =%.0f alpha = %.3f>",
           name, amount, alpha);
     }
@@ -200,20 +209,20 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){
         }
       }
 
-      if(schedule && seq_or_par == sequential){
+      if((seq_or_par == sequential) &&
+          (schedule ||
+              XBT_LOG_ISENABLED(sd_dotparse, xbt_log_priority_verbose))){
         /* try to take the information to schedule the task only if all is
          * right*/
+        int performer, order;
+        char *char_performer = agget(node, (char *) "performer");
+        char *char_order = agget(node, (char *) "order");
         /* performer is the computer which execute the task */
-        int performer = -1;
-        char * char_performer = agget(node, (char *) "performer");
-        if (char_performer)
-          performer = atoi(char_performer);
-
+        performer =
+            ((!char_performer || !strcmp(char_performer,"")) ? -1:atoi(char_performer));
         /* order is giving the task order on one computer */
-        int order = -1;
-        char * char_order = agget(node, (char *) "order");
-        if (char_order)
-          order = atoi(char_order);
+        order = ((!char_order || !strcmp(char_order, ""))? -1:atoi(char_order));
+
         XBT_DEBUG ("Task '%s' is scheduled on workstation '%d' in position '%d'",
                     task->name, performer, order);
         xbt_dynar_t computer = NULL;
@@ -316,6 +325,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){
         } else {
           XBT_WARN("Task '%s' is defined more than once", name);
         }
+        xbt_free(name);
       } else {
         SD_task_dependency_add(NULL, NULL, src, dst);
       }
@@ -347,6 +357,13 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){
 
   agclose(dag_dot);
   xbt_dict_free(&jobs);
+  fclose(in_file);
 
+  if (!acyclic_graph_detail(result)) {
+    XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.",
+              basename((char*)filename));
+    xbt_dynar_free(&result);
+    /* (result == NULL) here */
+  }
   return result;
 }