| // Copyright (c) 2012 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 "net/quic/congestion_control/leaky_bucket.h" |
| |
| #include "base/time/time.h" |
| |
| namespace net { |
| |
| LeakyBucket::LeakyBucket(QuicBandwidth draining_rate) |
| : bytes_(0), |
| time_last_updated_(QuicTime::Zero()), |
| draining_rate_(draining_rate) { |
| } |
| |
| void LeakyBucket::SetDrainingRate(QuicTime now, QuicBandwidth draining_rate) { |
| Update(now); |
| draining_rate_ = draining_rate; |
| } |
| |
| void LeakyBucket::Add(QuicTime now, QuicByteCount bytes) { |
| Update(now); |
| bytes_ += bytes; |
| } |
| |
| QuicTime::Delta LeakyBucket::TimeRemaining(QuicTime now) const { |
| QuicTime::Delta time_since_last_update = now.Subtract(time_last_updated_); |
| QuicTime::Delta send_delay = QuicTime::Delta::FromMicroseconds( |
| (bytes_ * base::Time::kMicrosecondsPerSecond) / |
| draining_rate_.ToBytesPerSecond()); |
| if (send_delay < time_since_last_update) { |
| return QuicTime::Delta::Zero(); |
| } |
| return send_delay.Subtract(time_since_last_update); |
| } |
| |
| QuicByteCount LeakyBucket::BytesPending(QuicTime now) { |
| Update(now); |
| return bytes_; |
| } |
| |
| void LeakyBucket::Update(QuicTime now) { |
| QuicTime::Delta elapsed_time = now.Subtract(time_last_updated_); |
| QuicByteCount bytes_cleared = draining_rate_.ToBytesPerPeriod(elapsed_time); |
| if (bytes_cleared >= bytes_) { |
| bytes_ = 0; |
| } else { |
| bytes_ -= bytes_cleared; |
| } |
| time_last_updated_ = now; |
| } |
| |
| } // namespace net |