clean up state transitions
This commit is contained in:
@@ -148,7 +148,6 @@ void timer::privateCancel ( epicsGuard < epicsMutex > & locker )
|
||||
}
|
||||
else if ( this->curState == stateActive ) {
|
||||
this->queue.cancelPending = true;
|
||||
this->curState = timer::stateLimbo;
|
||||
if ( this->queue.processThread != epicsThreadGetIdSelf() ) {
|
||||
// make certain timer expire() does not run after cancel () returns,
|
||||
// but dont require that lock is applied while calling expire()
|
||||
@@ -158,15 +157,19 @@ void timer::privateCancel ( epicsGuard < epicsMutex > & locker )
|
||||
this->queue.pExpireTmr == this ) {
|
||||
this->queue.cancelBlockingEvent.wait ();
|
||||
}
|
||||
// in case other threads are waiting
|
||||
this->queue.cancelBlockingEvent.signal ();
|
||||
}
|
||||
// in case other threads are waiting
|
||||
this->queue.cancelBlockingEvent.signal ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
epicsTimer::expireInfo timer::getExpireInfo () const
|
||||
{
|
||||
// taking a lock here guarantees that users will not
|
||||
// see brief intervals when a timer isnt active because
|
||||
// it is is canceled when start is called
|
||||
epicsGuard < epicsMutex > locker ( this->queue.mutex );
|
||||
if ( this->curState == statePending || this->curState == stateActive ) {
|
||||
return expireInfo ( true, this->exp );
|
||||
}
|
||||
|
||||
@@ -118,22 +118,25 @@ double timerQueue::process ( const epicsTime & currentTime )
|
||||
// while the call back was running
|
||||
//
|
||||
if ( this->cancelPending ) {
|
||||
this->pExpireTmr->curState = timer::stateLimbo;
|
||||
|
||||
// 1) if another thread is canceling cancel() waits for this
|
||||
// 2) if this thread is canceling in the timer callback then
|
||||
// dont touch timer or notify here because the cancel might
|
||||
// have occurred because they destroyed the time rin the
|
||||
// have occurred because they destroyed the timer in the
|
||||
// callback
|
||||
this->cancelPending = false;
|
||||
this->cancelBlockingEvent.signal ();
|
||||
}
|
||||
// restart as nec
|
||||
else {
|
||||
this->pExpireTmr->curState = timer::stateLimbo;
|
||||
// restart as nec
|
||||
if ( expStat.restart() ) {
|
||||
this->pExpireTmr->privateStart (
|
||||
*pTmpNotify, currentTime + expStat.expirationDelay() );
|
||||
}
|
||||
else {
|
||||
this->pExpireTmr->curState = timer::stateLimbo;
|
||||
}
|
||||
}
|
||||
this->pExpireTmr = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user