Index: src/libchcore/TOverlappedReaderWriterFB.cpp =================================================================== diff -u -N -r10d42e85d810f6da082cb2ce4415dcb72903410e -rb0a003dc39e6d21e34779cf1cf5d8a07318c1f5f --- src/libchcore/TOverlappedReaderWriterFB.cpp (.../TOverlappedReaderWriterFB.cpp) (revision 10d42e85d810f6da082cb2ce4415dcb72903410e) +++ src/libchcore/TOverlappedReaderWriterFB.cpp (.../TOverlappedReaderWriterFB.cpp) (revision b0a003dc39e6d21e34779cf1cf5d8a07318c1f5f) @@ -22,13 +22,15 @@ #include "ErrorCodes.h" #include #include "TWorkerThreadController.h" -#include +#include "TOverlappedThreadPool.h" +#include "TCoreWin32Exception.h" namespace chcore { TOverlappedReaderWriterFB::TOverlappedReaderWriterFB(const IFilesystemPtr& spFilesystem, const IFeedbackHandlerPtr& spFeedbackHandler, TWorkerThreadController& rThreadController, + TOverlappedThreadPool& rThreadPool, const TFileInfoPtr& spSrcFileInfo, const TSmartPath& pathDst, const TSubTaskStatsInfoPtr& spStats, @@ -41,11 +43,12 @@ bool bOnlyCreate) : m_spLog(logger::MakeLogger(spLogFileData, L"DataBuffer")), + m_rThreadPool(rThreadPool), m_rThreadController(rThreadController), m_spRange(std::make_shared(ullResumePosition)), m_spMemoryPool(spMemoryPool), m_spReader(std::make_shared(spFilesystem, spFeedbackHandler, rThreadController, spStats, spSrcFileInfo, spLogFileData, spMemoryPool->GetBufferList(), m_spRange, dwChunkSize, bNoBuffering, bProtectReadOnlyFiles)), - m_spWriter(std::make_shared(spFilesystem, spFeedbackHandler, rThreadController, spStats, spSrcFileInfo, pathDst, spLogFileData, m_spReader->GetReader()->GetFinishedQueue(), m_spRange, spMemoryPool->GetBufferList(), bOnlyCreate, bNoBuffering, bProtectReadOnlyFiles)) + m_spWriter(std::make_shared(spFilesystem, spFeedbackHandler, rThreadController, spStats, spSrcFileInfo, pathDst, spLogFileData, m_spReader->GetFinishedQueue(), m_spRange, spMemoryPool->GetBufferList(), bOnlyCreate, bNoBuffering, bProtectReadOnlyFiles)) { if(!spMemoryPool) throw TCoreException(eErr_InvalidArgument, L"spMemoryPool", LOCATION); @@ -127,7 +130,7 @@ if(eResult != TSubTaskBase::eSubResult_Continue) return eResult; - m_spReader->StartThreaded(); + m_rThreadPool.QueueRead(m_spReader); // read data from file to buffer // NOTE: order is critical here: @@ -145,7 +148,7 @@ std::vector vHandles = { m_rThreadController.GetKillThreadHandle(), - m_spReader->GetReader()->GetEventDataSourceFinishedHandle(), + m_spReader->GetEventDataSourceFinishedHandle(), m_spWriter->GetWriter()->GetEventWriteFinishedHandle(), m_spWriter->GetWriter()->GetEventWriteFailedHandle(), m_spWriter->GetWriter()->GetEventWritePossibleHandle() @@ -186,13 +189,11 @@ break; default: - throw TCoreException(eErr_UnhandledCase, L"Unknown result from async waiting function", LOCATION); + DWORD dwLastError = GetLastError(); + throw TCoreWin32Exception(eErr_UnhandledCase, dwLastError, L"Unknown result from async waiting function", LOCATION); } } - // ensure the reading thread is stopped (in case the switch version won't be called) - m_spReader->StopThreaded(); - WaitForMissingBuffersAndResetState(); return eResult;