| Index: net/quic/core/quic_stream_sequencer_buffer.cc
|
| diff --git a/net/quic/core/quic_stream_sequencer_buffer.cc b/net/quic/core/quic_stream_sequencer_buffer.cc
|
| index 011a016d100b582b731563c0b0eba849b5dcf530..c839e0795720cb4dadc9f183a187a2a5b33b8bdd 100644
|
| --- a/net/quic/core/quic_stream_sequencer_buffer.cc
|
| +++ b/net/quic/core/quic_stream_sequencer_buffer.cc
|
| @@ -47,7 +47,11 @@ QuicStreamSequencerBuffer::QuicStreamSequencerBuffer(size_t max_capacity_bytes)
|
| blocks_count_(
|
| ceil(static_cast<double>(max_capacity_bytes) / kBlockSizeBytes)),
|
| total_bytes_read_(0),
|
| - blocks_(blocks_count_) {
|
| + reduce_sequencer_buffer_memory_life_time_(
|
| + FLAGS_quic_reduce_sequencer_buffer_memory_life_time), // NOLINT
|
| + blocks_(reduce_sequencer_buffer_memory_life_time_
|
| + ? nullptr
|
| + : new BufferBlock*[blocks_count_]()) {
|
| Clear();
|
| }
|
|
|
| @@ -56,9 +60,11 @@ QuicStreamSequencerBuffer::~QuicStreamSequencerBuffer() {
|
| }
|
|
|
| void QuicStreamSequencerBuffer::Clear() {
|
| - for (size_t i = 0; i < blocks_count_; ++i) {
|
| - if (blocks_[i] != nullptr) {
|
| - RetireBlock(i);
|
| + if (!reduce_sequencer_buffer_memory_life_time_ || blocks_ != nullptr) {
|
| + for (size_t i = 0; i < blocks_count_; ++i) {
|
| + if (blocks_[i] != nullptr) {
|
| + RetireBlock(i);
|
| + }
|
| }
|
| }
|
| num_bytes_buffered_ = 0;
|
| @@ -169,6 +175,13 @@ QuicErrorCode QuicStreamSequencerBuffer::OnStreamData(
|
| bytes_avail = total_bytes_read_ + max_buffer_capacity_bytes_ - offset;
|
| }
|
|
|
| + if (reduce_sequencer_buffer_memory_life_time_ && blocks_ == nullptr) {
|
| + blocks_.reset(new BufferBlock*[blocks_count_]());
|
| + for (size_t i = 0; i < blocks_count_; ++i) {
|
| + blocks_[i] = nullptr;
|
| + }
|
| + }
|
| +
|
| if (blocks_[write_block_num] == nullptr) {
|
| // TODO(danzh): Investigate if using a freelist would improve performance.
|
| // Same as RetireBlock().
|
| @@ -393,6 +406,15 @@ size_t QuicStreamSequencerBuffer::FlushBufferedFrames() {
|
| return total_bytes_read_ - prev_total_bytes_read;
|
| }
|
|
|
| +void QuicStreamSequencerBuffer::ReleaseWholeBuffer() {
|
| + if (!reduce_sequencer_buffer_memory_life_time_) {
|
| + // Don't release buffer if flag is off.
|
| + return;
|
| + }
|
| + Clear();
|
| + blocks_.reset(nullptr);
|
| +}
|
| +
|
| size_t QuicStreamSequencerBuffer::ReadableBytes() const {
|
| return gaps_.front().begin_offset - total_bytes_read_;
|
| }
|
|
|