X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fxwt%2FScheduler.java;h=4dc85bfb49221737c8c73b4edb6fcbf416a94086;hb=7e9239a7088d4cd772a31a76e1a53e1c681638bc;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..4dc85bf 100644 --- a/src/org/xwt/Scheduler.java +++ b/src/org/xwt/Scheduler.java @@ -1,34 +1,96 @@ -// Copyright 2003 Adam Megacz, see the COPYING file for licensing [GPL] +// Copyright 2004 Adam Megacz, see the COPYING file for licensing [GPL] package org.xwt; 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(); } + + private static Task currentTask = null; + public static Task current() { return currentTask; } + + /** synchronizd so that we can safely call it from an event-delivery thread, in-context */ + private static volatile boolean rendering = false; + private static volatile boolean again = false; + public static void renderAll() { + if (rendering) { again = true; return; } + synchronized(Scheduler.class) { + try { + rendering = true; + do { + again = false; + for(int i=0; i