diff options
| -rw-r--r-- | Swiften/Network/BoostTimer.cpp | 14 | ||||
| -rw-r--r-- | Swiften/Network/BoostTimer.h | 1 | 
2 files changed, 12 insertions, 3 deletions
| diff --git a/Swiften/Network/BoostTimer.cpp b/Swiften/Network/BoostTimer.cpp index 30f5180..c30fe32 100644 --- a/Swiften/Network/BoostTimer.cpp +++ b/Swiften/Network/BoostTimer.cpp @@ -15,7 +15,7 @@  namespace Swift {  BoostTimer::BoostTimer(int milliseconds, boost::shared_ptr<boost::asio::io_service> service, EventLoop* eventLoop) : -		timeout(milliseconds), ioService(service), eventLoop(eventLoop) { +		timeout(milliseconds), ioService(service), eventLoop(eventLoop), shuttingDown(false) {  		timer.reset(new boost::asio::deadline_timer(*service));  } @@ -29,6 +29,7 @@ BoostTimer::~BoostTimer() {  void BoostTimer::start() {  	{  		boost::mutex::scoped_lock 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));  	} @@ -37,9 +38,10 @@ void BoostTimer::start() {  void BoostTimer::stop() {  	{  		boost::mutex::scoped_lock lockTimer(timerMutex); +		shuttingDown = true;  		timer->cancel(); +		eventLoop->removeEventsFromOwner(shared_from_this());  	} -	eventLoop->removeEventsFromOwner(shared_from_this());  }  void BoostTimer::handleTimerTick(const boost::system::error_code& error) { @@ -47,7 +49,13 @@ void BoostTimer::handleTimerTick(const boost::system::error_code& error) {  		assert(error == boost::asio::error::operation_aborted);  	}  	else { -		eventLoop->postEvent(boost::bind(boost::ref(onTick)), shared_from_this()); +		{ +			boost::mutex::scoped_lock lockTimer(timerMutex); +			if (shuttingDown) { +				return; +			} +			eventLoop->postEvent(boost::bind(boost::ref(onTick)), shared_from_this()); +		}  	}  } diff --git a/Swiften/Network/BoostTimer.h b/Swiften/Network/BoostTimer.h index a246b75..3227031 100644 --- a/Swiften/Network/BoostTimer.h +++ b/Swiften/Network/BoostTimer.h @@ -43,5 +43,6 @@ namespace Swift {  			boost::scoped_ptr<boost::asio::deadline_timer> timer;  			boost::mutex timerMutex;  			EventLoop* eventLoop; +			bool shuttingDown;  	};  } | 
 Swift
 Swift