Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(150)

Side by Side Diff: net/quic/test_tools/quic_stream_sequencer_buffer_peer.cc

Issue 2387753002: Release read buffer of QuicCryptoStream when incoming message become less frequent. Protected by --… (Closed)
Patch Set: enable quic crypto stream release buffer Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/quic/test_tools/quic_stream_sequencer_buffer_peer.h"
6
7 #include "net/quic/core/quic_flags.h"
8 #include "net/test/gtest_util.h"
9
10 typedef net::QuicStreamSequencerBuffer::BufferBlock BufferBlock;
11 typedef net::QuicStreamSequencerBuffer::FrameInfo FrameInfo;
12 typedef net::QuicStreamSequencerBuffer::Gap Gap;
13
14 static const size_t kBlockSizeBytes =
15 net::QuicStreamSequencerBuffer::kBlockSizeBytes;
16
17 namespace net {
18 namespace test {
19
20 QuicStreamSequencerBufferPeer::QuicStreamSequencerBufferPeer(
21 QuicStreamSequencerBuffer* buffer)
22 : buffer_(buffer) {}
23
24 // Read from this buffer_ into the given destination buffer_ up to the
25 // size of the destination. Returns the number of bytes read. Reading from
26 // an empty buffer_->returns 0.
27 size_t QuicStreamSequencerBufferPeer::Read(char* dest_buffer, size_t size) {
28 iovec dest;
29 dest.iov_base = dest_buffer, dest.iov_len = size;
30 size_t bytes_read;
31 std::string error_details;
32 EXPECT_EQ(QUIC_NO_ERROR,
33 buffer_->Readv(&dest, 1, &bytes_read, &error_details));
34 return bytes_read;
35 }
36
37 // If buffer is empty, the blocks_ array must be empty, which means all
38 // blocks are deallocated.
39 bool QuicStreamSequencerBufferPeer::CheckEmptyInvariants() {
40 return !buffer_->Empty() || IsBlockArrayEmpty();
41 }
42
43 bool QuicStreamSequencerBufferPeer::IsBlockArrayEmpty() {
44 if (FLAGS_quic_reduce_sequencer_buffer_memory_life_time && // NOLINT
45 buffer_->blocks_ == nullptr) {
46 return true;
47 }
48
49 size_t count = buffer_->blocks_count_;
50 for (size_t i = 0; i < count; i++) {
51 if (buffer_->blocks_[i] != nullptr) {
52 return false;
53 }
54 }
55 return true;
56 }
57
58 bool QuicStreamSequencerBufferPeer::CheckInitialState() {
59 EXPECT_TRUE(buffer_->Empty() && buffer_->total_bytes_read_ == 0 &&
60 buffer_->num_bytes_buffered_ == 0);
61 return CheckBufferInvariants();
62 }
63
64 bool QuicStreamSequencerBufferPeer::CheckBufferInvariants() {
65 QuicStreamOffset data_span =
66 buffer_->gaps_.back().begin_offset - buffer_->total_bytes_read_;
67 bool capacity_sane = data_span <= buffer_->max_buffer_capacity_bytes_ &&
68 data_span >= buffer_->num_bytes_buffered_;
69 if (!capacity_sane) {
70 LOG(ERROR) << "data span is larger than capacity.";
71 LOG(ERROR) << "total read: " << buffer_->total_bytes_read_
72 << " last byte: " << buffer_->gaps_.back().begin_offset;
73 }
74 bool total_read_sane =
75 buffer_->gaps_.front().begin_offset >= buffer_->total_bytes_read_;
76 if (!total_read_sane) {
77 LOG(ERROR) << "read across 1st gap.";
78 }
79 bool read_offset_sane = buffer_->ReadOffset() < kBlockSizeBytes;
80 if (!capacity_sane) {
81 LOG(ERROR) << "read offset go beyond 1st block";
82 }
83 bool block_match_capacity = (buffer_->max_buffer_capacity_bytes_ <=
84 buffer_->blocks_count_ * kBlockSizeBytes) &&
85 (buffer_->max_buffer_capacity_bytes_ >
86 (buffer_->blocks_count_ - 1) * kBlockSizeBytes);
87 if (!capacity_sane) {
88 LOG(ERROR) << "block number not match capcaity.";
89 }
90 bool block_retired_when_empty = CheckEmptyInvariants();
91 if (!block_retired_when_empty) {
92 LOG(ERROR) << "block is not retired after use.";
93 }
94 return capacity_sane && total_read_sane && read_offset_sane &&
95 block_match_capacity && block_retired_when_empty;
96 }
97
98 size_t QuicStreamSequencerBufferPeer::GetInBlockOffset(
99 QuicStreamOffset offset) {
100 return buffer_->GetInBlockOffset(offset);
101 }
102
103 BufferBlock* QuicStreamSequencerBufferPeer::GetBlock(size_t index) {
104 return buffer_->blocks_[index];
105 }
106
107 int QuicStreamSequencerBufferPeer::GapSize() {
108 return buffer_->gaps_.size();
109 }
110
111 std::list<Gap> QuicStreamSequencerBufferPeer::GetGaps() {
112 return buffer_->gaps_;
113 }
114
115 size_t QuicStreamSequencerBufferPeer::max_buffer_capacity() {
116 return buffer_->max_buffer_capacity_bytes_;
117 }
118
119 size_t QuicStreamSequencerBufferPeer::ReadableBytes() {
120 return buffer_->ReadableBytes();
121 }
122
123 std::map<QuicStreamOffset, FrameInfo>*
124 QuicStreamSequencerBufferPeer::frame_arrival_time_map() {
125 return &(buffer_->frame_arrival_time_map_);
126 }
127
128 void QuicStreamSequencerBufferPeer::set_total_bytes_read(
129 QuicStreamOffset total_bytes_read) {
130 buffer_->total_bytes_read_ = total_bytes_read;
131 }
132
133 void QuicStreamSequencerBufferPeer::set_gaps(const std::list<Gap>& gaps) {
134 buffer_->gaps_ = gaps;
135 }
136
137 bool QuicStreamSequencerBufferPeer::IsBufferAllocated() {
138 return buffer_->blocks_ != nullptr;
139 }
140
141 } // namespace test
142 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/test_tools/quic_stream_sequencer_buffer_peer.h ('k') | net/quic/test_tools/quic_stream_sequencer_peer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698