/**************************************************************************
* File name : CyclicScheduler.java
*
* This file is part a SCJ Level 0 and Level 1 implementation,
* based on SCJ Draft, Version 0.94 25 June 2013.
*
* It is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This SCJ Level 0 and Level 1 implementation is distributed in the hope
* that it will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this SCJ Level 0 and Level 1 implementation.
* If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2012
* @authors Anders P. Ravn, Aalborg University, DK
* Stephan E. Korsholm and Hans Søndergaard,
* VIA University College, DK
*************************************************************************/
package javax.safetycritical;
import icecaptools.IcecapCompileMe;
import javax.realtime.Scheduler;
import javax.safetycritical.MissionSequencer.State;
import javax.scj.util.Const;
import vm.Monitor;
import vm.Process;
/**
*
* @version 1.2; - December 2013
*
* @author Anders P. Ravn, Aalborg University, <A
* HREF="mailto:apr@cs.aau.dk">apr@cs.aau.dk</A>, <br>
* Hans Søndergaard, VIA University College, Denmark, <A
* HREF="mailto:hso@viauc.dk">hso@via.dk</A>
*
* @scjComment - implementation issue: infrastructure class;
* not part of the SCJ specification.
*/
final class CyclicScheduler extends Scheduler implements vm.Scheduler {
MissionSequencer<?> seq;
private ScjProcess current;
private static CyclicScheduler scheduler;
/**
*
* @return The cyclic scheduler.
*/
static CyclicScheduler instance() {
if (scheduler == null) {
scheduler = new CyclicScheduler();
}
return scheduler;
}
private CyclicScheduler() {
int[] sequencerStack = new int[Const.HANDLER_STACK_SIZE_DEFAULT];
vm.ClockInterruptHandler.initialize(this, sequencerStack);
}
public Process getNextProcess() {
ScjProcess scjProcess = CyclicScheduler.instance().getCurrentProcess();
if (scjProcess.getTarget() instanceof MissionSequencer<?>
&& ((MissionSequencer<?>) (scjProcess.getTarget())).currState == State.END) {
scjProcess.getTarget().cleanUp();
CyclicScheduler.instance().stop(scjProcess.process);
}
return scjProcess.process;
}
private vm.Process mainProcess;
private void processStart() {
vm.ClockInterruptHandler clockHandler = vm.ClockInterruptHandler.instance;
mainProcess = new vm.Process(null, null);
clockHandler.register();
clockHandler.enable();
clockHandler.startClockHandler(mainProcess);
clockHandler.yield();
}
@IcecapCompileMe
void stop(vm.Process current) {
current.transferTo(mainProcess);
}
void start(MissionSequencer<?> seq) {
this.seq = seq;
current = ManagedSchedMethods.createScjProcess(seq);
processStart();
}
ScjProcess getCurrentProcess() {
return current;
}
public void wait(Object target) {
}
public void notify(Object target) {
}
public void notifyAll(Object target) {
}
public Monitor getDefaultMonitor() {
return null;
}
}