blob: d3dd5139d1f7d65d9c0e6fd707c47406a24de290 [file] [log] [blame]
// 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(const QuicClock* clock, int bytes_per_second)
: clock_(clock),
bytes_(0),
draining_rate_bytes_per_s_(bytes_per_second) {
}
void LeakyBucket::SetDrainingRate(int bytes_per_second) {
Update();
draining_rate_bytes_per_s_ = bytes_per_second;
}
void LeakyBucket::Add(size_t bytes) {
Update();
bytes_ += bytes;
}
QuicTime::Delta LeakyBucket::TimeRemaining() {
Update();
return QuicTime::Delta::FromMicroseconds(
(bytes_ * base::Time::kMicrosecondsPerSecond) /
draining_rate_bytes_per_s_);
}
size_t LeakyBucket::BytesPending() {
Update();
return bytes_;
}
void LeakyBucket::Update() {
QuicTime::Delta elapsed_time = clock_->Now().Subtract(time_last_updated_);
size_t bytes_cleared =
(elapsed_time.ToMicroseconds() * draining_rate_bytes_per_s_) /
base::Time::kMicrosecondsPerSecond;
if (bytes_cleared >= bytes_) {
bytes_ = 0;
} else {
bytes_ -= bytes_cleared;
}
time_last_updated_ = clock_->Now();
}
} // namespace net