| Index: net/base/network_stream_throttler.cc
|
| diff --git a/net/base/network_stream_throttler.cc b/net/base/network_stream_throttler.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6f274295ff4407275fca586a556495a32104d8ad
|
| --- /dev/null
|
| +++ b/net/base/network_stream_throttler.cc
|
| @@ -0,0 +1,69 @@
|
| +// Copyright 2016 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/base/network_stream_throttler.h"
|
| +
|
| +namespace net {
|
| +
|
| +// Currently this is a null implementation that does no throttling;
|
| +// all entries are created in the unthrottled state, and no throttle state
|
| +// change notifications are transmitted.
|
| +
|
| +NetworkStreamThrottler::Throttle::~Throttle() {
|
| + if (throttler_)
|
| + throttler_->OnStreamDestroyed(this);
|
| +}
|
| +
|
| +void NetworkStreamThrottler::Throttle::SetPriority(RequestPriority priority) {
|
| + RequestPriority old_priority = priority_;
|
| + priority_ = priority;
|
| + if (throttler_)
|
| + throttler_->OnStreamPriorityChanged(this, old_priority, priority);
|
| +}
|
| +
|
| +NetworkStreamThrottler::Throttle::Throttle(
|
| + bool throttled,
|
| + RequestPriority priority,
|
| + base::WeakPtr<NetworkStreamThrottler> throttler)
|
| + : throttled_(throttled),
|
| + priority_(priority),
|
| + delegate_(nullptr),
|
| + throttler_(throttler) {}
|
| +
|
| +void NetworkStreamThrottler::Throttle::NotifyThrottleStateChanged(
|
| + bool new_throttle_state) {
|
| + throttled_ = new_throttle_state;
|
| + // TODO(rdsmith): Figure out if/how this needs to be made asynchronous.
|
| + if (delegate_)
|
| + delegate_->OnThrottleStateChanged();
|
| +}
|
| +
|
| +NetworkStreamThrottler::NetworkStreamThrottler()
|
| + : priority_queue_(MAXIMUM_PRIORITY + 1), factory_(this) {}
|
| +
|
| +NetworkStreamThrottler::~NetworkStreamThrottler() {}
|
| +
|
| +scoped_ptr<NetworkStreamThrottler::Throttle>
|
| +NetworkStreamThrottler::CreateThrottle(RequestPriority priority) {
|
| + scoped_ptr<Throttle> stream(
|
| + new Throttle(false, priority, factory_.GetWeakPtr()));
|
| +
|
| + stream->set_queue_pointer(priority_queue_.Insert(stream.get(), priority));
|
| +
|
| + return stream;
|
| +}
|
| +
|
| +void NetworkStreamThrottler::OnStreamPriorityChanged(
|
| + Throttle* stream,
|
| + RequestPriority old_priority,
|
| + RequestPriority new_priority) {
|
| + priority_queue_.Erase(stream->queue_pointer());
|
| + stream->set_queue_pointer(priority_queue_.Insert(stream, new_priority));
|
| +}
|
| +
|
| +void NetworkStreamThrottler::OnStreamDestroyed(Throttle* stream) {
|
| + priority_queue_.Erase(stream->queue_pointer());
|
| +}
|
| +
|
| +} // namespace net
|
|
|