package edu.purdue.scjtck.tck;
import javax.realtime.PeriodicParameters;
import javax.realtime.PriorityParameters;
import javax.realtime.PriorityScheduler;
import javax.realtime.RelativeTime;
import javax.safetycritical.MissionSequencer;
import javax.safetycritical.PeriodicEventHandler;
//import javax.safetycritical.StorageConfigurationParameters;
import javax.safetycritical.StorageParameters;
import javax.safetycritical.annotate.Level;
import javax.safetycritical.annotate.SCJAllowed;
/**
* Level 1
*
* - A preempted schedulable object must be placed at the front of the run queue
* for its active priority level.
*/
public class TestSchedule406 extends TestCase {
@Override
protected String getArgs() {
return "-L 1 -I 100";
}
public MissionSequencer getSequencer() {
return new GeneralSingleMissionSequencer(new GeneralMission() {
private volatile int _curRunner;
private volatile boolean _done;
private volatile boolean _preempted;
private long _iter = _prop._iterations;
public void initialize() {
int NOR_PRIORITY = PriorityScheduler.instance()
.getNormPriority();
int MIN_PRIORITY = PriorityScheduler.instance()
.getMinPriority();
PriorityParameters high = new PriorityParameters(NOR_PRIORITY);
PriorityParameters low = new PriorityParameters(NOR_PRIORITY
- (NOR_PRIORITY - MIN_PRIORITY) / 2);
for (int i = 0; i < 5; i++) {
final int index = i;
// final String s = index + " back to run";
new PeriodicEventHandler(low, new PeriodicParameters(null,
new RelativeTime(Long.MAX_VALUE, 0)),
new StorageParameters(_prop._schedObjBackStoreSize,
null), _prop._schedObjScopeSize) {
@Override
public void handleAsyncEvent() {
while (!_done) {
if (_preempted) {
int curRunner = _curRunner;
_preempted = false;
if (curRunner != index)
fail("Thread being preempted should be placed in front of the run queue");
// Terminal.getTerminal().writeln(s);
Thread.yield();
} else
_curRunner = index;
}
}
};
}
new PeriodicEventHandler(high, new PeriodicParameters(
new RelativeTime(20, 0), new RelativeTime(100, 0)),
new StorageParameters(_prop._schedObjBackStoreSize,
null), _prop._schedObjScopeSize) {
@Override
public void handleAsyncEvent() {
_preempted = true;
if (--_iter <= 0) {
_done = true;
requestSequenceTermination();
}
// Terminal.getTerminal().writeln(
// _curRunner + " ------------- being preempted");
}
};
}
});
}
@Override
@SCJAllowed(Level.SUPPORT)
public long immortalMemorySize() {
// TODO Auto-generated method stub
return 0;
}
}