X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fevent_mgr.cxx;h=cd3de3b91af7cc0fd7ba569f0e1b3a1de4ee04ca;hb=5b92575ed31ab0577d5ece4da42a88cfb88b4ad7;hp=63e4672faaeb0a95212cb39760af5925dc050619;hpb=3c0c51a9461f3c85642b0de18b5c9c65078816b6;p=simgear.git diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index 63e4672f..cd3de3b9 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -1,6 +1,9 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + #include "event_mgr.hxx" -#include #include void SGEventMgr::add(const std::string& name, SGCallback* cb, @@ -16,6 +19,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 +56,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; + } } //////////////////////////////////////////////////////////////////////// @@ -94,12 +103,15 @@ void SGTimerQueue::update(double deltaSecs) _now += deltaSecs; while(_numEntries && nextTime() <= _now) { SGTimer* t = remove(); - t->run(); - if(t->repeat) { + if(t->repeat) insert(t, t->interval); - } else { + // 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; - } } }