]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/event_mgr.cxx
performance monitor: start measurement interval with a fresh timestamp.
[simgear.git] / simgear / structure / event_mgr.cxx
index 5384031aeb29b463a9c9b57d96420f100a484460..f448a6495bd063c951b357e070c730cee29ce878 100644 (file)
@@ -1,8 +1,13 @@
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
 #include "event_mgr.hxx"
 
-#include <simgear/Math/SGMath.hxx>
+#include <simgear/math/SGMath.hxx>
+#include <simgear/debug/logstream.hxx>
 
-void SGEventMgr::add(SGCallback* cb,
+void SGEventMgr::add(const std::string& name, SGCallback* cb,
                      double interval, double delay,
                      bool repeat, bool simtime)
 {
@@ -13,26 +18,24 @@ void SGEventMgr::add(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)
@@ -43,6 +46,26 @@ 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;
+  }
+  if (t->running) {
+    // mark as not repeating so that the SGTimerQueue::update()
+    // will clean it up
+    t->repeat = false;
+  } else {
+    delete t;
+  }
+}
+
 ////////////////////////////////////////////////////////////////////////
 // SGTimerQueue
 // This is the priority queue implementation:
@@ -81,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;
     }
 }
 
@@ -165,3 +196,14 @@ 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;
+}