bool ObservableLooper::QuitRequested() { if(CountTargets()) { if(!m_quitting) { m_quitting = true; // no release request yet sent notifyRelease(); if(m_quitTimeout != B_INFINITE_TIMEOUT) { // Initiate a timer to force quit -- if an observer // has died, it shouldn't take me down with it. ASSERT(!m_executioner); m_executioner = new BMessageRunner( BMessenger(this), new BMessage(M_KILL_OBSERVABLE), m_quitTimeout, 1); } } // targets remain, so don't quit. return false; } // okay to quit return true; }
__USE_CORTEX_NAMESPACE // ---------------------------------------------------------------- // // *** deletion // ---------------------------------------------------------------- // // clients must call release() rather than deleting, // to ensure that all observers are notified of the // object's demise. if the object has already been // released, return an error. status_t ObservableHandler::release() { if(m_released) return B_NOT_ALLOWED; // PRINT(( // "ObservableHandler::release(): %ld targets\n", CountTargets())); if(!LockLooper()) { ASSERT(!"failed to lock looper"); } m_released = true; if(CountTargets()) { // notify notifyRelease(); UnlockLooper(); } else { releaseComplete(); UnlockLooper(); delete this; } return B_OK; }