예제 #1
0
//---------------------------------------------------------------------------
// 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 );
}
예제 #2
0
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 );
    }
}
예제 #3
0
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;
}
예제 #4
0
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;
                }
        }
    }
}
예제 #5
0
bool Downloader::isGood() const
{
    LB_TS_SCOPED( _thread );
    return impl_->isGood() && impl_->instance;
}
예제 #6
0
bool Compressor::isGood() const
{
    LB_TS_SCOPED( _thread );
    return impl_->isGood() && impl_->instance;
}
예제 #7
0
bool Decompressor::isGood() const
{
    LB_TS_SCOPED(_thread);
    return impl_->isGood();
}