Index: src/libchcore/TSubTaskArray.cpp =================================================================== diff -u -N -re8f31b0f922b402878356e130c866c4f3682a7f5 -rbe569bc86280887eeebb8d3e9489f6fc17c570e6 --- src/libchcore/TSubTaskArray.cpp (.../TSubTaskArray.cpp) (revision e8f31b0f922b402878356e130c866c4f3682a7f5) +++ src/libchcore/TSubTaskArray.cpp (.../TSubTaskArray.cpp) (revision be569bc86280887eeebb8d3e9489f6fc17c570e6) @@ -34,6 +34,7 @@ #include "TCoreException.h" #include "ErrorCodes.h" #include +#include "TTaskConfiguration.h" namespace chcore { @@ -71,30 +72,55 @@ m_eOperationType = rOperationPlan.GetOperationType(); + bool bReadTasksSizeBeforeBlocking = GetTaskPropValue(m_rSubTaskContext.GetConfig()); + bool bFastMoveBeforeBlocking = GetTaskPropValue(m_rSubTaskContext.GetConfig()); + switch (m_eOperationType) { case eOperation_Copy: - { - TSubTaskBasePtr spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); - AddSubTask(spOperation, true); - spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); - AddSubTask(spOperation, false); + { + TSubTaskBasePtr spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); + AddSubTask(spOperation, bReadTasksSizeBeforeBlocking); + spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); + AddSubTask(spOperation, false); - break; - } + break; + } + case eOperation_Move: - { - TSubTaskBasePtr spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); - AddSubTask(spOperation, true); - spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); - AddSubTask(spOperation, false); - spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); - AddSubTask(spOperation, false); - spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); - AddSubTask(spOperation, false); + { + TSubTaskBasePtr spOperation; + bool bReorderFastMove = bReadTasksSizeBeforeBlocking && !bFastMoveBeforeBlocking; - break; - } + // fastmove (if not reordered) + if(!bReorderFastMove) + { + spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); + AddSubTask(spOperation, bFastMoveBeforeBlocking); + } + + // scanning + spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); + AddSubTask(spOperation, bReadTasksSizeBeforeBlocking); + + // fastmove (if reordered) + if(bReorderFastMove) + { + spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); + AddSubTask(spOperation, bFastMoveBeforeBlocking); + } + + // copy/move + spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); + AddSubTask(spOperation, false); + + // delete + spOperation = boost::make_shared(boost::ref(m_rSubTaskContext)); + AddSubTask(spOperation, false); + + break; + } + default: throw TCoreException(eErr_UndefinedOperation, L"Operation type not known to the engine", LOCATION); }