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 |