/* This file is part of JOP, the Java Optimized Processor see <http://www.jopdesign.com/> Copyright (C) 2008-2012, Martin Schoeberl (martin@jopdesign.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package scopeuse; import java.io.IOException; import java.io.OutputStream; import javax.microedition.io.Connector; import javax.realtime.PeriodicParameters; import javax.realtime.PriorityParameters; import javax.realtime.RelativeTime; import javax.safetycritical.*; import javax.safetycritical.annotate.Level; import javax.safetycritical.annotate.Phase; import javax.safetycritical.annotate.SCJAllowed; import javax.safetycritical.annotate.SCJRestricted; import javax.safetycritical.io.SimplePrintStream; /** * Test nested private memories * * @author Martin Schoeberl * */ public class InOutParameter extends Mission implements Safelet { // work around... static InOutParameter single; static SimplePrintStream out; @Override @SCJAllowed(Level.SUPPORT) @SCJRestricted(phase = Phase.INITIALIZATION) public void initializeApplication() { // TODO Auto-generated method stub } // From Mission @Override protected void initialize() { OutputStream os = null; try { os = Connector.openOutputStream("console:"); } catch (IOException e) { throw new Error("No console available"); } out = new SimplePrintStream(os); PeriodicEventHandler peh = new PeriodicEventHandler( new PriorityParameters(11), new PeriodicParameters( new RelativeTime(0, 0), new RelativeTime(500, 0)), new StorageParameters(10000, null), 500) { int cnt; public void handleAsyncEvent() { InParam ip = new InParam(); OutParam op = new OutParam(); op.sb = new StringBuilder(30); Worker w = new Worker(ip, op); out.println("Ping " + cnt); ++cnt; // Generate more garbage for (int i=0; i<10; ++i) { // this would generate too much garbage in the initial private memory // w.run(); ip.s = "iter "; ip.i = i; ManagedMemory.enterPrivateMemory(500, w); out.println(op.sb); } if (cnt > 5) { // getCurrentMission is not yet working single.requestTermination(); } } }; peh.register(); } // Safelet methods @Override public MissionSequencer getSequencer() { // we assume this method is invoked only once StorageParameters sp = new StorageParameters(1000000, null); return new LinearMissionSequencer(new PriorityParameters(13), sp, false, this); } @Override public long missionMemorySize() { return 100000; } @Override public long immortalMemorySize() { return 1000; } /** * Within the JOP SCJ version we use a main method instead of a command line * parameter or configuration file. * * @param args */ public static void main(String[] args) { single = new InOutParameter(); JopSystem.startMission(single); } } class InParam { String s; int i; } class OutParam { StringBuilder sb; } class Worker implements Runnable { InParam in; OutParam out; public Worker(InParam in, OutParam out) { this.in = in; this.out = out; } @Override public void run() { // We generate garbage with string concatinuation String s = in.s + in.i; out.sb.setLength(0); // Hopefully this will not allocate a new buffer as it // shall be long enough out.sb.append(s); } }