Csaba Halasz: fix SGTimerQueue so tasks can remove themselves properly

fixes commit c033979130
This commit is contained in:
ThorstenB
2011-06-13 14:13:48 +02:00
parent c782a32076
commit 50cea4f64e
2 changed files with 13 additions and 2 deletions

View File

@@ -16,6 +16,7 @@ void SGEventMgr::add(const std::string& name, SGCallback* cb,
t->callback = cb;
t->repeat = repeat;
t->name = name;
t->running = false;
SGTimerQueue* q = simtime ? &_simQueue : &_rtQueue;
@@ -52,8 +53,13 @@ void SGEventMgr::removeTask(const std::string& name)
SG_LOG(SG_GENERAL, SG_WARN, "removeTask: no task found with name:" << name);
return;
}
delete t;
if (t->running) {
// mark as not repeating so that the SGTimerQueue::update()
// will clean it up
t->repeat = false;
} else {
delete t;
}
}
////////////////////////////////////////////////////////////////////////
@@ -96,7 +102,11 @@ void SGTimerQueue::update(double deltaSecs)
SGTimer* t = remove();
if(t->repeat)
insert(t, t->interval);
// warning: this is not thread safe
// but the entire timer queue isn't either
t->running = true;
t->run();
t->running = false;
if (!t->repeat)
delete t;
}

View File

@@ -17,6 +17,7 @@ public:
double interval;
SGCallback* callback;
bool repeat;
bool running;
};
class SGTimerQueue {