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" |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 data.Consume(bytes_consumed); | 91 data.Consume(bytes_consumed); |
92 byte_offset += bytes_consumed; | 92 byte_offset += bytes_consumed; |
93 } | 93 } |
94 } | 94 } |
95 | 95 |
96 // Buffer any remaining data to be consumed by the stream when ready. | 96 // Buffer any remaining data to be consumed by the stream when ready. |
97 for (size_t i = 0; i < data.Size(); ++i) { | 97 for (size_t i = 0; i < data.Size(); ++i) { |
98 DVLOG(1) << "Buffering stream data at offset " << byte_offset; | 98 DVLOG(1) << "Buffering stream data at offset " << byte_offset; |
99 const iovec& iov = data.iovec()[i]; | 99 const iovec& iov = data.iovec()[i]; |
100 buffered_frames_.insert(make_pair( | 100 buffered_frames_.insert(make_pair( |
101 byte_offset, string(static_cast<char*>(iov.iov_base), iov.iov_len))); | 101 byte_offset, |
| 102 std::string(static_cast<char*>(iov.iov_base), iov.iov_len))); |
102 byte_offset += iov.iov_len; | 103 byte_offset += iov.iov_len; |
103 num_bytes_buffered_ += iov.iov_len; | 104 num_bytes_buffered_ += iov.iov_len; |
104 } | 105 } |
105 return; | 106 return; |
106 } | 107 } |
107 | 108 |
108 void QuicStreamSequencer::CloseStreamAtOffset(QuicStreamOffset offset) { | 109 void QuicStreamSequencer::CloseStreamAtOffset(QuicStreamOffset offset) { |
109 const QuicStreamOffset kMaxOffset = numeric_limits<QuicStreamOffset>::max(); | 110 const QuicStreamOffset kMaxOffset = numeric_limits<QuicStreamOffset>::max(); |
110 | 111 |
111 // If we have a scheduled termination or close, any new offset should match | 112 // If we have a scheduled termination or close, any new offset should match |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 | 255 |
255 void QuicStreamSequencer::SetBlockedUntilFlush() { | 256 void QuicStreamSequencer::SetBlockedUntilFlush() { |
256 blocked_ = true; | 257 blocked_ = true; |
257 } | 258 } |
258 | 259 |
259 void QuicStreamSequencer::FlushBufferedFrames() { | 260 void QuicStreamSequencer::FlushBufferedFrames() { |
260 blocked_ = false; | 261 blocked_ = false; |
261 FrameMap::iterator it = buffered_frames_.find(num_bytes_consumed_); | 262 FrameMap::iterator it = buffered_frames_.find(num_bytes_consumed_); |
262 while (it != buffered_frames_.end()) { | 263 while (it != buffered_frames_.end()) { |
263 DVLOG(1) << "Flushing buffered packet at offset " << it->first; | 264 DVLOG(1) << "Flushing buffered packet at offset " << it->first; |
264 string* data = &it->second; | 265 std::string* data = &it->second; |
265 size_t bytes_consumed = stream_->ProcessRawData(data->c_str(), | 266 size_t bytes_consumed = stream_->ProcessRawData(data->c_str(), |
266 data->size()); | 267 data->size()); |
267 RecordBytesConsumed(bytes_consumed); | 268 RecordBytesConsumed(bytes_consumed); |
268 if (MaybeCloseStream()) { | 269 if (MaybeCloseStream()) { |
269 return; | 270 return; |
270 } | 271 } |
271 if (bytes_consumed > data->size()) { | 272 if (bytes_consumed > data->size()) { |
272 stream_->Reset(QUIC_ERROR_PROCESSING_STREAM); // Programming error | 273 stream_->Reset(QUIC_ERROR_PROCESSING_STREAM); // Programming error |
273 return; | 274 return; |
274 } else if (bytes_consumed == data->size()) { | 275 } else if (bytes_consumed == data->size()) { |
275 buffered_frames_.erase(it); | 276 buffered_frames_.erase(it); |
276 it = buffered_frames_.find(num_bytes_consumed_); | 277 it = buffered_frames_.find(num_bytes_consumed_); |
277 } else { | 278 } else { |
278 string new_data = it->second.substr(bytes_consumed); | 279 std::string new_data = it->second.substr(bytes_consumed); |
279 buffered_frames_.erase(it); | 280 buffered_frames_.erase(it); |
280 buffered_frames_.insert(make_pair(num_bytes_consumed_, new_data)); | 281 buffered_frames_.insert(make_pair(num_bytes_consumed_, new_data)); |
281 return; | 282 return; |
282 } | 283 } |
283 } | 284 } |
284 MaybeCloseStream(); | 285 MaybeCloseStream(); |
285 } | 286 } |
286 | 287 |
287 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { | 288 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { |
288 num_bytes_consumed_ += bytes_consumed; | 289 num_bytes_consumed_ += bytes_consumed; |
289 num_bytes_buffered_ -= bytes_consumed; | 290 num_bytes_buffered_ -= bytes_consumed; |
290 | 291 |
291 stream_->AddBytesConsumed(bytes_consumed); | 292 stream_->AddBytesConsumed(bytes_consumed); |
292 } | 293 } |
293 | 294 |
294 } // namespace net | 295 } // namespace net |
OLD | NEW |