OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_stream_sequencer.h" | 5 #include "net/quic/quic_stream_sequencer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/metrics/sparse_histogram.h" | 11 #include "base/metrics/sparse_histogram.h" |
12 #include "net/quic/reliable_quic_stream.h" | 12 #include "net/quic/reliable_quic_stream.h" |
13 | 13 |
14 using std::make_pair; | |
15 using std::min; | 14 using std::min; |
16 using std::numeric_limits; | 15 using std::numeric_limits; |
17 using std::string; | 16 using std::string; |
18 | 17 |
19 namespace net { | 18 namespace net { |
20 | 19 |
21 QuicStreamSequencer::QuicStreamSequencer(ReliableQuicStream* quic_stream) | 20 QuicStreamSequencer::QuicStreamSequencer(ReliableQuicStream* quic_stream) |
22 : stream_(quic_stream), | 21 : stream_(quic_stream), |
23 num_bytes_consumed_(0), | 22 num_bytes_consumed_(0), |
24 close_offset_(numeric_limits<QuicStreamOffset>::max()), | 23 close_offset_(numeric_limits<QuicStreamOffset>::max()), |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 data_len -= bytes_consumed; | 95 data_len -= bytes_consumed; |
97 data.Consume(bytes_consumed); | 96 data.Consume(bytes_consumed); |
98 byte_offset += bytes_consumed; | 97 byte_offset += bytes_consumed; |
99 } | 98 } |
100 } | 99 } |
101 | 100 |
102 // Buffer any remaining data to be consumed by the stream when ready. | 101 // Buffer any remaining data to be consumed by the stream when ready. |
103 for (size_t i = 0; i < data.Size(); ++i) { | 102 for (size_t i = 0; i < data.Size(); ++i) { |
104 DVLOG(1) << "Buffering stream data at offset " << byte_offset; | 103 DVLOG(1) << "Buffering stream data at offset " << byte_offset; |
105 const iovec& iov = data.iovec()[i]; | 104 const iovec& iov = data.iovec()[i]; |
106 buffered_frames_.insert(make_pair( | 105 buffered_frames_.insert(std::make_pair( |
107 byte_offset, string(static_cast<char*>(iov.iov_base), iov.iov_len))); | 106 byte_offset, string(static_cast<char*>(iov.iov_base), iov.iov_len))); |
108 byte_offset += iov.iov_len; | 107 byte_offset += iov.iov_len; |
109 num_bytes_buffered_ += iov.iov_len; | 108 num_bytes_buffered_ += iov.iov_len; |
110 } | 109 } |
111 return; | 110 return; |
112 } | 111 } |
113 | 112 |
114 void QuicStreamSequencer::CloseStreamAtOffset(QuicStreamOffset offset) { | 113 void QuicStreamSequencer::CloseStreamAtOffset(QuicStreamOffset offset) { |
115 const QuicStreamOffset kMaxOffset = numeric_limits<QuicStreamOffset>::max(); | 114 const QuicStreamOffset kMaxOffset = numeric_limits<QuicStreamOffset>::max(); |
116 | 115 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 if (it->second.size() == frame_offset) { | 187 if (it->second.size() == frame_offset) { |
189 // We've copied this whole frame | 188 // We've copied this whole frame |
190 RecordBytesConsumed(it->second.size()); | 189 RecordBytesConsumed(it->second.size()); |
191 buffered_frames_.erase(it); | 190 buffered_frames_.erase(it); |
192 it = buffered_frames_.begin(); | 191 it = buffered_frames_.begin(); |
193 frame_offset = 0; | 192 frame_offset = 0; |
194 } | 193 } |
195 } | 194 } |
196 // We've finished copying. If we have a partial frame, update it. | 195 // We've finished copying. If we have a partial frame, update it. |
197 if (frame_offset != 0) { | 196 if (frame_offset != 0) { |
198 buffered_frames_.insert( | 197 buffered_frames_.insert(std::make_pair(it->first + frame_offset, |
199 make_pair(it->first + frame_offset, it->second.substr(frame_offset))); | 198 it->second.substr(frame_offset))); |
200 buffered_frames_.erase(buffered_frames_.begin()); | 199 buffered_frames_.erase(buffered_frames_.begin()); |
201 RecordBytesConsumed(frame_offset); | 200 RecordBytesConsumed(frame_offset); |
202 } | 201 } |
203 return static_cast<int>(num_bytes_consumed_ - initial_bytes_consumed); | 202 return static_cast<int>(num_bytes_consumed_ - initial_bytes_consumed); |
204 } | 203 } |
205 | 204 |
206 bool QuicStreamSequencer::HasBytesToRead() const { | 205 bool QuicStreamSequencer::HasBytesToRead() const { |
207 FrameMap::const_iterator it = buffered_frames_.begin(); | 206 FrameMap::const_iterator it = buffered_frames_.begin(); |
208 | 207 |
209 return it != buffered_frames_.end() && it->first == num_bytes_consumed_; | 208 return it != buffered_frames_.end() && it->first == num_bytes_consumed_; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 } | 275 } |
277 if (bytes_consumed > data->size()) { | 276 if (bytes_consumed > data->size()) { |
278 stream_->Reset(QUIC_ERROR_PROCESSING_STREAM); // Programming error | 277 stream_->Reset(QUIC_ERROR_PROCESSING_STREAM); // Programming error |
279 return; | 278 return; |
280 } else if (bytes_consumed == data->size()) { | 279 } else if (bytes_consumed == data->size()) { |
281 buffered_frames_.erase(it); | 280 buffered_frames_.erase(it); |
282 it = buffered_frames_.find(num_bytes_consumed_); | 281 it = buffered_frames_.find(num_bytes_consumed_); |
283 } else { | 282 } else { |
284 string new_data = it->second.substr(bytes_consumed); | 283 string new_data = it->second.substr(bytes_consumed); |
285 buffered_frames_.erase(it); | 284 buffered_frames_.erase(it); |
286 buffered_frames_.insert(make_pair(num_bytes_consumed_, new_data)); | 285 buffered_frames_.insert(std::make_pair(num_bytes_consumed_, new_data)); |
287 return; | 286 return; |
288 } | 287 } |
289 } | 288 } |
290 MaybeCloseStream(); | 289 MaybeCloseStream(); |
291 } | 290 } |
292 | 291 |
293 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { | 292 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { |
294 num_bytes_consumed_ += bytes_consumed; | 293 num_bytes_consumed_ += bytes_consumed; |
295 num_bytes_buffered_ -= bytes_consumed; | 294 num_bytes_buffered_ -= bytes_consumed; |
296 | 295 |
297 stream_->AddBytesConsumed(bytes_consumed); | 296 stream_->AddBytesConsumed(bytes_consumed); |
298 } | 297 } |
299 | 298 |
300 } // namespace net | 299 } // namespace net |
OLD | NEW |