From c1abdea9591074ab5d98dad8fbf551f9e6710036 Mon Sep 17 00:00:00 2001 From: suter Date: Fri, 11 Jun 2010 13:55:15 +0000 Subject: [PATCH] Change the way a task is considered as ready Instead of removing dependencies when a task is done, a counter is decreased This way, it is always possible to reach ancestors thanks to the SD_taks_get_parents function. Change the level of some logs in sd_global from INFO to VERB git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7835 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- src/simdag/private.h | 1 + src/simdag/sd_global.c | 25 ++++++++++++++----------- src/simdag/sd_task.c | 13 +++++++++---- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/simdag/private.h b/src/simdag/private.h index 9a90996359..0d5223ea54 100644 --- a/src/simdag/private.h +++ b/src/simdag/private.h @@ -87,6 +87,7 @@ typedef struct SD_task { /* dependencies */ xbt_dynar_t tasks_before; xbt_dynar_t tasks_after; + unsigned int unsatisfied_dependencies; /* scheduling parameters (only exist in state SD_SCHEDULED) */ int workstation_nb; diff --git a/src/simdag/sd_global.c b/src/simdag/sd_global.c index 093b77ed65..aeab84f155 100644 --- a/src/simdag/sd_global.c +++ b/src/simdag/sd_global.c @@ -193,12 +193,12 @@ SD_task_t *SD_simulate(double how_long) surf_action_t action; SD_task_t *res = NULL; xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL); - unsigned int iter; + unsigned int iter, depcnt; static int first_time = 1; SD_CHECK_INIT_DONE(); - INFO0("Starting simulation..."); + VERB0("Starting simulation..."); if (first_time) { surf_presolve(); /* Takes traces into account */ @@ -213,7 +213,7 @@ SD_task_t *SD_simulate(double how_long) /* explore the ready tasks */ xbt_swag_foreach_safe(task, task_safe, sd_global->ready_task_set) { - INFO1("Executing task '%s'", SD_task_get_name(task)); + VERB1("Executing task '%s'", SD_task_get_name(task)); if (__SD_task_try_to_run(task) && !xbt_dynar_member(changed_tasks, &task)) xbt_dynar_push(changed_tasks, &task); } @@ -242,7 +242,7 @@ SD_task_t *SD_simulate(double how_long) task = action->data; task->start_time = surf_workstation_model->action_get_start_time(task->surf_action); task->finish_time = surf_get_clock(); - INFO1("Task '%s' done", SD_task_get_name(task)); + VERB1("Task '%s' done", SD_task_get_name(task)); DEBUG0("Calling __SD_task_just_done"); __SD_task_just_done(task); DEBUG1("__SD_task_just_done called on task '%s'", @@ -253,14 +253,17 @@ SD_task_t *SD_simulate(double how_long) xbt_dynar_push(changed_tasks, &task); /* remove the dependencies after this task */ - while (xbt_dynar_length(task->tasks_after) > 0) { - xbt_dynar_get_cpy(task->tasks_after, 0, &dependency); - dst = dependency->dst; - SD_task_dependency_remove(task, dst); + xbt_dynar_foreach(task->tasks_after, depcnt, dependency){ + dst = dependency->dst; + if (dst->unsatisfied_dependencies>0) + dst->unsatisfied_dependencies--; + + if (!(dst->unsatisfied_dependencies) && __SD_task_is_scheduled(dst)) + __SD_task_set_state(dst, SD_READY); /* is dst ready now? */ if (__SD_task_is_ready(dst) && !sd_global->watch_point_reached) { - INFO1("Executing task '%s'", SD_task_get_name(dst)); + VERB1("Executing task '%s'", SD_task_get_name(dst)); if (__SD_task_try_to_run(dst) && !xbt_dynar_member(changed_tasks, &task)) xbt_dynar_push(changed_tasks, &task); @@ -273,7 +276,7 @@ SD_task_t *SD_simulate(double how_long) task = action->data; task->start_time = surf_workstation_model->action_get_start_time(task->surf_action); task->finish_time = surf_get_clock(); - INFO1("Task '%s' failed", SD_task_get_name(task)); + VERB1("Task '%s' failed", SD_task_get_name(task)); __SD_task_set_state(task, SD_FAILED); surf_workstation_model->action_unref(action); task->surf_action = NULL; @@ -294,7 +297,7 @@ SD_task_t *SD_simulate(double how_long) } xbt_dynar_free(&changed_tasks); - INFO0("Simulation finished"); + VERB0("Simulation finished"); DEBUG3("elapsed_time = %f, total_time = %f, watch_point_reached = %d", elapsed_time, total_time, sd_global->watch_point_reached); DEBUG1("current time = %f", surf_get_clock()); diff --git a/src/simdag/sd_task.c b/src/simdag/sd_task.c index 0de83bb604..edd85d0c88 100644 --- a/src/simdag/sd_task.c +++ b/src/simdag/sd_task.c @@ -52,7 +52,7 @@ SD_task_t SD_task_create(const char *name, void *data, double amount) /* dependencies */ task->tasks_before = xbt_dynar_new(sizeof(SD_dependency_t), NULL); task->tasks_after = xbt_dynar_new(sizeof(SD_dependency_t), NULL); - + task->unsatisfied_dependencies=0; /* scheduling parameters */ task->workstation_nb = 0; task->workstation_list = NULL; @@ -150,7 +150,7 @@ void __SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) task->state = new_state; if (task->watch_points & new_state) { - INFO1("Watch point reached with task '%s'!", SD_task_get_name(task)); + VERB1("Watch point reached with task '%s'!", SD_task_get_name(task)); sd_global->watch_point_reached = 1; SD_task_unwatch(task, new_state); /* remove the watch point */ } @@ -314,6 +314,7 @@ void SD_task_dump(SD_task_t task) } } INFO1(" - amount: %.0f",SD_task_get_amount(task)); + INFO1(" - Dependencies to satisfy: %d", task->unsatisfied_dependencies); if (xbt_dynar_length(task->tasks_before)) { INFO0(" - pre-dependencies:"); xbt_dynar_foreach(task->tasks_before,counter,dependency) { @@ -426,6 +427,8 @@ void SD_task_dependency_add(const char *name, void *data, SD_task_t src, xbt_dynar_push(src->tasks_after, &dependency); xbt_dynar_push(dst->tasks_before, &dependency); + dst->unsatisfied_dependencies++; + /* if the task was ready, then dst->tasks_before is not empty anymore, so we must go back to state SD_SCHEDULED */ if (__SD_task_is_ready(dst)) { @@ -516,6 +519,7 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) if (dependency->src == src) { xbt_dynar_remove_at(dynar, i, NULL); __SD_task_dependency_destroy(dependency); + dst->unsatisfied_dependencies--; found = 1; } } @@ -526,7 +530,8 @@ void SD_task_dependency_remove(SD_task_t src, SD_task_t dst) SD_task_get_name(src), SD_task_get_name(dst)); /* if the task was scheduled and dst->tasks_before is empty now, we can make it ready */ - if (xbt_dynar_length(dst->tasks_before) == 0 && __SD_task_is_scheduled(dst)) + + if (dst->unsatisfied_dependencies == 0 && __SD_task_is_scheduled(dst)) __SD_task_set_state(dst, SD_READY); /* __SD_print_dependencies(src); @@ -687,7 +692,7 @@ static XBT_INLINE void SD_task_do_schedule(SD_task_t task) { SD_task_get_name(task)); /* update the task state */ - if (xbt_dynar_length(task->tasks_before) == 0) + if (task->unsatisfied_dependencies == 0) __SD_task_set_state(task, SD_READY); else __SD_task_set_state(task, SD_SCHEDULED); -- 2.20.1