| 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; | 14 using std::make_pair; |
| 15 using std::min; | 15 using std::min; |
| 16 using std::numeric_limits; | 16 using std::numeric_limits; |
| 17 using std::string; | 17 using std::string; |
| 18 | 18 |
| 19 namespace net { | 19 namespace net { |
| 20 | 20 |
| 21 QuicStreamSequencer::QuicStreamSequencer(ReliableQuicStream* quic_stream) | 21 QuicStreamSequencer::QuicStreamSequencer(ReliableQuicStream* quic_stream) |
| 22 : stream_(quic_stream), | 22 : stream_(quic_stream), |
| 23 num_bytes_consumed_(0), | 23 num_bytes_consumed_(0), |
| 24 close_offset_(numeric_limits<QuicStreamOffset>::max()), | 24 close_offset_(numeric_limits<QuicStreamOffset>::max()), |
| 25 blocked_(false), | 25 blocked_(false), |
| 26 num_bytes_buffered_(0), | 26 num_bytes_buffered_(0), |
| 27 num_frames_received_(0), | 27 num_frames_received_(0), |
| 28 num_duplicate_frames_received_(0) { | 28 num_duplicate_frames_received_(0), |
| 29 num_early_frames_received_(0) { |
| 29 } | 30 } |
| 30 | 31 |
| 31 QuicStreamSequencer::~QuicStreamSequencer() { | 32 QuicStreamSequencer::~QuicStreamSequencer() { |
| 32 } | 33 } |
| 33 | 34 |
| 34 void QuicStreamSequencer::OnStreamFrame(const QuicStreamFrame& frame) { | 35 void QuicStreamSequencer::OnStreamFrame(const QuicStreamFrame& frame) { |
| 35 ++num_frames_received_; | 36 ++num_frames_received_; |
| 36 if (IsDuplicate(frame)) { | 37 if (IsDuplicate(frame)) { |
| 37 ++num_duplicate_frames_received_; | 38 ++num_duplicate_frames_received_; |
| 38 // Silently ignore duplicates. | 39 // Silently ignore duplicates. |
| (...skipping 18 matching lines...) Expand all Loading... |
| 57 if (frame.fin) { | 58 if (frame.fin) { |
| 58 CloseStreamAtOffset(frame.offset + data_len); | 59 CloseStreamAtOffset(frame.offset + data_len); |
| 59 if (data_len == 0) { | 60 if (data_len == 0) { |
| 60 return; | 61 return; |
| 61 } | 62 } |
| 62 } | 63 } |
| 63 | 64 |
| 64 IOVector data; | 65 IOVector data; |
| 65 data.AppendIovec(frame.data.iovec(), frame.data.Size()); | 66 data.AppendIovec(frame.data.iovec(), frame.data.Size()); |
| 66 | 67 |
| 68 if (byte_offset > num_bytes_consumed_) { |
| 69 ++num_early_frames_received_; |
| 70 } |
| 71 |
| 67 // If the frame has arrived in-order then we can process it immediately, only | 72 // If the frame has arrived in-order then we can process it immediately, only |
| 68 // buffering if the stream is unable to process it. | 73 // buffering if the stream is unable to process it. |
| 69 if (!blocked_ && byte_offset == num_bytes_consumed_) { | 74 if (!blocked_ && byte_offset == num_bytes_consumed_) { |
| 70 DVLOG(1) << "Processing byte offset " << byte_offset; | 75 DVLOG(1) << "Processing byte offset " << byte_offset; |
| 71 size_t bytes_consumed = 0; | 76 size_t bytes_consumed = 0; |
| 72 for (size_t i = 0; i < data.Size(); ++i) { | 77 for (size_t i = 0; i < data.Size(); ++i) { |
| 73 bytes_consumed += stream_->ProcessRawData( | 78 bytes_consumed += stream_->ProcessRawData( |
| 74 static_cast<char*>(data.iovec()[i].iov_base), | 79 static_cast<char*>(data.iovec()[i].iov_base), |
| 75 data.iovec()[i].iov_len); | 80 data.iovec()[i].iov_len); |
| 76 } | 81 } |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 286 } | 291 } |
| 287 | 292 |
| 288 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { | 293 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { |
| 289 num_bytes_consumed_ += bytes_consumed; | 294 num_bytes_consumed_ += bytes_consumed; |
| 290 num_bytes_buffered_ -= bytes_consumed; | 295 num_bytes_buffered_ -= bytes_consumed; |
| 291 | 296 |
| 292 stream_->AddBytesConsumed(bytes_consumed); | 297 stream_->AddBytesConsumed(bytes_consumed); |
| 293 } | 298 } |
| 294 | 299 |
| 295 } // namespace net | 300 } // namespace net |
| OLD | NEW |