Index: remoting/base/rate_counter.cc |
diff --git a/remoting/base/rate_counter.cc b/remoting/base/rate_counter.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fff9b6cebcd18f3734cf7e5c9ed1c925b36fc1a4 |
--- /dev/null |
+++ b/remoting/base/rate_counter.cc |
@@ -0,0 +1,49 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "remoting/base/rate_counter.h" |
+ |
+namespace remoting { |
+ |
+RateCounter::RateCounter(base::TimeDelta time_window) |
+ : time_window_(time_window), |
+ sum_(0) { |
+} |
+ |
+RateCounter::~RateCounter() { |
+} |
+ |
+void RateCounter::Record(int64 value) { |
+ base::Time current_time = base::Time::Now(); |
+ Evict(current_time); |
+ |
+ base::AutoLock auto_lock(lock_); |
+ sum_ += value; |
+ data_points_.push(std::make_pair(current_time, value)); |
+} |
+ |
+double RateCounter::Rate() { |
+ Evict(base::Time::Now()); |
+ |
+ base::AutoLock auto_lock(lock_); |
+ return static_cast<double>(base::Time::kMillisecondsPerSecond) * sum_ / |
+ time_window_.InMilliseconds(); |
+} |
+ |
+void RateCounter::Evict(base::Time current_time) { |
+ base::AutoLock auto_lock(lock_); |
+ |
+ // Remove data points outside of the window. |
+ base::Time window_start = current_time - time_window_; |
+ |
+ while (!data_points_.empty()) { |
+ if (data_points_.front().first > window_start) |
+ break; |
+ |
+ sum_ -= data_points_.front().second; |
+ data_points_.pop(); |
+ } |
+} |
+ |
+} // namespace remoting |