X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5f45a3bad3fd29ece130e18a0f0ff17f0b245eb8..9ad287798b010fb71a233c26966f1ee902e0ee14:/src/simdag/sd_dotloader.c diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index 1abe74bca9..9402eaa366 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -20,6 +20,11 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files"); #include #elif HAVE_AGRAPH_H #include +#define agnxtnode(dot, node) agnxtnode(node) +#define agfstin(dot, node) agfstin(node) +#define agnxtin(dot, edge) agnxtin(edge) +#define agfstout(dot, node) agfstout(node) +#define agnxtout(dot, edge) agnxtout(edge) #endif void dot_add_task(Agnode_t * dag_node); @@ -84,6 +89,12 @@ static void dot_task_free(void *task) SD_task_destroy(t); } +static void dot_task_p_free(void *task) +{ + SD_task_t *t = task; + SD_task_destroy(*t); +} + static void TRACE_sd_dotloader (SD_task_t task, const char *category) { if (category){ @@ -160,7 +171,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename) 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); + result = xbt_dynar_new(sizeof(SD_task_t), dot_task_p_free); files = xbt_dict_new_homogeneous(&dot_task_free); jobs = xbt_dict_new_homogeneous(NULL); computers = xbt_dict_new_homogeneous(NULL); @@ -174,15 +185,8 @@ xbt_dynar_t SD_dotload_generic(const char * filename) xbt_dict_set(jobs, "end", end_task, NULL); Agnode_t *dag_node = NULL; - for (dag_node = agfstnode(dag_dot); dag_node; -#ifdef HAVE_CGRAPH_H - dag_node = agnxtnode(dag_dot, dag_node) -#elif HAVE_AGRAPH_H - dag_node = agnxtnode(dag_node) -#endif - ) { - - dot_add_task(dag_node); + for (dag_node = agfstnode(dag_dot); dag_node; dag_node = agnxtnode(dag_dot, dag_node)) { + dot_add_task(dag_node); } agclose(dag_dot); xbt_dict_free(&jobs); @@ -239,18 +243,13 @@ 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; - else { - unsigned int cpt; + 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_foreach(result, cpt, file) - SD_task_destroy(file); - xbt_dynar_free_container(&result); + xbt_dynar_free(&result); + /* (result == NULL) here */ } - free(dag_dot); - return NULL; + return result; } /* dot_add_task create a sd_task and all transfers required for this @@ -277,26 +276,15 @@ void dot_add_task(Agnode_t * dag_node) Agedge_t *e; int count = 0; -#ifdef HAVE_CGRAPH_H - for (e = agfstin(dag_dot, dag_node); e; e = agnxtin(dag_dot, e)) -#elif HAVE_AGRAPH_H - for (e = agfstin(dag_node); e; e = agnxtin(e)) -#endif - { - dot_add_input_dependencies(current_job, e); - count++; + for (e = agfstin(dag_dot, dag_node); e; e = agnxtin(dag_dot, e)) { + dot_add_input_dependencies(current_job, e); + count++; } if (count == 0 && current_job != root_task) { SD_task_dependency_add(NULL, NULL, root_task, current_job); } count = 0; -#ifdef HAVE_CGRAPH_H - for (e = agfstout(dag_dot, dag_node); e; e = agnxtout(dag_dot, e)) -#elif HAVE_AGRAPH_H - for (e = agfstout(dag_node); e; e = agnxtout(e)) -#endif - { - + for (e = agfstout(dag_dot, dag_node); e; e = agnxtout(dag_dot, e)) { dot_add_output_dependencies(current_job, e); count++; }