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
/* dependencies */
xbt_dynar_t tasks_before;
xbt_dynar_t tasks_after;
/* 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;
/* scheduling parameters (only exist in state SD_SCHEDULED) */
int workstation_nb;
surf_action_t action;
SD_task_t *res = NULL;
xbt_dynar_t changed_tasks = xbt_dynar_new(sizeof(SD_task_t), NULL);
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, depcnt;
static int first_time = 1;
SD_CHECK_INIT_DONE();
static int first_time = 1;
SD_CHECK_INIT_DONE();
- INFO0("Starting simulation...");
+ VERB0("Starting simulation...");
if (first_time) {
surf_presolve(); /* Takes traces into account */
if (first_time) {
surf_presolve(); /* Takes traces into account */
/* explore the ready tasks */
xbt_swag_foreach_safe(task, task_safe, sd_global->ready_task_set) {
/* 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);
}
if (__SD_task_try_to_run(task) && !xbt_dynar_member(changed_tasks, &task))
xbt_dynar_push(changed_tasks, &task);
}
task = action->data;
task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
task->finish_time = surf_get_clock();
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'",
DEBUG0("Calling __SD_task_just_done");
__SD_task_just_done(task);
DEBUG1("__SD_task_just_done called on task '%s'",
xbt_dynar_push(changed_tasks, &task);
/* remove the dependencies after this task */
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) {
/* 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);
if (__SD_task_try_to_run(dst) &&
!xbt_dynar_member(changed_tasks, &task))
xbt_dynar_push(changed_tasks, &task);
task = action->data;
task->start_time = surf_workstation_model->action_get_start_time(task->surf_action);
task->finish_time = surf_get_clock();
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;
__SD_task_set_state(task, SD_FAILED);
surf_workstation_model->action_unref(action);
task->surf_action = NULL;
}
xbt_dynar_free(&changed_tasks);
}
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());
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());
/* dependencies */
task->tasks_before = xbt_dynar_new(sizeof(SD_dependency_t), NULL);
task->tasks_after = xbt_dynar_new(sizeof(SD_dependency_t), NULL);
/* 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;
/* scheduling parameters */
task->workstation_nb = 0;
task->workstation_list = NULL;
task->state = new_state;
if (task->watch_points & 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 */
}
sd_global->watch_point_reached = 1;
SD_task_unwatch(task, new_state); /* remove the watch point */
}
}
}
INFO1(" - amount: %.0f",SD_task_get_amount(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) {
if (xbt_dynar_length(task->tasks_before)) {
INFO0(" - pre-dependencies:");
xbt_dynar_foreach(task->tasks_before,counter,dependency) {
xbt_dynar_push(src->tasks_after, &dependency);
xbt_dynar_push(dst->tasks_before, &dependency);
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)) {
/* 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)) {
if (dependency->src == src) {
xbt_dynar_remove_at(dynar, i, NULL);
__SD_task_dependency_destroy(dependency);
if (dependency->src == src) {
xbt_dynar_remove_at(dynar, i, NULL);
__SD_task_dependency_destroy(dependency);
+ dst->unsatisfied_dependencies--;
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 */
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);
__SD_task_set_state(dst, SD_READY);
/* __SD_print_dependencies(src);
SD_task_get_name(task));
/* update the task state */
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);
__SD_task_set_state(task, SD_READY);
else
__SD_task_set_state(task, SD_SCHEDULED);