From 50cea4f64e7e9ed8aba7368edd1a4c146e126424 Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Mon, 13 Jun 2011 14:13:48 +0200 Subject: [PATCH] Csaba Halasz: fix SGTimerQueue so tasks can remove themselves properly fixes commit c033979130b1c5822c5e9fc55bffc09632d5a48f --- simgear/structure/event_mgr.cxx | 14 ++++++++++++-- simgear/structure/event_mgr.hxx | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index eeefaac9..11b34b7a 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -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; } diff --git a/simgear/structure/event_mgr.hxx b/simgear/structure/event_mgr.hxx index 23ee5348..b8dda323 100644 --- a/simgear/structure/event_mgr.hxx +++ b/simgear/structure/event_mgr.hxx @@ -17,6 +17,7 @@ public: double interval; SGCallback* callback; bool repeat; + bool running; }; class SGTimerQueue { -- 2.39.5