OLD | NEW |
| (Empty) |
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 | |
11 LeakyBucket::LeakyBucket(QuicBandwidth draining_rate) | |
12 : bytes_(0), | |
13 time_last_updated_(QuicTime::Zero()), | |
14 draining_rate_(draining_rate) { | |
15 } | |
16 | |
17 void LeakyBucket::SetDrainingRate(QuicTime now, QuicBandwidth draining_rate) { | |
18 Update(now); | |
19 draining_rate_ = draining_rate; | |
20 } | |
21 | |
22 void LeakyBucket::Add(QuicTime now, QuicByteCount bytes) { | |
23 Update(now); | |
24 bytes_ += bytes; | |
25 } | |
26 | |
27 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 | |
38 QuicByteCount LeakyBucket::BytesPending(QuicTime now) { | |
39 Update(now); | |
40 return bytes_; | |
41 } | |
42 | |
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 | |
OLD | NEW |