Author: astitcher Date: Tue Jun 23 20:02:35 2009 New Revision: 787813 URL: http://svn.apache.org/viewvc?rev=787813&view=rev Log: Add blocking to sys::Timer so that timer callback and cancel can't happen interleaved
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/Timer.cpp qpid/trunk/qpid/cpp/src/qpid/sys/Timer.h Modified: qpid/trunk/qpid/cpp/src/qpid/sys/Timer.cpp URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/Timer.cpp?rev=787813&r1=787812&r2=787813&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/sys/Timer.cpp (original) +++ qpid/trunk/qpid/cpp/src/qpid/sys/Timer.cpp Tue Jun 23 20:02:35 2009 @@ -19,6 +19,7 @@ * */ #include "Timer.h" +#include "Mutex.h" #include <iostream> #include <numeric> @@ -62,7 +63,10 @@ void TimerTask::restart() { nextFireTime = AbsTime(AbsTime::now(), period); } void TimerTask::delayTill(AbsTime time) { period = 0; nextFireTime = max(nextFireTime, time); } -void TimerTask::cancel() { cancelled = true; } +void TimerTask::cancel() { + ScopedLock<Mutex> l(callbackLock); + cancelled = true; +} bool TimerTask::isCancelled() const { return cancelled; } Timer::Timer() : @@ -85,16 +89,21 @@ } else { intrusive_ptr<TimerTask> t = tasks.top(); tasks.pop(); + { + ScopedLock<Mutex> l(t->callbackLock); if (t->isCancelled()) { + continue; } else if(t->readyToFire()) { Monitor::ScopedUnlock u(monitor); t->fireTask(); + continue; } else { // If the timer was adjusted into the future it might no longer // be the next event, so push and then get top to make sure tasks.push(t); - monitor.wait(tasks.top()->nextFireTime); } + } + monitor.wait(tasks.top()->nextFireTime); } } } Modified: qpid/trunk/qpid/cpp/src/qpid/sys/Timer.h URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/Timer.h?rev=787813&r1=787812&r2=787813&view=diff ============================================================================== --- qpid/trunk/qpid/cpp/src/qpid/sys/Timer.h (original) +++ qpid/trunk/qpid/cpp/src/qpid/sys/Timer.h Tue Jun 23 20:02:35 2009 @@ -22,6 +22,7 @@ #define sys_Timer #include "qpid/sys/Monitor.h" +#include "qpid/sys/Mutex.h" #include "qpid/sys/Thread.h" #include "qpid/sys/Runnable.h" #include "qpid/RefCounted.h" @@ -43,6 +44,7 @@ Duration period; AbsTime nextFireTime; + Mutex callbackLock; volatile bool cancelled; bool readyToFire() const; --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:commits-subscr...@qpid.apache.org