Index: src/libchcore/TTaskManagerStatsSnapshot.cpp =================================================================== diff -u -N -r12a1725bfd04b0f55fd0fda302975fdcd4174943 -ra5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8 --- src/libchcore/TTaskManagerStatsSnapshot.cpp (.../TTaskManagerStatsSnapshot.cpp) (revision 12a1725bfd04b0f55fd0fda302975fdcd4174943) +++ src/libchcore/TTaskManagerStatsSnapshot.cpp (.../TTaskManagerStatsSnapshot.cpp) (revision a5f396da5ed5ffb3fcd9fdf22afb5a7fd07e1ab8) @@ -22,53 +22,185 @@ // ============================================================================ #include "stdafx.h" #include "TTaskManagerStatsSnapshot.h" +#include "MathFunctions.h" BEGIN_CHCORE_NAMESPACE - //////////////////////////////////////////////////////////////////////////////// // class TTaskManagerStatsSnapshot TTaskManagerStatsSnapshot::TTaskManagerStatsSnapshot() : - m_stProcessedCount(0), - m_stTotalCount(0), + m_stRunningTasks(0), + m_bCacheFilled(false), + m_ullProcessedCount(0), + m_ullTotalCount(0), m_ullProcessedSize(0), m_ullTotalSize(0), - m_dGlobalProgressInPercent(0.0), - m_stRunningTasks(0) + m_dCountSpeed(0.0), + m_dSizeSpeed(0.0), + m_dCombinedProgress(0.0), + m_dAvgCountSpeed(0.0), + m_dAvgSizeSpeed(0.0) { } -TTaskManagerStatsSnapshot::TTaskManagerStatsSnapshot(const TTaskManagerStatsSnapshot& rSrc) : - m_stProcessedCount(rSrc.m_stProcessedCount), - m_stTotalCount(rSrc.m_stTotalCount), - m_ullProcessedSize(rSrc.m_ullProcessedSize), - m_ullTotalSize(rSrc.m_ullTotalSize), - m_dGlobalProgressInPercent(rSrc.m_dGlobalProgressInPercent), - m_stRunningTasks(rSrc.m_stRunningTasks) +void TTaskManagerStatsSnapshot::Clear() { + m_stRunningTasks = 0; + m_bCacheFilled = false; + m_ullProcessedCount = 0; + m_ullTotalCount = 0; + m_ullProcessedSize = 0; + m_ullTotalSize = 0; + m_dCountSpeed = 0.0; + m_dSizeSpeed = 0.0; + m_dCombinedProgress = 0.0; + m_dAvgCountSpeed = 0.0; + m_dAvgSizeSpeed = 0.0; + + m_vTasksSnapshots.clear(); } -TTaskManagerStatsSnapshot& TTaskManagerStatsSnapshot::operator=(const TTaskManagerStatsSnapshot& rSrc) +void TTaskManagerStatsSnapshot::AddTaskStats(const TTaskStatsSnapshotPtr& spStats) { - m_stProcessedCount = rSrc.m_stProcessedCount; - m_stTotalCount = rSrc.m_stTotalCount; - m_ullProcessedSize = rSrc.m_ullProcessedSize; - m_ullTotalSize = rSrc.m_ullTotalSize; - m_dGlobalProgressInPercent = rSrc.m_dGlobalProgressInPercent; - m_stRunningTasks = rSrc.m_stRunningTasks; + m_vTasksSnapshots.push_back(spStats); +} - return *this; +size_t TTaskManagerStatsSnapshot::GetTaskStatsCount() const +{ + return m_vTasksSnapshots.size(); } -void TTaskManagerStatsSnapshot::Clear() +TTaskStatsSnapshotPtr TTaskManagerStatsSnapshot::GetTaskStatsAt(size_t stIndex) const { - m_stProcessedCount = 0; - m_stTotalCount = 0; + if(stIndex >= m_vTasksSnapshots.size()) + return TTaskStatsSnapshotPtr(); + + return m_vTasksSnapshots[stIndex]; +} + +TTaskStatsSnapshotPtr TTaskManagerStatsSnapshot::GetTaskStatsForSessionUniqueID(size_t stSessionUniqueID) const +{ + BOOST_FOREACH(TTaskStatsSnapshotPtr spStats, m_vTasksSnapshots) + { + if(spStats->GetSessionUniqueID() == stSessionUniqueID) + return spStats; + } + + return TTaskStatsSnapshotPtr(); +} + + +void TTaskManagerStatsSnapshot::CalculateProgressAndSpeeds() const +{ + m_bCacheFilled = false; + m_ullProcessedCount = 0; + m_ullTotalCount = 0; m_ullProcessedSize = 0; m_ullTotalSize = 0; - m_dGlobalProgressInPercent = 0.0; - m_stRunningTasks = 0; + m_dCountSpeed = 0.0; + m_dSizeSpeed = 0.0; + m_dCombinedProgress = 0.0; + m_dAvgCountSpeed = 0.0; + m_dAvgSizeSpeed = 0.0; + + BOOST_FOREACH(TTaskStatsSnapshotPtr spTaskStats, m_vTasksSnapshots) + { + m_ullProcessedCount += spTaskStats->GetProcessedCount(); + m_ullTotalCount += spTaskStats->GetTotalCount(); + + m_ullProcessedSize += spTaskStats->GetProcessedSize(); + m_ullTotalSize += spTaskStats->GetTotalSize(); + + m_dCountSpeed += spTaskStats->GetCountSpeed(); + m_dSizeSpeed += spTaskStats->GetSizeSpeed(); + + m_dAvgCountSpeed += spTaskStats->GetAvgCountSpeed(); + m_dAvgSizeSpeed += spTaskStats->GetAvgSizeSpeed(); + } + + // we're treating each of the items as 512B object to process + // to have some balance between items' count and items' size in + // progress information + unsigned long long ullProcessed = 512ULL * m_ullProcessedCount + m_ullProcessedSize; + unsigned long long ullTotal = 512ULL * m_ullTotalCount + m_ullTotalSize; + + if(ullTotal != 0) + m_dCombinedProgress = Math::Div64(ullProcessed, ullTotal); + + m_bCacheFilled = true; } +unsigned long long TTaskManagerStatsSnapshot::GetProcessedCount() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullProcessedCount; +} + +unsigned long long TTaskManagerStatsSnapshot::GetTotalCount() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullTotalCount; +} + +unsigned long long TTaskManagerStatsSnapshot::GetProcessedSize() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullProcessedSize; +} + +unsigned long long TTaskManagerStatsSnapshot::GetTotalSize() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_ullTotalSize; +} + +double TTaskManagerStatsSnapshot::GetCountSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dCountSpeed; +} + +double TTaskManagerStatsSnapshot::GetSizeSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dSizeSpeed; +} + +double TTaskManagerStatsSnapshot::GetCombinedProgress() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dCombinedProgress; +} + +double TTaskManagerStatsSnapshot::GetAvgCountSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dAvgCountSpeed; +} + +double TTaskManagerStatsSnapshot::GetAvgSizeSpeed() const +{ + if(!m_bCacheFilled) + CalculateProgressAndSpeeds(); + + return m_dAvgSizeSpeed; +} + END_CHCORE_NAMESPACE