gfe-relnote: In QUIC, replaces QuicStream::priority_ with QuicStream::precedence_ and pluming it to write_blocked_list. No functional change expected. Not protected.
This is a preparation for using H2 priority.
PiperOrigin-RevId: 260000909
Change-Id: Ieee790614b259509ad12611e17e99511feedc423
diff --git a/quic/core/http/quic_headers_stream_test.cc b/quic/core/http/quic_headers_stream_test.cc
index ebfa6cc..89338a8 100644
--- a/quic/core/http/quic_headers_stream_test.cc
+++ b/quic/core/http/quic_headers_stream_test.cc
@@ -284,7 +284,8 @@
_, _, NO_FIN))
.WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov)));
QuicSpdySessionPeer::WriteHeadersOnHeadersStream(
- &session_, stream_id, headers_.Clone(), fin, priority, nullptr);
+ &session_, stream_id, headers_.Clone(), fin,
+ spdy::SpdyStreamPrecedence(priority), nullptr);
// Parse the outgoing data and check that it matches was was written.
if (is_request) {
@@ -451,7 +452,8 @@
headers_frame.set_has_priority(true);
headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0));
frame = framer_->SerializeFrame(headers_frame);
- EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
+ EXPECT_CALL(session_, OnStreamHeadersPriority(
+ stream_id, spdy::SpdyStreamPrecedence(0)));
} else {
SpdyHeadersIR headers_frame(stream_id, headers_.Clone());
headers_frame.set_fin(fin);
@@ -536,7 +538,10 @@
.WillRepeatedly(InvokeWithoutArgs(
this, &QuicHeadersStreamTest::TearDownLocalConnectionState));
} else {
- EXPECT_CALL(session_, OnPriorityFrame(stream_id, priority)).Times(1);
+ EXPECT_CALL(
+ session_,
+ OnPriorityFrame(stream_id, spdy::SpdyStreamPrecedence(priority)))
+ .Times(1);
}
stream_frame_.data_buffer = frame.data();
stream_frame_.data_length = frame.size();
@@ -588,7 +593,8 @@
headers_frame.set_has_priority(true);
headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0));
frame = framer_->SerializeFrame(headers_frame);
- EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
+ EXPECT_CALL(session_, OnStreamHeadersPriority(
+ stream_id, spdy::SpdyStreamPrecedence(0)));
} else {
SpdyHeadersIR headers_frame(stream_id, headers_.Clone());
headers_frame.set_fin(fin);
@@ -778,7 +784,8 @@
headers_frame.set_has_priority(true);
headers_frame.set_weight(Spdy3PriorityToHttp2Weight(0));
frame = framer_->SerializeFrame(headers_frame);
- EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0));
+ EXPECT_CALL(session_, OnStreamHeadersPriority(
+ stream_id, spdy::SpdyStreamPrecedence(0)));
} else {
SpdyHeadersIR headers_frame(stream_id, headers_.Clone());
headers_frame.set_fin(fin);
diff --git a/quic/core/http/quic_receive_control_stream.cc b/quic/core/http/quic_receive_control_stream.cc
index 93fae3a..922dc8c 100644
--- a/quic/core/http/quic_receive_control_stream.cc
+++ b/quic/core/http/quic_receive_control_stream.cc
@@ -237,7 +237,7 @@
// that the server is not permitted to open. In that case, simply drop the
// frame.
if (stream) {
- stream->SetPriority(priority.weight);
+ stream->SetPriority(spdy::SpdyStreamPrecedence(priority.weight));
}
return true;
}
diff --git a/quic/core/http/quic_receive_control_stream_test.cc b/quic/core/http/quic_receive_control_stream_test.cc
index aaf60e9..d5a3139 100644
--- a/quic/core/http/quic_receive_control_stream_test.cc
+++ b/quic/core/http/quic_receive_control_stream_test.cc
@@ -223,9 +223,9 @@
QuicStreamFrame data(receive_control_stream_->id(), false, 0,
QuicStringPiece(serialized_frame));
- EXPECT_EQ(3u, stream_->priority());
+ EXPECT_EQ(3u, stream_->precedence().spdy3_priority());
receive_control_stream_->OnStreamFrame(data);
- EXPECT_EQ(1u, stream_->priority());
+ EXPECT_EQ(1u, stream_->precedence().spdy3_priority());
}
TEST_P(QuicReceiveControlStreamTest, PushPromiseOnControlStreamShouldClose) {
diff --git a/quic/core/http/quic_server_session_base_test.cc b/quic/core/http/quic_server_session_base_test.cc
index 0041c85..698193b 100644
--- a/quic/core/http/quic_server_session_base_test.cc
+++ b/quic/core/http/quic_server_session_base_test.cc
@@ -503,7 +503,8 @@
QuicServerSessionBasePeer::SetCryptoStream(session_.get(), crypto_stream);
session_->RegisterStreamPriority(
QuicUtils::GetHeadersStreamId(connection_->transport_version()),
- /*is_static=*/true, QuicStream::kDefaultPriority);
+ /*is_static=*/true,
+ spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority));
// Set some initial bandwidth values.
QuicSentPacketManager* sent_packet_manager =
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 3a55a34..6352d7b 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -215,11 +215,10 @@
return;
}
- // TODO(mpw): avoid down-conversion and plumb SpdyStreamPrecedence through
- // QuicHeadersStream.
SpdyPriority priority =
has_priority ? Http2WeightToSpdy3Priority(weight) : 0;
- session_->OnHeaders(stream_id, has_priority, priority, fin);
+ session_->OnHeaders(stream_id, has_priority,
+ spdy::SpdyStreamPrecedence(priority), fin);
}
void OnWindowUpdate(SpdyStreamId /*stream_id*/,
@@ -259,7 +258,7 @@
// TODO (wangyix): implement real HTTP/2 weights and dependencies instead of
// converting to SpdyPriority.
SpdyPriority priority = Http2WeightToSpdy3Priority(weight);
- session_->OnPriority(stream_id, priority);
+ session_->OnPriority(stream_id, spdy::SpdyStreamPrecedence(priority));
}
bool OnUnknownFrame(SpdyStreamId /*stream_id*/,
@@ -412,14 +411,15 @@
QUIC_NOTREACHED();
}
-void QuicSpdySession::OnStreamHeadersPriority(QuicStreamId stream_id,
- SpdyPriority priority) {
+void QuicSpdySession::OnStreamHeadersPriority(
+ QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence) {
QuicSpdyStream* stream = GetSpdyDataStream(stream_id);
if (!stream) {
// It's quite possible to receive headers after a stream has been reset.
return;
}
- stream->OnStreamHeadersPriority(priority);
+ stream->OnStreamHeadersPriority(precedence);
}
void QuicSpdySession::OnStreamHeaderList(QuicStreamId stream_id,
@@ -460,15 +460,16 @@
stream->OnStreamHeaderList(fin, frame_len, header_list);
}
-void QuicSpdySession::OnPriorityFrame(QuicStreamId stream_id,
- SpdyPriority priority) {
+void QuicSpdySession::OnPriorityFrame(
+ QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence) {
QuicSpdyStream* stream = GetSpdyDataStream(stream_id);
if (!stream) {
// It's quite possible to receive a PRIORITY frame after a stream has been
// reset.
return;
}
- stream->OnPriorityFrame(priority);
+ stream->OnPriorityFrame(precedence);
}
size_t QuicSpdySession::ProcessHeaderData(const struct iovec& iov) {
@@ -480,13 +481,14 @@
QuicStreamId id,
SpdyHeaderBlock headers,
bool fin,
- SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) {
DCHECK(!VersionUsesQpack(connection()->transport_version()));
return WriteHeadersOnHeadersStreamImpl(
id, std::move(headers), fin,
- /* parent_stream_id = */ 0, Spdy3PriorityToHttp2Weight(priority),
+ /* parent_stream_id = */ 0,
+ Spdy3PriorityToHttp2Weight(precedence.spdy3_priority()),
/* exclusive = */ false, std::move(ack_listener));
}
@@ -644,7 +646,7 @@
void QuicSpdySession::OnHeaders(SpdyStreamId stream_id,
bool has_priority,
- SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
bool fin) {
if (has_priority) {
if (perspective() == Perspective::IS_CLIENT) {
@@ -652,7 +654,7 @@
"Server must not send priorities.");
return;
}
- OnStreamHeadersPriority(stream_id, priority);
+ OnStreamHeadersPriority(stream_id, precedence);
} else {
if (perspective() == Perspective::IS_SERVER) {
CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
@@ -681,13 +683,13 @@
// TODO (wangyix): Why is SpdyStreamId used instead of QuicStreamId?
// This occurs in many places in this file.
void QuicSpdySession::OnPriority(SpdyStreamId stream_id,
- SpdyPriority priority) {
+ const spdy::SpdyStreamPrecedence& precedence) {
if (perspective() == Perspective::IS_CLIENT) {
CloseConnectionWithDetails(QUIC_INVALID_HEADERS_STREAM_DATA,
"Server must not send PRIORITY frames.");
return;
}
- OnPriorityFrame(stream_id, priority);
+ OnPriorityFrame(stream_id, precedence);
}
void QuicSpdySession::OnHeaderList(const QuicHeaderList& header_list) {
diff --git a/quic/core/http/quic_spdy_session.h b/quic/core/http/quic_spdy_session.h
index a504e9c..3fe5c66 100644
--- a/quic/core/http/quic_spdy_session.h
+++ b/quic/core/http/quic_spdy_session.h
@@ -76,8 +76,9 @@
// Called by |headers_stream_| when headers with a priority have been
// received for a stream. This method will only be called for server streams.
- virtual void OnStreamHeadersPriority(QuicStreamId stream_id,
- spdy::SpdyPriority priority);
+ virtual void OnStreamHeadersPriority(
+ QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence);
// Called by |headers_stream_| when headers have been completely received
// for a stream. |fin| will be true if the fin flag was set in the headers
@@ -98,7 +99,7 @@
// Called by |headers_stream_| when a PRIORITY frame has been received for a
// stream. This method will only be called for server streams.
virtual void OnPriorityFrame(QuicStreamId stream_id,
- spdy::SpdyPriority priority);
+ const spdy::SpdyStreamPrecedence& precedence);
// Sends contents of |iov| to h2_deframer_, returns number of bytes processed.
size_t ProcessHeaderData(const struct iovec& iov);
@@ -111,7 +112,7 @@
QuicStreamId id,
spdy::SpdyHeaderBlock headers,
bool fin,
- spdy::SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener);
// Writes a PRIORITY frame the to peer. Returns the size in bytes of the
@@ -243,7 +244,7 @@
// Called when a HEADERS frame has been received.
void OnHeaders(spdy::SpdyStreamId stream_id,
bool has_priority,
- spdy::SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
bool fin);
// Called when a PUSH_PROMISE frame has been received.
@@ -251,7 +252,8 @@
spdy::SpdyStreamId promised_stream_id);
// Called when a PRIORITY frame has been received.
- void OnPriority(spdy::SpdyStreamId stream_id, spdy::SpdyPriority priority);
+ void OnPriority(spdy::SpdyStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence);
// Called when the complete list of headers is available.
void OnHeaderList(const QuicHeaderList& header_list);
diff --git a/quic/core/http/quic_spdy_session_test.cc b/quic/core/http/quic_spdy_session_test.cc
index 2042f88..c36cdd7 100644
--- a/quic/core/http/quic_spdy_session_test.cc
+++ b/quic/core/http/quic_spdy_session_test.cc
@@ -654,7 +654,7 @@
// Now let stream 4 do the 2nd of its 3 writes, but add a block for a high
// priority stream 6. 4 should be preempted. 6 will write but *not* block so
// will cede back to 4.
- stream6->SetPriority(kV3HighestPriority);
+ stream6->SetPriority(spdy::SpdyStreamPrecedence(kV3HighestPriority));
EXPECT_CALL(*stream4, OnCanWrite())
.WillOnce(Invoke([this, stream4, stream6]() {
session_.SendLargeFakeData(stream4, 6000);
@@ -1253,14 +1253,15 @@
EXPECT_FALSE(session_.IsStreamFlowControlBlocked());
headers["header"] = QuicStrCat(random.RandUint64(), random.RandUint64(),
random.RandUint64());
- session_.WriteHeadersOnHeadersStream(stream_id, headers.Clone(), true, 0,
+ session_.WriteHeadersOnHeadersStream(stream_id, headers.Clone(), true,
+ spdy::SpdyStreamPrecedence(0),
nullptr);
stream_id += IdDelta();
}
// Write once more to ensure that the headers stream has buffered data. The
// random headers may have exactly filled the flow control window.
- session_.WriteHeadersOnHeadersStream(stream_id, std::move(headers), true, 0,
- nullptr);
+ session_.WriteHeadersOnHeadersStream(stream_id, std::move(headers), true,
+ spdy::SpdyStreamPrecedence(0), nullptr);
EXPECT_TRUE(headers_stream->HasBufferedData());
EXPECT_TRUE(headers_stream->flow_controller()->IsBlocked());
@@ -2006,8 +2007,10 @@
TEST_P(QuicSpdySessionTestServer, OnPriorityFrame) {
QuicStreamId stream_id = GetNthClientInitiatedBidirectionalId(0);
TestStream* stream = session_.CreateIncomingStream(stream_id);
- session_.OnPriorityFrame(stream_id, kV3HighestPriority);
- EXPECT_EQ(kV3HighestPriority, stream->priority());
+ session_.OnPriorityFrame(stream_id,
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ EXPECT_EQ(spdy::SpdyStreamPrecedence(kV3HighestPriority),
+ stream->precedence());
}
TEST_P(QuicSpdySessionTestServer, SimplePendingStreamType) {
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index aee3ba5..c577225 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -479,9 +479,10 @@
}
}
-void QuicSpdyStream::OnStreamHeadersPriority(SpdyPriority priority) {
+void QuicSpdyStream::OnStreamHeadersPriority(
+ const spdy::SpdyStreamPrecedence& precedence) {
DCHECK_EQ(Perspective::IS_SERVER, session()->connection()->perspective());
- SetPriority(priority);
+ SetPriority(precedence);
}
void QuicSpdyStream::OnStreamHeaderList(bool fin,
@@ -623,9 +624,10 @@
}
}
-void QuicSpdyStream::OnPriorityFrame(SpdyPriority priority) {
+void QuicSpdyStream::OnPriorityFrame(
+ const spdy::SpdyStreamPrecedence& precedence) {
DCHECK_EQ(Perspective::IS_SERVER, session()->connection()->perspective());
- SetPriority(priority);
+ SetPriority(precedence);
}
void QuicSpdyStream::OnStreamReset(const QuicRstStreamFrame& frame) {
@@ -936,7 +938,7 @@
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) {
if (!VersionUsesQpack(transport_version())) {
return spdy_session_->WriteHeadersOnHeadersStream(
- id(), std::move(header_block), fin, priority(),
+ id(), std::move(header_block), fin, precedence(),
std::move(ack_listener));
}
@@ -976,7 +978,7 @@
}
void QuicSpdyStream::PopulatePriorityFrame(PriorityFrame* frame) {
- frame->weight = priority();
+ frame->weight = precedence().spdy3_priority();
frame->dependency_type = ROOT_OF_TREE;
frame->prioritized_type = REQUEST_STREAM;
frame->prioritized_element_id = id();
diff --git a/quic/core/http/quic_spdy_stream.h b/quic/core/http/quic_spdy_stream.h
index bdb8752..e030e93 100644
--- a/quic/core/http/quic_spdy_stream.h
+++ b/quic/core/http/quic_spdy_stream.h
@@ -78,7 +78,8 @@
// Called by the session when headers with a priority have been received
// for this stream. This method will only be called for server streams.
- virtual void OnStreamHeadersPriority(spdy::SpdyPriority priority);
+ virtual void OnStreamHeadersPriority(
+ const spdy::SpdyStreamPrecedence& precedence);
// Called by the session when decompressed headers have been completely
// delivered to this stream. If |fin| is true, then this stream
@@ -95,7 +96,7 @@
// Called by the session when a PRIORITY frame has been been received for this
// stream. This method will only be called for server streams.
- void OnPriorityFrame(spdy::SpdyPriority priority);
+ void OnPriorityFrame(const spdy::SpdyStreamPrecedence& precedence);
// Override the base class to not discard response when receiving
// QUIC_STREAM_NO_ERROR.
diff --git a/quic/core/http/quic_spdy_stream_test.cc b/quic/core/http/quic_spdy_stream_test.cc
index ddfb651..20c1b65 100644
--- a/quic/core/http/quic_spdy_stream_test.cc
+++ b/quic/core/http/quic_spdy_stream_test.cc
@@ -108,22 +108,26 @@
class TestMockUpdateStreamSession : public MockQuicSpdySession {
public:
explicit TestMockUpdateStreamSession(QuicConnection* connection)
- : MockQuicSpdySession(connection) {}
+ : MockQuicSpdySession(connection),
+ expected_precedence_(
+ spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority)) {}
- void UpdateStreamPriority(QuicStreamId id, SpdyPriority priority) override {
+ void UpdateStreamPriority(
+ QuicStreamId id,
+ const spdy::SpdyStreamPrecedence& precedence) override {
EXPECT_EQ(id, expected_stream_->id());
- EXPECT_EQ(expected_priority_, priority);
- EXPECT_EQ(expected_priority_, expected_stream_->priority());
+ EXPECT_EQ(expected_precedence_, precedence);
+ EXPECT_EQ(expected_precedence_, expected_stream_->precedence());
}
void SetExpectedStream(QuicSpdyStream* stream) { expected_stream_ = stream; }
- void SetExpectedPriority(SpdyPriority priority) {
- expected_priority_ = priority;
+ void SetExpectedPriority(const spdy::SpdyStreamPrecedence& precedence) {
+ expected_precedence_ = precedence;
}
private:
QuicSpdyStream* expected_stream_;
- SpdyPriority expected_priority_;
+ spdy::SpdyStreamPrecedence expected_precedence_;
};
class QuicSpdyStreamTest : public QuicTestWithParam<ParsedQuicVersion> {
@@ -245,7 +249,8 @@
TEST_P(QuicSpdyStreamTest, ProcessHeaderList) {
Initialize(kShouldProcessData);
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
ProcessHeaders(false, headers_);
EXPECT_EQ("", stream_->data());
EXPECT_FALSE(stream_->header_list().empty());
@@ -256,7 +261,8 @@
Initialize(kShouldProcessData);
QuicHeaderList headers;
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
const bool version_uses_qpack =
VersionUsesQpack(GetParam().transport_version);
@@ -288,7 +294,8 @@
headers.OnHeader(p.first, p.second);
total_bytes += p.first.size() + p.second.size();
}
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
stream_->OnStreamHeaderList(true, total_bytes, headers);
EXPECT_EQ("", stream_->data());
EXPECT_FALSE(stream_->header_list().empty());
@@ -925,7 +932,8 @@
total_bytes += p.first.size() + p.second.size();
}
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
stream_->OnStreamHeaderList(/*fin=*/false, total_bytes, headers);
stream_->ConsumeHeaderList();
@@ -1432,8 +1440,9 @@
TEST_P(QuicSpdyStreamTest, OnPriorityFrame) {
Initialize(kShouldProcessData);
- stream_->OnPriorityFrame(kV3HighestPriority);
- EXPECT_EQ(kV3HighestPriority, stream_->priority());
+ stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ EXPECT_EQ(spdy::SpdyStreamPrecedence(kV3HighestPriority),
+ stream_->precedence());
}
TEST_P(QuicSpdyStreamTest, OnPriorityFrameAfterSendingData) {
@@ -1451,8 +1460,9 @@
}
EXPECT_CALL(*session_, WritevData(_, _, 4, _, FIN));
stream_->WriteOrBufferBody("data", true);
- stream_->OnPriorityFrame(kV3HighestPriority);
- EXPECT_EQ(kV3HighestPriority, stream_->priority());
+ stream_->OnPriorityFrame(spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ EXPECT_EQ(spdy::SpdyStreamPrecedence(kV3HighestPriority),
+ stream_->precedence());
}
TEST_P(QuicSpdyStreamTest, SetPriorityBeforeUpdateStreamPriority) {
@@ -1473,11 +1483,11 @@
// if called within UpdateStreamPriority(). This expectation is enforced in
// TestMockUpdateStreamSession::UpdateStreamPriority().
session->SetExpectedStream(stream);
- session->SetExpectedPriority(kV3HighestPriority);
- stream->SetPriority(kV3HighestPriority);
+ session->SetExpectedPriority(spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ stream->SetPriority(spdy::SpdyStreamPrecedence(kV3HighestPriority));
- session->SetExpectedPriority(kV3LowestPriority);
- stream->SetPriority(kV3LowestPriority);
+ session->SetExpectedPriority(spdy::SpdyStreamPrecedence(kV3LowestPriority));
+ stream->SetPriority(spdy::SpdyStreamPrecedence(kV3LowestPriority));
}
TEST_P(QuicSpdyStreamTest, StreamWaitsForAcks) {
@@ -2155,7 +2165,8 @@
QuicStreamFrame frame(stream_->id(), false, 0, buffer.get(), length);
// TODO(lassey): Check for HTTP_WRONG_STREAM error code.
EXPECT_CALL(*connection_, CloseConnection(QUIC_HTTP_DECODER_ERROR, _, _));
- stream_->OnStreamHeadersPriority(kV3HighestPriority);
+ stream_->OnStreamHeadersPriority(
+ spdy::SpdyStreamPrecedence(kV3HighestPriority));
ProcessHeaders(false, headers_);
stream_->ConsumeHeaderList();
stream_->OnStreamFrame(frame);
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 221d75e..964ddc1 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -1155,19 +1155,21 @@
void QuicSession::OnCryptoHandshakeMessageReceived(
const CryptoHandshakeMessage& /*message*/) {}
-void QuicSession::RegisterStreamPriority(QuicStreamId id,
- bool is_static,
- SpdyPriority priority) {
- write_blocked_streams()->RegisterStream(id, is_static, priority);
+void QuicSession::RegisterStreamPriority(
+ QuicStreamId id,
+ bool is_static,
+ const spdy::SpdyStreamPrecedence& precedence) {
+ write_blocked_streams()->RegisterStream(id, is_static, precedence);
}
void QuicSession::UnregisterStreamPriority(QuicStreamId id, bool is_static) {
write_blocked_streams()->UnregisterStream(id, is_static);
}
-void QuicSession::UpdateStreamPriority(QuicStreamId id,
- SpdyPriority new_priority) {
- write_blocked_streams()->UpdateStreamPriority(id, new_priority);
+void QuicSession::UpdateStreamPriority(
+ QuicStreamId id,
+ const spdy::SpdyStreamPrecedence& new_precedence) {
+ write_blocked_streams()->UpdateStreamPriority(id, new_precedence);
}
QuicConfig* QuicSession::config() {
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index b7c0212..ba5592a 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -256,16 +256,18 @@
const CryptoHandshakeMessage& message);
// Called by the stream on creation to set priority in the write blocked list.
- virtual void RegisterStreamPriority(QuicStreamId id,
- bool is_static,
- spdy::SpdyPriority priority);
+ virtual void RegisterStreamPriority(
+ QuicStreamId id,
+ bool is_static,
+ const spdy::SpdyStreamPrecedence& precedence);
// Called by the stream on deletion to clear priority from the write blocked
// list.
virtual void UnregisterStreamPriority(QuicStreamId id, bool is_static);
// Called by the stream on SetPriority to update priority on the write blocked
// list.
- virtual void UpdateStreamPriority(QuicStreamId id,
- spdy::SpdyPriority new_priority);
+ virtual void UpdateStreamPriority(
+ QuicStreamId id,
+ const spdy::SpdyStreamPrecedence& new_precedence);
// Returns mutable config for this session. Returned config is owned
// by QuicSession.
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 90577d5..2e15df1 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -890,7 +890,7 @@
// Now let stream 4 do the 2nd of its 3 writes, but add a block for a high
// priority stream 6. 4 should be preempted. 6 will write but *not* block so
// will cede back to 4.
- stream6->SetPriority(kV3HighestPriority);
+ stream6->SetPriority(spdy::SpdyStreamPrecedence(kV3HighestPriority));
EXPECT_CALL(*stream4, OnCanWrite())
.WillOnce(Invoke([this, stream4, stream6]() {
session_.SendLargeFakeData(stream4, 6000);
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index 8ef4717..a44be4e 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -236,7 +236,7 @@
: sequencer_(std::move(sequencer)),
id_(id),
session_(session),
- priority_(kDefaultPriority),
+ precedence_(spdy::SpdyStreamPrecedence(kDefaultPriority)),
stream_bytes_read_(stream_bytes_read),
stream_error_(QUIC_STREAM_NO_ERROR),
connection_error_(QUIC_NO_ERROR),
@@ -276,7 +276,7 @@
}
SetFromConfig();
if (type_ != CRYPTO) {
- session_->RegisterStreamPriority(id, is_static_, priority_);
+ session_->RegisterStreamPriority(id, is_static_, precedence_);
}
}
@@ -432,13 +432,13 @@
error, details, ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
}
-SpdyPriority QuicStream::priority() const {
- return priority_;
+const spdy::SpdyStreamPrecedence& QuicStream::precedence() const {
+ return precedence_;
}
-void QuicStream::SetPriority(SpdyPriority priority) {
- priority_ = priority;
- session_->UpdateStreamPriority(id(), priority);
+void QuicStream::SetPriority(const spdy::SpdyStreamPrecedence& precedence) {
+ precedence_ = precedence;
+ session_->UpdateStreamPriority(id(), precedence);
}
void QuicStream::WriteOrBufferData(
diff --git a/quic/core/quic_stream.h b/quic/core/quic_stream.h
index 6f5536d..b747451 100644
--- a/quic/core/quic_stream.h
+++ b/quic/core/quic_stream.h
@@ -176,11 +176,11 @@
virtual void OnConnectionClosed(QuicErrorCode error,
ConnectionCloseSource source);
- spdy::SpdyPriority priority() const;
+ const spdy::SpdyStreamPrecedence& precedence() const;
// Sets priority_ to priority. This should only be called before bytes are
// written to the server.
- void SetPriority(spdy::SpdyPriority priority);
+ void SetPriority(const spdy::SpdyStreamPrecedence& precedence);
// Returns true if this stream is still waiting for acks of sent data.
// This will return false if all data has been acked, or if the stream
@@ -456,8 +456,8 @@
QuicStreamId id_;
// Pointer to the owning QuicSession object.
QuicSession* session_;
- // The priority of the stream, once parsed.
- spdy::SpdyPriority priority_;
+ // The precedence of the stream, once parsed.
+ spdy::SpdyStreamPrecedence precedence_;
// Bytes read refers to payload bytes only: they do not include framing,
// encryption overhead etc.
uint64_t stream_bytes_read_;
diff --git a/quic/core/quic_write_blocked_list.h b/quic/core/quic_write_blocked_list.h
index eca7c1a..4b49816 100644
--- a/quic/core/quic_write_blocked_list.h
+++ b/quic/core/quic_write_blocked_list.h
@@ -92,15 +92,14 @@
void RegisterStream(QuicStreamId stream_id,
bool is_static_stream,
- spdy::SpdyPriority priority) {
+ const spdy::SpdyStreamPrecedence& precedence) {
DCHECK(!priority_write_scheduler_.StreamRegistered(stream_id));
if (is_static_stream) {
static_stream_collection_.Register(stream_id);
return;
}
- priority_write_scheduler_.RegisterStream(
- stream_id, spdy::SpdyStreamPrecedence(priority));
+ priority_write_scheduler_.RegisterStream(stream_id, precedence);
}
void UnregisterStream(QuicStreamId stream_id, bool is_static) {
@@ -112,10 +111,9 @@
}
void UpdateStreamPriority(QuicStreamId stream_id,
- spdy::SpdyPriority new_priority) {
+ const spdy::SpdyStreamPrecedence& new_precedence) {
DCHECK(!static_stream_collection_.IsRegistered(stream_id));
- priority_write_scheduler_.UpdateStreamPrecedence(
- stream_id, spdy::SpdyStreamPrecedence(new_priority));
+ priority_write_scheduler_.UpdateStreamPrecedence(stream_id, new_precedence);
}
void UpdateBytesForStream(QuicStreamId stream_id, size_t bytes) {
diff --git a/quic/core/quic_write_blocked_list_test.cc b/quic/core/quic_write_blocked_list_test.cc
index 30bb08e..f26fc56 100644
--- a/quic/core/quic_write_blocked_list_test.cc
+++ b/quic/core/quic_write_blocked_list_test.cc
@@ -26,11 +26,16 @@
TEST_F(QuicWriteBlockedListTest, PriorityOrder) {
// Mark streams blocked in roughly reverse priority order, and
// verify that streams are sorted.
- write_blocked_list_.RegisterStream(40, false, kV3LowestPriority);
- write_blocked_list_.RegisterStream(23, false, kV3HighestPriority);
- write_blocked_list_.RegisterStream(17, false, kV3HighestPriority);
- write_blocked_list_.RegisterStream(1, true, kV3HighestPriority);
- write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
+ write_blocked_list_.RegisterStream(
+ 40, false, spdy::SpdyStreamPrecedence(kV3LowestPriority));
+ write_blocked_list_.RegisterStream(
+ 23, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 17, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(40);
EXPECT_TRUE(write_blocked_list_.IsStreamBlocked(40));
@@ -70,7 +75,8 @@
}
TEST_F(QuicWriteBlockedListTest, CryptoStream) {
- write_blocked_list_.RegisterStream(1, true, kV3HighestPriority);
+ write_blocked_list_.RegisterStream(
+ 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(1);
EXPECT_EQ(1u, write_blocked_list_.NumBlockedStreams());
@@ -81,7 +87,8 @@
}
TEST_F(QuicWriteBlockedListTest, HeadersStream) {
- write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(3);
EXPECT_EQ(1u, write_blocked_list_.NumBlockedStreams());
@@ -92,8 +99,10 @@
}
TEST_F(QuicWriteBlockedListTest, VerifyHeadersStream) {
- write_blocked_list_.RegisterStream(5, false, kV3HighestPriority);
- write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
+ write_blocked_list_.RegisterStream(
+ 5, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(5);
write_blocked_list_.AddStream(3);
@@ -114,7 +123,8 @@
// Try to add a stream to the write blocked list multiple times at the same
// priority.
const QuicStreamId kBlockedId = 3 + 2;
- write_blocked_list_.RegisterStream(kBlockedId, false, kV3HighestPriority);
+ write_blocked_list_.RegisterStream(
+ kBlockedId, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(kBlockedId);
write_blocked_list_.AddStream(kBlockedId);
write_blocked_list_.AddStream(kBlockedId);
@@ -133,9 +143,12 @@
const QuicStreamId id1 = 3 + 2;
const QuicStreamId id2 = id1 + 2;
const QuicStreamId id3 = id2 + 2;
- write_blocked_list_.RegisterStream(id1, false, kV3LowestPriority);
- write_blocked_list_.RegisterStream(id2, false, kV3LowestPriority);
- write_blocked_list_.RegisterStream(id3, false, kV3HighestPriority);
+ write_blocked_list_.RegisterStream(
+ id1, false, spdy::SpdyStreamPrecedence(kV3LowestPriority));
+ write_blocked_list_.RegisterStream(
+ id2, false, spdy::SpdyStreamPrecedence(kV3LowestPriority));
+ write_blocked_list_.RegisterStream(
+ id3, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
write_blocked_list_.AddStream(id1);
write_blocked_list_.AddStream(id2);
@@ -180,13 +193,17 @@
}
TEST_F(QuicWriteBlockedListTest, Ceding) {
- write_blocked_list_.RegisterStream(15, false, kV3HighestPriority);
- write_blocked_list_.RegisterStream(16, false, kV3HighestPriority);
- write_blocked_list_.RegisterStream(5, false, 5);
- write_blocked_list_.RegisterStream(4, false, 5);
- write_blocked_list_.RegisterStream(7, false, 7);
- write_blocked_list_.RegisterStream(1, true, kV3HighestPriority);
- write_blocked_list_.RegisterStream(3, true, kV3HighestPriority);
+ write_blocked_list_.RegisterStream(
+ 15, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 16, false, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(5, false, spdy::SpdyStreamPrecedence(5));
+ write_blocked_list_.RegisterStream(4, false, spdy::SpdyStreamPrecedence(5));
+ write_blocked_list_.RegisterStream(7, false, spdy::SpdyStreamPrecedence(7));
+ write_blocked_list_.RegisterStream(
+ 1, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
+ write_blocked_list_.RegisterStream(
+ 3, true, spdy::SpdyStreamPrecedence(kV3HighestPriority));
// When nothing is on the list, nothing yields.
EXPECT_FALSE(write_blocked_list_.ShouldYield(5));
diff --git a/quic/quartc/quartc_session.cc b/quic/quartc/quartc_session.cc
index 8a918ca..f851579 100644
--- a/quic/quartc/quartc_session.cc
+++ b/quic/quartc/quartc_session.cc
@@ -301,7 +301,8 @@
// Register the stream to the QuicWriteBlockedList. |priority| is clamped
// between 0 and 7, with 0 being the highest priority and 7 the lowest
// priority.
- write_blocked_streams()->UpdateStreamPriority(stream->id(), priority);
+ write_blocked_streams()->UpdateStreamPriority(
+ stream->id(), spdy::SpdyStreamPrecedence(priority));
if (IsIncomingStream(stream->id())) {
DCHECK(session_delegate_);
diff --git a/quic/quartc/quartc_stream_test.cc b/quic/quartc/quartc_stream_test.cc
index be23b75..719cca7 100644
--- a/quic/quartc/quartc_stream_test.cc
+++ b/quic/quartc/quartc_stream_test.cc
@@ -107,9 +107,9 @@
// Tracks whether the stream is write blocked and its priority.
void RegisterReliableStream(QuicStreamId stream_id,
spdy::SpdyPriority priority) {
- write_blocked_streams()->RegisterStream(stream_id,
- /*is_static_stream=*/false,
- priority);
+ write_blocked_streams()->RegisterStream(
+ stream_id,
+ /*is_static_stream=*/false, spdy::SpdyStreamPrecedence(priority));
}
// The session take ownership of the stream.
diff --git a/quic/test_tools/quic_spdy_session_peer.cc b/quic/test_tools/quic_spdy_session_peer.cc
index 68552a8..d63c2d9 100644
--- a/quic/test_tools/quic_spdy_session_peer.cc
+++ b/quic/test_tools/quic_spdy_session_peer.cc
@@ -58,10 +58,10 @@
QuicStreamId id,
spdy::SpdyHeaderBlock headers,
bool fin,
- spdy::SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) {
return session->WriteHeadersOnHeadersStream(
- id, std::move(headers), fin, priority, std::move(ack_listener));
+ id, std::move(headers), fin, precedence, std::move(ack_listener));
}
// static
diff --git a/quic/test_tools/quic_spdy_session_peer.h b/quic/test_tools/quic_spdy_session_peer.h
index aacf712..7d6cea7 100644
--- a/quic/test_tools/quic_spdy_session_peer.h
+++ b/quic/test_tools/quic_spdy_session_peer.h
@@ -41,7 +41,7 @@
QuicStreamId id,
spdy::SpdyHeaderBlock headers,
bool fin,
- spdy::SpdyPriority priority,
+ const spdy::SpdyStreamPrecedence& precedence,
QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener);
// |session| can't be nullptr.
static QuicStreamId GetNextOutgoingUnidirectionalStreamId(
diff --git a/quic/test_tools/quic_test_client.cc b/quic/test_tools/quic_test_client.cc
index ef92cb0..402a231 100644
--- a/quic/test_tools/quic_test_client.cc
+++ b/quic/test_tools/quic_test_client.cc
@@ -547,7 +547,8 @@
if (!latest_created_stream_) {
SetLatestCreatedStream(client_->CreateClientStream());
if (latest_created_stream_) {
- latest_created_stream_->SetPriority(priority_);
+ latest_created_stream_->SetPriority(
+ spdy::SpdyStreamPrecedence(priority_));
}
}
diff --git a/quic/test_tools/quic_test_utils.h b/quic/test_tools/quic_test_utils.h
index 20494d7..52f0e2d 100644
--- a/quic/test_tools/quic_test_utils.h
+++ b/quic/test_tools/quic_test_utils.h
@@ -702,7 +702,8 @@
MOCK_METHOD2(OnStreamHeaders,
void(QuicStreamId stream_id, QuicStringPiece headers_data));
MOCK_METHOD2(OnStreamHeadersPriority,
- void(QuicStreamId stream_id, spdy::SpdyPriority priority));
+ void(QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence));
MOCK_METHOD3(OnStreamHeadersComplete,
void(QuicStreamId stream_id, bool fin, size_t frame_len));
MOCK_METHOD4(OnStreamHeaderList,
@@ -723,7 +724,8 @@
size_t frame_len,
const QuicHeaderList& header_list));
MOCK_METHOD2(OnPriorityFrame,
- void(QuicStreamId id, spdy::SpdyPriority priority));
+ void(QuicStreamId id,
+ const spdy::SpdyStreamPrecedence& precedence));
MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta));
MOCK_METHOD4(
diff --git a/quic/tools/quic_simple_server_session.cc b/quic/tools/quic_simple_server_session.cc
index 2e98cdd..ef70fdb 100644
--- a/quic/tools/quic_simple_server_session.cc
+++ b/quic/tools/quic_simple_server_session.cc
@@ -216,7 +216,8 @@
DCHECK_EQ(promised_info.stream_id, promised_stream->id());
QUIC_DLOG(INFO) << "created server push stream " << promised_stream->id();
- promised_stream->SetPriority(promised_info.priority);
+ promised_stream->SetPriority(
+ spdy::SpdyStreamPrecedence(promised_info.priority));
spdy::SpdyHeaderBlock request_headers(
std::move(promised_info.request_headers));
diff --git a/quic/tools/quic_simple_server_session_test.cc b/quic/tools/quic_simple_server_session_test.cc
index cef24b7..a3d7d12 100644
--- a/quic/tools/quic_simple_server_session_test.cc
+++ b/quic/tools/quic_simple_server_session_test.cc
@@ -483,7 +483,8 @@
QuicSimpleServerSessionPeer::SetCryptoStream(session_.get(), crypto_stream);
session_->RegisterStreamPriority(
QuicUtils::GetHeadersStreamId(connection_->transport_version()),
- /*is_static=*/true, QuicStream::kDefaultPriority);
+ /*is_static=*/true,
+ spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority));
// Create push streams till reaching the upper limit of allowed open streams.
for (size_t i = 0; i < kMaxStreamsForTest; ++i) {
@@ -587,7 +588,8 @@
QuicSimpleServerSessionPeer::SetCryptoStream(session_.get(), crypto_stream);
session_->RegisterStreamPriority(
QuicUtils::GetHeadersStreamId(connection_->transport_version()),
- /*is_static=*/true, QuicStream::kDefaultPriority);
+ /*is_static=*/true,
+ spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority));
}
// Given |num_resources|, create this number of fake push resources and push
diff --git a/quic/tools/quic_simple_server_stream_test.cc b/quic/tools/quic_simple_server_stream_test.cc
index 7bac18e..fca04ff 100644
--- a/quic/tools/quic_simple_server_stream_test.cc
+++ b/quic/tools/quic_simple_server_stream_test.cc
@@ -133,7 +133,8 @@
size_t frame_len,
const QuicHeaderList& header_list));
MOCK_METHOD2(OnStreamHeadersPriority,
- void(QuicStreamId stream_id, spdy::SpdyPriority priority));
+ void(QuicStreamId stream_id,
+ const spdy::SpdyStreamPrecedence& precedence));
MOCK_METHOD3(SendRstStream,
void(QuicStreamId stream_id,
QuicRstStreamErrorCode error,
diff --git a/quic/tools/quic_spdy_client_base.cc b/quic/tools/quic_spdy_client_base.cc
index 3a3bafe..09a1998 100644
--- a/quic/tools/quic_spdy_client_base.cc
+++ b/quic/tools/quic_spdy_client_base.cc
@@ -174,7 +174,8 @@
auto* stream = static_cast<QuicSpdyClientStream*>(
client_session()->CreateOutgoingBidirectionalStream());
if (stream) {
- stream->SetPriority(QuicStream::kDefaultPriority);
+ stream->SetPriority(
+ spdy::SpdyStreamPrecedence(QuicStream::kDefaultPriority));
stream->set_visitor(this);
}
return stream;