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 #define STATUS_END_OF_FILE 0xc0000011 namespace chcore { TOverlappedMemoryPool::TOverlappedMemoryPool() : - m_eventHasBuffers(true, false), + m_spQueueBuffers(std::make_shared()), 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(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 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; } }