gfe-relnote: Add NumRegisteredStreams interface to WriteScheduler and implements it in subclasses. No used in prod yet, not protected.

Also move WriteSchedulerType to third_party/spdy/spdy_protocol.h to allow it be used by QUIC.

PiperOrigin-RevId: 259786320
Change-Id: I71fd5b68be9c10bf47f576c3020af17f80212178
diff --git a/spdy/core/http2_priority_write_scheduler.h b/spdy/core/http2_priority_write_scheduler.h
index 1f72fdb..d08d125 100644
--- a/spdy/core/http2_priority_write_scheduler.h
+++ b/spdy/core/http2_priority_write_scheduler.h
@@ -76,11 +76,9 @@
   PopNextReadyStreamAndPrecedence() override;
   size_t NumReadyStreams() const override;
   bool IsStreamReady(StreamIdType stream_id) const override;
+  size_t NumRegisteredStreams() const override;
   SpdyString DebugString() const override;
 
-  // Return the number of streams currently in the tree.
-  int num_streams() const;
-
  private:
   friend class test::Http2PriorityWriteSchedulerPeer<StreamIdType>;
 
@@ -201,11 +199,6 @@
 }
 
 template <typename StreamIdType>
-int Http2PriorityWriteScheduler<StreamIdType>::num_streams() const {
-  return all_stream_infos_.size();
-}
-
-template <typename StreamIdType>
 bool Http2PriorityWriteScheduler<StreamIdType>::StreamRegistered(
     StreamIdType stream_id) const {
   return SpdyContainsKey(all_stream_infos_, stream_id);
@@ -696,8 +689,14 @@
 }
 
 template <typename StreamIdType>
+size_t Http2PriorityWriteScheduler<StreamIdType>::NumRegisteredStreams() const {
+  return all_stream_infos_.size();
+}
+
+template <typename StreamIdType>
 SpdyString Http2PriorityWriteScheduler<StreamIdType>::DebugString() const {
-  return SpdyStrCat("Http2PriorityWriteScheduler {num_streams=", num_streams(),
+  return SpdyStrCat("Http2PriorityWriteScheduler {num_registered_streams=",
+                    NumRegisteredStreams(),
                     " num_ready_streams=", NumReadyStreams(), "}");
 }
 
@@ -757,15 +756,15 @@
     }
   }
 
-  // Make sure num_streams reflects the total number of streams the map
-  // contains.
-  if (total_streams != num_streams()) {
+  // Make sure NumRegisteredStreams() reflects the total number of streams the
+  // map contains.
+  if (total_streams != NumRegisteredStreams()) {
     SPDY_DLOG(INFO) << "Map contains incorrect number of streams.";
     return false;
   }
   // Validate the validation function; we should have visited each stream twice
   // (except for the root)
-  DCHECK(streams_visited == 2 * num_streams() - 1);
+  DCHECK(streams_visited == 2 * NumRegisteredStreams() - 1);
   return true;
 }
 
