Index: src/libchcore/TDataBuffer.cpp =================================================================== diff -u -N -r6f082e25ab71169e9e631f139a2eddc4ef45d2e9 -rb013066ba827b440b2e281bd58e8b16e51a080d7 --- src/libchcore/TDataBuffer.cpp (.../TDataBuffer.cpp) (revision 6f082e25ab71169e9e631f139a2eddc4ef45d2e9) +++ src/libchcore/TDataBuffer.cpp (.../TDataBuffer.cpp) (revision b013066ba827b440b2e281bd58e8b16e51a080d7) @@ -88,7 +88,8 @@ bool TVirtualAllocMemoryBlock::IsChunkOwner(LPVOID pChunk) const { - return(pChunk >= m_pMemory && pChunk < (BYTE*)m_pMemory + m_stMemorySize); + LPVOID pMemoryEnd = (BYTE*)m_pMemory + m_stMemorySize; + return(pChunk >= m_pMemory && pChunk < pMemoryEnd); } bool TVirtualAllocMemoryBlock::AreAllChunksFree() const @@ -369,11 +370,28 @@ bool TDataBufferManager::HasFreeBuffer() const { - return !m_listUnusedBuffers.empty(); + return !m_listUnusedBuffers.empty() || CanAllocPage(); } size_t TDataBufferManager::GetCountOfFreeBuffers() const { + if(!IsInitialized()) + return 0; + + // count of unallocated pages + size_t stCurrentMaxPages = m_stMaxMemory / m_stPageSize; + size_t stPagesStillUnallocated = stCurrentMaxPages - m_vVirtualAllocBlocks.size(); + + return m_listUnusedBuffers.size() + stPagesStillUnallocated * m_stPageSize / m_stBufferSize; +} + +bool TDataBufferManager::HasFreeBufferNA() const +{ + return !m_listUnusedBuffers.empty(); +} + +size_t TDataBufferManager::GetCountOfFreeBuffersNA() const +{ return m_listUnusedBuffers.size(); } @@ -444,17 +462,14 @@ void TDataBufferManager::FreePage(const details::TVirtualAllocMemoryBlockPtr& spAllocBlock) { spAllocBlock->ReleaseChunks(m_listUnusedBuffers); - if(spAllocBlock->AreAllChunksFree()) - { - std::vector::iterator iterAllocBlock = std::find(m_vVirtualAllocBlocks.begin(), m_vVirtualAllocBlocks.end(), spAllocBlock); - if(iterAllocBlock == m_vVirtualAllocBlocks.end()) - THROW_CORE_EXCEPTION(eErr_InternalProblem); - m_vVirtualAllocBlocks.erase(iterAllocBlock); - } - else - { + if(!spAllocBlock->AreAllChunksFree()) m_vAllocBlocksToFree.push_back(spAllocBlock); - } + + std::vector::iterator iterAllocBlock = std::find(m_vVirtualAllocBlocks.begin(), m_vVirtualAllocBlocks.end(), spAllocBlock); + if(iterAllocBlock == m_vVirtualAllocBlocks.end()) + THROW_CORE_EXCEPTION(eErr_InternalProblem); + m_vVirtualAllocBlocks.erase(iterAllocBlock); + m_stMaxMemory -= m_stPageSize; } @@ -486,9 +501,7 @@ { if(rSimpleBuffer.m_pBuffer) { - if(m_vAllocBlocksToFree.empty()) - m_listUnusedBuffers.push_back(rSimpleBuffer.m_pBuffer); - else + if(!m_vAllocBlocksToFree.empty()) { for(std::vector::iterator iterAllocBlock = m_vAllocBlocksToFree.begin(); iterAllocBlock != m_vAllocBlocksToFree.end(); ++iterAllocBlock) { @@ -499,11 +512,13 @@ if(spAllocBlock->AreAllChunksFree()) { m_vAllocBlocksToFree.erase(iterAllocBlock); - break; } + return; } } } + + m_listUnusedBuffers.push_back(rSimpleBuffer.m_pBuffer); } }