1// Copyright (c) 2012 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 "net/quic/congestion_control/leaky_bucket.h" 6 7#include "base/time/time.h" 8 9namespace net { 10 11LeakyBucket::LeakyBucket(QuicBandwidth draining_rate) 12 : bytes_(0), 13 time_last_updated_(QuicTime::Zero()), 14 draining_rate_(draining_rate) { 15} 16 17void LeakyBucket::SetDrainingRate(QuicTime now, QuicBandwidth draining_rate) { 18 Update(now); 19 draining_rate_ = draining_rate; 20} 21 22void LeakyBucket::Add(QuicTime now, QuicByteCount bytes) { 23 Update(now); 24 bytes_ += bytes; 25} 26 27QuicTime::Delta LeakyBucket::TimeRemaining(QuicTime now) { 28 Update(now); 29 return QuicTime::Delta::FromMicroseconds( 30 (bytes_ * base::Time::kMicrosecondsPerSecond) / 31 draining_rate_.ToBytesPerSecond()); 32} 33 34QuicByteCount LeakyBucket::BytesPending(QuicTime now) { 35 Update(now); 36 return bytes_; 37} 38 39void LeakyBucket::Update(QuicTime now) { 40 QuicTime::Delta elapsed_time = now.Subtract(time_last_updated_); 41 QuicByteCount bytes_cleared = draining_rate_.ToBytesPerPeriod(elapsed_time); 42 if (bytes_cleared >= bytes_) { 43 bytes_ = 0; 44 } else { 45 bytes_ -= bytes_cleared; 46 } 47 time_last_updated_ = now; 48} 49 50} // namespace net 51