Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
even with DOT, we should whine if cycle are detected and return nothing
[simgrid.git] / src / simdag / sd_dotloader.c
index 8d15084..d1900ad 100644 (file)
@@ -9,6 +9,8 @@
 #include "xbt/misc.h"
 #include "xbt/log.h"
 #include <stdbool.h>
+#include <string.h>
+#include <libgen.h>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files");
 
@@ -154,7 +156,7 @@ xbt_dynar_t SD_dotload_with_sched(const char *filename){
 xbt_dynar_t SD_dotload_generic(const char * filename)
 {
   xbt_assert(filename, "Unable to use a null file descriptor\n");
-//dag_dot =  agopen((char*)filename,Agstrictdirected,0);
+  //dag_dot =  agopen((char*)filename,Agstrictdirected,0);
   FILE *in_file = fopen(filename, "r");
   dag_dot = agread(in_file, NIL(Agdisc_t *));
 
@@ -239,7 +241,14 @@ xbt_dynar_t SD_dotload_generic(const char * filename)
   fclose(in_file);
   if(acyclic_graph_detail(result))
     return result;
-  acyclic_graph_detail(result);
+  else {
+    unsigned int cpt;
+    XBT_ERROR("The DOT described in %s is not a DAG. It contains a cycle.",
+              basename((char*)filename));
+    xbt_dynar_foreach(result, cpt, file)
+      SD_task_destroy(file);
+     xbt_dynar_free_container(&result);
+  }
   free(dag_dot);
   return NULL;
 }
@@ -342,7 +351,7 @@ void dot_add_task(Agnode_t * dag_node)
     else {
       //one of necessary parameters are not given
       schedule = false;
-      XBT_VERB("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 scheduled", current_job->name);
     }
   }
 }
@@ -353,10 +362,10 @@ void dot_add_task(Agnode_t * dag_node)
  * edge. */
 void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge)
 {
-  SD_task_t file;
+  SD_task_t file = NULL;
   char *name_tail=agnameof(agtail(edge));
   char *name_head=agnameof(aghead(edge));
-  char *name = malloc((strlen(name_head)+strlen(name_tail)+3)*sizeof(char));
+  char *name = malloc((strlen(name_head)+strlen(name_tail)+6)*sizeof(char));
   sprintf(name, "%s->%s", name_tail, name_head);
   double size = dot_parse_double(agget(edge, (char *) "size"));
   XBT_DEBUG("size : %e, get size : %s", size, agget(edge, (char *) "size"));
@@ -377,7 +386,7 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge)
     }
     SD_task_dependency_add(NULL, NULL, file, current_job);
   } else {
-    file = xbt_dict_get_or_null(jobs, agnameof(agtail(edge)));
+    file = xbt_dict_get_or_null(jobs, name_tail);
     if (file != NULL) {
       SD_task_dependency_add(NULL, NULL, file, current_job);
     }
@@ -394,7 +403,7 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge)
   SD_task_t file;
   char *name_tail=agnameof(agtail(edge));
   char *name_head=agnameof(aghead(edge));
-  char *name = malloc((strlen(name_head)+strlen(name_tail)+3)*sizeof(char));
+  char *name = malloc((strlen(name_head)+strlen(name_tail)+6)*sizeof(char));
   sprintf(name, "%s->%s", name_tail, name_head);
   double size = dot_parse_double(agget(edge, (char *) "size"));
   XBT_DEBUG("size : %e, get size : %s", size, agget(edge, (char *) "size"));
@@ -418,7 +427,7 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge)
       XBT_WARN("File %s created at more than one location...", file->name);
     }
   } else {
-    file = xbt_dict_get_or_null(jobs, agnameof(aghead(edge)));
+    file = xbt_dict_get_or_null(jobs, name_head);
     if (file != NULL) {
       SD_task_dependency_add(NULL, NULL, current_job, file);
     }