| // 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" |
| |
| #include "base/check_op.h" |
| |
| namespace remoting { |
| |
| RateCounter::RateCounter(base::TimeDelta time_window) |
| : time_window_(time_window), sum_(0) { |
| DCHECK_GT(time_window, base::TimeDelta()); |
| } |
| |
| RateCounter::~RateCounter() { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| } |
| |
| void RateCounter::Record(int64_t value) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| |
| base::TimeTicks now = tick_clock_->NowTicks(); |
| EvictOldDataPoints(now); |
| sum_ += value; |
| data_points_.push(std::make_pair(now, value)); |
| } |
| |
| double RateCounter::Rate() const { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| |
| // This is just to ensure the rate is up to date. |
| const_cast<RateCounter*>(this)->EvictOldDataPoints(tick_clock_->NowTicks()); |
| return sum_ / time_window_.InSecondsF(); |
| } |
| |
| void RateCounter::EvictOldDataPoints(base::TimeTicks now) { |
| // Remove data points outside of the window. |
| base::TimeTicks window_start = now - time_window_; |
| |
| while (!data_points_.empty()) { |
| if (data_points_.front().first > window_start) |
| break; |
| |
| sum_ -= data_points_.front().second; |
| data_points_.pop(); |
| } |
| } |
| |
| } // namespace remoting |