From 0b104291cbb5c9a59c291c23ab76904c7dc47a57 Mon Sep 17 00:00:00 2001 From: nathan Date: Sun, 21 Feb 2016 00:49:40 +0100 Subject: [PATCH] Fixed issue for DelayTimer, when changing the timer during the callback --- Dorkbox-Util/src/dorkbox/util/DelayTimer.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Dorkbox-Util/src/dorkbox/util/DelayTimer.java b/Dorkbox-Util/src/dorkbox/util/DelayTimer.java index acf1bcb..7fc30bb 100644 --- a/Dorkbox-Util/src/dorkbox/util/DelayTimer.java +++ b/Dorkbox-Util/src/dorkbox/util/DelayTimer.java @@ -23,7 +23,7 @@ class DelayTimer { private final String name; private final boolean isDaemon; private final Runnable listener; - private Timer timer; + private volatile Timer timer; private long delay; public @@ -85,8 +85,19 @@ class DelayTimer { @Override public void run() { + // timer can change if the callback calls delay() or cancel() + Timer origTimer = DelayTimer.this.timer; + DelayTimer.this.listener.run(); - DelayTimer.this.cancel(); + + if (origTimer != null) { + origTimer.cancel(); + origTimer.purge(); + + if (origTimer == DelayTimer.this.timer) { + DelayTimer.this.timer = null; + } + } } }; this.timer.schedule(t, delay);