diff options
Diffstat (limited to 'remoting/base/rate_counter.cc')
-rw-r--r-- | remoting/base/rate_counter.cc | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/remoting/base/rate_counter.cc b/remoting/base/rate_counter.cc index fff9b6c..e6532da 100644 --- a/remoting/base/rate_counter.cc +++ b/remoting/base/rate_counter.cc @@ -4,36 +4,43 @@ #include "remoting/base/rate_counter.h" +#include "base/logging.h" + namespace remoting { RateCounter::RateCounter(base::TimeDelta time_window) : time_window_(time_window), sum_(0) { + DCHECK_GT(time_window.InMilliseconds(), 0); } RateCounter::~RateCounter() { } void RateCounter::Record(int64 value) { - base::Time current_time = base::Time::Now(); - Evict(current_time); + DCHECK(CalledOnValidThread()); - base::AutoLock auto_lock(lock_); + base::Time current_time = CurrentTime(); + EvictOldDataPoints(current_time); sum_ += value; data_points_.push(std::make_pair(current_time, value)); } double RateCounter::Rate() { - Evict(base::Time::Now()); + DCHECK(CalledOnValidThread()); - base::AutoLock auto_lock(lock_); - return static_cast<double>(base::Time::kMillisecondsPerSecond) * sum_ / - time_window_.InMilliseconds(); + EvictOldDataPoints(CurrentTime()); + return sum_ / time_window_.InSecondsF(); } -void RateCounter::Evict(base::Time current_time) { - base::AutoLock auto_lock(lock_); +void RateCounter::SetCurrentTimeForTest(base::Time current_time) { + DCHECK(CalledOnValidThread()); + DCHECK(current_time >= current_time_for_test_); + + current_time_for_test_ = current_time; +} +void RateCounter::EvictOldDataPoints(base::Time current_time) { // Remove data points outside of the window. base::Time window_start = current_time - time_window_; @@ -46,4 +53,10 @@ void RateCounter::Evict(base::Time current_time) { } } +base::Time RateCounter::CurrentTime() const { + if (current_time_for_test_ == base::Time()) + return base::Time::Now(); + return current_time_for_test_; +} + } // namespace remoting |