Esempio n. 1
0
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 );
}
Esempio n. 2
0
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;
    }
}
Esempio n. 3
0
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();
}