Index: src/libchcore/TSubTaskArray.cpp =================================================================== diff -u -N -rff16e23b043c1c3f3ea883372b6f81d7ad4adca3 -rd0bc3c187684f54894c7280a936d5507a5e49f35 --- src/libchcore/TSubTaskArray.cpp (.../TSubTaskArray.cpp) (revision ff16e23b043c1c3f3ea883372b6f81d7ad4adca3) +++ src/libchcore/TSubTaskArray.cpp (.../TSubTaskArray.cpp) (revision d0bc3c187684f54894c7280a936d5507a5e49f35) @@ -120,7 +120,7 @@ size_t stSize = m_vSubTasks.size(); long lIndex = m_lSubOperationIndex.load(boost::memory_order_acquire); - while(lIndex < stSize && eResult == TSubTaskBase::eSubResult_Continue) + while(boost::numeric_cast(lIndex) < stSize) { std::pair& rCurrentSubTask = m_vSubTasks.at(lIndex); TSubTaskBasePtr spCurrentSubTask = rCurrentSubTask.first; @@ -133,6 +133,8 @@ } eResult = spCurrentSubTask->Exec(); + if(eResult != TSubTaskBase::eSubResult_Continue) + break; lIndex = m_lSubOperationIndex.fetch_add(1, boost::memory_order_release) + 1; } @@ -222,7 +224,7 @@ if(bAdded || lCurrentIndex != m_lLastStoredIndex) { // mark subtask at current index as "current"; don't do that if we just finished. - if(lCurrentIndex != m_vSubTasks.size()) + if(boost::numeric_cast(lCurrentIndex) != m_vSubTasks.size()) { spRow = spContainer->GetRow(lCurrentIndex); *spRow % TRowData(_T("is_current"), true); @@ -298,7 +300,7 @@ TSubTaskBasePtr spSubTask = CreateSubtask((ESubOperationType)iType, m_rSubTaskContext); spSubTask->Load(spSerializer); - if(lID != m_vSubTasks.size()) + if(boost::numeric_cast(lID) != m_vSubTasks.size()) THROW_CORE_EXCEPTION(eErr_InvalidData); m_vSubTasks.push_back(std::make_pair(spSubTask, bIsEstimation));