Index: src/libchcore/TSubTaskCopyMove.cpp =================================================================== diff -u -N -rb89aea376d35ce4b0d6506f7d04dba73830d9268 -r1506d51ff1c0a5d156dab398051efc0c87473e81 --- src/libchcore/TSubTaskCopyMove.cpp (.../TSubTaskCopyMove.cpp) (revision b89aea376d35ce4b0d6506f7d04dba73830d9268) +++ src/libchcore/TSubTaskCopyMove.cpp (.../TSubTaskCopyMove.cpp) (revision 1506d51ff1c0a5d156dab398051efc0c87473e81) @@ -37,7 +37,7 @@ #include "TPathContainer.h" #include "TScopedRunningTimeTracker.h" #include "TFeedbackHandlerWrapper.h" -#include "TOverlappedDataBufferQueue.h" +#include "TOverlappedMemoryPool.h" #include "TOverlappedDataBuffer.h" #include "RoundingFunctions.h" #include @@ -53,15 +53,15 @@ struct CUSTOM_COPY_PARAMS { CUSTOM_COPY_PARAMS() : - spBuffer(std::make_shared()) + spMemoryPool(std::make_shared()) { } TFileInfoPtr spSrcFile; // CFileInfo - src file TSmartPath pathDstFile; // dest path with filename TBufferSizes tBufferSizes; - TOverlappedDataBufferQueuePtr spBuffer; // buffer handling + TOverlappedMemoryPoolPtr spMemoryPool; // buffer handling bool bOnlyCreate = false; // flag from configuration - skips real copying - only create bool bProcessed = false; // has the element been processed ? (false if skipped) }; @@ -150,7 +150,7 @@ // remove changes in buffer sizes to avoid re-creation later rCfgTracker.RemoveModificationSet(TOptionsSet() % eTO_DefaultBufferSize % eTO_OneDiskBufferSize % eTO_TwoDisksBufferSize % eTO_CDBufferSize % eTO_LANBufferSize % eTO_UseOnlyDefaultBuffer % eTO_BufferQueueDepth); - AdjustBufferIfNeeded(ccp.spBuffer, ccp.tBufferSizes, true); + AdjustBufferIfNeeded(ccp.spMemoryPool, ccp.tBufferSizes, true); bool bIgnoreFolders = GetTaskPropValue(rConfig); bool bForceDirectories = GetTaskPropValue(rConfig); @@ -359,20 +359,24 @@ else if(bSkip) return TSubTaskBase::eSubResult_Continue; - // let the buffer queue know that we change the data source - TOverlappedReaderWriter tReaderWriter(m_spLog->GetLogFileData(), pData->spBuffer); - // recreate buffer if needed - AdjustBufferIfNeeded(pData->spBuffer, pData->tBufferSizes); + AdjustBufferIfNeeded(pData->spMemoryPool, pData->tBufferSizes); ATLTRACE(_T("CustomCopyFile: %s\n"), pData->spSrcFile->GetFullFilePath().ToString()); // establish count of data to read TBufferSizes::EBufferType eBufferIndex = GetBufferIndex(pData->tBufferSizes, pData->spSrcFile); m_tSubTaskStats.SetCurrentBufferIndex(eBufferIndex); - DWORD dwToRead = RoundUp(pData->tBufferSizes.GetSizeByType(eBufferIndex), IFilesystemFile::MaxSectorSize); + // determine buffer size to use for the operation + DWORD dwCurrentBufferSize = RoundUp(pData->tBufferSizes.GetSizeByType(eBufferIndex), IFilesystemFile::MaxSectorSize); + // resume copying from the position after the last processed mark; the proper value should be set + // by OpenSrcAndDstFilesFB() - that includes the no-buffering setting if required. + unsigned long long ullNextReadPos = m_tSubTaskStats.GetCurrentItemProcessedSize(); + + TOverlappedReaderWriter tReaderWriter(m_spLog->GetLogFileData(), pData->spMemoryPool, ullNextReadPos, dwCurrentBufferSize); + // read data from file to buffer // NOTE: order is critical here: // - write finished is first, so that all the data that were already queued to be written, will be written and accounted for (in stats) @@ -388,10 +392,6 @@ tReaderWriter.GetEventReadPossibleHandle() }; - // resume copying from the position after the last processed mark; the proper value should be set - // by OpenSrcAndDstFilesFB() - that includes the no-buffering setting if required. - unsigned long long ullNextReadPos = m_tSubTaskStats.GetCurrentItemProcessedSize(); - bool bStopProcessing = false; while(!bStopProcessing) { @@ -421,9 +421,6 @@ if (!pBuffer) throw TCoreException(eErr_InternalProblem, L"Read was possible, but no buffer is available", LOCATION); - pBuffer->InitForRead(ullNextReadPos, dwToRead); - ullNextReadPos += dwToRead; - eResult = tFileFBWrapper.ReadFileFB(fileSrc, *pBuffer, pData->spSrcFile->GetFullFilePath(), bSkip); if(eResult != TSubTaskBase::eSubResult_Continue) { @@ -453,24 +450,7 @@ // read error encountered - handle it eResult = HandleReadError(spFeedbackHandler, *pBuffer, pData->spSrcFile->GetFullFilePath(), bSkip); if(eResult == TSubTaskBase::eSubResult_Retry) - { - // re-request read of the same data - eResult = tFileFBWrapper.ReadFileFB(fileSrc, *pBuffer, pData->spSrcFile->GetFullFilePath(), bSkip); - if(eResult != TSubTaskBase::eSubResult_Continue) - { - tReaderWriter.AddEmptyBuffer(pBuffer); - bStopProcessing = true; - } - else if(bSkip) - { - tReaderWriter.AddEmptyBuffer(pBuffer); - - AdjustProcessedSizeForSkip(pData->spSrcFile); - - pData->bProcessed = false; - bStopProcessing = true; - } - } + tReaderWriter.AddFailedReadBuffer(pBuffer); else if(eResult != TSubTaskBase::eSubResult_Continue) { tReaderWriter.AddEmptyBuffer(pBuffer); @@ -520,23 +500,7 @@ { eResult = HandleWriteError(spFeedbackHandler, *pBuffer, pData->pathDstFile, bSkip); if(eResult == TSubTaskBase::eSubResult_Retry) - { - eResult = tFileFBWrapper.WriteFileFB(fileDst, *pBuffer, pData->pathDstFile, bSkip); - if(eResult != TSubTaskBase::eSubResult_Continue) - { - tReaderWriter.AddEmptyBuffer(pBuffer); - bStopProcessing = true; - } - else if(bSkip) - { - tReaderWriter.AddEmptyBuffer(pBuffer); - - AdjustProcessedSizeForSkip(pData->spSrcFile); - - pData->bProcessed = false; - bStopProcessing = true; - } - } + tReaderWriter.AddFailedFullBuffer(pBuffer); else if(eResult != TSubTaskBase::eSubResult_Continue) { tReaderWriter.AddEmptyBuffer(pBuffer); @@ -788,7 +752,7 @@ return eResult; } - bool TSubTaskCopyMove::AdjustBufferIfNeeded(const TOverlappedDataBufferQueuePtr& spBuffer, TBufferSizes& rBufferSizes, bool bForce) + bool TSubTaskCopyMove::AdjustBufferIfNeeded(const TOverlappedMemoryPoolPtr& spBuffer, TBufferSizes& rBufferSizes, bool bForce) { const TConfig& rConfig = GetContext().GetConfig(); TTaskConfigTracker& rCfgTracker = GetContext().GetCfgTracker();