Refactor GetOrCreateStream() and GetOrCreateDynamicStream() and remove
StreamHandler.
StreamHandler is no longer needed since pending stream handling is done
separately from normal streams.
GetOrCreateStreamImpl() is no longer needed since GetOrCreateStream() now only
deals with normal streams.
gfe-relnote: code refactor, no bahavior change. Not flag protected.
PiperOrigin-RevId: 249158527
Change-Id: I579d1ce1705743e5ebbe2dc6f699705620a46ac4
diff --git a/quic/core/quic_session.cc b/quic/core/quic_session.cc
index 6d526ab..f605e56 100644
--- a/quic/core/quic_session.cc
+++ b/quic/core/quic_session.cc
@@ -202,9 +202,9 @@
return;
}
- StreamHandler handler = GetOrCreateStreamImpl(stream_id);
+ QuicStream* stream = GetOrCreateStream(stream_id);
- if (!handler.stream) {
+ if (!stream) {
// The stream no longer exists, but we may still be interested in the
// final stream byte offset sent by the peer. A frame with a FIN can give
// us this offset.
@@ -214,15 +214,14 @@
}
return;
}
- if (eliminate_static_stream_map_ && frame.fin &&
- handler.stream->is_static()) {
+ if (eliminate_static_stream_map_ && frame.fin && stream->is_static()) {
QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_3, 1, 17);
connection()->CloseConnection(
QUIC_INVALID_STREAM_ID, "Attempt to close a static stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
return;
}
- handler.stream->OnStreamFrame(frame);
+ stream->OnStreamFrame(frame);
}
void QuicSession::OnCryptoFrame(const QuicCryptoFrame& frame) {
@@ -373,20 +372,20 @@
return;
}
- StreamHandler handler = GetOrCreateStreamImpl(stream_id);
+ QuicStream* stream = GetOrCreateStream(stream_id);
- if (!handler.stream) {
+ if (!stream) {
HandleRstOnValidNonexistentStream(frame);
return; // Errors are handled by GetOrCreateStream.
}
- if (eliminate_static_stream_map_ && handler.stream->is_static()) {
+ if (eliminate_static_stream_map_ && stream->is_static()) {
QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_3, 3, 17);
connection()->CloseConnection(
QUIC_INVALID_STREAM_ID, "Attempt to reset a static stream",
ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
return;
}
- handler.stream->OnStreamReset(frame);
+ stream->OnStreamReset(frame);
}
void QuicSession::OnGoAway(const QuicGoAwayFrame& frame) {
@@ -1266,24 +1265,17 @@
}
QuicStream* QuicSession::GetOrCreateStream(const QuicStreamId stream_id) {
- StreamHandler handler = GetOrCreateStreamImpl(stream_id);
- DCHECK(!handler.is_pending);
- return handler.stream;
-}
-
-QuicSession::StreamHandler QuicSession::GetOrCreateStreamImpl(
- QuicStreamId stream_id) {
if (eliminate_static_stream_map_ &&
QuicUtils::IsCryptoStreamId(connection_->transport_version(),
stream_id)) {
QUIC_RELOADABLE_FLAG_COUNT_N(quic_eliminate_static_stream_map_3, 13, 17);
- return StreamHandler(GetMutableCryptoStream());
+ return GetMutableCryptoStream();
}
StaticStreamMap::iterator it = static_stream_map_.find(stream_id);
if (it != static_stream_map_.end()) {
- return StreamHandler(it->second);
+ return it->second;
}
- return GetOrCreateDynamicStreamImpl(stream_id);
+ return GetOrCreateDynamicStream(stream_id);
}
void QuicSession::StreamDraining(QuicStreamId stream_id) {
@@ -1337,28 +1329,21 @@
QuicStream* QuicSession::GetOrCreateDynamicStream(
const QuicStreamId stream_id) {
- StreamHandler handler = GetOrCreateDynamicStreamImpl(stream_id);
- DCHECK(!handler.is_pending);
- return handler.stream;
-}
-
-QuicSession::StreamHandler QuicSession::GetOrCreateDynamicStreamImpl(
- QuicStreamId stream_id) {
DCHECK(!QuicContainsKey(static_stream_map_, stream_id))
<< "Attempt to call GetOrCreateDynamicStream for a static stream";
DynamicStreamMap::iterator it = dynamic_stream_map_.find(stream_id);
if (it != dynamic_stream_map_.end()) {
- return StreamHandler(it->second.get());
+ return it->second.get();
}
if (IsClosedStream(stream_id)) {
- return StreamHandler();
+ return nullptr;
}
if (!IsIncomingStream(stream_id)) {
HandleFrameOnNonexistentOutgoingStream(stream_id);
- return StreamHandler();
+ return nullptr;
}
// TODO(fkastenholz): If we are creating a new stream and we have
@@ -1367,7 +1352,7 @@
// B) reject stream creation ("return nullptr")
if (!MaybeIncreaseLargestPeerStreamId(stream_id)) {
- return StreamHandler();
+ return nullptr;
}
if (connection_->transport_version() != QUIC_VERSION_99) {
@@ -1377,11 +1362,11 @@
GetNumOpenIncomingStreams())) {
// Refuse to open the stream.
SendRstStream(stream_id, QUIC_REFUSED_STREAM, 0);
- return StreamHandler();
+ return nullptr;
}
}
- return StreamHandler(CreateIncomingStream(stream_id));
+ return CreateIncomingStream(stream_id);
}
void QuicSession::set_largest_peer_created_stream_id(
diff --git a/quic/core/quic_session.h b/quic/core/quic_session.h
index dc7153a..5e527f3 100644
--- a/quic/core/quic_session.h
+++ b/quic/core/quic_session.h
@@ -557,31 +557,6 @@
return stream_id_manager_;
}
- // A StreamHandler represents an object which can receive a STREAM or
- // or RST_STREAM frame.
- struct StreamHandler {
- StreamHandler() : is_pending(false), stream(nullptr) {}
-
- // Creates a StreamHandler wrapping a QuicStream.
- explicit StreamHandler(QuicStream* stream)
- : is_pending(false), stream(stream) {}
-
- // Creates a StreamHandler wrapping a PendingStream.
- explicit StreamHandler(PendingStream* pending)
- : is_pending(true), pending(pending) {
- DCHECK(pending != nullptr);
- }
-
- // True if this handler contains a non-null PendingStream, false otherwise.
- bool is_pending;
- union {
- QuicStream* stream;
- PendingStream* pending;
- };
- };
-
- StreamHandler GetOrCreateStreamImpl(QuicStreamId stream_id);
-
// Processes the stream type information of |pending| depending on
// different kinds of sessions' own rules.
virtual void ProcessPendingStream(PendingStream* pending) {}
@@ -620,8 +595,6 @@
// closed.
QuicStream* GetStream(QuicStreamId id) const;
- StreamHandler GetOrCreateDynamicStreamImpl(QuicStreamId stream_id);
-
PendingStream* GetOrCreatePendingStream(QuicStreamId stream_id);
// Let streams and control frame managers retransmit lost data, returns true