X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/526747a744ea55946618ab192e053cd508947259..2cc04c39207b220e24338174f34ca4517e21670b:/src/simdag/sd_dotloader.c diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index f2ee1a694b..7c440894ff 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -9,6 +9,8 @@ #include "xbt/misc.h" #include "xbt/log.h" #include +#include +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd, "Parsing DOT files"); @@ -18,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); @@ -29,15 +36,21 @@ static double dot_parse_double(const char *string) { if (string == NULL) return -1; - int ret = 0; double value = -1; + char *err; - ret = sscanf(string, "%lg", &value); - if (ret != 1) - XBT_WARN("%s is not a double", string); + //ret = sscanf(string, "%lg", &value); + errno = 0; + value = strtod(string,&err); + if(errno) + { + XBT_WARN("Failed to convert string to double: %s\n",strerror(errno)); + return -1; + } return value; } + static int dot_parse_int(const char *string) { if (string == NULL) @@ -81,7 +94,7 @@ static void TRACE_sd_dotloader (SD_task_t task, const char *category) if (category){ if (strlen (category) != 0){ TRACE_category (category); - TRACE_sd_set_task_category (task, category); + SD_task_set_category (task, category); } } } @@ -147,13 +160,15 @@ xbt_dynar_t SD_dotload_with_sched(const char *filename){ xbt_dynar_t SD_dotload_generic(const char * filename) { - xbt_assert0(filename, "Unable to use a null file descriptor\n"); - dag_dot = agopen((char*)filename,Agstrictdirected,0); + xbt_assert(filename, "Unable to use a null file descriptor\n"); + //dag_dot = agopen((char*)filename,Agstrictdirected,0); + 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); - files = xbt_dict_new(); - jobs = xbt_dict_new(); - computers = xbt_dict_new(); + files = xbt_dict_new_homogeneous(&dot_task_free); + jobs = xbt_dict_new_homogeneous(NULL); + computers = xbt_dict_new_homogeneous(NULL); root_task = SD_task_create_comp_seq("root", NULL, 0); /* by design the root task is always SCHEDULABLE */ __SD_task_set_state(root_task, SD_SCHEDULABLE); @@ -164,15 +179,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); @@ -189,7 +197,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename) unsigned int cpt1, cpt2; SD_task_t newfile = NULL; SD_dependency_t depbefore, depafter; - if (xbt_dynar_length(file->tasks_before) == 0) { + if (xbt_dynar_is_empty(file->tasks_before)) { xbt_dynar_foreach(file->tasks_after, cpt2, depafter) { SD_task_t newfile = SD_task_create_comm_e2e(file->name, NULL, file->amount); @@ -197,7 +205,7 @@ xbt_dynar_t SD_dotload_generic(const char * filename) SD_task_dependency_add(NULL, NULL, newfile, depafter->dst); xbt_dynar_push(result, &newfile); } - } else if (xbt_dynar_length(file->tasks_after) == 0) { + } else if (xbt_dynar_is_empty(file->tasks_after)) { xbt_dynar_foreach(file->tasks_before, cpt2, depbefore) { SD_task_t newfile = SD_task_create_comm_e2e(file->name, NULL, file->amount); @@ -228,10 +236,17 @@ 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; - acyclic_graph_detail(result); - free(dag_dot); + 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); + } return NULL; } @@ -259,26 +274,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++; } @@ -309,7 +313,7 @@ void dot_add_task(Agnode_t * dag_node) computer = xbt_dynar_new(sizeof(SD_task_t), NULL); xbt_dict_set(computers, char_performer, computer, NULL); } - if(performer < host_lib->count){ + if(performer < xbt_lib_length(host_lib)){ // the wanted computer is available SD_task_t *task_test = NULL; if(order < computer->used) @@ -333,7 +337,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); } } } @@ -344,10 +348,11 @@ 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; - - char name[80]; - sprintf(name, "%s->%s", agnameof(agtail(edge)), agnameof(aghead(edge))); + 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)+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")); @@ -358,7 +363,7 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge) #ifdef HAVE_TRACING TRACE_sd_dotloader (file, agget (edge, (char*)"category")); #endif - xbt_dict_set(files, name, file, &dot_task_free); + xbt_dict_set(files, name, file, NULL); } else { if (SD_task_get_amount(file) != size) { XBT_WARN("Ignoring file %s size redefinition from %.0f to %.0f", @@ -367,11 +372,12 @@ 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); } } + free(name); } /* dot_add_output_dependencies create the dependencies between a @@ -381,8 +387,10 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t * edge) void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge) { SD_task_t file; - char name[80]; - sprintf(name, "%s->%s", agnameof(agtail(edge)), agnameof(aghead(edge))); + 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")); @@ -393,7 +401,7 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t * edge) #ifdef HAVE_TRACING TRACE_sd_dotloader (file, agget (edge, (char*)"category")); #endif - xbt_dict_set(files, name, file, &dot_task_free); + xbt_dict_set(files, name, file, NULL); } else { if (SD_task_get_amount(file) != size) { XBT_WARN("Ignoring file %s size redefinition from %.0f to %.0f", @@ -405,9 +413,10 @@ 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); } } + free(name); }