Ejemplo n.º 1
0
uint32_t Config::finishFrame()
{
    ClientPtr client = getClient();
    const uint32_t latency = getLatency();
    const uint32_t frameToFinish = (_currentFrame >= latency) ? 
                                       _currentFrame - latency : 0;

    ConfigStatistics stat( Statistic::CONFIG_FINISH_FRAME, this );
    stat.event.data.statistic.frameNumber = frameToFinish;
    {
        ConfigStatistics waitStat( Statistic::CONFIG_WAIT_FINISH_FRAME, this );
        waitStat.event.data.statistic.frameNumber = frameToFinish;
        
        // local draw sync
        if( _needsLocalSync( ))
            while( _unlockedFrame < _currentFrame )
                client->processCommand();

        // local node finish (frame-latency) sync
        const Nodes& nodes = getNodes();
        if( !nodes.empty( ))
        {
            EQASSERT( nodes.size() == 1 );
            const Node* node = nodes.front();

            while( node->getFinishedFrame() < frameToFinish )
                client->processCommand();
        }

        // global sync
        const uint32_t timeout = getTimeout();
        co::base::Clock time;
        const int64_t pingTimeout = co::Global::getKeepaliveTimeout();

        while( !_finishedFrame.timedWaitGE( frameToFinish, pingTimeout ))
        {
            if( time.getTime64() >= timeout || !getLocalNode()->pingIdleNodes())
            {
                EQWARN << "Timeout waiting for nodes to finish frame " 
                       << frameToFinish << std::endl;
                break;
            }
        }
    }

    handleEvents();
    _updateStatistics( frameToFinish );
    _releaseObjects();

    EQLOG( co::base::LOG_ANY ) << "---- Finished Frame --- " << frameToFinish
                               << " (" << _currentFrame << ')' << std::endl;
    return frameToFinish;
}
Ejemplo n.º 2
0
uint32_t Config::finishAllFrames()
{
    if( _finishedFrame == _currentFrame )
        return _currentFrame;

    EQLOG( co::base::LOG_ANY ) << "-- Finish All Frames --" << std::endl;
    ConfigFinishAllFramesPacket packet;
    send( getServer(), packet );

    ClientPtr client = getClient();
    const uint32_t timeout = getTimeout();
    while( _finishedFrame < _currentFrame )
    {
        try
        {
            client->processCommand( timeout );
        }
        catch( const co::Exception& e )
        {
            EQWARN << e.what() << std::endl;
            break;
        } 
    }
    handleEvents();
    _updateStatistics( _currentFrame );
    _releaseObjects();
    EQLOG( co::base::LOG_ANY ) << "-- Finished All Frames --" << std::endl;
    return _currentFrame;
}
Ejemplo n.º 3
0
bool Config::exit()
{
    update();
    finishAllFrames();

    co::LocalNodePtr localNode = getLocalNode();
    localNode->disableSendOnRegister();

    ConfigExitPacket packet;
    packet.requestID = localNode->registerRequest();
    send( getServer(), packet );

    ClientPtr client = getClient();
    while( !localNode->isRequestServed( packet.requestID ))
        client->processCommand();

    bool ret = false;
    localNode->waitRequest( packet.requestID, ret );

    while( tryNextEvent( )) /* flush all pending events */ ;
    if( _lastEvent )
        _lastEvent->release();
    _eventQueue.flush();
    _lastEvent = 0;
    _running = false;
    return ret;
}
Ejemplo n.º 4
0
bool Config::init( const uint128_t& initID )
{
    EQASSERT( !_running );
    _currentFrame = 0;
    _unlockedFrame = 0;
    _finishedFrame = 0;
    _frameTimes.clear();

    co::LocalNodePtr localNode = getLocalNode();
    ConfigInitPacket packet;
    packet.requestID  = localNode->registerRequest();
    packet.initID     = initID;

    send( getServer(), packet );
    
    ClientPtr client = getClient();
    while( !localNode->isRequestServed( packet.requestID ))
        client->processCommand();
    localNode->waitRequest( packet.requestID, _running );
    localNode->enableSendOnRegister();

    if( _running )
        handleEvents();
    else
        EQWARN << "Config initialization failed: " << getError() << std::endl
               << "    Consult client log for further information" << std::endl;
    return _running;
}
Ejemplo n.º 5
0
void Server::unmap()
{
    ClientPtr client = getClient();

    const uint32_t requestID = client->registerRequest();
    send( fabric::CMD_SERVER_UNMAP ) << requestID;

    while( !client->isRequestServed( requestID ))
        client->processCommand();
    client->waitRequest( requestID );
}
Ejemplo n.º 6
0
void Server::releaseConfig( Config* config )
{
    LBASSERT( isConnected( ));
    ClientPtr client = getClient();

    lunchbox::Request< void > request = client->registerRequest< void >();
    send( fabric::CMD_SERVER_RELEASE_CONFIG ) << config->getID() << request;

    while( !request.isReady( ))
        client->processCommand();
}
Ejemplo n.º 7
0
bool Config::update()
{
    commit( CO_COMMIT_NEXT );

    // send update req to server
    ClientPtr client = getClient();

    ConfigUpdatePacket packet;    
    packet.versionID = client->registerRequest();
    packet.finishID = client->registerRequest();
    packet.requestID = client->registerRequest();
    send( getServer(), packet );

    // wait for new version
    uint128_t version = co::VERSION_INVALID;
    client->waitRequest( packet.versionID, version );
    uint32_t finishID = 0;
    client->waitRequest( packet.finishID, finishID );

    if( finishID == EQ_UNDEFINED_UINT32 )
    {
        sync( version );
        client->unregisterRequest( packet.requestID );
        return true;
    }

    client->disableSendOnRegister();
    while( _finishedFrame < _currentFrame )
        client->processCommand();

    sync( version );
    client->ackRequest( getServer(), finishID );

    while( !client->isRequestServed( packet.requestID ))
        client->processCommand();

    bool result = false;
    client->waitRequest( packet.requestID, result );
    client->enableSendOnRegister();
    return result;
}
Ejemplo n.º 8
0
void Server::releaseConfig( Config* config )
{
    LBASSERT( isConnected( ));
    ClientPtr client = getClient();
    const uint32_t requestID = client->registerRequest();
    send( fabric::CMD_SERVER_RELEASE_CONFIG ) << config->getID() << requestID;

    while( !client->isRequestServed( requestID ))
        client->processCommand();

    client->waitRequest( requestID );
}
Ejemplo n.º 9
0
void Server::releaseConfig( Config* config )
{
    EQASSERT( isConnected( ));
    ClientPtr client = getClient();
    ServerReleaseConfigPacket packet;
    packet.requestID = client->registerRequest();
    packet.configID  = config->getID();
    send( packet );

    while( !client->isRequestServed( packet.requestID ))
        client->processCommand();

    client->waitRequest( packet.requestID );
}