// Copyright 2014 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/test/leaky_bucket.h" #include "base/logging.h" namespace remoting { LeakyBucket::LeakyBucket(double depth, double rate) : depth_(depth), rate_(rate), level_(0.0), last_update_(base::TimeTicks::Now()) { } LeakyBucket::~LeakyBucket() { } base::TimeDelta LeakyBucket::AddPacket(int size) { UpdateLevel(); double new_level = level_ + size; if (new_level > depth_) return base::TimeDelta::Max(); base::TimeDelta result = base::TimeDelta::FromSecondsD(level_ / rate_); level_ = new_level; return result; } void LeakyBucket::UpdateLevel() { base::TimeTicks now = base::TimeTicks::Now(); level_ -= rate_ * (now - last_update_).InSecondsF(); if (level_ < 0.0) level_ = 0.0; last_update_ = now; } } // namespace remoting