summaryrefslogtreecommitdiffstats
path: root/src/com
diff options
context:
space:
mode:
authorAlex Clayton <alex.clayton@isode.com>2018-03-16 14:12:08 (GMT)
committerAlex Clayton <alex.clayton@isode.com>2018-03-21 09:27:34 (GMT)
commit17a1e7662102eea20ddc104133e2e30a70fefdc1 (patch)
treeb5d75cd518fe6924bfa4b3a5908bc95b7faf4e34 /src/com
parentbf4830bc9f51a27aba59bc5708caddb835e84789 (diff)
downloadstroke-17a1e7662102eea20ddc104133e2e30a70fefdc1.zip
stroke-17a1e7662102eea20ddc104133e2e30a70fefdc1.tar.bz2
Ensure JavaTimer.stop() cleans up any unresolved events
The code for stop() in JavaTimer read: @Override public void stop() { timer_.stop(); //FIXME: This needs to clear any remaining events out of the EventLoop queue. } Where as the equivalent swiften code in BoostTimer was: void BoostTimer::stop() { { std::unique_lock<std::mutex> lockTimer(timerMutex); shuttingDown = true; timer->cancel(); eventLoop->removeEventsFromOwner(shared_from_this()); } } This patch updates the java code to bring it inline with the swiften code. In short to make sure it removes any remaining events from the event loop when it is stopped. Test-information: Code Inspection. Unit test still pass. Ran update stroke against M-Link Console it ran ok. Change-Id: Idf92e92d002b8404547702d1c34738165e331810
Diffstat (limited to 'src/com')
-rw-r--r--src/com/isode/stroke/network/JavaTimer.java47
1 files changed, 25 insertions, 22 deletions
diff --git a/src/com/isode/stroke/network/JavaTimer.java b/src/com/isode/stroke/network/JavaTimer.java
index ac9e219..2baae3d 100644
--- a/src/com/isode/stroke/network/JavaTimer.java
+++ b/src/com/isode/stroke/network/JavaTimer.java
@@ -4,21 +4,20 @@
* See Documentation/Licenses/GPLv3.txt for more information.
*/
/*
- * Copyright (c) 2010, Isode Limited, London, England.
+ * Copyright (c) 2010-2018, Isode Limited, London, England.
* All rights reserved.
*/
package com.isode.stroke.network;
-import java.util.Date;
-
import com.isode.stroke.eventloop.Event;
import com.isode.stroke.eventloop.EventLoop;
+import com.isode.stroke.eventloop.EventOwner;
class JavaTimer extends Timer {
- private class TimerRunnable implements Runnable {
+ private class TimerRunnable implements Runnable,EventOwner {
- boolean running_ = true;
+ private boolean running_ = true;
private final EventLoop eventLoop_;
private final long milliseconds_;
@@ -28,25 +27,27 @@ class JavaTimer extends Timer {
}
public void run() {
- long endTime = new Date().getTime() + milliseconds_;
- while (shouldEmit() && new Date().getTime() < endTime) {
+ long endTime = System.currentTimeMillis() + milliseconds_;
+ while (shouldEmit() && System.currentTimeMillis() < endTime) {
try {
- long timeToWait = endTime - new Date().getTime();
+ long timeToWait = endTime - System.currentTimeMillis();
if (timeToWait > 0) {
- Thread.sleep(milliseconds_);
+ Thread.sleep(timeToWait);
}
} catch (InterruptedException ex) {
// Needs to be caught, but won't break out of the loop
// unless end time reached or stop() has been called.
}
- }
- if (shouldEmit()) {
- eventLoop_.postEvent(new Event.Callback() {
- public void run() {
- onTick.emit();
- }
- });
- }
+ }
+ synchronized(this) {
+ if (shouldEmit()) {
+ eventLoop_.postEvent(new Event.Callback() {
+ public void run() {
+ onTick.emit();
+ }
+ },this);
+ }
+ }
}
@@ -56,6 +57,7 @@ class JavaTimer extends Timer {
public synchronized void stop() {
running_ = false;
+ timer_.eventLoop_.removeEventsFromOwner(this);
}
}
@@ -85,14 +87,15 @@ class JavaTimer extends Timer {
@Override
public void stop() {
timer_.stop();
- //FIXME: This needs to clear any remaining events out of the EventLoop queue.
}
-
+
@Override
public String toString() {
- return "JavaTimer for " + timer_.milliseconds_ +
- " milliseconds " +
- (timer_.running_ ? "running" : "not running");
+ synchronized (timer_) {
+ return "JavaTimer for " + timer_.milliseconds_ +
+ " milliseconds " +
+ (timer_.running_ ? "running" : "not running");
+ }
}
private final TimerRunnable timer_;
}