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; }
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; }
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; }
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; }
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 ); }
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(); }
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; }
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 ); }
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 ); }