Exemple #1
0
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;
}