//--------------------------------------------------------------------------- // Listener interface //--------------------------------------------------------------------------- void Channel::addListener( ChannelListener* listener ) { LB_TS_SCOPED( _serverThread ); LBASSERT( std::find( _listeners.begin(), _listeners.end(), listener ) == _listeners.end( )); _listeners.push_back( listener ); }
void Channel::_fireLoadData( const uint32_t frameNumber, const Statistics& statistics, const Viewport& region ) { LB_TS_SCOPED( _serverThread ); for( ChannelListeners::const_iterator i = _listeners.begin(); i != _listeners.end(); ++i ) { (*i)->notifyLoadData( this, frameNumber, statistics, region ); } }
BufferPtr BufferCache::alloc( const uint64_t size ) { LB_TS_SCOPED( _thread ); LBASSERTINFO( size >= COMMAND_ALLOCSIZE, size ); LBASSERTINFO( size < LB_BIT48, "Out-of-sync network stream: buffer size " << size << "?" ); BufferPtr buffer = _impl->newBuffer(); LBASSERT( buffer->getRefCount() == 1 ); buffer->reserve( size ); buffer->resize( 0 ); return buffer; }
ConnectionSet::Event ConnectionSet::select( const uint32_t timeout ) { LB_TS_SCOPED( _selectThread ); while( true ) { _impl->connection = 0; _impl->error = 0; #ifdef _WIN32 if( _impl->thread ) { _impl->thread->event = EVENT_NONE; // unblock previous thread _impl->thread = 0; } #endif if( !_setupFDSet( )) return EVENT_INVALID_HANDLE; // poll for a result #ifdef _WIN32 LBASSERT( LB_TIMEOUT_INDEFINITE == INFINITE ); const DWORD ret = WaitForMultipleObjectsEx( _impl->fdSet.getSize(), _impl->fdSet.getData(), FALSE, timeout, TRUE ); #else const int pollTimeout = timeout == LB_TIMEOUT_INDEFINITE ? -1 : int( timeout ); const int ret = poll( _impl->fdSet.getData(), _impl->fdSet.getSize(), pollTimeout ); #endif switch( ret ) { case SELECT_TIMEOUT: return EVENT_TIMEOUT; case SELECT_ERROR: #ifdef _WIN32 if( !_impl->thread ) _impl->error = GetLastError(); if( _impl->error == WSA_INVALID_HANDLE ) { _impl->dirty = true; break; } #else if( errno == EINTR ) // Interrupted system call (gdb) - ignore break; _impl->error = errno; #endif LBERROR << "Error during select: " << lunchbox::sysError << std::endl; return EVENT_SELECT_ERROR; default: // SUCCESS { Event event = _getSelectResult( ret ); if( event == EVENT_NONE ) break; if( _impl->connection == _impl->selfConnection.get( )) { _impl->connection = 0; _impl->selfConnection->reset(); return EVENT_INTERRUPT; } if( event == EVENT_DATA &&_impl->connection->isListening()) event = EVENT_CONNECT; #ifdef _WIN32 if ( _isThreadMode && _needRebalance ) _rebalanceThreads(); #endif _rotateFDSet(); return event; } } } }
bool Downloader::isGood() const { LB_TS_SCOPED( _thread ); return impl_->isGood() && impl_->instance; }
bool Compressor::isGood() const { LB_TS_SCOPED( _thread ); return impl_->isGood() && impl_->instance; }
bool Decompressor::isGood() const { LB_TS_SCOPED(_thread); return impl_->isGood(); }