You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2009/06/23 22:02:36 UTC

svn commit: r787813 - in /qpid/trunk/qpid/cpp/src/qpid/sys: Timer.cpp Timer.h

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-subscribe@qpid.apache.org