X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/84ebf8af3c606445e30b013b2e14bebeaa693dbf..ff1eebe3071b50372f9bf3048eeec04c610d2788:/src/simdag/sd_dotloader.c diff --git a/src/simdag/sd_dotloader.c b/src/simdag/sd_dotloader.c index cb9108cd02..1c96d2bbe5 100644 --- a/src/simdag/sd_dotloader.c +++ b/src/simdag/sd_dotloader.c @@ -12,7 +12,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_dotparse, sd,"Parsing DOT files"); #undef CLEANUP -#include +#include void dot_add_task(Agnode_t *dag_node) ; void dot_add_input_dependencies(SD_task_t current_job, Agedge_t *edge) ; @@ -20,15 +20,16 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t *edge) ; xbt_dynar_t SD_dotload_FILE(FILE* in_file); static double dot_parse_double(const char *string) { - if (string == NULL) return -10; + if (string == NULL) return -1; int ret = 0; - double value; + double value = -1; ret = sscanf(string, "%lg", &value); if (ret != 1) WARN1("%s is not a double", string); return value; } + static int dot_parse_int(const char *string) { if (string == NULL) return -10; int ret = 0; @@ -88,12 +89,14 @@ xbt_dynar_t SD_dotload_FILE(FILE* in_file){ /* by design the root task is always SCHEDULABLE */ __SD_task_set_state(root_task, SD_SCHEDULABLE); + xbt_dict_set(jobs,"root",root_task,NULL); xbt_dynar_push(result,&root_task); end_task = SD_task_create_comp_seq("end",NULL,0); + xbt_dict_set(jobs,"end",end_task,NULL); Agnode_t *dag_node = NULL; for (dag_node = agfstnode(dag_dot); dag_node; dag_node = agnxtnode(dag_dot,dag_node)){ - dot_add_task(dag_node); + dot_add_task(dag_node); } agclose(dag_dot); xbt_dict_free(&jobs); @@ -154,60 +157,32 @@ xbt_dynar_t SD_dotload_FILE(FILE* in_file){ * The unit of size is the Flop.*/ void dot_add_task(Agnode_t *dag_node) { char *name = agnameof(dag_node); + SD_task_t current_job; double runtime = dot_parse_double(agget(dag_node,(char*)"size")); long performer = (long)dot_parse_int((char *) agget(dag_node,(char*)"performer")); INFO3("See ",name,agget(dag_node,(char*)"size"),runtime); - SD_task_t current_job = SD_task_create_comp_seq(name,(void*)performer,runtime); - xbt_dict_set(jobs,name,current_job,NULL); - xbt_dynar_push(result,¤t_job); + current_job = xbt_dict_get_or_null(jobs,name); + if (current_job == NULL) { + current_job = SD_task_create_comp_seq(name,(void*)performer,runtime); + xbt_dict_set(jobs,name,current_job,NULL); + xbt_dynar_push(result,¤t_job); + } Agedge_t *e; int count = 0; for (e = agfstin(dag_dot,dag_node); e; e = agnxtin(dag_dot,e)) { dot_add_input_dependencies(current_job,e); count++; } - if (count==0){ - SD_task_t file; - char *name= (char*)"root->many"; - double size = 0; - - file = xbt_dict_get_or_null(files,name); - if (file==NULL) { - file = SD_task_create_comm_e2e(name,NULL,size); - xbt_dict_set(files,name,file,&dot_task_free); - } else { - if (SD_task_get_amount(file)!=size) { - WARN3("Ignoring file %s size redefinition from %.0f to %.0f", - name,SD_task_get_amount(file),size); - } - } - SD_task_dependency_add(NULL,NULL,file,current_job); + if (count==0 && current_job != root_task){ + SD_task_dependency_add(NULL,NULL,root_task,current_job); } count = 0; for (e = agfstout(dag_dot,dag_node); e; e = agnxtout(dag_dot,e)) { dot_add_output_dependencies(current_job,e); count++; } - if (count==0){ - SD_task_t file; - char *name = (char*)"many->end"; - double size = 0; - - // INFO2("See ",A_dot__uses_file,(is_input?"in":"out")); - file = xbt_dict_get_or_null(files,name); - if (file==NULL) { - file = SD_task_create_comm_e2e(name,NULL,size); - xbt_dict_set(files,name,file,&dot_task_free); - } else { - if (SD_task_get_amount(file)!=size) { - WARN3("Ignoring file %s size redefinition from %.0f to %.0f", - name,SD_task_get_amount(file),size); - } - } - SD_task_dependency_add(NULL,NULL,current_job,file); - if (xbt_dynar_length(file->tasks_before)>1) { - WARN1("File %s created at more than one location...",file->name); - } + if (count==0 && current_job != end_task){ + SD_task_dependency_add(NULL,NULL,current_job,end_task); } } @@ -221,20 +196,27 @@ void dot_add_input_dependencies(SD_task_t current_job, Agedge_t *edge) { char name[80]; sprintf(name ,"%s->%s",agnameof(agtail(edge)) ,agnameof(aghead(edge))); double size = dot_parse_double(agget(edge,(char*)"size")); + INFO2("size : %e, get size : %s",size,agget(edge,(char*)"size")); //int sender = dot_parse_int(agget(edge,(char*)"sender")); //int reciever = dot_parse_int(agget(edge,(char*)"reciever")); - - file = xbt_dict_get_or_null(files,name); - if (file==NULL) { + if(size >0){ + file = xbt_dict_get_or_null(files,name); + if (file==NULL) { file = SD_task_create_comm_e2e(name,NULL,size); xbt_dict_set(files,name,file,&dot_task_free); - } else { + } else { if (SD_task_get_amount(file)!=size) { - WARN3("Ignoring file %s size redefinition from %.0f to %.0f", - name,SD_task_get_amount(file),size); + WARN3("Ignoring file %s size redefinition from %.0f to %.0f", + name,SD_task_get_amount(file),size); } + } + SD_task_dependency_add(NULL,NULL,file,current_job); + }else{ + file = xbt_dict_get_or_null(jobs,agnameof(agtail(edge))); + if (file != NULL){ + SD_task_dependency_add(NULL,NULL,file,current_job); + } } - SD_task_dependency_add(NULL,NULL,file,current_job); } /* dot_add_output_dependencies create the dependencies between a @@ -246,23 +228,31 @@ void dot_add_output_dependencies(SD_task_t current_job, Agedge_t *edge) { char name[80]; sprintf(name ,"%s->%s",agnameof(agtail(edge)) ,agnameof(aghead(edge))); double size = dot_parse_double(agget(edge,(char*)"size")); + INFO2("size : %e, get size : %s",size,agget(edge,(char*)"size")); //int sender = dot_parse_int(agget(edge,(char*)"sender")); //int reciever = dot_parse_int(agget(edge,(char*)"reciever")); //INFO2("See ",A_dot__uses_file,(is_input?"in":"out")); - file = xbt_dict_get_or_null(files,name); - if (file==NULL) { + if(size >0){ + file = xbt_dict_get_or_null(files,name); + if (file==NULL) { file = SD_task_create_comm_e2e(name,NULL,size); xbt_dict_set(files,name,file,&dot_task_free); - } else { + } else { if (SD_task_get_amount(file)!=size) { - WARN3("Ignoring file %s size redefinition from %.0f to %.0f", - name,SD_task_get_amount(file),size); + WARN3("Ignoring file %s size redefinition from %.0f to %.0f", + name,SD_task_get_amount(file),size); } - } - SD_task_dependency_add(NULL,NULL,current_job,file); - if (xbt_dynar_length(file->tasks_before)>1) { + } + SD_task_dependency_add(NULL,NULL,current_job,file); + if (xbt_dynar_length(file->tasks_before)>1) { WARN1("File %s created at more than one location...",file->name); + } + }else{ + file = xbt_dict_get_or_null(jobs,agnameof(aghead(edge))); + if (file != NULL){ + SD_task_dependency_add(NULL,NULL,current_job,file); + } } }