blob: 85568109625aa842de17aa10c4e4eb304470b56e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
// 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.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) {
Update(now);
return QuicTime::Delta::FromMicroseconds(
(bytes_ * base::Time::kMicrosecondsPerSecond) /
draining_rate_.ToBytesPerSecond());
}
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
|