Remove session pointer from PendingStream.
PiperOrigin-RevId: 329335303
Change-Id: I300c10505828a3b9e20ac207f667d2c417350156
diff --git a/quic/core/http/quic_receive_control_stream.cc b/quic/core/http/quic_receive_control_stream.cc
index 82d1fe1..62c9ba8 100644
--- a/quic/core/http/quic_receive_control_stream.cc
+++ b/quic/core/http/quic_receive_control_stream.cc
@@ -20,7 +20,10 @@
QuicReceiveControlStream::QuicReceiveControlStream(
PendingStream* pending,
QuicSpdySession* spdy_session)
- : QuicStream(pending, READ_UNIDIRECTIONAL, /*is_static=*/true),
+ : QuicStream(pending,
+ spdy_session,
+ READ_UNIDIRECTIONAL,
+ /*is_static=*/true),
settings_frame_received_(false),
decoder_(this),
spdy_session_(spdy_session) {
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 6b3d0c8..dded232 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -1239,7 +1239,7 @@
return false;
}
auto encoder_receive = std::make_unique<QpackReceiveStream>(
- pending, qpack_decoder_->encoder_stream_receiver());
+ pending, this, qpack_decoder_->encoder_stream_receiver());
qpack_encoder_receive_stream_ = encoder_receive.get();
ActivateStream(std::move(encoder_receive));
qpack_encoder_receive_stream_->SetUnblocked();
@@ -1256,7 +1256,7 @@
return false;
}
auto decoder_receive = std::make_unique<QpackReceiveStream>(
- pending, qpack_encoder_->decoder_stream_receiver());
+ pending, this, qpack_encoder_->decoder_stream_receiver());
qpack_decoder_receive_stream_ = decoder_receive.get();
ActivateStream(std::move(decoder_receive));
qpack_decoder_receive_stream_->SetUnblocked();
diff --git a/quic/core/http/quic_spdy_stream.cc b/quic/core/http/quic_spdy_stream.cc
index a14c3e5..67c24e4 100644
--- a/quic/core/http/quic_spdy_stream.cc
+++ b/quic/core/http/quic_spdy_stream.cc
@@ -220,7 +220,7 @@
QuicSpdyStream::QuicSpdyStream(PendingStream* pending,
QuicSpdySession* spdy_session,
StreamType type)
- : QuicStream(pending, type, /*is_static=*/false),
+ : QuicStream(pending, spdy_session, type, /*is_static=*/false),
spdy_session_(spdy_session),
on_body_available_called_because_sequencer_is_closed_(false),
visitor_(nullptr),
diff --git a/quic/core/qpack/qpack_receive_stream.cc b/quic/core/qpack/qpack_receive_stream.cc
index d2fc88b..b2f15c4 100644
--- a/quic/core/qpack/qpack_receive_stream.cc
+++ b/quic/core/qpack/qpack_receive_stream.cc
@@ -9,8 +9,9 @@
namespace quic {
QpackReceiveStream::QpackReceiveStream(PendingStream* pending,
+ QuicSession* session,
QpackStreamReceiver* receiver)
- : QuicStream(pending, READ_UNIDIRECTIONAL, /*is_static=*/true),
+ : QuicStream(pending, session, READ_UNIDIRECTIONAL, /*is_static=*/true),
receiver_(receiver) {}
void QpackReceiveStream::OnStreamReset(const QuicRstStreamFrame& /*frame*/) {
diff --git a/quic/core/qpack/qpack_receive_stream.h b/quic/core/qpack/qpack_receive_stream.h
index 0613871..0814985 100644
--- a/quic/core/qpack/qpack_receive_stream.h
+++ b/quic/core/qpack/qpack_receive_stream.h
@@ -19,7 +19,9 @@
public:
// Construct receive stream from pending stream, the |pending| object needs
// to be deleted after the construction.
- QpackReceiveStream(PendingStream* pending, QpackStreamReceiver* receiver);
+ QpackReceiveStream(PendingStream* pending,
+ QuicSession* session,
+ QpackStreamReceiver* receiver);
QpackReceiveStream(const QpackReceiveStream&) = delete;
QpackReceiveStream& operator=(const QpackReceiveStream&) = delete;
~QpackReceiveStream() override = default;
diff --git a/quic/core/quic_session_test.cc b/quic/core/quic_session_test.cc
index 37f1305..62c012c 100644
--- a/quic/core/quic_session_test.cc
+++ b/quic/core/quic_session_test.cc
@@ -165,8 +165,8 @@
StreamType type)
: QuicStream(id, session, is_static, type) {}
- TestStream(PendingStream* pending, StreamType type)
- : QuicStream(pending, type, /*is_static=*/false) {}
+ TestStream(PendingStream* pending, QuicSession* session, StreamType type)
+ : QuicStream(pending, session, type, /*is_static=*/false) {}
using QuicStream::CloseWriteSide;
using QuicStream::WriteMemSlices;
@@ -257,8 +257,9 @@
TestStream* CreateIncomingStream(PendingStream* pending) override {
QuicStreamId id = pending->id();
TestStream* stream = new TestStream(
- pending, DetermineStreamType(id, connection()->version(), perspective(),
- /*is_incoming=*/true, BIDIRECTIONAL));
+ pending, this,
+ DetermineStreamType(id, connection()->version(), perspective(),
+ /*is_incoming=*/true, BIDIRECTIONAL));
ActivateStream(QuicWrapUnique(stream));
++num_incoming_streams_created_;
return stream;
diff --git a/quic/core/quic_stream.cc b/quic/core/quic_stream.cc
index d965fa7..a5be981 100644
--- a/quic/core/quic_stream.cc
+++ b/quic/core/quic_stream.cc
@@ -111,7 +111,6 @@
PendingStream::PendingStream(QuicStreamId id, QuicSession* session)
: id_(id),
- session_(session),
stream_delegate_(session),
stream_bytes_read_(0),
fin_received_(false),
@@ -122,8 +121,8 @@
GetReceivedFlowControlWindow(session, id),
GetInitialStreamFlowControlWindowToSend(session, id),
kStreamReceiveWindowLimit,
- session_->flow_controller()->auto_tune_receive_window(),
- session_->flow_controller()),
+ session->flow_controller()->auto_tune_receive_window(),
+ session->flow_controller()),
sequencer_(this) {}
void PendingStream::OnDataAvailable() {
@@ -264,9 +263,12 @@
sequencer_.StopReading();
}
-QuicStream::QuicStream(PendingStream* pending, StreamType type, bool is_static)
+QuicStream::QuicStream(PendingStream* pending,
+ QuicSession* session,
+ StreamType type,
+ bool is_static)
: QuicStream(pending->id_,
- pending->session_,
+ session,
std::move(pending->sequencer_),
is_static,
type,
diff --git a/quic/core/quic_stream.h b/quic/core/quic_stream.h
index 8f669ca..f808d50 100644
--- a/quic/core/quic_stream.h
+++ b/quic/core/quic_stream.h
@@ -90,9 +90,7 @@
// ID of this stream.
QuicStreamId id_;
- // Session which owns this.
- // TODO(b/136274541): Remove session pointer from streams.
- QuicSession* session_;
+ // |stream_delegate_| must outlive this stream.
StreamDelegateInterface* stream_delegate_;
// Bytes read refers to payload bytes only: they do not include framing,
@@ -133,7 +131,10 @@
QuicSession* session,
bool is_static,
StreamType type);
- QuicStream(PendingStream* pending, StreamType type, bool is_static);
+ QuicStream(PendingStream* pending,
+ QuicSession* session,
+ StreamType type,
+ bool is_static);
QuicStream(const QuicStream&) = delete;
QuicStream& operator=(const QuicStream&) = delete;
diff --git a/quic/core/quic_stream_test.cc b/quic/core/quic_stream_test.cc
index 2313852..f2b5563 100644
--- a/quic/core/quic_stream_test.cc
+++ b/quic/core/quic_stream_test.cc
@@ -58,8 +58,11 @@
sequencer()->set_level_triggered(true);
}
- TestStream(PendingStream* pending, StreamType type, bool is_static)
- : QuicStream(pending, type, is_static) {}
+ TestStream(PendingStream* pending,
+ QuicSession* session,
+ StreamType type,
+ bool is_static)
+ : QuicStream(pending, session, type, is_static) {}
MOCK_METHOD(void, OnDataAvailable, (), (override));
@@ -169,11 +172,12 @@
Initialize();
PendingStream pending(kTestStreamId + 2, session_.get());
- TestStream stream(&pending, StreamType::BIDIRECTIONAL, false);
+ TestStream stream(&pending, session_.get(), StreamType::BIDIRECTIONAL, false);
EXPECT_FALSE(stream.is_static());
PendingStream pending2(kTestStreamId + 3, session_.get());
- TestStream stream2(&pending2, StreamType::BIDIRECTIONAL, true);
+ TestStream stream2(&pending2, session_.get(), StreamType::BIDIRECTIONAL,
+ true);
EXPECT_TRUE(stream2.is_static());
}
@@ -233,7 +237,8 @@
QuicStreamFrame frame2(kTestStreamId + 2, true, 3, ".");
pending.OnStreamFrame(frame2);
- TestStream stream(&pending, StreamType::READ_UNIDIRECTIONAL, false);
+ TestStream stream(&pending, session_.get(), StreamType::READ_UNIDIRECTIONAL,
+ false);
EXPECT_EQ(3, stream.num_frames_received());
EXPECT_EQ(3u, stream.stream_bytes_read());
EXPECT_EQ(1, stream.num_duplicate_frames_received());
@@ -251,8 +256,8 @@
QuicStreamFrame frame(kTestStreamId + 2, false, 2, ".");
pending.OnStreamFrame(frame);
- auto stream =
- new TestStream(&pending, StreamType::READ_UNIDIRECTIONAL, false);
+ auto stream = new TestStream(&pending, session_.get(),
+ StreamType::READ_UNIDIRECTIONAL, false);
session_->ActivateStream(QuicWrapUnique(stream));
QuicStreamFrame frame2(kTestStreamId + 2, true, 3, ".");