Index: src/libchcore/TDataBuffer.cpp
===================================================================
diff -u -N -r2c34ba2265e64a9547ace8cf1d29b1def1a552f4 -rfdf4929dc7df1376ed439b7271765f1a4ca31de6
--- src/libchcore/TDataBuffer.cpp	(.../TDataBuffer.cpp)	(revision 2c34ba2265e64a9547ace8cf1d29b1def1a552f4)
+++ src/libchcore/TDataBuffer.cpp	(.../TDataBuffer.cpp)	(revision fdf4929dc7df1376ed439b7271765f1a4ca31de6)
@@ -27,12 +27,9 @@
 
 namespace
 {
-	const size_t c_DefaultAllocGranularity = 4096;
 	const size_t c_DefaultBufferSize = 65536;
 	const size_t c_DefaultPageSize = 1024*1024;
 	const size_t c_DefaultMaxMemory = 1024*1024;
-
-	template<class T> T RoundUp(T number, T roundValue) { return ((number + roundValue - 1) & ~(roundValue - 1)); }
 }
 
 namespace details
@@ -64,16 +61,24 @@
 
 	void TVirtualAllocMemoryBlock::ReleaseChunks(std::list<LPVOID>& rListChunks)
 	{
-		for(std::list<LPVOID>::iterator iterList = rListChunks.begin(); iterList != rListChunks.end(); ++iterList)
+		std::list<LPVOID>::iterator iterList = rListChunks.begin();
+		while(iterList != rListChunks.end())
 		{
-			ReleaseChunk(*iterList);
+			if(ReleaseChunk(*iterList))
+				iterList = rListChunks.erase(iterList);
+			else
+				++iterList;
 		}
 	}
 
-	void TVirtualAllocMemoryBlock::ReleaseChunk(LPVOID pChunk)
+	bool TVirtualAllocMemoryBlock::ReleaseChunk(LPVOID pChunk)
 	{
 		if(IsValidChunk(pChunk))
+		{
 			m_setFreeChunks.insert(pChunk);
+			return true;
+		}
+		return false;
 	}
 
 	size_t TVirtualAllocMemoryBlock::CountOwnChunks(const std::list<LPVOID>& rListChunks)
@@ -141,7 +146,7 @@
 	{
 		if(IsChunkOwner(pChunk))
 		{
-			bool bValidPtr = (((BYTE*)pChunk - (BYTE*)m_pMemory) % m_stChunkSize) != 0;
+			bool bValidPtr = (((BYTE*)pChunk - (BYTE*)m_pMemory) % m_stChunkSize) == 0;
 			_ASSERTE(bValidPtr);
 			return bValidPtr;
 		}
@@ -156,7 +161,8 @@
 TSimpleDataBuffer::TSimpleDataBuffer() :
 	m_pBuffer(NULL),
 	m_pBufferManager(NULL),
-	m_stBufferSize(0)
+	m_stBufferSize(0),
+	m_stDataSize(0)
 {
 }
 
@@ -185,6 +191,22 @@
 	m_stBufferSize = stBufferSize;
 }
 
+void TSimpleDataBuffer::SetDataSize(size_t stDataSize)
+{
+	if(stDataSize > m_stBufferSize)
+		THROW_CORE_EXCEPTION(eErr_InvalidArgument);
+
+	m_stDataSize = stDataSize;
+}
+
+void TSimpleDataBuffer::CutDataFromBuffer(size_t stCount)
+{
+	if(stCount >= m_stBufferSize || !m_pBuffer)
+		return;	// nothing to do
+
+	memmove(m_pBuffer, (BYTE*)m_pBuffer + stCount, m_stBufferSize - stCount);
+}
+
 ///////////////////////////////////////////////////////////////////////////////////
 // class TDataBufferManager
 
@@ -218,7 +240,7 @@
 	}
 	else
 	{
-		size_t stNewSize = RoundUp(stBufferSize, c_DefaultAllocGranularity);
+		size_t stNewSize = RoundUp(stBufferSize, DefaultAllocGranularity);
 		if(stBufferSize != stNewSize)
 		{
 			stBufferSize = stNewSize;