From aa2ed5fb0cb16766f440231f23581bb90e9963d8 Mon Sep 17 00:00:00 2001 From: James Turner Date: Tue, 13 Jul 2010 13:07:35 +0100 Subject: [PATCH] Allow tasks to be removed from the EventManager by name. --- simgear/structure/event_mgr.cxx | 33 +++++++++++++++++++++++++++++++-- simgear/structure/event_mgr.hxx | 22 +++++++++++++--------- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index d4b573d0..6753a38f 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -1,8 +1,9 @@ #include "event_mgr.hxx" #include +#include -void SGEventMgr::add(SGCallback* cb, +void SGEventMgr::add(const std::string& name, SGCallback* cb, double interval, double delay, bool repeat, bool simtime) { @@ -16,7 +17,8 @@ void SGEventMgr::add(SGCallback* cb, t->mgr = this; t->repeat = repeat; t->simtime = simtime; - + t->name = name; + SGTimerQueue* q = simtime ? &_simQueue : &_rtQueue; q->insert(t, delay); @@ -43,6 +45,21 @@ void SGEventMgr::update(double delta_time_sec) _rtQueue.update(rt); } +void SGEventMgr::removeTask(const std::string& name) +{ + SGTimer* t = _simQueue.findByName(name); + if (t) { + _simQueue.remove(t); + } else if ((t = _rtQueue.findByName(name))) { + _rtQueue.remove(t); + } else { + SG_LOG(SG_GENERAL, SG_WARN, "removeTask: no task found with name:" << name); + return; + } + + delete t; +} + //////////////////////////////////////////////////////////////////////// // SGTimerQueue // This is the priority queue implementation: @@ -165,3 +182,15 @@ void SGTimerQueue::growArray() delete[] _table; _table = newTable; } + +SGTimer* SGTimerQueue::findByName(const std::string& name) const +{ + for (int i=0; i < _numEntries; ++i) { + if (_table[i].timer->name == name) { + return _table[i].timer; + } + } + + return NULL; +} + diff --git a/simgear/structure/event_mgr.hxx b/simgear/structure/event_mgr.hxx index 007321b8..5b31c809 100644 --- a/simgear/structure/event_mgr.hxx +++ b/simgear/structure/event_mgr.hxx @@ -9,6 +9,7 @@ class SGEventMgr; struct SGTimer { + std::string name; double interval; SGCallback* callback; SGEventMgr* mgr; @@ -33,6 +34,7 @@ public: SGTimer* nextTimer() { return _numEntries ? _table[0].timer : 0; } double nextTime() { return -_table[0].pri; } + SGTimer* findByName(const std::string& name) const; private: // The "priority" is stored as a negative time. This allows the // implemenetation to treat the "top" of the heap as the largest @@ -77,43 +79,45 @@ public: * ex: addTask("foo", &Function ... ) */ template - inline void addTask(const char* name, const FUNC& f, + inline void addTask(const std::string& name, const FUNC& f, double interval, double delay=0, bool sim=false) - { add(make_callback(f), interval, delay, true, sim); } + { add(name, make_callback(f), interval, delay, true, sim); } /** * Add a single function callback event as a one-shot event. * ex: addEvent("foo", &Function ... ) */ template - inline void addEvent(const char* name, const FUNC& f, + inline void addEvent(const std::string& name, const FUNC& f, double delay, bool sim=false) - { add(make_callback(f), 0, delay, false, sim); } + { add(name, make_callback(f), 0, delay, false, sim); } /** * Add a object/method pair as a repeating task. * ex: addTask("foo", &object, &ClassName::Method, ...) */ template - inline void addTask(const char* name, + inline void addTask(const std::string& name, const OBJ& o, METHOD m, double interval, double delay=0, bool sim=false) - { add(make_callback(o,m), interval, delay, true, sim); } + { add(name, make_callback(o,m), interval, delay, true, sim); } /** * Add a object/method pair as a repeating task. * ex: addEvent("foo", &object, &ClassName::Method, ...) */ template - inline void addEvent(const char* name, + inline void addEvent(const std::string& name, const OBJ& o, METHOD m, double delay, bool sim=false) - { add(make_callback(o,m), 0, delay, false, sim); } + { add(name, make_callback(o,m), 0, delay, false, sim); } + + void removeTask(const std::string& name); private: friend struct SGTimer; - void add(SGCallback* cb, + void add(const std::string& name, SGCallback* cb, double interval, double delay, bool repeat, bool simtime); -- 2.39.5