summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/sys/Timer.h
diff options
context:
space:
mode:
authorAndrew Stitcher <astitcher@apache.org>2012-07-05 19:38:26 +0000
committerAndrew Stitcher <astitcher@apache.org>2012-07-05 19:38:26 +0000
commitdbc5b2128daa9072c8cd186686078ca392edfb9b (patch)
tree15907ae7c2867f2b8648b530ae911a2946d7cef5 /cpp/src/qpid/sys/Timer.h
parent9d587a132403026b2a99dc7295be0f8b1fdf337a (diff)
downloadqpid-python-dbc5b2128daa9072c8cd186686078ca392edfb9b.tar.gz
NO-JIRA: Fix for potential Timer deadlock issue:
- Previously we used a mutex to prevent cancelling a TimerTask whilst it was still executing from within its callback in another thread. This violates the principle that you shouldn't hold locks when calling the arbitrary code in a callback, and so is subject to potential deadlock problems. - This fix only works if no timer callback calls TimerTask::cancel(); this is true with the current code. And there is no good reason to call cancel() from within a callback, as cancel is the default behviour in any case - you have to specifically reschedule a recurring timer. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1357827 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/sys/Timer.h')
-rw-r--r--cpp/src/qpid/sys/Timer.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/cpp/src/qpid/sys/Timer.h b/cpp/src/qpid/sys/Timer.h
index fccb17dbc2..af0b1b6803 100644
--- a/cpp/src/qpid/sys/Timer.h
+++ b/cpp/src/qpid/sys/Timer.h
@@ -40,6 +40,7 @@ class Timer;
class TimerTask : public RefCounted {
friend class Timer;
+ friend class TimerTaskCallbackScope;
friend bool operator<(const boost::intrusive_ptr<TimerTask>&,
const boost::intrusive_ptr<TimerTask>&);
@@ -47,9 +48,11 @@ class TimerTask : public RefCounted {
AbsTime sortTime;
Duration period;
AbsTime nextFireTime;
- Mutex callbackLock;
- volatile bool cancelled;
+ qpid::sys::Monitor stateMonitor;
+ enum {WAITING, CALLBACK, CANCELLED} state;
+ bool prepareToFire();
+ void finishFiring();
bool readyToFire() const;
void fireTask();