• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
9 namespace net {
10 
LeakyBucket(QuicBandwidth draining_rate)11 LeakyBucket::LeakyBucket(QuicBandwidth draining_rate)
12     : bytes_(0),
13       time_last_updated_(QuicTime::Zero()),
14       draining_rate_(draining_rate) {
15 }
16 
SetDrainingRate(QuicTime now,QuicBandwidth draining_rate)17 void LeakyBucket::SetDrainingRate(QuicTime now, QuicBandwidth draining_rate) {
18   Update(now);
19   draining_rate_ = draining_rate;
20 }
21 
Add(QuicTime now,QuicByteCount bytes)22 void LeakyBucket::Add(QuicTime now, QuicByteCount bytes) {
23   Update(now);
24   bytes_ += bytes;
25 }
26 
TimeRemaining(QuicTime now) const27 QuicTime::Delta LeakyBucket::TimeRemaining(QuicTime now) const {
28   QuicTime::Delta time_since_last_update = now.Subtract(time_last_updated_);
29   QuicTime::Delta send_delay = QuicTime::Delta::FromMicroseconds(
30       (bytes_ * base::Time::kMicrosecondsPerSecond) /
31       draining_rate_.ToBytesPerSecond());
32   if (send_delay < time_since_last_update) {
33     return QuicTime::Delta::Zero();
34   }
35   return send_delay.Subtract(time_since_last_update);
36 }
37 
BytesPending(QuicTime now)38 QuicByteCount LeakyBucket::BytesPending(QuicTime now) {
39   Update(now);
40   return bytes_;
41 }
42 
Update(QuicTime now)43 void LeakyBucket::Update(QuicTime now) {
44   QuicTime::Delta elapsed_time = now.Subtract(time_last_updated_);
45   QuicByteCount bytes_cleared = draining_rate_.ToBytesPerPeriod(elapsed_time);
46   if (bytes_cleared >= bytes_) {
47     bytes_ = 0;
48   } else {
49     bytes_ -= bytes_cleared;
50   }
51   time_last_updated_ = now;
52 }
53 
54 }  // namespace net
55