Turn `buffered_reset_stream_at_` into a heap-allocated object, since it's used infrequently. Saves 32 bytes of memory per stream. PiperOrigin-RevId: 947677356
diff --git a/quiche/quic/core/quic_stream.cc b/quiche/quic/core/quic_stream.cc index d140e25..2b98540 100644 --- a/quiche/quic/core/quic_stream.cc +++ b/quiche/quic/core/quic_stream.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <cstdint> #include <limits> +#include <memory> #include <optional> #include <string> #include <utility> @@ -281,13 +282,13 @@ " greater than the FIN offset: ", sequencer()->close_offset())); return; } - if (buffered_reset_stream_at_.has_value() && + if (buffered_reset_stream_at_ != nullptr && (frame.reliable_offset > buffered_reset_stream_at_->reliable_offset)) { // Ignore a reliable reset that raises the reliable size. It might have // arrived out of sequence. return; } - buffered_reset_stream_at_ = frame; + buffered_reset_stream_at_ = std::make_unique<QuicResetStreamAtFrame>(frame); sequencer_.OnReliableReset(frame.reliable_offset); } @@ -341,7 +342,7 @@ (session->GetClock()->ApproximateNow() - pending.creation_time())) { QUICHE_DCHECK(session->version().IsIetfQuic()); sequencer_.set_stream(this); - buffered_reset_stream_at_ = pending.buffered_reset_stream_at(); + buffered_reset_stream_at_ = std::move(pending.buffered_reset_stream_at_); } namespace { @@ -636,13 +637,13 @@ " greater than the FIN offset: ", sequencer()->close_offset())); return; } - if (buffered_reset_stream_at_.has_value() && + if (buffered_reset_stream_at_ != nullptr && (frame.reliable_offset > buffered_reset_stream_at_->reliable_offset)) { // Ignore a reliable reset that raises the reliable size. It might have // arrived out of sequence. return; } - buffered_reset_stream_at_ = frame; + buffered_reset_stream_at_ = std::make_unique<QuicResetStreamAtFrame>(frame); MaybeCloseStreamWithBufferedReset(); if (!rst_received_) { sequencer_.OnReliableReset(frame.reliable_offset); @@ -1594,10 +1595,10 @@ } void QuicStream::MaybeCloseStreamWithBufferedReset() { - if (buffered_reset_stream_at_.has_value() && !sequencer_.IsClosed() && + if (buffered_reset_stream_at_ != nullptr && !sequencer_.IsClosed() && NumBytesConsumed() >= buffered_reset_stream_at_->reliable_offset) { OnStreamReset(buffered_reset_stream_at_->ToRstStream()); - buffered_reset_stream_at_ = std::nullopt; + buffered_reset_stream_at_.reset(); } }
diff --git a/quiche/quic/core/quic_stream.h b/quiche/quic/core/quic_stream.h index a3a26f0..c45d40f 100644 --- a/quiche/quic/core/quic_stream.h +++ b/quiche/quic/core/quic_stream.h
@@ -19,9 +19,11 @@ #include <cstddef> #include <cstdint> +#include <memory> #include <optional> #include <string> +#include "absl/base/nullability.h" #include "absl/strings/string_view.h" #include "absl/types/span.h" #include "quiche/quic/core/frames/quic_connection_close_frame.h" @@ -110,8 +112,8 @@ QuicTime creation_time() const { return creation_time_; } - std::optional<QuicResetStreamAtFrame> buffered_reset_stream_at() const { - return buffered_reset_stream_at_; + const QuicResetStreamAtFrame* absl_nullable buffered_reset_stream_at() const { + return buffered_reset_stream_at_.get(); } private: @@ -150,7 +152,7 @@ const QuicTime creation_time_; // When RESET_STREAM_AT arrives,buffer it for when reliable_size is consumed. - std::optional<QuicResetStreamAtFrame> buffered_reset_stream_at_; + std::unique_ptr<QuicResetStreamAtFrame> buffered_reset_stream_at_; }; class QUICHE_EXPORT QuicStream : public QuicStreamSequencer::StreamInterface { @@ -626,8 +628,9 @@ // before being moved to this QuicStream. const QuicTime::Delta pending_duration_; - // When RESET_STREAM_AT arrives,buffer it for when reliable_size is consumed. - std::optional<QuicResetStreamAtFrame> buffered_reset_stream_at_; + // When RESET_STREAM_AT arrives, buffer it for when reliable_size is consumed. + absl_nullable std::unique_ptr<QuicResetStreamAtFrame> + buffered_reset_stream_at_; // If the stream is reset, outgoing data up to reliable_size_will be // delivered (and acknowledged) before the write side of the stream is closed.