Index: src/libchcore/TOverlappedWriter.cpp
===================================================================
diff -u -N -r6c41e7b3cf7711c6f5027c0c0154013f50f08e7b -r593ca68706f3a3c7c2a3820b02a56fc24d5bea11
--- src/libchcore/TOverlappedWriter.cpp	(.../TOverlappedWriter.cpp)	(revision 6c41e7b3cf7711c6f5027c0c0154013f50f08e7b)
+++ src/libchcore/TOverlappedWriter.cpp	(.../TOverlappedWriter.cpp)	(revision 593ca68706f3a3c7c2a3820b02a56fc24d5bea11)
@@ -25,13 +25,19 @@
 namespace chcore
 {
 	TOverlappedWriter::TOverlappedWriter(const logger::TLogFileDataPtr& spLogFileData, const TOrderedBufferQueuePtr& spBuffersToWrite,
-		unsigned long long ullFilePos) :
+		unsigned long long ullFilePos, const TBufferListPtr& spEmptyBuffers) :
 		m_spLog(logger::MakeLogger(spLogFileData, L"DataBuffer")),
 		m_tBuffersToWrite(spBuffersToWrite),
-		m_tFinishedBuffers(ullFilePos)
+		m_tFinishedBuffers(ullFilePos),
+		m_spEmptyBuffers(spEmptyBuffers)
 	{
+		if(!spLogFileData)
+			throw TCoreException(eErr_InvalidArgument, L"spLogFileData is NULL", LOCATION);
 		if(!spBuffersToWrite)
-			throw TCoreException(eErr_InvalidArgument, L"spBuffersToWrite", LOCATION);
+			throw TCoreException(eErr_InvalidArgument, L"spBuffersToWrite is NULL", LOCATION);
+		if(!spEmptyBuffers)
+			throw TCoreException(eErr_InvalidArgument, L"spEmptyBuffers is NULL", LOCATION);
+
 	}
 
 	TOverlappedWriter::~TOverlappedWriter()
@@ -40,6 +46,9 @@
 
 	TOverlappedDataBuffer* TOverlappedWriter::GetWriteBuffer()
 	{
+		if(m_bReleaseMode)
+			return nullptr;
+
 		return m_tBuffersToWrite.Pop();
 	}
 
@@ -48,27 +57,38 @@
 		if(!pBuffer)
 			throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION);
 
-		LOG_TRACE(m_spLog) << L"Queuing buffer as full (failed); buffer-order: " << pBuffer->GetFilePosition() <<
-			L", requested-data-size: " << pBuffer->GetRequestedDataSize() <<
-			L", real-data-size: " << pBuffer->GetRealDataSize() <<
-			L", file-position: " << pBuffer->GetFilePosition() <<
-			L", error-code: " << pBuffer->GetErrorCode() <<
-			L", status-code: " << pBuffer->GetStatusCode() <<
-			L", is-last-part: " << pBuffer->IsLastPart();
+		if(m_bReleaseMode)
+			m_spEmptyBuffers->Push(pBuffer);
+		else
+		{
+			LOG_TRACE(m_spLog) << L"Queuing buffer as full (failed); buffer-order: " << pBuffer->GetFilePosition() <<
+				L", requested-data-size: " << pBuffer->GetRequestedDataSize() <<
+				L", real-data-size: " << pBuffer->GetRealDataSize() <<
+				L", file-position: " << pBuffer->GetFilePosition() <<
+				L", error-code: " << pBuffer->GetErrorCode() <<
+				L", status-code: " << pBuffer->GetStatusCode() <<
+				L", is-last-part: " << pBuffer->IsLastPart();
 
-		// overwrite error code (to avoid treating the buffer as failed read)
-		pBuffer->SetErrorCode(ERROR_SUCCESS);
+			// overwrite error code (to avoid treating the buffer as failed read)
+			pBuffer->SetErrorCode(ERROR_SUCCESS);
 
-		m_tFinishedBuffers.PushError(pBuffer, m_tBuffersToWrite);
+			m_tFinishedBuffers.PushError(pBuffer, m_tBuffersToWrite);
+		}
 	}
 
 	TOverlappedDataBuffer* TOverlappedWriter::GetFailedWriteBuffer()
 	{
+		if(m_bReleaseMode)
+			return nullptr;
+
 		return m_tFinishedBuffers.PopError();
 	}
 
 	TOverlappedDataBuffer* TOverlappedWriter::GetFinishedBuffer()
 	{
+		if(m_bReleaseMode)
+			return nullptr;
+
 		TOverlappedDataBuffer* pBuffer = m_tFinishedBuffers.Pop();
 
 		if (pBuffer && pBuffer->IsLastPart())
@@ -83,9 +103,12 @@
 
 	void TOverlappedWriter::MarkAsFinalized(TOverlappedDataBuffer* pBuffer)
 	{
-		if (!pBuffer)
+		if(!pBuffer)
 			throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION);
 
+		if(m_bReleaseMode)
+			return;
+
 		if (pBuffer != m_pLastPartBuffer)
 			throw TCoreException(eErr_InvalidArgument, L"Trying to mark different buffer as finalized", LOCATION);
 
@@ -97,25 +120,27 @@
 		if (!pBuffer)
 			throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION);
 
-		LOG_TRACE(m_spLog) << L"Queuing buffer as finished; buffer-order: " << pBuffer->GetFilePosition() <<
-			L", requested-data-size: " << pBuffer->GetRequestedDataSize() <<
-			L", real-data-size: " << pBuffer->GetRealDataSize() <<
-			L", file-position: " << pBuffer->GetFilePosition() <<
-			L", error-code: " << pBuffer->GetErrorCode() <<
-			L", status-code: " << pBuffer->GetStatusCode() <<
-			L", is-last-part: " << pBuffer->IsLastPart();
+		if(m_bReleaseMode)
+			m_spEmptyBuffers->Push(pBuffer);
+		else
+		{
+			LOG_TRACE(m_spLog) << L"Queuing buffer as finished; buffer-order: " << pBuffer->GetFilePosition() <<
+				L", requested-data-size: " << pBuffer->GetRequestedDataSize() <<
+				L", real-data-size: " << pBuffer->GetRealDataSize() <<
+				L", file-position: " << pBuffer->GetFilePosition() <<
+				L", error-code: " << pBuffer->GetErrorCode() <<
+				L", status-code: " << pBuffer->GetStatusCode() <<
+				L", is-last-part: " << pBuffer->IsLastPart();
 
-		m_tFinishedBuffers.Push(pBuffer);
+			m_tFinishedBuffers.Push(pBuffer);
+		}
 	}
 
-	size_t TOverlappedWriter::GetBufferCount() const
+	void TOverlappedWriter::ReleaseBuffers()
 	{
-		return m_tFinishedBuffers.GetCount();
+		m_bReleaseMode = true;
+		m_pLastPartBuffer = nullptr;
+		m_tBuffersToWrite.ReleaseBuffers(m_spEmptyBuffers);
+		m_tFinishedBuffers.ReleaseBuffers(m_spEmptyBuffers);
 	}
-
-	void TOverlappedWriter::ReleaseBuffers(const TBufferListPtr& spList)
-	{
-		m_tBuffersToWrite.ReleaseBuffers(spList);
-		m_tFinishedBuffers.ReleaseBuffers(spList);
-	}
 }