]> git.mxchange.org Git - simgear.git/blobdiff - simgear/structure/event_mgr.cxx
Revert "Use simgear internal stuff for the singleton class."
[simgear.git] / simgear / structure / event_mgr.cxx
index 63e4672faaeb0a95212cb39760af5925dc050619..f448a6495bd063c951b357e070c730cee29ce878 100644 (file)
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+#  include <simgear_config.h>
+#endif
+
 #include "event_mgr.hxx"
 
 #include <simgear/math/SGMath.hxx>
@@ -16,6 +20,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 +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;
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////
@@ -94,12 +104,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;
-        }
     }
 }