From: megacz Date: Fri, 30 Jan 2004 07:41:05 +0000 (+0000) Subject: 2003/11/05 10:25:00 X-Git-Tag: RC3~366 X-Git-Url: http://git.megacz.com/?p=org.ibex.core.git;a=commitdiff_plain;h=11fd362678d42aed89e4bc3cd0ce18e399ae48c4 2003/11/05 10:25:00 darcs-hash:20040130074105-2ba56-18be0ee684ad4cf15f0443224826bd7b6a40f4df.gz --- diff --git a/src/org/xwt/Main.java b/src/org/xwt/Main.java index bc26f96..1268fdc 100644 --- a/src/org/xwt/Main.java +++ b/src/org/xwt/Main.java @@ -97,7 +97,7 @@ public class Main { return null; } }); - new Thread() { public void run() { Scheduler.singleton.run(); } }.start(); + new Thread() { public void run() { Scheduler.init(); } }.start(); Platform.running(); } diff --git a/src/org/xwt/Scheduler.java b/src/org/xwt/Scheduler.java index 2cb7892..a46c75c 100644 --- a/src/org/xwt/Scheduler.java +++ b/src/org/xwt/Scheduler.java @@ -8,21 +8,37 @@ import org.xwt.util.*; /** Implements cooperative multitasking */ public class Scheduler { - public static final Scheduler singleton = Platform.getScheduler(); - protected Scheduler() { } + // Public API Exposed to org.xwt ///////////////////////////////////////////////// public static abstract class Task { public abstract void perform(); } + public static void add(Task t) { singleton.runnable.append(t); } + public static void init() { singleton.run(); } + + + // API which must be supported by subclasses ///////////////////////////////////// + + protected Scheduler() { } + + /** + * INVARIANT: all scheduler implementations MUST invoke + * Surface.renderAll() after performing a Task if no tasks remain + * in the queue. A scheduler may choose to invoke + * Surface.renderAll() more often than that if it so chooses. + */ + public void run() { defaultRun(); } + + + // Default Implementation ///////////////////////////////////// protected static Queue runnable = new Queue(50); - public static void add(Task t) { singleton.runnable.append(t); } - public void run() { + private static final Scheduler singleton = Platform.getScheduler(); + public void defaultRun() { while(true) { Task t = (Task)runnable.remove(true); try { t.perform(); // FIXME: be smarter about this - for(int i=0; i