diff --git a/src/libCom/timer/osiTimer.cpp b/src/libCom/timer/osiTimer.cpp index b677194e4..a1a98ae89 100644 --- a/src/libCom/timer/osiTimer.cpp +++ b/src/libCom/timer/osiTimer.cpp @@ -223,7 +223,7 @@ void osiTimer::arm (osiTimerQueue &queueIn, double initialDelay) queueIn.mutex.unlock (); - queueIn.event.signal (); + queueIn.rescheduleEvent.signal (); } // @@ -319,7 +319,7 @@ void osiTimer::unlock () const // osiTimerQueue::osiTimerQueue (unsigned managerThreadPriority) : osiThread ("osiTimerQueue", threadGetStackSize (threadStackMedium), managerThreadPriority), - pExpireTmr (0), inProcess (false), terminateFlag (false) + pExpireTmr (0), inProcess (false), terminateFlag (false), exitFlag (false) { } @@ -348,7 +348,10 @@ osiTimerQueue::~osiTimerQueue() pTmr->destroy (); } this->terminateFlag = true; - this->event.signal (); + this->rescheduleEvent.signal (); + while (!this->exitFlag) { + this->exitEvent.wait (); + } } // @@ -356,10 +359,13 @@ osiTimerQueue::~osiTimerQueue() // void osiTimerQueue::entryPoint () { + this->exitFlag = false; while (!this->terminateFlag) { this->process (); - this->event.wait ( this->delayToFirstExpire () ); + this->rescheduleEvent.wait ( this->delayToFirstExpire () ); } + this->exitFlag = true; + this->exitEvent.signal (); // no access to this ptr after this statement } // diff --git a/src/libCom/timer/osiTimer.h b/src/libCom/timer/osiTimer.h index f4bf381a5..92854a6f2 100644 --- a/src/libCom/timer/osiTimer.h +++ b/src/libCom/timer/osiTimer.h @@ -174,12 +174,14 @@ public: void show (unsigned level) const; private: osiMutex mutex; - osiEvent event; + osiEvent rescheduleEvent; + osiEvent exitEvent; tsDLList pending; tsDLList expired; osiTimer *pExpireTmr; bool inProcess; bool terminateFlag; + bool exitFlag; virtual void entryPoint (); void install (osiTimer &tmr, double delay);