- while ((action = xbt_swag_extract(surf_workstation_resource->common_public->states.done_action_set))) {
- task = action->data;
- INFO1("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'", SD_task_get_name(task));
-
- /* the state has changed */
- if (!task->state_changed) {
- task->state_changed = 1;
- changed_tasks[changed_task_number++] = task;
- /*
- if (changed_task_number == changed_task_capacity) {
- changed_task_capacity *= 2;
- changed_tasks = xbt_realloc(changed_tasks, sizeof(SD_task_t) * changed_task_capacity);
- }
- */
- changed_tasks[changed_task_number] = NULL;
+ xbt_dynar_foreach(model_list, iter, model) {
+ while ((action = xbt_swag_extract(model->states.done_action_set))) {
+ 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));
+ DEBUG0("Calling __SD_task_just_done");
+ __SD_task_just_done(task);
+ DEBUG1("__SD_task_just_done called on task '%s'",
+ SD_task_get_name(task));
+
+ /* the state has changed */
+ if (!xbt_dynar_member(changed_tasks, &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);
+
+ /* is dst ready now? */
+ if (__SD_task_is_ready(dst) && !sd_global->watch_point_reached) {
+ INFO1("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);
+ }
+ }