package NET.worlds.console; import NET.worlds.core.IniFile; import NET.worlds.core.Std; import java.util.Vector; public class Main { public static int profile = IniFile.gamma().getIniInt("Profile", 0); private static Thread mainThread; private static boolean stopFlag = false; private static Vector v = new Vector(); private static int lastAt = -1; private Main() { } public static void mainLoop() { for (mainThread = Thread.currentThread(); !stopFlag; Thread.yield()) { MainCallback cb = getNextCallback(); if (cb != null) { if (profile != 0) { int start = Std.getRealTime(); long startBytes = Runtime.getRuntime().freeMemory(); cb.mainCallback(); int dur = Std.getRealTime() - start; long used = startBytes - Runtime.getRuntime().freeMemory(); if (dur > profile && !(cb instanceof Console)) { System.out.println("Took " + dur + "ms and " + used + " bytes to call mainCallback " + cb); } } else { cb.mainCallback(); } } } MainCallback cb; while ((cb = getNextCallback()) != null) { if (cb instanceof MainTerminalCallback) { ((MainTerminalCallback)cb).terminalCallback(); Thread.yield(); } else { unregister(cb); } } mainThread = null; } public static void end() { stopFlag = true; } public static boolean isMainThread() { return Thread.currentThread() == mainThread; } public static int queueLength() { return v.size(); } private static MainCallback getNextCallback() { synchronized (v) { int n = v.size(); MainCallback cb; if (n == 0) { lastAt = -1; cb = null; } else { if (++lastAt >= n) { lastAt = 0; } cb = v.elementAt(lastAt); } return cb; } } public static void register(MainCallback x) { v.addElement(x); } public static void unregister(MainCallback x) { synchronized (v) { int i = v.indexOf(x); v.removeElementAt(i); if (lastAt >= i) { lastAt--; } } } }