summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Network')
-rw-r--r--Swiften/Network/Timer.cpp35
-rw-r--r--Swiften/Network/Timer.h12
2 files changed, 21 insertions, 26 deletions
diff --git a/Swiften/Network/Timer.cpp b/Swiften/Network/Timer.cpp
index f3b296c..d6120e3 100644
--- a/Swiften/Network/Timer.cpp
+++ b/Swiften/Network/Timer.cpp
@@ -6,35 +6,32 @@
namespace Swift {
-Timer::Timer(int milliseconds) :
- timeout_(milliseconds), ioService_(0), thread_(0), timer_(0) {
- ioService_ = new boost::asio::io_service();
+Timer::Timer(int milliseconds, boost::asio::io_service* service) :
+ timeout(milliseconds), timer(*service) {
}
Timer::~Timer() {
- //MainEventLoop::removeEventsFromOwner(shared_from_this());
- ioService_->stop();
- thread_->join();
- delete timer_;
- delete thread_;
- delete ioService_;
+ stop();
}
void Timer::start() {
- thread_ = new boost::thread(boost::bind(&Timer::doStart, shared_from_this()));
+ timer.expires_from_now(boost::posix_time::milliseconds(timeout));
+ timer.async_wait(boost::bind(&Timer::handleTimerTick, shared_from_this(), boost::asio::placeholders::error));
}
-void Timer::doStart() {
- timer_ = new boost::asio::deadline_timer(*ioService_);
- timer_->expires_from_now(boost::posix_time::milliseconds(timeout_));
- timer_->async_wait(boost::bind(&Timer::handleTimerTick, shared_from_this()));
- ioService_->run();
+void Timer::stop() {
+ timer.cancel();
}
-void Timer::handleTimerTick() {
- MainEventLoop::postEvent(boost::bind(boost::ref(onTick)), shared_from_this());
- timer_->expires_from_now(boost::posix_time::milliseconds(timeout_));
- timer_->async_wait(boost::bind(&Timer::handleTimerTick, shared_from_this()));
+void Timer::handleTimerTick(const boost::system::error_code& error) {
+ if (error) {
+ assert(error == boost::asio::error::operation_aborted);
+ }
+ else {
+ MainEventLoop::postEvent(boost::bind(boost::ref(onTick)), shared_from_this());
+ timer.expires_from_now(boost::posix_time::milliseconds(timeout));
+ timer.async_wait(boost::bind(&Timer::handleTimerTick, shared_from_this(), boost::asio::placeholders::error));
+ }
}
}
diff --git a/Swiften/Network/Timer.h b/Swiften/Network/Timer.h
index de97c13..6474fe9 100644
--- a/Swiften/Network/Timer.h
+++ b/Swiften/Network/Timer.h
@@ -10,22 +10,20 @@
namespace Swift {
class Timer : public EventOwner, public boost::enable_shared_from_this<Timer> {
public:
- Timer(int milliseconds);
+ Timer(int milliseconds, boost::asio::io_service* service);
~Timer();
void start();
+ void stop();
public:
boost::signal<void ()> onTick;
private:
- void doStart();
- void handleTimerTick();
+ void handleTimerTick(const boost::system::error_code& error);
private:
- int timeout_;
- boost::asio::io_service* ioService_;
- boost::thread* thread_;
- boost::asio::deadline_timer* timer_;
+ int timeout;
+ boost::asio::deadline_timer timer;
};
}