alive access synced

This commit is contained in:
Matej Sekoranja
2011-10-05 22:10:15 +02:00
parent ed0e8d0782
commit 5a9eff29fa
2 changed files with 23 additions and 9 deletions

View File

@@ -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();