X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FScheduler.java;h=5000287ca2654508c0b512dbcdcbf71b25569c63;hb=457660f731024833fc8aea9b0154eae578b51600;hp=95fd6bf321b4395f2bf089b7a52371ef9a4d5739;hpb=6a96430e10e27fc1de5754cb5add705f929dd109;p=org.ibex.core.git diff --git a/src/org/xwt/Scheduler.java b/src/org/xwt/Scheduler.java index 95fd6bf..5000287 100644 --- a/src/org/xwt/Scheduler.java +++ b/src/org/xwt/Scheduler.java @@ -5,30 +5,55 @@ import java.util.*; import org.xwt.js.*; import org.xwt.util.*; -// FEATURE: reimplement Watcher /** Implements cooperative multitasking */ public class Scheduler { - private static Scheduler singleton = new Scheduler(); - public static void run() { singleton.do_run(); } - protected Scheduler() { } + // FIXME: prepending events messes with keysate -- make a "no re-ordering" invariant? - public static abstract class Task implements Callback { public abstract Object call(Object o); } + // Public API Exposed to org.xwt ///////////////////////////////////////////////// - private static Queue runnable = new Queue(50); + private static Scheduler singleton; + public static interface Task { public abstract void perform() throws Exception; } + /** adds a task to the back of the queue */ public static void add(Task t) { singleton.runnable.append(t); } - public void do_run() { + + /** adds a task to the front of the queue (guaranteed to run next) */ + public static void addAtFront(Task t) { singleton.runnable.prepend(t); } + + public static void init() { if (singleton == null) (singleton = Platform.getScheduler()).run(); } + + // API which must be supported by subclasses ///////////////////////////////////// + + /** + * 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(); } + protected Scheduler() { } + + + // Default Implementation ////////////////////////////////////////////////////// + + protected static Queue runnable = new Queue(50); + public void defaultRun() { while(true) { Task t = (Task)runnable.remove(true); try { - t.call(null); - for(int i=0; i