Index: src/libchcore/TOverlappedReaderWriterFB.cpp =================================================================== diff -u -N -r734408890246965d47e6bbf2c2978371269dd1fd -r980c1a0de537813728871676200a0960410b11fb --- src/libchcore/TOverlappedReaderWriterFB.cpp (.../TOverlappedReaderWriterFB.cpp) (revision 734408890246965d47e6bbf2c2978371269dd1fd) +++ src/libchcore/TOverlappedReaderWriterFB.cpp (.../TOverlappedReaderWriterFB.cpp) (revision 980c1a0de537813728871676200a0960410b11fb) @@ -43,32 +43,67 @@ { } - void TOverlappedReaderWriterFB::WaitForMissingBuffersAndResetState(HANDLE hKillEvent) + TSubTaskBase::ESubOperationResult TOverlappedReaderWriterFB::WaitForMissingBuffersAndResetState(bool& bProcessed) { - m_spReader->GetReader()->ReleaseBuffers(); - m_spWriter->GetWriter()->ReleaseBuffers(); + m_spReader->SetReleaseMode(); + m_spWriter->SetReleaseMode(); - enum { eKillThread = 0, eAllBuffersReturned, eHandleCount }; - std::array arrHandles = { hKillEvent, m_spMemoryPool->GetBufferList()->GetAllBuffersAccountedForEvent() }; + enum + { + eAllBuffersAccountedFor, eWriteFinished, eWriteFailed, eWritePossible, eHandleCount + }; + std::array arrHandles = { + m_spMemoryPool->GetBufferList()->GetAllBuffersAccountedForEvent(), + m_spWriter->GetWriter()->GetEventWriteFinishedHandle(), + m_spWriter->GetWriter()->GetEventWriteFailedHandle(), + m_spWriter->GetWriter()->GetEventWritePossibleHandle() + }; - bool bExit = false; - while (!bExit) + TSubTaskBase::ESubOperationResult eResult = TSubTaskBase::eSubResult_Continue; + bool bStopProcessing = false; + while(!bStopProcessing) { + bool bIgnoreStop = false; + DWORD dwResult = WaitForMultipleObjectsEx(eHandleCount, arrHandles.data(), false, INFINITE, true); - switch (dwResult) + switch(dwResult) { case STATUS_USER_APC: break; - case WAIT_OBJECT_0 + eAllBuffersReturned: - bExit = true; + case WAIT_OBJECT_0 + eAllBuffersAccountedFor: + { + LOG_DEBUG(m_spLog) << L"All buffer accounted for."; + + eResult = TSubTaskBase::eSubResult_KillRequest; + bStopProcessing = true; break; + } - case WAIT_OBJECT_0 + eKillThread: - bExit = true; + case WAIT_OBJECT_0 + eWritePossible: + { + eResult = m_spWriter->OnWritePossible(bIgnoreStop, bProcessed); break; } + + case WAIT_OBJECT_0 + eWriteFailed: + { + eResult = m_spWriter->OnWriteFailed(bIgnoreStop, bProcessed); + break; + } + + case WAIT_OBJECT_0 + eWriteFinished: + { + eResult = m_spWriter->OnWriteFinished(bIgnoreStop, bProcessed); + break; + } + + default: + throw TCoreException(eErr_UnhandledCase, L"Unknown result from async waiting function", LOCATION); + } } + + return eResult; } TSubTaskBase::ESubOperationResult TOverlappedReaderWriterFB::Start(HANDLE hKill, bool& bProcessed) @@ -146,7 +181,7 @@ } } - WaitForMissingBuffersAndResetState(hKill); + WaitForMissingBuffersAndResetState(bProcessed); return eResult; }