From 11fd362678d42aed89e4bc3cd0ce18e399ae48c4 Mon Sep 17 00:00:00 2001 From: megacz Date: Fri, 30 Jan 2004 07:41:05 +0000 Subject: [PATCH] 2003/11/05 10:25:00 darcs-hash:20040130074105-2ba56-18be0ee684ad4cf15f0443224826bd7b6a40f4df.gz --- src/org/xwt/Main.java | 2 +- src/org/xwt/Scheduler.java | 28 ++++++++++++++++++++++------ src/org/xwt/Surface.java | 8 ++++++-- src/org/xwt/js/JS.java | 10 ++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-) 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