Index: remoting/base/rate_counter.cc |
diff --git a/remoting/base/rate_counter.cc b/remoting/base/rate_counter.cc |
index fff9b6cebcd18f3734cf7e5c9ed1c925b36fc1a4..e6532da165541fb06c21cee39032572cf7b8627e 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 |