X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/999a64fe86043f1b9cc777db6a5cdc4e34c4c922..5eecba1cd4850c7820f9cfa3c1af484f674b1e8b:/src/simdag/sd_daxloader.c?ds=sidebyside diff --git a/src/simdag/sd_daxloader.c b/src/simdag/sd_daxloader.c index c63256fb1b..c056626357 100644 --- a/src/simdag/sd_daxloader.c +++ b/src/simdag/sd_daxloader.c @@ -93,10 +93,10 @@ bool children_are_marked(SD_task_t task){ bool parents_are_marked(SD_task_t task){ SD_task_t parent_task = NULL; bool all_marked = true; - SD_dependency_t depafter = NULL; + SD_dependency_t depbefore = NULL; unsigned int count; - xbt_dynar_foreach(task->tasks_after,count,depafter){ - parent_task = depafter->dst; + xbt_dynar_foreach(task->tasks_before,count,depbefore){ + parent_task = depbefore->src; //test marked if(parent_task->marked == 0) { all_marked = false; @@ -174,12 +174,20 @@ bool acyclic_graph_detail(xbt_dynar_t dag){ if(!all_marked){ VERB0("there is at least one cycle in your task graph"); + current = xbt_dynar_new(sizeof(SD_task_t),NULL); + xbt_dynar_foreach(dag,count,task){ + if(task->kind == SD_TASK_COMM_E2E) continue; + if(xbt_dynar_length(task->tasks_before) == 0){ + xbt_dynar_push(current, &task); + } + } + count = 0; task = NULL; xbt_dynar_foreach(dag,count,task){ if(task->kind == SD_TASK_COMM_E2E) continue; - task->marked = 0; if(xbt_dynar_length(task->tasks_before) == 0){ + task->marked = 1; xbt_dynar_push(current, &task); } } @@ -197,13 +205,13 @@ bool acyclic_graph_detail(xbt_dynar_t dag){ task->marked = 1; count = 0; xbt_dynar_foreach(task->tasks_after,count,depafter){ - child_task = depafter->dst; + child_task = depbefore->dst; if(child_task->kind == SD_TASK_COMM_E2E){ unsigned int j=0; child_task->marked = 1; SD_task_t child_task_2 = NULL; xbt_dynar_foreach(child_task->tasks_after,j,depafter){ - child_task_2 = depafter->src; + child_task_2 = depbefore->dst; if(parents_are_marked(child_task_2)) xbt_dynar_push(next, &child_task_2); } @@ -211,7 +219,7 @@ bool acyclic_graph_detail(xbt_dynar_t dag){ if(parents_are_marked(child_task)) xbt_dynar_push(next, &child_task); } - parent_task = NULL; + child_task = NULL; } task = NULL; count = 0; @@ -227,7 +235,7 @@ bool acyclic_graph_detail(xbt_dynar_t dag){ if(task->kind == SD_TASK_COMM_E2E) continue; //test if all tasks are marked if(task->marked == 0){ - WARN1("the task %s is not marked",task->name); + WARN1("the task %s is in a cycle",task->name); all_marked = false; } } @@ -235,75 +243,6 @@ bool acyclic_graph_detail(xbt_dynar_t dag){ return all_marked; } -bool acyclic_graph_detection(xbt_dynar_t dag){ - unsigned int count=0, count_current=0; - bool all_marked = true; - SD_task_t task = NULL, parent_task = NULL; - SD_dependency_t depbefore = NULL; - xbt_dynar_t next = NULL, current = xbt_dynar_new(sizeof(SD_task_t),NULL); - - xbt_dynar_foreach(dag,count,task){ - if(task->kind == SD_TASK_COMM_E2E) continue; - task->marked = 0; - if(xbt_dynar_length(task->tasks_after) == 0){ - xbt_dynar_push(current, &task); - } - } - task = NULL; - count = 0; - //test if something has to be done for the next iteration - while(xbt_dynar_length(current) != 0){ - next = xbt_dynar_new(sizeof(SD_task_t),NULL); - //test if the current iteration is done - count_current=0; - xbt_dynar_foreach(current,count_current,task){ - if (task == NULL) continue; - count = 0; - //push task in next - task->marked = 1; - count = 0; - xbt_dynar_foreach(task->tasks_before,count,depbefore){ - parent_task = depbefore->src; - if(parent_task->kind == SD_TASK_COMM_E2E){ - unsigned int j=0; - parent_task->marked = 1; - SD_task_t parent_task_2 = NULL; - xbt_dynar_foreach(parent_task->tasks_before,j,depbefore){ - parent_task_2 = depbefore->src; - if(children_are_marked(parent_task_2)) - xbt_dynar_push(next, &parent_task_2); - } - } else{ - if(children_are_marked(parent_task)) - xbt_dynar_push(next, &parent_task); - } - parent_task = NULL; - } - task = NULL; - count = 0; - } - xbt_dynar_free(¤t); - current = next; - next = NULL; - } - xbt_dynar_free(¤t); - current = NULL; - all_marked = true; - xbt_dynar_foreach(dag,count,task){ - if(task->kind == SD_TASK_COMM_E2E) continue; - //test if all tasks are marked - if(task->marked == 0){ - WARN1("the task %s is not marked",task->name); - all_marked = false; - break; - } - } - task = NULL; - if(!all_marked){ - VERB0("there is at least one cycle in your task graph"); - } - return all_marked; -} static YY_BUFFER_STATE input_buffer; @@ -379,10 +318,12 @@ xbt_dynar_t SD_daxload(const char *filename) SD_task_dependency_add(NULL, NULL, root_task, newfile); SD_task_dependency_add(NULL, NULL, newfile, depafter->dst); #ifdef HAVE_TRACING - const char *category = depbefore->src->category; - if (category){ - TRACE_category (category); - TRACE_sd_set_task_category (newfile, category); + if (depafter->src){ + const char *category = depafter->src->category; + if (category){ + TRACE_category (category); + TRACE_sd_set_task_category (newfile, category); + } } #endif xbt_dynar_push(result, &newfile); @@ -394,10 +335,12 @@ xbt_dynar_t SD_daxload(const char *filename) SD_task_dependency_add(NULL, NULL, depbefore->src, newfile); SD_task_dependency_add(NULL, NULL, newfile, end_task); #ifdef HAVE_TRACING - const char *category = depbefore->src->category; - if (category){ - TRACE_category (category); - TRACE_sd_set_task_category (newfile, category); + if (depbefore->src){ + const char *category = depbefore->src->category; + if (category){ + TRACE_category (category); + TRACE_sd_set_task_category (newfile, category); + } } #endif xbt_dynar_push(result, &newfile); @@ -415,10 +358,12 @@ xbt_dynar_t SD_daxload(const char *filename) SD_task_dependency_add(NULL, NULL, depbefore->src, newfile); SD_task_dependency_add(NULL, NULL, newfile, depafter->dst); #ifdef HAVE_TRACING - const char *category = depbefore->src->category; - if (category){ - TRACE_category (category); - TRACE_sd_set_task_category (newfile, category); + if (depbefore->src){ + const char *category = depbefore->src->category; + if (category){ + TRACE_category (category); + TRACE_sd_set_task_category (newfile, category); + } } #endif xbt_dynar_push(result, &newfile); @@ -439,13 +384,14 @@ xbt_dynar_t SD_daxload(const char *filename) } } - acyclic_graph_detection(result); + acyclic_graph_detail(result); return result; } void STag_dax__adag(void) { - double version = dax_parse_double(A_dax__adag_version); + double version; + version = dax_parse_double(A_dax__adag_version); xbt_assert1((version == 2.1), "Expected version 2.1 in tag, got %f. Fix the parser or your file",