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<details::TVirtualAllocMemoryBlockPtr>::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<details::TVirtualAllocMemoryBlockPtr>::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<details::TVirtualAllocMemoryBlockPtr>::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);
 	}
 }