- 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& output : task->get_outputs())
+ output->produced_by(task);
+ task->clear_successors();
+ action = model->extract_done_action();