X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fstructure%2Fevent_mgr.cxx;h=a62e83f91df7e26b94a7b42a2259eb02ef100b36;hb=ff7e70f4d570c472bbc6fe4198483d927914a35e;hp=32c499f9988961dabc906ee5900cb507a371ad22;hpb=34e2a9dc374914418d0a414490e10e1264c0a146;p=simgear.git diff --git a/simgear/structure/event_mgr.cxx b/simgear/structure/event_mgr.cxx index 32c499f9..a62e83f9 100644 --- a/simgear/structure/event_mgr.cxx +++ b/simgear/structure/event_mgr.cxx @@ -4,6 +4,10 @@ void SGEventMgr::add(SGCallback* cb, double interval, double delay, bool repeat, bool simtime) { + // Clamp the delay value to 1 usec, so that user code can use + // "zero" as a synonym for "next frame". + if(delay <= 0) delay = 0.000001; + SGTimer* t = new SGTimer; t->interval = interval; t->callback = cb; @@ -31,9 +35,10 @@ void SGTimer::run() void SGEventMgr::update(double delta_time_sec) { - _rtQueue.update(delta_time_sec); - if(!_freezeProp || _freezeProp->getBoolValue() == false) - _simQueue.update(delta_time_sec); + _simQueue.update(delta_time_sec); + + double rt = _rtProp ? _rtProp->getDoubleValue() : 0; + _rtQueue.update(rt); } //////////////////////////////////////////////////////////////////////// @@ -59,7 +64,14 @@ SGTimerQueue::SGTimerQueue(int size) SGTimerQueue::~SGTimerQueue() { + for(int i=0; i<_numEntries; i++) { + delete _table[i].timer; + _table[i].timer = 0; + } + _numEntries = 0; delete[] _table; + _table = 0; + _tableSize = 0; } void SGTimerQueue::update(double deltaSecs) @@ -73,8 +85,6 @@ void SGTimerQueue::update(double deltaSecs) void SGTimerQueue::insert(SGTimer* timer, double time) { - if(time < 0) *(int*)0=0; - if(_numEntries >= _tableSize) growArray(); @@ -120,21 +130,16 @@ SGTimer* SGTimerQueue::remove() void SGTimerQueue::siftDown(int n) { - // While we have a child bigger than us: - while(((lchild(n) < (_numEntries-1)) - && (_table[n].pri < _table[lchild(n)].pri)) - || - ((rchild(n) < (_numEntries-1)) - && (_table[n].pri < _table[rchild(n)].pri))) - { - // Swap us with the biggest child - if(_table[lchild(n)].pri > _table[rchild(n)].pri) { - swap(n, lchild(n)); - n = lchild(n); - } else { - swap(n, rchild(n)); - n = rchild(n); - } + // While we have children bigger than us, swap us with the biggest + // child. + while(lchild(n) < _numEntries) { + int bigc = lchild(n); + if(rchild(n) < _numEntries && pri(rchild(n)) > pri(bigc)) + bigc = rchild(n); + if(pri(bigc) <= pri(n)) + break; + swap(n, bigc); + n = bigc; } }