/**************************************************************************
* File name : ManagedThread.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.AbsoluteTime;
//import javax.realtime.Clock;
import javax.realtime.HighResolutionTime;
import javax.realtime.MemoryArea;
import javax.realtime.RealtimeThread;
import javax.realtime.PriorityParameters;
import javax.realtime.RelativeTime;
import javax.safetycritical.annotate.Level;
import javax.safetycritical.annotate.Phase;
import javax.safetycritical.annotate.SCJAllowed;
import javax.safetycritical.annotate.SCJRestricted;
import vm.ClockInterruptHandler;
import vm.Memory;
/**
* This class enables a mission to keep track of all the no-heap realtime
* threads that are created during the initialization phase.
*
* @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>
*
*/
@SCJAllowed(Level.LEVEL_2)
public class ManagedThread extends RealtimeThread implements
ManagedSchedulable {
PriorityParameters priority;
StorageParameters storage;
ScjProcess process;
Mission mission = null;
ManagedMemory privateMemory;
// used in JML spec. methods
boolean isRegistered;
boolean isInMissionScope;
public ManagedThread(PriorityParameters priority, StorageParameters storage) {
this(priority, storage, null);
}
public ManagedThread(PriorityParameters priority, StorageParameters storage, Runnable logic) {
super(priority, logic);
this.priority = priority;
if (storage == null)
throw new IllegalArgumentException("storage is null");
this.storage = storage;
this.mission = Mission.getMission();
int backingStoreOfThisMemory =
mission == null ?
MemoryArea.getRemainingMemorySize() :
(int) this.storage.totalBackingStore;
MemoryArea backingStoreProvider =
mission == null ? MemoryArea.overAllBackingStore :
mission.currMissSeq.missionMemory;
String privateMemoryName = Memory.getNextMemoryName("PvtMem");
privateMemory = new PrivateMemory((int) storage.getMaxMemoryArea(),
backingStoreOfThisMemory,
backingStoreProvider,
privateMemoryName);
this.isRegistered = false;
this.isInMissionScope = false;
}
Mission getMission() {
return mission;
}
@SCJAllowed(Level.INFRASTRUCTURE)
@SCJRestricted(Phase.INITIALIZE)
public final void register() {
ManagedSchedulableSet msSet = Mission.getMission().msSetForMission;
msSet.addMS(this);
isRegistered = true;
isInMissionScope = true;
}
@SCJAllowed(Level.SUPPORT)
@SCJRestricted(Phase.CLEANUP)
public void cleanUp() {
privateMemory.removeArea();
}
public void signalTermination() {
//process.state = ScjProcess.State.HANDLED;
//devices.Console.println("ManagedThread.signalTermination: process " + process.index); // + "; state " + process.state);
// ManagedSchedulableSet msSet = Mission.getCurrentMission().msSetForMission;
// msSet.removeMSObject(this);
}
/**
* Remove the currently execution schedulable object from the set of
* runnable schedulable object until time.
*
* @param time
* @throws java.lang.InterruptedException
*/
public static void sleep(HighResolutionTime time) throws java.lang.InterruptedException {
vm.ClockInterruptHandler.instance.disable();
// get current process and reset the boolean value
ScjProcess current = PriorityScheduler.instance().current;
// get current time.
//AbsoluteTime abs = Clock.getRealtimeClock().getTime(current.next);
// set the next release time for current process
if (time instanceof RelativeTime) {
current.next.add((RelativeTime) time, current.next);
//current.next = abs.add((RelativeTime) time, abs);
}
else if (time instanceof AbsoluteTime) {
current.next = new AbsoluteTime((AbsoluteTime) time);
}
else {
throw new UnsupportedOperationException();
}
// set state to SLEEPING
current.state = ScjProcess.State.SLEEPING;
// transfer process;
// PriorityScheduler.move() will call gotoNextState that inserts
// current process (ScjManagedThreadProcess) in sleeping queue.
vm.ClockInterruptHandler.instance.enable();
ClockInterruptHandler.instance.yield();
}
}