Index: src/libchcore/TSubTaskStatsInfo.cpp =================================================================== diff -u -N -r19925be73ffcadd9f345f10e03e55aadb3f0eeac -rd0bc3c187684f54894c7280a936d5507a5e49f35 --- src/libchcore/TSubTaskStatsInfo.cpp (.../TSubTaskStatsInfo.cpp) (revision 19925be73ffcadd9f345f10e03e55aadb3f0eeac) +++ src/libchcore/TSubTaskStatsInfo.cpp (.../TSubTaskStatsInfo.cpp) (revision d0bc3c187684f54894c7280a936d5507a5e49f35) @@ -61,7 +61,8 @@ m_ullCurrentItemProcessedSize(m_setModifications, 0), m_ullCurrentItemTotalSize(m_setModifications, 0), m_eSubOperationType(m_setModifications, eSubOperation_None), - m_tTimer(m_setModifications) + m_tTimer(m_setModifications), + m_bIsInitialized(m_setModifications, false) { } @@ -80,6 +81,7 @@ m_ullCurrentItemProcessedSize = 0; m_ullCurrentItemTotalSize = 0; m_eSubOperationType = eSubOperation_None; + m_bIsInitialized = false; } void TSubTaskStatsInfo::GetSnapshot(TSubTaskStatsSnapshotPtr& spStatsSnapshot) const @@ -137,7 +139,7 @@ { boost::unique_lock lock(m_lock); - m_tCountSpeed.Modify().AddSample(stProcessedCount - m_stProcessedCount, m_tTimer.Modify().Tick()); + m_tCountSpeed.Modify().AddSample(0/*stProcessedCount - m_stProcessedCount*/, m_tTimer.Modify().Tick()); m_stProcessedCount = stProcessedCount; @@ -167,11 +169,24 @@ THROW_CORE_EXCEPTION(eErr_InternalProblem); } +void TSubTaskStatsInfo::DecreaseProcessedSize(unsigned long long ullDecreaseBy) +{ + boost::unique_lock lock(m_lock); + m_ullProcessedSize.Modify() -= ullDecreaseBy; + + // we didn't process anything here - hence the 0-sized sample + m_tSizeSpeed.Modify().AddSample(0, m_tTimer.Modify().Tick()); + + _ASSERTE(m_ullProcessedSize <= m_ullTotalSize); + if(m_ullProcessedSize > m_ullTotalSize) + THROW_CORE_EXCEPTION(eErr_InternalProblem); +} + void TSubTaskStatsInfo::SetProcessedSize(unsigned long long ullProcessedSize) { boost::unique_lock lock(m_lock); - m_tSizeSpeed.Modify().AddSample(ullProcessedSize - m_ullProcessedSize, m_tTimer.Modify().Tick()); + m_tSizeSpeed.Modify().AddSample(0/*ullProcessedSize - m_ullProcessedSize*/, m_tTimer.Modify().Tick()); m_ullProcessedSize = ullProcessedSize; _ASSERTE(m_ullProcessedSize <= m_ullTotalSize); @@ -199,6 +214,16 @@ THROW_CORE_EXCEPTION(eErr_InternalProblem); } +void TSubTaskStatsInfo::DecreaseCurrentItemProcessedSize(unsigned long long ullDecreaseBy) +{ + boost::unique_lock lock(m_lock); + m_ullCurrentItemProcessedSize.Modify() -= ullDecreaseBy; + + _ASSERTE(m_ullCurrentItemProcessedSize <= m_ullCurrentItemTotalSize); + if(m_ullCurrentItemProcessedSize > m_ullCurrentItemTotalSize) + THROW_CORE_EXCEPTION(eErr_InternalProblem); +} + void TSubTaskStatsInfo::SetCurrentItemProcessedSize(unsigned long long ullProcessedSize) { boost::unique_lock lock(m_lock); @@ -258,6 +283,8 @@ if(m_bSubTaskIsRunning.IsModified()) *spRowData % TRowData(_T("is_running"), m_bSubTaskIsRunning); + if(m_bIsInitialized.IsModified()) + *spRowData % TRowData(_T("is_initialized"), m_bIsInitialized); if(m_ullTotalSize.IsModified()) *spRowData % TRowData(_T("total_size"), m_ullTotalSize); @@ -300,6 +327,7 @@ *spColumnDefs % _T("is_running") + % _T("is_initialized") % _T("total_size") % _T("processed_size") % _T("size_speed") @@ -319,6 +347,7 @@ boost::unique_lock lock(m_lock); spRowReader->GetValue(_T("is_running"), m_bSubTaskIsRunning.Modify()); + spRowReader->GetValue(_T("is_initialized"), m_bIsInitialized.Modify()); spRowReader->GetValue(_T("total_size"), m_ullTotalSize.Modify()); @@ -349,4 +378,39 @@ m_setModifications.reset(); } +void TSubTaskStatsInfo::Init(int iCurrentBufferIndex, size_t stTotalCount, size_t stProcessedCount, unsigned long long ullTotalSize, unsigned long long ullProcessedSize, const TString& strCurrentPath) +{ + boost::unique_lock lock(m_lock); + + if(m_bIsInitialized) + THROW_CORE_EXCEPTION(eErr_InvalidData); + + m_iCurrentBufferIndex = iCurrentBufferIndex; + + m_stTotalCount = stTotalCount; + m_stProcessedCount = stProcessedCount; + + _ASSERTE(m_stProcessedCount <= m_stTotalCount); + if(m_stProcessedCount > m_stTotalCount) + THROW_CORE_EXCEPTION(eErr_InternalProblem); + + m_ullTotalSize = ullTotalSize; + m_ullProcessedSize = ullProcessedSize; + _ASSERTE(m_ullProcessedSize <= m_ullTotalSize); + if(m_ullProcessedSize > m_ullTotalSize) + THROW_CORE_EXCEPTION(eErr_InternalProblem); + + m_strCurrentPath = strCurrentPath; + + m_bIsInitialized = true; +} + +bool TSubTaskStatsInfo::IsInitialized() const +{ + boost::shared_lock lock(m_lock); + bool bInitialized = m_bIsInitialized; + + return bInitialized; +} + END_CHCORE_NAMESPACE