rate_counter.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/base/rate_counter.h"
6
7#include "base/logging.h"
8
9namespace remoting {
10
11RateCounter::RateCounter(base::TimeDelta time_window)
12    : time_window_(time_window),
13      sum_(0) {
14  DCHECK_GT(time_window.InMilliseconds(), 0);
15}
16
17RateCounter::~RateCounter() {
18}
19
20void RateCounter::Record(int64 value) {
21  DCHECK(CalledOnValidThread());
22
23  base::Time current_time = CurrentTime();
24  EvictOldDataPoints(current_time);
25  sum_ += value;
26  data_points_.push(std::make_pair(current_time, value));
27}
28
29double RateCounter::Rate() {
30  DCHECK(CalledOnValidThread());
31
32  EvictOldDataPoints(CurrentTime());
33  return sum_ / time_window_.InSecondsF();
34}
35
36void RateCounter::SetCurrentTimeForTest(base::Time current_time) {
37  DCHECK(CalledOnValidThread());
38  DCHECK(current_time >= current_time_for_test_);
39
40  current_time_for_test_ = current_time;
41}
42
43void RateCounter::EvictOldDataPoints(base::Time current_time) {
44  // Remove data points outside of the window.
45  base::Time window_start = current_time - time_window_;
46
47  while (!data_points_.empty()) {
48    if (data_points_.front().first > window_start)
49      break;
50
51    sum_ -= data_points_.front().second;
52    data_points_.pop();
53  }
54}
55
56base::Time RateCounter::CurrentTime() const {
57  if (current_time_for_test_ == base::Time())
58    return base::Time::Now();
59  return current_time_for_test_;
60}
61
62}  // namespace remoting
63