X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fevent_mgr.cxx;h=f448a6495bd063c951b357e070c730cee29ce878;hb=66c9187c95fb6861d9737f135fdf68d1bfa265f3;hp=6753a38f41de7cf5b22e0b3160911cefb9441f6e;hpb=72f301c6558758c71c65f5a647be7efa034468dc;p=simgear.git diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index 6753a38f..f448a649 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -1,3 +1,7 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + #include "event_mgr.hxx" #include @@ -14,27 +18,24 @@ void SGEventMgr::add(const std::string& name, SGCallback* cb, SGTimer* t = new SGTimer; t->interval = interval; t->callback = cb; - t->mgr = this; t->repeat = repeat; - t->simtime = simtime; t->name = name; + t->running = false; SGTimerQueue* q = simtime ? &_simQueue : &_rtQueue; q->insert(t, delay); } +SGTimer::~SGTimer() +{ + delete callback; + callback = NULL; +} + void SGTimer::run() { (*callback)(); - - if(repeat) { - SGTimerQueue* q = simtime ? &mgr->_simQueue : &mgr->_rtQueue; - q->insert(this, interval); - } else { - delete callback; - delete this; - } } void SGEventMgr::update(double delta_time_sec) @@ -56,8 +57,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; + } } //////////////////////////////////////////////////////////////////////// @@ -98,7 +104,15 @@ void SGTimerQueue::update(double deltaSecs) _now += deltaSecs; while(_numEntries && nextTime() <= _now) { 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; } } @@ -193,4 +207,3 @@ SGTimer* SGTimerQueue::findByName(const std::string& name) const return NULL; } -