- task = NULL;
- count = 0;
- //test if something has to be done for the next iteration
- while(!xbt_dynar_is_empty(current)){
- next = xbt_dynar_new(sizeof(SD_task_t),NULL);
- //test if the current iteration is done
- count_current=0;
- xbt_dynar_foreach(current,count_current,task){
- if (task == NULL) continue;
- count = 0;
- //push task in next
- task->marked = 1;
- count = 0;
- xbt_dynar_foreach(task->tasks_before,count,depbefore){
- parent_task = depbefore->src;
- if(parent_task->kind == SD_TASK_COMM_E2E){
- unsigned int j=0;
- parent_task->marked = 1;
- SD_task_t parent_task_2 = NULL;
- xbt_dynar_foreach(parent_task->tasks_before,j,depbefore){
- parent_task_2 = depbefore->src;
- if(children_are_marked(parent_task_2))
- xbt_dynar_push(next, &parent_task_2);
- }
- } else{
- if(children_are_marked(parent_task))
- xbt_dynar_push(next, &parent_task);
- }
- parent_task = NULL;
+ while (not current.empty()) {
+ std::vector<SD_task_t> next;
+ for (auto const& t : current) {
+ //Mark task
+ t->marked = 1;
+ for (SD_task_t const& input : *t->inputs) {
+ input->marked=1;
+ // Inputs are communication, hence they can have only one predecessor
+ SD_task_t input_pred = *(input->predecessors->begin());
+ if (children_are_marked(input_pred))
+ next.push_back(input_pred);
+ }
+ for (SD_task_t const& pred : *t->predecessors) {
+ if (children_are_marked(pred))
+ next.push_back(pred);