clean up state transitions

This commit is contained in:
Jeff Hill
2002-06-25 15:11:52 +00:00
parent 02ed07196b
commit c78c3ce853
2 changed files with 12 additions and 6 deletions
+6 -3
View File
@@ -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 );
}
+6 -3
View File
@@ -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;