Index: src/libchcore/TOverlappedMemoryPool.cpp
===================================================================
diff -u -N -r1506d51ff1c0a5d156dab398051efc0c87473e81 -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9
--- src/libchcore/TOverlappedMemoryPool.cpp	(.../TOverlappedMemoryPool.cpp)	(revision 1506d51ff1c0a5d156dab398051efc0c87473e81)
+++ src/libchcore/TOverlappedMemoryPool.cpp	(.../TOverlappedMemoryPool.cpp)	(revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9)
@@ -21,14 +21,13 @@
 #include "TOverlappedDataBuffer.h"
 #include "TCoreException.h"
 #include "ErrorCodes.h"
-#include <array>
 
 #define STATUS_END_OF_FILE 0xc0000011
 
 namespace chcore
 {
 	TOverlappedMemoryPool::TOverlappedMemoryPool() :
-		m_eventHasBuffers(true, false),
+		m_spQueueBuffers(std::make_shared<TBufferList>()),
 		m_eventAllBuffersAccountedFor(true, true)
 	{
 	}
@@ -43,57 +42,10 @@
 	{
 	}
 
-	TOverlappedDataBuffer* TOverlappedMemoryPool::GetBuffer()
-	{
-		if (!m_dequeBuffers.empty())
-		{
-			TOverlappedDataBuffer* pBuffer = m_dequeBuffers.front();
-			m_dequeBuffers.pop_front();
-
-			UpdateHasBuffers();
-			UpdateAllBuffersAccountedFor();
-
-			return pBuffer;
-		}
-
-		return nullptr;
-	}
-
-	bool TOverlappedMemoryPool::AreAllBuffersAccountedFor() const
-	{
-		return m_dequeBuffers.size() == m_listAllBuffers.size();
-	}
-
-	void TOverlappedMemoryPool::AddBuffer(TOverlappedDataBuffer* pBuffer)
-	{
-		if (!pBuffer)
-			throw TCoreException(eErr_InvalidPointer, L"pBuffer", LOCATION);
-
-		m_dequeBuffers.push_back(pBuffer);
-		UpdateHasBuffers();
-		UpdateAllBuffersAccountedFor();
-	}
-
-	void TOverlappedMemoryPool::UpdateAllBuffersAccountedFor()
-	{
-		if (AreAllBuffersAccountedFor())
-			m_eventAllBuffersAccountedFor.SetEvent();
-		else
-			m_eventAllBuffersAccountedFor.ResetEvent();
-	}
-
-	void TOverlappedMemoryPool::UpdateHasBuffers()
-	{
-		if(!m_dequeBuffers.empty())
-			m_eventHasBuffers.SetEvent();
-		else
-			m_eventHasBuffers.ResetEvent();
-	}
-
 	void TOverlappedMemoryPool::ReinitializeBuffers(size_t stCount, size_t stBufferSize)
 	{
 		// sanity check - if any of the buffers are still in use, we can't change the sizes
-		if (m_listAllBuffers.size() != m_dequeBuffers.size())
+		if (m_listAllBuffers.size() != m_spQueueBuffers->GetCount())
 			throw TCoreException(eErr_InternalProblem, L"Some buffers are still in use", LOCATION);
 		if (stBufferSize == 0)
 			throw TCoreException(eErr_InvalidArgument, L"stBufferSize", LOCATION);
@@ -102,7 +54,7 @@
 		{
 			// buffer sizes increased - clear current buffers and proceed with creating new ones
 			m_listAllBuffers.clear();
-			m_dequeBuffers.clear();
+			m_spQueueBuffers->Clear();
 		}
 		else if (stCount == m_listAllBuffers.size())
 			return;		// nothing really changed
@@ -111,31 +63,26 @@
 		else if (stCount < m_listAllBuffers.size())
 		{
 			// there are too many buffers - reduce
-			m_dequeBuffers.clear();
+			m_spQueueBuffers->Clear();
 
 			size_t stCountToRemove = m_listAllBuffers.size() - stCount;
 
 			m_listAllBuffers.erase(m_listAllBuffers.begin(), m_listAllBuffers.begin() + stCountToRemove);
 			for (const auto& upElement : m_listAllBuffers)
 			{
-				m_dequeBuffers.push_back(upElement.get());
+				m_spQueueBuffers->Push(upElement.get());
 			}
 
-			UpdateHasBuffers();
-			UpdateAllBuffersAccountedFor();
 			return;
 		}
 
 		// allocate buffers
 		while (stCount--)
 		{
 			auto upBuffer = std::make_unique<TOverlappedDataBuffer>(stBufferSize, nullptr);
-			m_dequeBuffers.push_back(upBuffer.get());
+			m_spQueueBuffers->Push(upBuffer.get());
 			m_listAllBuffers.push_back(std::move(upBuffer));
 		}
-
-		UpdateHasBuffers();
-		UpdateAllBuffersAccountedFor();
 	}
 
 	size_t TOverlappedMemoryPool::GetTotalBufferCount() const
@@ -145,7 +92,7 @@
 
 	size_t TOverlappedMemoryPool::GetAvailableBufferCount() const
 	{
-		return m_dequeBuffers.size();
+		return m_spQueueBuffers->GetCount();
 	}
 	
 	size_t TOverlappedMemoryPool::GetSingleBufferSize() const
@@ -156,28 +103,8 @@
 		return (*m_listAllBuffers.begin())->GetBufferSize();
 	}
 
-	void TOverlappedMemoryPool::WaitForMissingBuffers(HANDLE hKillEvent) const
+	TBufferListPtr TOverlappedMemoryPool::GetBufferList() const
 	{
-		enum { eKillThread = 0, eAllBuffersReturned, eHandleCount };
-		std::array<HANDLE, eHandleCount> arrHandles = { hKillEvent, m_eventAllBuffersAccountedFor.Handle() };
-
-		bool bExit = false;
-		while (!bExit)
-		{
-			DWORD dwResult = WaitForMultipleObjectsEx(eHandleCount, arrHandles.data(), false, INFINITE, true);
-			switch (dwResult)
-			{
-			case STATUS_USER_APC:
-				break;
-
-			case WAIT_OBJECT_0 + eAllBuffersReturned:
-				bExit = true;
-				break;
-
-			case WAIT_OBJECT_0 + eKillThread:
-				bExit = true;
-				break;
-			}
-		}
+		return m_spQueueBuffers;
 	}
 }