package uk.ac.imperial.lsds.seepmaster.scheduler.schedulingstrategy;
import java.util.List;
import java.util.Map;
import uk.ac.imperial.lsds.seep.api.RuntimeEvent;
import uk.ac.imperial.lsds.seep.comm.protocol.Command;
import uk.ac.imperial.lsds.seep.scheduler.Stage;
import uk.ac.imperial.lsds.seepmaster.scheduler.ScheduleTracker;
public class SequentialSchedulingStrategy implements SchedulingStrategy {
@Override
public Stage next(ScheduleTracker tracker, Map<Integer, List<RuntimeEvent>> rEvents) {
// Explore from stage 0 (the sink) and backwards until detect the next stage to execute
Stage head = tracker.getHead();
Stage nextToSchedule = nextStageToSchedule(head, tracker);
return nextToSchedule;
}
private Stage nextStageToSchedule(Stage head, ScheduleTracker tracker) {
Stage toReturn = null;
if(tracker.isStageReady(head)) {
toReturn = head;
}
else {
for(Stage upstream : head.getDependencies()) {
if(! tracker.isStageFinished(upstream)) {
toReturn = nextStageToSchedule(upstream, tracker);
}
}
}
return toReturn;
}
@Override
public List<Command> postCompletion(Stage finishedStage, ScheduleTracker tracker) {
return null;
// TODO Auto-generated method stub
}
}