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 @@ -1,98 +1,101 @@ /* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * 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_; public TimerRunnable(EventLoop eventLoop, long milliseconds) { eventLoop_ = eventLoop; milliseconds_ = milliseconds; } 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); + } + } } synchronized boolean shouldEmit() { return running_; } public synchronized void stop() { running_ = false; + timer_.eventLoop_.removeEventsFromOwner(this); } } /** * Create a new JavaTimer * @param eventLoop the caller's EventLoop. Should not be null. * @param milliseconds length of delay. */ public JavaTimer(EventLoop eventLoop, long milliseconds) { timer_ = new TimerRunnable(eventLoop, milliseconds); } /** * Start the timer running. The timer will expire and generate a signal * after the specified delay, unless {@link #stop()} has been called. */ @Override public void start() { Thread thread = (new Thread(timer_)); thread.setDaemon(true); thread.start(); } /** * Cancel the timer. No signal will be generated. */ @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_; } |