/**************************************************************************
* File name : PriorityFrame.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 javax.realtime.PeriodicParameters;
import javax.realtime.RelativeTime;
import javax.safetycritical.annotate.Level;
import javax.safetycritical.annotate.SCJAllowed;
/**
* This frame class holds a ready queue and a sleeping queue
* for the priority scheduler. <br>
* The class is package protected because it is not part of the SCJ
* specification.
*
* @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.
*/
@SCJAllowed(Level.INFRASTRUCTURE)
class PriorityFrame {
PriorityQueue readyQueue;
SleepingQueue sleepingQueue; // a priority queue ordered by
// ScjProcess.nextActivationTime;
PriorityQueueForLockAndWait waitQueue;
PriorityQueueForLockAndWait lockQueue;
PriorityFrame(int queueSize) {
// create the queues ...
readyQueue = new PriorityQueue(queueSize);
sleepingQueue = new SleepingQueue(queueSize);
waitQueue = new PriorityQueueForLockAndWait(queueSize);
lockQueue = new PriorityQueueForLockAndWait(queueSize);
}
void addProcess(ScjProcess process) {
if (process.getTarget() instanceof PeriodicEventHandler) {
//devices.Console.println("PrFrame.addProcess, periodic " + process + ", index " + process.index);
PeriodicEventHandler pevh = (PeriodicEventHandler) process.getTarget();
RelativeTime start = ((PeriodicParameters) pevh.release).getStart();
if (start.getMilliseconds() == 0 && start.getNanoseconds() == 0) {
process.state = ScjProcess.State.READY;
readyQueue.insert(process);
} else {
process.state = ScjProcess.State.SLEEPING;
sleepingQueue.insert(process);
}
}
else if (process.getTarget() instanceof MissionSequencer) {
//devices.Console.println("PrFrame.addProcess, missSeq " + process+ ", index " + process.index);
process.state = ScjProcess.State.READY;
readyQueue.insert(process);
}
else if (process.getTarget() instanceof AperiodicEventHandler) {
//devices.Console.println("PrFrame.addProcess, aperiodic " + process+ ", index " + process.index);
process.state = ScjProcess.State.BLOCKED;
}
else if (process.getTarget() instanceof OneShotEventHandler)
{
//devices.Console.println("PrFrame.addProcess, oneshot " + process+ ", index " + process.index);
process.state = ScjProcess.State.SLEEPING;
sleepingQueue.insert(process);
}
// if a thread is added, then it is made blocked and waiting
// for the call to start.
else if (process.getTarget() instanceof ManagedThread) {
//devices.Console.println("PrFrame.addProcess, managedThread " + process+ ", index " + process.index);
//if (((ManagedThread) process.getTarget()).isAutoStart()) {
process.state = ScjProcess.State.READY;
readyQueue.insert(process);
//} else {
// process.state = ScjProcess.State.BLOCKED;
//}
}
else {
throw new IllegalArgumentException("PriorityFrame.addProcess: another schedulable object ?");
}
}
public void removeFromQueue(ScjProcess scjProcess) {
readyQueue.remove(scjProcess);
sleepingQueue.remove(scjProcess);
waitQueue.removeProcess(scjProcess);
lockQueue.removeProcess(scjProcess);
}
}