summaryrefslogtreecommitdiff
path: root/NET/worlds/console/Main.java
diff options
context:
space:
mode:
Diffstat (limited to 'NET/worlds/console/Main.java')
-rw-r--r--NET/worlds/console/Main.java93
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--;
+ }
+ }
+ }
+}