]> git.mxchange.org Git - simgear.git/commitdiff
Csaba Halasz: fix SGTimerQueue so tasks can remove themselves properly
authorThorstenB <brehmt@gmail.com>
Mon, 13 Jun 2011 12:13:48 +0000 (14:13 +0200)
committerThorstenB <brehmt@gmail.com>
Mon, 13 Jun 2011 12:13:48 +0000 (14:13 +0200)
fixes commit c033979130b1c5822c5e9fc55bffc09632d5a48f

simgear/structure/event_mgr.cxx
simgear/structure/event_mgr.hxx

index eeefaac99f76e5be79648ed3e07189552acb8188..11b34b7a1e6ce05533b067913c522788ce6367d4 100644 (file)
@@ -16,6 +16,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 +53,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;
+  }
 }
 
 ////////////////////////////////////////////////////////////////////////
@@ -96,7 +102,11 @@ void SGTimerQueue::update(double deltaSecs)
         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;
     }
index 23ee5348d9a836408370e773650c93e1d2ba6cc4..b8dda323fb7e7c15f4ae3156a69b1d52b99702dc 100644 (file)
@@ -17,6 +17,7 @@ public:
     double interval;
     SGCallback* callback;
     bool repeat;
+    bool running;
 };
 
 class SGTimerQueue {