| 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 |