// Public API Exposed to org.xwt /////////////////////////////////////////////////
+ private static Scheduler singleton;
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(); }
+ public static void init() {
+ if (singleton != null) return;
+ singleton = Platform.getScheduler();
+ 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.
+ * 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 /////////////////////////////////////
+ // Default Implementation //////////////////////////////////////////////////////
protected static Queue runnable = new Queue(50);
- 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
+ // FEATURE: be smarter about this
Surface.renderAll();
} catch (Exception e) {
Log.log(Scheduler.class, "Task threw an exception: " + e);