/** * This file is part of miniCDx benchmark of oSCJ. * * miniCDx 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. * * miniCDx 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 miniCDx. If not, see <http://www.gnu.org/licenses/>. * * * Copyright 2009, 2010 * @authors Daniel Tang, Ales Plsek * * See: http://sss.cs.purdue.edu/projects/oscj/ */ package minicdj.cdx; import java.io.DataOutputStream; /** * This thread runs only during start-up to run other threads. It runs in immortal memory, is allocated in immortal * memory, and it's constructor runs in immortal memory. It is a singleton, allocation from the Main class Ales: this * thread allocates - the scopes - the PersistentDetectorScope and TransientDetectorScope - */ /*@javax.safetycritical.annotate.Scope("immortal")*/ public class ImmortalEntry implements Runnable { static public Object initMonitor = new Object(); static public boolean detectorReady = false; static public boolean simulatorReady = false; static public int maxDetectorRuns; static public long detectorFirstRelease = -1; static public long[] timesBefore; static public long[] timesAfter; static public long[] heapFreeBefore; static public long[] heapFreeAfter; static public int[] detectedCollisions; static public int[] suspectedCollisions; static public long detectorThreadStart; static public long[] detectorReleaseTimes; static public boolean[] detectorReportedMiss; static public int reportedMissedPeriods = 0; static public int frameNotReadyCount = 0; static public int droppedFrames = 0; static public int framesProcessed = 0; static public int recordedRuns = 0; static public int recordedDetectorReleaseTimes = 0; static public FrameBuffer frameBuffer = null; static public DataOutputStream binaryDumpStream = null; public ImmortalEntry() { // super(new PriorityParameters(Constants.DETECTOR_STARTUP_PRIORITY)); maxDetectorRuns = Constants.MAX_FRAMES; timesBefore = new long[maxDetectorRuns]; timesAfter = new long[maxDetectorRuns]; heapFreeBefore = new long[maxDetectorRuns]; heapFreeAfter = new long[maxDetectorRuns]; detectedCollisions = new int[maxDetectorRuns]; suspectedCollisions = new int[maxDetectorRuns]; detectorReleaseTimes = new long[maxDetectorRuns + 10]; // the 10 is for missed deadlines detectorReportedMiss = new boolean[maxDetectorRuns + 10]; } /** Called only once during initialization. Runs in immortal memory */ public void run() { devices.Console.println("Detector: detector priority is " + Constants.DETECTOR_PRIORITY); devices.Console.println("Detector: detector period is " + Constants.DETECTOR_PERIOD); frameBuffer = new FrameBuffer(); /* start the detector at rounded-up time, so that the measurements are not subject * to phase shift */ } }