diff options
Diffstat (limited to 'Swiften/Network/BoostTimer.cpp')
-rw-r--r-- | Swiften/Network/BoostTimer.cpp | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/Swiften/Network/BoostTimer.cpp b/Swiften/Network/BoostTimer.cpp index bf042d6..a177504 100644 --- a/Swiften/Network/BoostTimer.cpp +++ b/Swiften/Network/BoostTimer.cpp @@ -1,40 +1,62 @@ /* - * 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-2016 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. */ #include <Swiften/Network/BoostTimer.h> -#include <boost/date_time/posix_time/posix_time.hpp> #include <boost/asio.hpp> #include <boost/bind.hpp> +#include <boost/date_time/posix_time/posix_time.hpp> #include <Swiften/EventLoop/EventLoop.h> namespace Swift { -BoostTimer::BoostTimer(int milliseconds, boost::shared_ptr<boost::asio::io_service> service, EventLoop* eventLoop) : - timeout(milliseconds), ioService(service), timer(*service), eventLoop(eventLoop) { +BoostTimer::BoostTimer(int milliseconds, std::shared_ptr<boost::asio::io_service> service, EventLoop* eventLoop) : + timeout(milliseconds), ioService(service), eventLoop(eventLoop), shuttingDown(false) { + timer.reset(new boost::asio::deadline_timer(*service)); +} + +BoostTimer::~BoostTimer() { + { + std::unique_lock<std::mutex> lockTimer(timerMutex); + timer.reset(); + } } void BoostTimer::start() { - timer.expires_from_now(boost::posix_time::milliseconds(timeout)); - timer.async_wait(boost::bind(&BoostTimer::handleTimerTick, shared_from_this(), boost::asio::placeholders::error)); + { + std::unique_lock<std::mutex> lockTimer(timerMutex); + shuttingDown = false; + timer->expires_from_now(boost::posix_time::milliseconds(timeout)); + timer->async_wait(boost::bind(&BoostTimer::handleTimerTick, shared_from_this(), boost::asio::placeholders::error)); + } } void BoostTimer::stop() { - timer.cancel(); - eventLoop->removeEventsFromOwner(shared_from_this()); + { + std::unique_lock<std::mutex> lockTimer(timerMutex); + shuttingDown = true; + timer->cancel(); + eventLoop->removeEventsFromOwner(shared_from_this()); + } } void BoostTimer::handleTimerTick(const boost::system::error_code& error) { - if (error) { - assert(error == boost::asio::error::operation_aborted); - } - else { - eventLoop->postEvent(boost::bind(boost::ref(onTick)), shared_from_this()); - } + if (error) { + assert(error == boost::asio::error::operation_aborted); + } + else { + { + std::unique_lock<std::mutex> lockTimer(timerMutex); + if (shuttingDown) { + return; + } + eventLoop->postEvent(boost::bind(boost::ref(onTick)), shared_from_this()); + } + } } } |