Index: src/libchcore/TOverlappedReaderWriterFB.cpp =================================================================== diff -u -N -rc719644bb4360fcf7ccf6f1139bcae852bd6effd -r518d1a3484cde91ff17c071211df5e40cb3487e3 --- src/libchcore/TOverlappedReaderWriterFB.cpp (.../TOverlappedReaderWriterFB.cpp) (revision c719644bb4360fcf7ccf6f1139bcae852bd6effd) +++ src/libchcore/TOverlappedReaderWriterFB.cpp (.../TOverlappedReaderWriterFB.cpp) (revision 518d1a3484cde91ff17c071211df5e40cb3487e3) @@ -79,15 +79,14 @@ // - read possible - lowest priority - if we don't have anything to write or finalize , then read another part of source data enum { - eReadingFinished, eWritingFinished, eKillThread + eReadingFinished, eWritingFinished }; TEvent unsignaledEvent(true, false); std::vector vHandles = { m_spReader->GetEventProcessingFinishedHandle(), - m_spWriter->GetEventProcessingFinishedHandle(), - m_rThreadController.GetKillThreadHandle() // kill is last to allow reader and writer to exit first + m_spWriter->GetEventProcessingFinishedHandle() }; bool bStopProcessing = false; @@ -99,11 +98,6 @@ case STATUS_USER_APC: break; - case WAIT_OBJECT_0 + eKillThread: - eResult = TSubTaskBase::eSubResult_KillRequest; - bStopProcessing = true; - break; - case WAIT_OBJECT_0 + eWritingFinished: eResult = m_spWriter->StopThreaded(); vHandles[eWritingFinished] = unsignaledEvent.Handle(); @@ -121,9 +115,17 @@ } } + // ensure both reader and writer are correctly stopped + m_spReader->StopThreaded(); + m_spWriter->StopThreaded(); + + // get rid of reader and writer - mostly to release the buffers being used + m_spReader.reset(); + m_spWriter.reset(); + // ensure that no buffer was lost in the process if(!m_spMemoryPool->GetBufferList()->AreAllBuffersAccountedFor()) - throw TCoreException(eErr_InternalProblem, L"", LOCATION); + throw TCoreException(eErr_InternalProblem, L"Some buffers were lost in action", LOCATION); return eResult; }