void PhysicalLayerMonitor::ChangeState(IMonitorState* apState) { LOG_BLOCK(LEV_DEBUG, mpState->ConvertToString() << " -> " << apState->ConvertToString() << " : " << mpPhys->ConvertStateToString()); IMonitorState* pLast = mpState; CriticalSection cs(&mLock); mpState = apState; if(pLast->GetState() != apState->GetState()) { for(ObserverSet::iterator i = mObservers.begin(); i != mObservers.end(); ++i) (*i)->OnStateChange(apState->GetState()); // signaling this way makes sure we're free and clear of the event that causes this // before someone else and deletes if(mpState->GetState() == PLS_SHUTDOWN) mpTimerSrc->Post(boost::bind(&PhysicalLayerMonitor::DoFinalShutdown, this)); } }
void PhysicalLayerMonitor::ChangeState(IMonitorState* apState) { LOG_BLOCK(LEV_DEBUG, mpState->ConvertToString() << " -> " << apState->ConvertToString() << " : " << mpPhys->ConvertStateToString()); IMonitorState* pLast = mpState; std::unique_lock<std::mutex> lock(mMutex); mpState = apState; if(pLast->GetState() != apState->GetState()) { this->OnStateChange(mpState->GetState()); // signaling this way makes sure we're free and clear of the event that causes this // before someone else and deletes if(mpState->GetState() == CS_SHUTDOWN) mpPhys->GetExecutor()->Post(std::bind(&PhysicalLayerMonitor::DoFinalShutdown, this)); } }