/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package org.absmodels.abs.plugin.debug.scheduling;
import java.util.List;
import abs.backend.java.observing.TaskStackFrameView;
import abs.backend.java.observing.TaskStackView;
import abs.backend.java.scheduling.ScheduleAction;
import abs.backend.java.scheduling.ScheduleOptions;
import abs.backend.java.scheduling.TaskScheduler;
import abs.backend.java.scheduling.SimpleTaskScheduler.TaskInfo;
/**
* This scheduler does actions on the current base scheduler until the stack frame of the last stepped
* task equals the given stack frame. That means, the task is again in the same method.
*
* @author mweber
*
*/
public class StepOverScheduler implements TotalScheduler{
private final SchedulingStrategy schedulingStrategy;
private TaskStackFrameView frame;
private boolean firstStep = true;
public StepOverScheduler(SchedulingStrategy schedulingStrategy, TaskStackFrameView frame) {
this.schedulingStrategy = schedulingStrategy;
this.frame = frame;
}
@Override
public ScheduleAction choose(ScheduleOptions options) {
if(firstStep){
firstStep = false;
schedulingStrategy.baseScheduler.reset();
return schedulingStrategy.baseScheduler.choose(options);
} else {
TaskStackView stack = schedulingStrategy.steppedTask.getTaskView().getStack();
if(stack.hasFrames() && stack.getCurrentFrame().equals(frame)){
return schedulingStrategy.awaitGUIAction(options);
} else {
schedulingStrategy.baseScheduler.reset();
return schedulingStrategy.baseScheduler.choose(options);
}
}
}
@Override
public TaskInfo schedule(TaskScheduler scheduler,
List<TaskInfo> scheduableTasks) {
return schedulingStrategy.baseScheduler.schedule(scheduler, scheduableTasks);
}
@Override
public void reset() {
}
}