X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/746b2ddb2075d73a7ac430d7bf0cef2266effc83..de867c79dcf6cf4248bb6c8e2d7c749f6d0e7696:/src/simdag/sd_dotloader.c diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index 8b5ee8a381..f635a0fbde 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -40,11 +40,6 @@ static xbt_dict_t computers; static Agraph_t *dag_dot; static bool schedule = true; -static void dot_task_free(void *task) { - SD_task_t t = task; - SD_task_destroy(t); -} - static void dot_task_p_free(void *task) { SD_task_t *t = task; SD_task_destroy(*t); @@ -122,8 +117,6 @@ xbt_dynar_t SD_dotload_with_sched(const char *filename) { }else{ XBT_WARN("The scheduling is ignored"); } - SD_task_t task; - unsigned int count; xbt_dynar_t computer = NULL; xbt_dict_cursor_t dict_cursor; char *computer_name; @@ -131,9 +124,7 @@ xbt_dynar_t SD_dotload_with_sched(const char *filename) { xbt_dynar_free(&computer); } xbt_dict_free(&computers); - xbt_dynar_foreach(result,count,task){ - SD_task_destroy(task); - } + xbt_dynar_free(&result); return NULL; } @@ -148,6 +139,15 @@ xbt_dynar_t SD_PTG_dotload(const char * filename) { return result; } +#ifdef HAVE_CGRAPH_H +static int edge_compare(const void *a, const void *b) +{ + unsigned va = AGSEQ(*(Agedge_t **)a); + unsigned vb = AGSEQ(*(Agedge_t **)b); + return va == vb ? 0 : (va < vb ? -1 : 1); +} +#endif + xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){ xbt_assert(filename, "Unable to use a null file descriptor\n"); unsigned int i; @@ -166,7 +166,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){ char *name = agnameof(node); double amount = atof(agget(node, (char *) "size")); - double alpha; + double alpha = 0.0; if (seq_or_par == sequential){ XBT_DEBUG("See ", name, amount); @@ -295,10 +295,27 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){ /* * Create edges */ - node = NULL; + xbt_dynar_t edges = xbt_dynar_new(sizeof(Agedge_t*), NULL); for (node = agfstnode(dag_dot); node; node = agnxtnode(dag_dot, node)) { - Agedge_t * edge = NULL; - for (edge = agfstout(dag_dot, node); edge; edge = agnxtout(dag_dot, edge)) { + unsigned cursor; + Agedge_t * edge; + xbt_dynar_reset(edges); + for (edge = agfstout(dag_dot, node); edge; edge = agnxtout(dag_dot, edge)) + xbt_dynar_push_as(edges, Agedge_t *, edge); +#ifdef HAVE_CGRAPH_H + /* Hack: circumvent a bug in libcgraph, where the edges are not always given + * back in creation order. We sort them again, according to their sequence + * id. The problem appears to be solved (i.e.: I did not test it) in + * graphviz' mercurial repository by the following changeset: + * changeset: 8431:d5f1fb7e8103 + * user: Emden Gansner + * date: Tue Oct 11 12:38:58 2011 -0400 + * summary: Make sure edges are stored in node creation order + * It should be fixed in graphviz 2.30 and above. + */ + xbt_dynar_sort(edges, edge_compare); +#endif + xbt_dynar_foreach(edges, cursor, edge) { SD_task_t src, dst; char *src_name=agnameof(agtail(edge)); char *dst_name=agnameof(aghead(edge)); @@ -333,6 +350,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename, seq_par_t seq_or_par){ } } } + xbt_dynar_free(&edges); /* all compute and transfer tasks have been created, put the "end" node at * the end of dynar