void Config::deregisterObject( co::Object* object ) { EQASSERT( object ) EQASSERT( object->isMaster( )); if( !object->isAttached( )) // not registered return; const uint32_t latency = getLatency(); ClientPtr client = getClient(); if( latency == 0 || !_running || !object->isBuffered( )) // OPT { client->deregisterObject( object ); return; } // Keep a distributed object latency frames. // Replaces the object with a dummy proxy object using the // existing master change manager. ConfigSwapObjectPacket packet; packet.requestID = getLocalNode()->registerRequest(); packet.object = object; send( client, packet ); client->waitRequest( packet.requestID ); }
void Config::_releaseObjects() { ClientPtr client = getClient(); co::base::ScopedFastWrite mutex( _latencyObjects ); while( !_latencyObjects->empty() ) { LatencyObject* latencyObject = _latencyObjects->front(); if( latencyObject->frameNumber > _currentFrame ) break; client->deregisterObject( latencyObject ); _latencyObjects->erase( _latencyObjects->begin() ); delete latencyObject; } }
void Config::notifyDetach() { { ClientPtr client = getClient(); co::base::ScopedFastWrite mutex( _latencyObjects ); while( !_latencyObjects->empty() ) { LatencyObject* latencyObject = _latencyObjects->back(); _latencyObjects->pop_back(); client->deregisterObject( latencyObject ); delete latencyObject; latencyObject = 0; } } std::vector< uint32_t > requests; for( co::Connections::const_iterator i = _connections.begin(); i != _connections.end(); ++i ) { co::ConnectionPtr connection = *i; requests.push_back( getClient()->removeListenerNB( connection )); } co::LocalNodePtr localNode = getLocalNode(); for( size_t i = 0; i < _connections.size(); ++i ) { co::ConnectionPtr connection = _connections[i]; localNode->waitRequest( requests[ i ] ); connection->close(); // connection and _connections hold reference EQASSERTINFO( connection->getRefCount()==2 || connection->getDescription()->type >= co::CONNECTIONTYPE_MULTICAST, connection->getRefCount() << ": " << *connection ); } _connections.clear(); _exitMessagePump(); Super::notifyDetach(); }