| Index: net/quic/quic_write_blocked_list.h
|
| diff --git a/net/quic/quic_write_blocked_list.h b/net/quic/quic_write_blocked_list.h
|
| deleted file mode 100644
|
| index e99eaa76525d1462e835c6e3716705e31305e139..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_write_blocked_list.h
|
| +++ /dev/null
|
| @@ -1,176 +0,0 @@
|
| -// Copyright 2014 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.
|
| -//
|
| -#ifndef NET_QUIC_QUIC_WRITE_BLOCKED_LIST_H_
|
| -#define NET_QUIC_QUIC_WRITE_BLOCKED_LIST_H_
|
| -
|
| -#include <stddef.h>
|
| -#include <stdint.h>
|
| -
|
| -#include <set>
|
| -
|
| -#include "base/macros.h"
|
| -#include "net/base/net_export.h"
|
| -#include "net/quic/quic_flags.h"
|
| -#include "net/quic/quic_protocol.h"
|
| -#include "net/spdy/priority_write_scheduler.h"
|
| -
|
| -namespace net {
|
| -
|
| -// Keeps tracks of the QUIC streams that have data to write, sorted by
|
| -// priority. QUIC stream priority order is:
|
| -// Crypto stream > Headers stream > Data streams by requested priority.
|
| -class NET_EXPORT_PRIVATE QuicWriteBlockedList {
|
| - private:
|
| - typedef PriorityWriteScheduler<QuicStreamId> QuicPriorityWriteScheduler;
|
| -
|
| - public:
|
| - QuicWriteBlockedList();
|
| - ~QuicWriteBlockedList();
|
| -
|
| - bool HasWriteBlockedDataStreams() const {
|
| - return priority_write_scheduler_.HasReadyStreams();
|
| - }
|
| -
|
| - bool HasWriteBlockedCryptoOrHeadersStream() const {
|
| - return crypto_stream_blocked_ || headers_stream_blocked_;
|
| - }
|
| -
|
| - size_t NumBlockedStreams() const {
|
| - size_t num_blocked = priority_write_scheduler_.NumReadyStreams();
|
| - if (crypto_stream_blocked_) {
|
| - ++num_blocked;
|
| - }
|
| - if (headers_stream_blocked_) {
|
| - ++num_blocked;
|
| - }
|
| -
|
| - return num_blocked;
|
| - }
|
| -
|
| - bool ShouldYield(QuicStreamId id) const {
|
| - if (id == kCryptoStreamId) {
|
| - return false; // The crypto stream yields to none.
|
| - }
|
| - if (crypto_stream_blocked_) {
|
| - return true; // If the crypto stream is blocked, all other streams yield.
|
| - }
|
| - if (id == kHeadersStreamId) {
|
| - return false; // The crypto stream isn't blocked so headers won't yield.
|
| - }
|
| - if (headers_stream_blocked_) {
|
| - return true; // All data streams yield to the headers stream.
|
| - }
|
| -
|
| - return priority_write_scheduler_.ShouldYield(id);
|
| - }
|
| -
|
| - // Pops the highest priorty stream, special casing crypto and headers streams.
|
| - // Latches the most recently popped data stream for batch writing purposes.
|
| - QuicStreamId PopFront() {
|
| - if (crypto_stream_blocked_) {
|
| - crypto_stream_blocked_ = false;
|
| - return kCryptoStreamId;
|
| - }
|
| -
|
| - if (headers_stream_blocked_) {
|
| - headers_stream_blocked_ = false;
|
| - return kHeadersStreamId;
|
| - }
|
| -
|
| - const auto id_and_precedence =
|
| - priority_write_scheduler_.PopNextReadyStreamAndPrecedence();
|
| - const QuicStreamId id = std::get<0>(id_and_precedence);
|
| - const SpdyPriority priority =
|
| - std::get<1>(id_and_precedence).spdy3_priority();
|
| -
|
| - if (!priority_write_scheduler_.HasReadyStreams()) {
|
| - // If no streams are blocked, don't bother latching. This stream will be
|
| - // the first popped for its priority anyway.
|
| - batch_write_stream_id_[priority] = 0;
|
| - last_priority_popped_ = priority;
|
| - } else if (batch_write_stream_id_[priority] != id) {
|
| - // If newly latching this batch write stream, let it write 16k.
|
| - batch_write_stream_id_[priority] = id;
|
| - bytes_left_for_batch_write_[priority] = 16000;
|
| - last_priority_popped_ = priority;
|
| - }
|
| -
|
| - return id;
|
| - }
|
| -
|
| - void RegisterStream(QuicStreamId stream_id, SpdyPriority priority) {
|
| - priority_write_scheduler_.RegisterStream(stream_id,
|
| - SpdyStreamPrecedence(priority));
|
| - }
|
| -
|
| - void UnregisterStream(QuicStreamId stream_id) {
|
| - priority_write_scheduler_.UnregisterStream(stream_id);
|
| - }
|
| -
|
| - void UpdateStreamPriority(QuicStreamId stream_id, SpdyPriority new_priority) {
|
| - priority_write_scheduler_.UpdateStreamPrecedence(
|
| - stream_id, SpdyStreamPrecedence(new_priority));
|
| - }
|
| -
|
| - void UpdateBytesForStream(QuicStreamId stream_id, size_t bytes) {
|
| - if (batch_write_stream_id_[last_priority_popped_] == stream_id) {
|
| - // If this was the last data stream popped by PopFront, update the
|
| - // bytes remaining in its batch write.
|
| - bytes_left_for_batch_write_[last_priority_popped_] -=
|
| - static_cast<int32_t>(bytes);
|
| - }
|
| - }
|
| -
|
| - // Pushes a stream to the back of the list for its priority level *unless*
|
| - // it is latched for doing batched writes in which case it goes to the front
|
| - // of the list for its priority level.
|
| - // Headers and crypto streams are special cased to always resume first.
|
| - void AddStream(QuicStreamId stream_id) {
|
| - if (stream_id == kCryptoStreamId) {
|
| - // TODO(avd) Add DCHECK(!crypto_stream_blocked_)
|
| - crypto_stream_blocked_ = true;
|
| - return;
|
| - }
|
| -
|
| - if (stream_id == kHeadersStreamId) {
|
| - // TODO(avd) Add DCHECK(!headers_stream_blocked_);
|
| - headers_stream_blocked_ = true;
|
| - return;
|
| - }
|
| - bool push_front =
|
| - stream_id == batch_write_stream_id_[last_priority_popped_] &&
|
| - bytes_left_for_batch_write_[last_priority_popped_] > 0;
|
| - priority_write_scheduler_.MarkStreamReady(stream_id, push_front);
|
| -
|
| - return;
|
| - }
|
| -
|
| - bool crypto_stream_blocked() const { return crypto_stream_blocked_; }
|
| - bool headers_stream_blocked() const { return headers_stream_blocked_; }
|
| -
|
| - private:
|
| - QuicPriorityWriteScheduler priority_write_scheduler_;
|
| -
|
| - // If performing batch writes, this will be the stream ID of the stream doing
|
| - // batch writes for this priority level. We will allow this stream to write
|
| - // until it has written kBatchWriteSize bytes, it has no more data to write,
|
| - // or a higher priority stream preempts.
|
| - QuicStreamId batch_write_stream_id_[kV3LowestPriority + 1];
|
| - // Set to kBatchWriteSize when we set a new batch_write_stream_id_ for a given
|
| - // priority. This is decremented with each write the stream does until it is
|
| - // done with its batch write.
|
| - int32_t bytes_left_for_batch_write_[kV3LowestPriority + 1];
|
| - // Tracks the last priority popped for UpdateBytesForStream.
|
| - SpdyPriority last_priority_popped_;
|
| -
|
| - bool crypto_stream_blocked_;
|
| - bool headers_stream_blocked_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(QuicWriteBlockedList);
|
| -};
|
| -
|
| -} // namespace net
|
| -
|
| -#endif // NET_QUIC_QUIC_WRITE_BLOCKED_LIST_H_
|
|
|