/**************************************************************************
* File name : ManagedSchedulableSet.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
*
* Description:
*
* Revision history:
* date init comment
*
*************************************************************************/
package javax.safetycritical;
import javax.safetycritical.annotate.Level;
import javax.safetycritical.annotate.SCJAllowed;
import javax.scj.util.Const;
/**
* This collection class of handlers is created in mission memory and used
* by the mission.
*
* @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 ManagedSchedulableSet {
ManagedSchedulable[] managedSchObjects =
new ManagedSchedulable[Const.DEFAULT_HANDLER_NUMBER];
int noOfRegistered = 0;
ScjProcess[] scjProcesses = new ScjProcess[Const.DEFAULT_HANDLER_NUMBER];
/**
* Count of ManagedSchedulable objects for the mission.
* Only one mission at a time; no sub-mission
*
* The msCount is incremented by addMS,
* and is decremented by PriorityScheduler when MS object is terminated.
*
* Mission.runCleanup is waiting until msCount == 0
*/
int msCount;
ManagedSchedulableSet() {
}
/*@
behavior
requires ms != null;
ensures this.contains(ms);
@*/
void addMS(ManagedSchedulable ms) {
if (!contains(ms)) {
managedSchObjects[noOfRegistered] = ms;
noOfRegistered++;
msCount++;
}
}
boolean contains(ManagedSchedulable ms) {
for (int i = 0; i < noOfRegistered; i++) {
if (managedSchObjects[i] == ms)
return true;
}
return false;
}
void terminateMSObjects() // stop all managed schedule objects; called in CyclicExecutive.runCleanup
{
for (int i = noOfRegistered; i > 0; i--) {
managedSchObjects[i - 1].cleanUp();
managedSchObjects[i - 1] = null;
msCount--;
}
}
void removeMSObject(ManagedSchedulable ms) // called in Scj...Process.gotoNextState
{
for (int i = 0; i < noOfRegistered; i++) {
if (managedSchObjects[i] == ms) {
managedSchObjects[i].cleanUp();
managedSchObjects[i] = null;
//PriorityScheduler.instance().pFrame.readyQueue.remove(scjProcesses[i]);
PriorityScheduler.instance().pFrame.removeFromQueue (scjProcesses[i]);
//devices.Console.println("MSSet.removeMSObject " + scjProcesses[i].index);
scjProcesses[i] = null;
msCount--;
}
}
//devices.Console.println("MSSet.removeMSObject: msCount " + msCount);
if (msCount == 0)
ManagedSchedMethods.getMission(ms).getSequencer().seqNotify();
}
void removeAperiodicHandlers() // remove all aperiodic handlers;
// called in PriorityScheduler.move()
{
for (int i = 0; i < noOfRegistered; i++) {
if (managedSchObjects[i] instanceof AperiodicEventHandler) {
managedSchObjects[i].cleanUp();
PriorityScheduler.instance().pFrame.readyQueue
.remove(scjProcesses[i]);
msCount--;
}
if (msCount == 0)
ManagedSchedMethods.getMission(managedSchObjects[i]).getSequencer().seqNotify();
}
}
int indexOf(ManagedSchedulable ms) {
for (int i = 0; i < noOfRegistered; i++) {
if (managedSchObjects[i] == ms)
return i;
}
return -1;
}
public String toString() {
return "Mission: " + noOfRegistered + " handlers";
}
}