- for (auto const& succ : *task->successors) {
- succ->predecessors->erase(task);
- succ->inputs->erase(task);
- XBT_DEBUG("Release dependency on %s: %zu remain(s). Becomes schedulable if %zu=0", SD_task_get_name(succ),
- succ->predecessors->size()+succ->inputs->size(), succ->predecessors->size());
-
- if (SD_task_get_state(succ) == SD_NOT_SCHEDULED && succ->predecessors->empty())
- SD_task_set_state(succ, SD_SCHEDULABLE);
-
- if (SD_task_get_state(succ) == SD_SCHEDULED && succ->predecessors->empty() && succ->inputs->empty())
- SD_task_set_state(succ, SD_RUNNABLE);
-
- if (SD_task_get_state(succ) == SD_RUNNABLE && not sd_global->watch_point_reached)
- SD_task_run(succ);
- }
- task->successors->clear();
-
- for (auto const& output : *task->outputs) {
- output->start_time = task->finish_time;
- output->predecessors->erase(task);
- if (SD_task_get_state(output) == SD_SCHEDULED)
- SD_task_set_state(output, SD_RUNNABLE);
- else
- SD_task_set_state(output, SD_SCHEDULABLE);
-
- SD_task_t comm_dst = *(output->successors->begin());
- if (SD_task_get_state(comm_dst) == SD_NOT_SCHEDULED && comm_dst->predecessors->empty()){
- XBT_DEBUG("%s is a transfer, %s may be ready now if %zu=0",
- SD_task_get_name(output), SD_task_get_name(comm_dst), comm_dst->predecessors->size());
- SD_task_set_state(comm_dst, SD_SCHEDULABLE);
- }
- if (SD_task_get_state(output) == SD_RUNNABLE && not sd_global->watch_point_reached)
- SD_task_run(output);
- }
- task->outputs->clear();
- action = surf_model_extract_done_action_set(model);
+ for (auto const& succ : task->get_successors())
+ succ->released_by(task);
+ task->clear_successors();
+
+ for (auto const& output : task->get_outputs())
+ output->produced_by(task);
+ task->clear_outputs();
+ action = model->extract_done_action();