Index: src/libchcore/TSubTaskCopyMove.cpp =================================================================== diff -u -N -r3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9 -r6e4ac7776b68464371cd8522a2a8d79fbcab3b28 --- src/libchcore/TSubTaskCopyMove.cpp (.../TSubTaskCopyMove.cpp) (revision 3ccbdb8d3eac3427e6d3354854476e57fdc7ceb9) +++ src/libchcore/TSubTaskCopyMove.cpp (.../TSubTaskCopyMove.cpp) (revision 6e4ac7776b68464371cd8522a2a8d79fbcab3b28) @@ -384,7 +384,10 @@ // that also means that we don't want to queue reads or writes anymore - all the data that were read until now, will be lost // - write possible - we're prioritizing write queuing here to empty buffers as soon as possible // - read possible - lowest priority - if we don't have anything to write or finalize , then read another part of source data - enum { eWriteFinished, eKillThread, eWriteFailed, eWritePossible, eReadFailed, eReadPossible, eHandleCount }; + enum + { + eKillThread, eWriteFinished, eWriteFailed, eWritePossible, eReadFailed, eReadPossible, eHandleCount + }; std::array arrHandles = { rThreadController.GetKillThreadHandle(), tReaderWriter.GetEventWriteFinishedHandle(), @@ -469,13 +472,10 @@ } case WAIT_OBJECT_0 + eWritePossible: { - TOverlappedDataBuffer* pBuffer = tReaderWriter.GetFinishedReadBuffer(); + TOverlappedDataBuffer* pBuffer = tReaderWriter.GetWriteBuffer(); if (!pBuffer) throw TCoreException(eErr_InternalProblem, L"Write was possible, but no buffer is available", LOCATION); - // was there an error reported? - pBuffer->InitForWrite(); - eResult = tFileFBWrapper.WriteFileFB(fileDst, *pBuffer, pData->pathDstFile, bSkip); if(eResult != TSubTaskBase::eSubResult_Continue) { @@ -528,44 +528,47 @@ if (!pBuffer) throw TCoreException(eErr_InternalProblem, L"Write finished was possible, but no buffer is available", LOCATION); - eResult = tFileFBWrapper.FinalizeFileFB(fileDst, *pBuffer, pData->pathDstFile, bSkip); - if (eResult != TSubTaskBase::eSubResult_Continue) + if(pBuffer->IsLastPart()) { - tReaderWriter.AddEmptyBuffer(pBuffer, false); - bStopProcessing = true; - } - else if (bSkip) - { - tReaderWriter.AddEmptyBuffer(pBuffer, false); + eResult = tFileFBWrapper.FinalizeFileFB(fileDst, *pBuffer, pData->pathDstFile, bSkip); + if (eResult != TSubTaskBase::eSubResult_Continue) + { + tReaderWriter.AddEmptyBuffer(pBuffer, false); + bStopProcessing = true; + break; + } + else if (bSkip) + { + tReaderWriter.AddEmptyBuffer(pBuffer, false); - AdjustProcessedSizeForSkip(pData->spSrcFile); + AdjustProcessedSizeForSkip(pData->spSrcFile); - pData->bProcessed = false; - bStopProcessing = true; + pData->bProcessed = false; + bStopProcessing = true; + break; + } } - else - { - file_size_t fsWritten = pBuffer->GetRealDataSize(); - // in case we read past the original eof, try to get new file size from filesystem - AdjustProcessedSize(fsWritten, pData->spSrcFile, fileSrc); + file_size_t fsWritten = pBuffer->GetRealDataSize(); - // stop iterating through file - bStopProcessing = pBuffer->IsLastPart(); + // in case we read past the original eof, try to get new file size from filesystem + AdjustProcessedSize(fsWritten, pData->spSrcFile, fileSrc); + // stop iterating through file + bStopProcessing = pBuffer->IsLastPart(); + if(bStopProcessing) + { tReaderWriter.MarkFinishedBufferAsComplete(pBuffer); - tReaderWriter.AddEmptyBuffer(pBuffer, false); - if(bStopProcessing) - { - // this is the end of copying of src file - in case it is smaller than expected fix the stats so that difference is accounted for - AdjustFinalSize(pData->spSrcFile, fileSrc); + // this is the end of copying of src file - in case it is smaller than expected fix the stats so that difference is accounted for + AdjustFinalSize(pData->spSrcFile, fileSrc); - pData->bProcessed = true; - m_tSubTaskStats.ResetCurrentItemProcessedSize(); - } + pData->bProcessed = true; + m_tSubTaskStats.ResetCurrentItemProcessedSize(); } + tReaderWriter.AddEmptyBuffer(pBuffer, false); + break; }