diff options
author | Alex Clayton <alex.clayton@isode.com> | 2018-03-16 14:12:08 (GMT) |
---|---|---|
committer | Alex Clayton <alex.clayton@isode.com> | 2018-03-21 09:27:34 (GMT) |
commit | 17a1e7662102eea20ddc104133e2e30a70fefdc1 (patch) | |
tree | b5d75cd518fe6924bfa4b3a5908bc95b7faf4e34 | |
parent | bf4830bc9f51a27aba59bc5708caddb835e84789 (diff) | |
download | stroke-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
-rw-r--r-- | src/com/isode/stroke/network/JavaTimer.java | 47 |
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_; } |