# HG changeset patch # User Jaroslav Tulach # Date 1461728981 -7200 # Node ID a139403de81996c3d530a5837a71f76e2a14f90a # Parent 644d4f4bc6e08b9d9ca6317e861b74e41142edb0 Cancel previous timeouts and check for next one after executing one diff -r 644d4f4bc6e0 -r a139403de819 rt/emul/compact/src/main/java/java/util/Timer.java --- a/rt/emul/compact/src/main/java/java/util/Timer.java Wed Apr 27 04:01:39 2016 +0200 +++ b/rt/emul/compact/src/main/java/java/util/Timer.java Wed Apr 27 05:49:41 2016 +0200 @@ -490,7 +490,8 @@ * Otherwise, the Timer would never be garbage-collected and this * thread would never go away. */ - private TaskQueue queue; + private final TaskQueue queue; + private Object prevTimeout; TimerThread(TaskQueue queue) { this.queue = queue; @@ -500,14 +501,41 @@ if (delay < 1) { delay = 1; } - setTimeout(delay, this); + prevTimeout = setTimeout(delay, this, prevTimeout); } - @JavaScriptBody(args = { "delay", "r" }, body = "window.setTimeout(function() { r.run__V(); }, delay);") - private static native void setTimeout(int delay, Runnable r); + @JavaScriptBody(args = { "delay", "r", "prev" }, body = "" +// + "console.log('clear prev ' + prev);\n" + + "if (prev) {\n" + + " window.clearTimeout(prev);\n" + + "}\n" +// + "console.log('schedule in ' + delay);\n" + + "return window.setTimeout(function() {\n" +// + " console.log('running time');\n" + + " r.run__V();\n" +// + " console.log('done running time');\n" + + "}, delay);\n" + ) + private static native Object setTimeout(int delay, Runnable r, Object prev); + +// @JavaScriptBody(args = { "msg" }, body = "console.log(msg);") + private static void log(String msg) { + } + @Override public void run() { - mainLoop(1); + try { + mainLoop(1); + } finally { + synchronized (queue) { + if (!queue.isEmpty()) { + long next = queue.getMin().nextExecutionTime; + long now = System.currentTimeMillis(); + int delta = (int) (next - now); + notifyQueue(delta); + } + } + } // try { // mainLoop(0); // } finally { @@ -561,8 +589,12 @@ return; } } - if (taskFired) // Task fired; run it, holding no locks + if (taskFired) { + // Task fired; run it, holding no locks + log("Running " + task); task.run(); + log("Done running " + task); + } } catch(Exception e) { e.printStackTrace(); } diff -r 644d4f4bc6e0 -r a139403de819 rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/TimerTest.java --- a/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/TimerTest.java Wed Apr 27 04:01:39 2016 +0200 +++ b/rt/emul/compacttest/src/test/java/org/apidesign/bck2brwsr/tck/TimerTest.java Wed Apr 27 05:49:41 2016 +0200 @@ -28,6 +28,7 @@ * @author Jaroslav Tulach */ public class TimerTest { + boolean started; int miss; int exec; @@ -35,15 +36,18 @@ } @BrwsrTest public void scheduleTick() throws Exception { - Timer t = new Timer("MyTest"); - class TT extends TimerTask { - @Override - public void run() { - exec++; + if (!started) { + started = true; + Timer t = new Timer("MyTest"); + class TT extends TimerTask { + @Override + public void run() { + exec++; + } } + TT task = new TT(); + t.schedule(task, 15); } - TT task = new TT(); - t.schedule(task, 15); if (exec == 0) { miss++; @@ -55,15 +59,20 @@ } @BrwsrTest public void repeatedTicks() throws Exception { - Timer t = new Timer("MyTest"); - class TT extends TimerTask { - @Override - public void run() { - exec++; + if (!started) { + started = true; + Timer t = new Timer("MyTest"); + class TT extends TimerTask { + @Override + public void run() { + if (++exec == 2) { + cancel(); + } + } } + TT task = new TT(); + t.scheduleAtFixedRate(task, 50, 70); } - TT task = new TT(); - t.scheduleAtFixedRate(task, 15, 10); if (exec != 2) { miss++;