From 5a9eff29fab96157124cad61dd848355f909acfd Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Wed, 5 Oct 2011 22:10:15 +0200 Subject: [PATCH] alive access synced --- pvDataApp/misc/lock.h | 13 ++++++++++--- pvDataApp/misc/timer.cpp | 19 +++++++++++++------ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/pvDataApp/misc/lock.h b/pvDataApp/misc/lock.h index 86348ef..56e2811 100644 --- a/pvDataApp/misc/lock.h +++ b/pvDataApp/misc/lock.h @@ -13,6 +13,8 @@ * Effective C++, Third Edition, Scott Meyers */ +// TODO reference counting lock to allow recursions + namespace epics { namespace pvData { typedef epicsMutex Mutex; @@ -25,14 +27,19 @@ public: ~Lock(){unlock();} void lock() { - if(!locked) mutexPtr.lock(); - locked = true; + if(!locked) + { + mutexPtr.lock(); + locked = true; + } } void unlock() { if(locked) + { mutexPtr.unlock(); - locked=false; + locked=false; + } } bool ownsLock() const{return locked;} private: diff --git a/pvDataApp/misc/timer.cpp b/pvDataApp/misc/timer.cpp index 521e458..6ffea19 100644 --- a/pvDataApp/misc/timer.cpp +++ b/pvDataApp/misc/timer.cpp @@ -57,7 +57,7 @@ public: // only used by this source module Mutex mutex; Event waitForWork; Event waitForDone; - volatile bool alive; + bool alive; Thread thread; void addElement(TimerNode::Pvt &node); }; @@ -128,13 +128,14 @@ bool TimerNode::isScheduled() void Timer::Pvt::run() { TimeStamp currentTime; - while(alive) { + while(true) { currentTime.getCurrent(); TimeStamp *timeToRun = 0; double period = 0.0; TimerNode::Pvt *nodeToCall = 0; { Lock xx(mutex); + if (!alive) break; TimerListNode *timerListNode = timerList.getHead(); if(timerListNode!=0) { TimerNode::Pvt *timerNodePvt = &timerListNode->getObject(); @@ -164,7 +165,10 @@ void Timer::Pvt::run() if(nodeToCall!=0) { nodeToCall->callback->callback(); } - if(!alive) break; + { + Lock xx(mutex); + if(!alive) break; + } if(timeToRun==0) { waitForWork.wait(); } else { @@ -205,9 +209,12 @@ void Timer::schedulePeriodic(TimerNode &timerNode,double delay,double period) if(timerNodePvt->timerListNode.isOnList()) { throw std::logic_error(String("already queued")); } - if(!pImpl->alive) { - timerNodePvt->callback->timerStopped(); - return; + { + Lock xx(pImpl->mutex); + if(!pImpl->alive) { + timerNodePvt->callback->timerStopped(); + return; + } } TimeStamp *timeStamp = &timerNodePvt->timeToRun; timeStamp->getCurrent();