Index: src/libchcore/TOverlappedWriterFB.cpp =================================================================== diff -u -N -rb051cbac8dac8c448507aa7c64753af9cf793af5 -rc719644bb4360fcf7ccf6f1139bcae852bd6effd --- src/libchcore/TOverlappedWriterFB.cpp (.../TOverlappedWriterFB.cpp) (revision b051cbac8dac8c448507aa7c64753af9cf793af5) +++ src/libchcore/TOverlappedWriterFB.cpp (.../TOverlappedWriterFB.cpp) (revision c719644bb4360fcf7ccf6f1139bcae852bd6effd) @@ -309,6 +309,7 @@ void TOverlappedWriterFB::StartThreaded() { + m_eventProcessingFinished.ResetEvent(); TEventGuard guardProcessingFinished(m_eventProcessingFinished, true); TEvent eventNonSignaled(true, false); @@ -325,35 +326,43 @@ }; bool bWrittenLastBuffer = false; - while(!bWrittenLastBuffer && m_eThreadResult == TSubTaskBase::eSubResult_Continue) + + try { - DWORD dwResult = WaitForMultipleObjectsEx(boost::numeric_cast(vHandles.size()), vHandles.data(), false, INFINITE, true); - switch(dwResult) + while(!bWrittenLastBuffer && m_eThreadResult == TSubTaskBase::eSubResult_Continue) { - case STATUS_USER_APC: - break; + DWORD dwResult = WaitForMultipleObjectsEx(boost::numeric_cast(vHandles.size()), vHandles.data(), false, INFINITE, true); + switch(dwResult) + { + case STATUS_USER_APC: + break; - case WAIT_OBJECT_0 + eKillThread: - m_eThreadResult = TSubTaskBase::eSubResult_KillRequest; - break; + case WAIT_OBJECT_0 + eKillThread: + m_eThreadResult = TSubTaskBase::eSubResult_KillRequest; + break; - case WAIT_OBJECT_0 + eWritePossible: - m_eThreadResult = OnWritePossible(); - break; + case WAIT_OBJECT_0 + eWritePossible: + m_eThreadResult = OnWritePossible(); + break; - case WAIT_OBJECT_0 + eWriteFailed: - m_eThreadResult = OnWriteFailed(); - break; + case WAIT_OBJECT_0 + eWriteFailed: + m_eThreadResult = OnWriteFailed(); + break; - case WAIT_OBJECT_0 + eWriteFinished: - m_eThreadResult = OnWriteFinished(bWrittenLastBuffer); - break; + case WAIT_OBJECT_0 + eWriteFinished: + m_eThreadResult = OnWriteFinished(bWrittenLastBuffer); + break; - default: - DWORD dwLastError = GetLastError(); - throw TCoreWin32Exception(eErr_UnhandledCase, dwLastError, L"Unknown result from async waiting function", LOCATION); + default: + DWORD dwLastError = GetLastError(); + throw TCoreWin32Exception(eErr_UnhandledCase, dwLastError, L"Unknown result from async waiting function", LOCATION); + } } } + catch(const std::exception&) + { + m_eThreadResult = TSubTaskBase::eSubResult_Error; + } WaitForOnTheFlyBuffers(); ClearBuffers(); @@ -380,11 +389,7 @@ TSubTaskBase::ESubOperationResult TOverlappedWriterFB::StopThreaded() { + WaitForSingleObjectEx(m_eventProcessingFinished.Handle(), INFINITE, FALSE); return m_eThreadResult; } - - TOverlappedWriterPtr TOverlappedWriterFB::GetWriter() const - { - return m_spWriter; - } }