CBuffer *CBuffer::Allocator::Allocate() { CCriticalSection::Owner lock( m_criticalSection ); CBuffer *pBuffer = 0; if ( !m_freeList.Empty() ) { pBuffer = m_freeList.PopNode(); pBuffer->AddRef(); } else { pBuffer = new( m_bufferSize )CBuffer( *this, m_bufferSize ); if ( !pBuffer ) { throw CException( _T("CBuffer::Allocator::Allocate()"), _T("Out of memory") ); } OnBufferCreated(); } m_activeList.PushNode( pBuffer ); OnBufferAllocated(); return pBuffer; }
CBuffer *CPackager::PackUp( const void *pData, size_t dataLength ) { CCriticalSection::Owner lock( m_csRecv ); if ( NULL == pData || dataLength < 3 /* cID + cPackFlag + ... */ ) { return NULL; } BYTE cID = CPackager::Peek( pData ); BUFFER_MAP::iterator it; if ( m_theRecv.end() == ( it = m_theRecv.find( cID ) ) ) { CBuffer *pPack = m_theAllocator.Allocate(); m_theRecv[cID] = pPack; } CBuffer *pBuffer = m_theRecv[cID]; ASSERT( pBuffer ); BYTE cFlag = CPackager::Peek( pData, 1 ); const size_t nDataBegin = 1 + 1 + sizeof( unsigned long ); if ( _Header( cFlag ) ) { pBuffer->Empty(); pBuffer->AddData( ( ( const char * )pData + nDataBegin ), dataLength - nDataBegin ); } if ( _Middle( cFlag ) ) { pBuffer->AddData( ( ( const char * )pData + nDataBegin ), dataLength - nDataBegin ); } if ( _Tail( cFlag ) ) { unsigned long lnUserData = *( const unsigned long * )( ( const char * )pData + 2 ); pBuffer->SetUserData( lnUserData ); pBuffer->AddRef(); return pBuffer; } if ( _Error( cFlag ) ) { ASSERT( NULL && "CPackager::PackUp - Invalid package!" ); } return NULL; }
CBuffer *CClientNode::CDataQueue::Get() { { CCriticalSection::Owner lock( m_csQueue ); if ( !m_theData.empty() ) { CBuffer *pBuffer = m_theData.front(); pBuffer->AddRef(); m_theData.pop_front(); pBuffer->Release(); return pBuffer; } } return NULL; }