diff options
Diffstat (limited to 'NET/worlds/console/Main.java')
| -rw-r--r-- | NET/worlds/console/Main.java | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/NET/worlds/console/Main.java b/NET/worlds/console/Main.java new file mode 100644 index 0000000..49f89bd --- /dev/null +++ b/NET/worlds/console/Main.java @@ -0,0 +1,93 @@ +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<MainCallback> v = new Vector<MainCallback>(); + 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--; + } + } + } +} |