Index: src/libchcore/TSubTaskStatsInfo.cpp =================================================================== diff -u -N -r20aff533ab239b5b41263bb342879b4ea46fdbf6 -r12a1725bfd04b0f55fd0fda302975fdcd4174943 --- src/libchcore/TSubTaskStatsInfo.cpp (.../TSubTaskStatsInfo.cpp) (revision 20aff533ab239b5b41263bb342879b4ea46fdbf6) +++ src/libchcore/TSubTaskStatsInfo.cpp (.../TSubTaskStatsInfo.cpp) (revision 12a1725bfd04b0f55fd0fda302975fdcd4174943) @@ -22,6 +22,9 @@ // ============================================================================ #include "stdafx.h" #include "TSubTaskStatsInfo.h" +#include +#include "DataBuffer.h" +#include "TSubTaskStatsSnapshot.h" BEGIN_CHCORE_NAMESPACE @@ -51,10 +54,41 @@ m_iCurrentBufferIndex(0), m_strCurrentPath(), m_timeElapsed(0), - m_timeLast(0) + m_timeLast(-1) { } +void TSubTaskStatsInfo::Clear() +{ + m_bSubTaskIsRunning = false; + m_ullTotalSize = 0; + m_ullProcessedSize = 0; + m_stTotalCount = 0; + m_stProcessedCount = 0; + m_iCurrentBufferIndex = 0; + m_strCurrentPath.Clear(); + m_timeElapsed = 0; + m_timeLast = -1; +} + +void TSubTaskStatsInfo::GetSnapshot(TSubTaskStatsSnapshot& rStatsSnapshot) const +{ + rStatsSnapshot.Clear(); + + boost::upgrade_lock lock(m_lock); + UpdateTime(lock); + + rStatsSnapshot.SetRunning(m_bSubTaskIsRunning); + rStatsSnapshot.SetProcessedCount(m_stProcessedCount); + rStatsSnapshot.SetTotalCount(m_stTotalCount); + rStatsSnapshot.SetProcessedSize(m_ullProcessedSize); + rStatsSnapshot.SetTotalSize(m_ullTotalSize); + rStatsSnapshot.SetProgressInPercent(CalculateProgressInPercent(lock)); + rStatsSnapshot.SetCurrentBufferIndex(m_iCurrentBufferIndex); + rStatsSnapshot.SetCurrentPath(m_strCurrentPath); + rStatsSnapshot.SetTimeElapsed(m_timeElapsed); +} + // is running? void TSubTaskStatsInfo::MarkAsRunning() { @@ -68,20 +102,6 @@ m_bSubTaskIsRunning = false; } -bool TSubTaskStatsInfo::IsRunning() const -{ - boost::shared_lock lock(m_lock); - return m_bSubTaskIsRunning; -} - -// count stats -void TSubTaskStatsInfo::GetCountStats(size_t& stProcessedCount, size_t& stTotalCount) const -{ - boost::shared_lock lock(m_lock); - stProcessedCount = m_stProcessedCount; - stTotalCount = m_stTotalCount; -} - void TSubTaskStatsInfo::IncreaseProcessedCount(size_t stIncreaseBy) { boost::unique_lock lock(m_lock); @@ -109,14 +129,6 @@ THROW_CORE_EXCEPTION(eErr_InternalProblem); } -// size stats -void TSubTaskStatsInfo::GetSizeStats(unsigned long long& ullProcessedSize, unsigned long long& ullTotalSize) const -{ - boost::shared_lock lock(m_lock); - ullProcessedSize = m_ullProcessedSize; - ullTotalSize = m_ullTotalSize; -} - void TSubTaskStatsInfo::IncreaseProcessedSize(unsigned long long ullIncreaseBy) { boost::unique_lock lock(m_lock); @@ -150,42 +162,20 @@ boost::unique_lock lock(m_lock); m_iCurrentBufferIndex = iCurrentIndex; } - -int TSubTaskStatsInfo::GetCurrentBufferIndex() const -{ - boost::shared_lock lock(m_lock); - return m_iCurrentBufferIndex; -} - // current path void TSubTaskStatsInfo::SetCurrentPath(const TString& strPath) { boost::unique_lock lock(m_lock); m_strCurrentPath = strPath; } -const TString& TSubTaskStatsInfo::GetCurrentPath() const -{ - boost::shared_lock lock(m_lock); - return m_strCurrentPath; -} - // time void TSubTaskStatsInfo::SetTimeElapsed(time_t timeElapsed) { boost::unique_lock lock(m_lock); m_timeElapsed = timeElapsed; } -time_t TSubTaskStatsInfo::GetTimeElapsed() -{ - boost::upgrade_lock lock(m_lock); - - UpdateTime(lock); - - return m_timeElapsed; -} - void TSubTaskStatsInfo::EnableTimeTracking() { boost::upgrade_lock lock(m_lock); @@ -209,7 +199,7 @@ } } -void TSubTaskStatsInfo::UpdateTime(boost::upgrade_lock& lock) +void TSubTaskStatsInfo::UpdateTime(boost::upgrade_lock& lock) const { if(m_timeLast != -1) { @@ -221,4 +211,21 @@ } } +double TSubTaskStatsInfo::CalculateProgressInPercent(boost::upgrade_lock& lock) const +{ + lock; // lock unused; enforced passing as parameter to ensure the code is executed in critical section + double dSizePercent = 0; + double dCountPercent = 0; + + if(m_ullTotalSize) + dSizePercent = 100.0 * boost::numeric_cast(m_ullProcessedSize) / boost::numeric_cast(m_ullTotalSize); + if(m_stTotalCount) + dCountPercent = 100.0 * boost::numeric_cast(m_stProcessedCount) / boost::numeric_cast(m_stTotalCount); + + if(m_ullTotalSize && m_stTotalCount) + return (dSizePercent + dCountPercent) / 2; + else + return dSizePercent + dCountPercent; +} + END_CHCORE_NAMESPACE