diff --git a/spdy/core/http2_priority_write_scheduler_test.cc b/spdy/core/http2_priority_write_scheduler_test.cc
index 17b7721..484e59a 100644
--- a/spdy/core/http2_priority_write_scheduler_test.cc
+++ b/spdy/core/http2_priority_write_scheduler_test.cc
@@ -46,12 +46,12 @@
 };
 
 TEST_F(Http2PriorityWriteSchedulerTest, RegisterAndUnregisterStreams) {
-  EXPECT_EQ(1, scheduler_.num_streams());
+  EXPECT_EQ(1u, scheduler_.NumRegisteredStreams());
   EXPECT_TRUE(scheduler_.StreamRegistered(0));
   EXPECT_FALSE(scheduler_.StreamRegistered(1));
 
   scheduler_.RegisterStream(1, SpdyStreamPrecedence(0, 100, false));
-  EXPECT_EQ(2, scheduler_.num_streams());
+  EXPECT_EQ(2u, scheduler_.NumRegisteredStreams());
   ASSERT_TRUE(scheduler_.StreamRegistered(1));
   EXPECT_EQ(100, scheduler_.GetStreamPrecedence(1).weight());
   EXPECT_FALSE(scheduler_.StreamRegistered(5));
@@ -62,14 +62,14 @@
   EXPECT_SPDY_BUG(
       scheduler_.RegisterStream(5, SpdyStreamPrecedence(1, 50, false)),
       "Stream 5 already registered");
-  EXPECT_EQ(3, scheduler_.num_streams());
+  EXPECT_EQ(3u, scheduler_.NumRegisteredStreams());
   EXPECT_TRUE(scheduler_.StreamRegistered(1));
   ASSERT_TRUE(scheduler_.StreamRegistered(5));
   EXPECT_EQ(50, scheduler_.GetStreamPrecedence(5).weight());
   EXPECT_FALSE(scheduler_.StreamRegistered(13));
 
   scheduler_.RegisterStream(13, SpdyStreamPrecedence(5, 130, true));
-  EXPECT_EQ(4, scheduler_.num_streams());
+  EXPECT_EQ(4u, scheduler_.NumRegisteredStreams());
   EXPECT_TRUE(scheduler_.StreamRegistered(1));
   EXPECT_TRUE(scheduler_.StreamRegistered(5));
   ASSERT_TRUE(scheduler_.StreamRegistered(13));
@@ -79,7 +79,7 @@
   scheduler_.UnregisterStream(5);
   // Cannot remove a stream that has already been removed.
   EXPECT_SPDY_BUG(scheduler_.UnregisterStream(5), "Stream 5 not registered");
-  EXPECT_EQ(3, scheduler_.num_streams());
+  EXPECT_EQ(3u, scheduler_.NumRegisteredStreams());
   EXPECT_TRUE(scheduler_.StreamRegistered(1));
   EXPECT_FALSE(scheduler_.StreamRegistered(5));
   EXPECT_TRUE(scheduler_.StreamRegistered(13));
diff --git a/spdy/core/priority_write_scheduler.h b/spdy/core/priority_write_scheduler.h
index bcacb25..e438583 100644
--- a/spdy/core/priority_write_scheduler.h
+++ b/spdy/core/priority_write_scheduler.h
@@ -258,6 +258,8 @@
   // Returns the number of ready streams.
   size_t NumReadyStreams() const override { return num_ready_streams_; }
 
+  size_t NumRegisteredStreams() const override { return stream_infos_.size(); }
+
   SpdyString DebugString() const override {
     return SpdyStrCat(
         "PriorityWriteScheduler {num_streams=", stream_infos_.size(),
diff --git a/spdy/core/priority_write_scheduler_test.cc b/spdy/core/priority_write_scheduler_test.cc
index ae348be..7488820 100644
--- a/spdy/core/priority_write_scheduler_test.cc
+++ b/spdy/core/priority_write_scheduler_test.cc
@@ -40,8 +40,10 @@
 TEST_F(PriorityWriteSchedulerTest, RegisterUnregisterStreams) {
   EXPECT_FALSE(scheduler_.HasReadyStreams());
   EXPECT_FALSE(scheduler_.StreamRegistered(1));
+  EXPECT_EQ(0u, scheduler_.NumRegisteredStreams());
   scheduler_.RegisterStream(1, SpdyStreamPrecedence(1));
   EXPECT_TRUE(scheduler_.StreamRegistered(1));
+  EXPECT_EQ(1u, scheduler_.NumRegisteredStreams());
 
   // Root stream counts as already registered.
   EXPECT_SPDY_BUG(
@@ -55,12 +57,15 @@
                   "Stream 1 already registered");
 
   scheduler_.RegisterStream(2, SpdyStreamPrecedence(3));
+  EXPECT_EQ(2u, scheduler_.NumRegisteredStreams());
 
   // Verify registration != ready.
   EXPECT_FALSE(scheduler_.HasReadyStreams());
 
   scheduler_.UnregisterStream(1);
+  EXPECT_EQ(1u, scheduler_.NumRegisteredStreams());
   scheduler_.UnregisterStream(2);
+  EXPECT_EQ(0u, scheduler_.NumRegisteredStreams());
 
   // Try redundant unregistration.
   EXPECT_SPDY_BUG(scheduler_.UnregisterStream(1), "Stream 1 not registered");
diff --git a/spdy/core/spdy_protocol.h b/spdy/core/spdy_protocol.h
index 92893d2..2d2ce96 100644
--- a/spdy/core/spdy_protocol.h
+++ b/spdy/core/spdy_protocol.h
@@ -196,6 +196,15 @@
   ERROR_CODE_MAX = ERROR_CODE_HTTP_1_1_REQUIRED
 };
 
+// Type of priority write scheduler.
+enum class WriteSchedulerType {
+  LIFO,  // Last added stream has the highest priority.
+  SPDY,  // Uses SPDY priorities described in
+         // https://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1#TOC-2.3.3-Stream-priority.
+  HTTP2,  // Uses HTTP2 (tree-style) priority described in
+          // https://tools.ietf.org/html/rfc7540#section-5.3.
+};
+
 // A SPDY priority is a number between 0 and 7 (inclusive).
 typedef uint8_t SpdyPriority;
 
diff --git a/spdy/core/write_scheduler.h b/spdy/core/write_scheduler.h
index 7906ad7..98db442 100644
--- a/spdy/core/write_scheduler.h
+++ b/spdy/core/write_scheduler.h
@@ -150,6 +150,9 @@
   // Returns true if stream with |stream_id| is ready.
   virtual bool IsStreamReady(StreamIdType stream_id) const = 0;
 
+  // Returns the number of registered streams.
+  virtual size_t NumRegisteredStreams() const = 0;
+
   // Returns summary of internal state, for logging/debugging.
   virtual SpdyString DebugString() const = 0;
 };