-/* dot_add_output_dependencies create the dependencies between a
- * transfers and a task. This is given by the edges in the dot file.
- * The amount of data transfers is given by the attribute size on the
- * edge. */
-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)+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"));
-
- if (size > 0) {
- file = xbt_dict_get_or_null(files, name);
- if (file == NULL) {
- file = SD_task_create_comm_e2e(name, NULL, size);
+ if (!(end = xbt_dict_get_or_null(jobs, "end"))){
+ if (seq_or_par == sequential)
+ end = SD_task_create_comp_seq("end", NULL, 0);
+ else
+ end = SD_task_create_comp_par_amdahl("end", NULL, 0, 0);
+ /* Should be inserted later in the dynar */
+ }
+
+ /*
+ * Create edges
+ */
+ xbt_dynar_t edges = xbt_dynar_new(sizeof(Agedge_t*), NULL);
+ for (node = agfstnode(dag_dot); node; node = agnxtnode(dag_dot, node)) {
+ 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 <erg@research.att.com>
+ * 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));
+ double size = atof(agget(edge, (char *) "size"));
+
+ src = xbt_dict_get_or_null(jobs, src_name);
+ dst = xbt_dict_get_or_null(jobs, dst_name);
+
+ if (size > 0) {
+ char *name =
+ xbt_malloc((strlen(src_name)+strlen(dst_name)+6)*sizeof(char));
+ sprintf(name, "%s->%s", src_name, dst_name);
+ XBT_DEBUG("See <transfer id=%s amount = %.0f>", name, size);
+ if (!(task = xbt_dict_get_or_null(jobs, name))) {
+ if (seq_or_par == sequential)
+ task = SD_task_create_comm_e2e(name, NULL , size);
+ else
+ task = SD_task_create_comm_par_mxn_1d_block(name, NULL , size);