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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..eba6509abeeca4e18af60bb084fae1c1442fabdd |
--- /dev/null |
+++ b/net/quic/quic_write_blocked_list.h |
@@ -0,0 +1,90 @@ |
+// Copyright (c) 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 "net/base/net_export.h" |
+#include "net/quic/quic_protocol.h" |
+#include "net/spdy/write_blocked_list.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 WriteBlockedList<QuicStreamId> QuicWriteBlockedListBase; |
+ |
+ public: |
+ static const QuicPriority kHighestPriority; |
+ static const QuicPriority kLowestPriority; |
+ |
+ QuicWriteBlockedList(); |
+ ~QuicWriteBlockedList(); |
+ |
+ bool HasWriteBlockedStreams() const { |
+ return crypto_stream_blocked_ || |
+ headers_stream_blocked_ || |
+ base_write_blocked_list_.HasWriteBlockedStreams(); |
+ } |
+ |
+ size_t NumBlockedStreams() const { |
+ int num_blocked = base_write_blocked_list_.NumBlockedStreams(); |
+ if (crypto_stream_blocked_) { |
+ ++num_blocked; |
+ } |
+ if (headers_stream_blocked_) { |
+ ++num_blocked; |
+ } |
+ |
+ return num_blocked; |
+ } |
+ |
+ QuicStreamId PopFront() { |
+ if (crypto_stream_blocked_) { |
+ crypto_stream_blocked_ = false; |
+ return kCryptoStreamId; |
+ } else if (headers_stream_blocked_) { |
+ headers_stream_blocked_ = false; |
+ return kHeadersStreamId; |
+ } else { |
+ SpdyPriority priority = |
+ base_write_blocked_list_.GetHighestPriorityWriteBlockedList(); |
+ return base_write_blocked_list_.PopFront(priority); |
+ } |
+ } |
+ |
+ // TODO(avd) Remove version argument when QUIC_VERSION_12 is deprecated. |
+ void PushBack(QuicStreamId stream_id, |
+ QuicPriority priority, |
+ QuicVersion version) { |
+ if (stream_id == kCryptoStreamId) { |
+ DCHECK_EQ(kHighestPriority, priority); |
+ // TODO(avd) Add DCHECK(!crypto_stream_blocked_) |
+ crypto_stream_blocked_ = true; |
+ } else if (version > QUIC_VERSION_12 && |
+ stream_id == kHeadersStreamId) { |
+ DCHECK_EQ(kHighestPriority, priority); |
+ // TODO(avd) Add DCHECK(!headers_stream_blocked_); |
+ headers_stream_blocked_ = true; |
+ } else { |
+ base_write_blocked_list_.PushBack( |
+ stream_id, static_cast<SpdyPriority>(priority)); |
+ } |
+ } |
+ |
+ private: |
+ QuicWriteBlockedListBase base_write_blocked_list_; |
+ bool crypto_stream_blocked_; |
+ bool headers_stream_blocked_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(QuicWriteBlockedList); |
+}; |
+ |
+} // namespace net |
+ |
+ |
+#endif // NET_QUIC_QUIC_WRITE_BLOCKED_LIST_H_ |