CBuffer *CPackager::GetNextPack( BYTE cID ) { CCriticalSection::Owner lock( m_csSend ); BUFFER_MAP::iterator it; if ( m_theSend.end() != ( it = m_theSend.find( cID ) ) ) { CBuffer *pBuffer = m_theSend[cID]; CBuffer *pPack = pBuffer->GetNextPack(); if ( NULL == pPack ) { return NULL; } if ( 0 == pPack->GetUsed() ) { pPack->Release(); return NULL; } CBuffer *pNewBufer = m_theAllocator.Allocate(); pNewBufer->AddData( cID ); BYTE cFlag = enumPackMiddle; if ( !pBuffer->HaveNextPack() ) { cFlag |= enumPackTail; } pNewBufer->AddData( cFlag ); /* * Add a user data into this buffer */ unsigned long lnUserData = pBuffer->GetUserData(); pNewBufer->AddData( ( const char * )( &lnUserData ), sizeof( unsigned long ) ); /* * Add some data into this buffer */ pNewBufer->AddData( pPack->GetBuffer(), pPack->GetUsed() ); pPack->Release(); return pNewBufer; } 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; }