Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
don't break anything this way
[simgrid.git] / src / simdag / sd_dotloader.c
index f4bfee3..47cb4ca 100644 (file)
@@ -215,14 +215,13 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){
         /* try to take the information to schedule the task only if all is
          * right*/
         int performer, order;
-        char *char_performer, *char_order;
+        char *char_performer = agget(node, (char *) "performer");
+        char *char_order = agget(node, (char *) "order");
         /* performer is the computer which execute the task */
         performer =
-            (!strcmp((char_performer  = agget(node, (char *) "performer")), "")?
-            -1:atoi(char_performer));
+            ((!char_performer || !strcmp(char_performer,"")) ? -1:atoi(char_performer));
         /* order is giving the task order on one computer */
-        order = (!strcmp((char_order  = agget(node, (char *) "order")), "")?
-              -1: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);
@@ -326,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);
       }
@@ -358,5 +358,11 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){
   agclose(dag_dot);
   xbt_dict_free(&jobs);
 
+  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;
 }