OLD | NEW |
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2015 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 #ifndef NET_QUIC_QUIC_FRAME_LIST_H_ | 5 #ifndef NET_QUIC_QUIC_FRAME_LIST_H_ |
6 #define NET_QUIC_QUIC_FRAME_LIST_H_ | 6 #define NET_QUIC_QUIC_FRAME_LIST_H_ |
7 | 7 |
8 #include "net/quic/quic_frame_list.h" | |
9 #include "net/quic/quic_protocol.h" | 8 #include "net/quic/quic_protocol.h" |
| 9 #include "net/quic/quic_stream_sequencer_buffer_interface.h" |
10 | 10 |
11 using base::StringPiece; | 11 using base::StringPiece; |
12 using std::string; | 12 using std::string; |
13 using std::list; | 13 using std::list; |
14 | 14 |
15 namespace net { | 15 namespace net { |
16 | 16 |
17 namespace test { | 17 namespace test { |
18 class QuicStreamSequencerPeer; | 18 class QuicStreamSequencerPeer; |
19 } | 19 } |
20 | 20 |
21 class NET_EXPORT_PRIVATE QuicFrameList { | 21 class NET_EXPORT_PRIVATE QuicFrameList |
| 22 : public QuicStreamSequencerBufferInterface { |
22 public: | 23 public: |
23 // A contiguous segment received by a QUIC stream. | 24 // A contiguous segment received by a QUIC stream. |
24 struct FrameData { | 25 struct FrameData { |
25 FrameData(QuicStreamOffset offset, | 26 FrameData(QuicStreamOffset offset, |
26 string segment, | 27 string segment, |
27 const QuicTime timestamp); | 28 const QuicTime timestamp); |
28 | 29 |
29 const QuicStreamOffset offset; | 30 const QuicStreamOffset offset; |
30 string segment; | 31 string segment; |
31 const QuicTime timestamp; | 32 const QuicTime timestamp; |
32 }; | 33 }; |
33 | 34 |
34 explicit QuicFrameList(); | 35 explicit QuicFrameList(); |
35 | 36 |
36 ~QuicFrameList(); | 37 ~QuicFrameList() override; |
37 | 38 |
38 // Clear the buffer such that it is in its initial, newly constructed state. | 39 // QuicStreamSequencerBufferInterface implementation |
39 void Clear() { frame_list_.clear(); } | 40 void Clear() override; |
40 | 41 bool Empty() const override; |
41 // Returns true if there is nothing to read in this buffer. | 42 QuicErrorCode OnStreamData(QuicStreamOffset offset, |
42 bool Empty() const { return frame_list_.empty(); } | 43 StringPiece data, |
43 | 44 QuicTime timestamp, |
44 // Write the supplied data to this buffer. |timestamp| is used for | 45 size_t* bytes_buffered) override; |
45 // measuring head of line (HOL) blocking. If the write was | 46 size_t Readv(const struct iovec* iov, size_t iov_len) override; |
46 // successful, return the number of bytes written in | 47 int GetReadableRegions(struct iovec* iov, int iov_len) const override; |
47 // |bytes_written|. Return QUIC_INVALID_STREAM_DATA if |data| | 48 bool GetReadableRegion(iovec* iov, QuicTime* timestamp) const override; |
48 // overlaps with existing data. No data will be written. Return | 49 bool MarkConsumed(size_t bytes_used) override; |
49 // QUIC_NO_ERROR, if |data| is duplicated with data written | 50 size_t FlushBufferedFrames() override; |
50 // previously, and |bytes_written| = 0 | 51 bool HasBytesToRead() const override; |
51 QuicErrorCode WriteAtOffset(QuicStreamOffset offset, | 52 QuicStreamOffset BytesConsumed() const override; |
52 StringPiece data, | 53 size_t BytesBuffered() const override; |
53 QuicTime timestamp, | |
54 size_t* bytes_written); | |
55 | |
56 // Read from this buffer into given iovec array, upto number of iov_len iovec | |
57 // objects. | |
58 // Returns the number of bytes read into iov. | |
59 size_t ReadvAndInvalidate(const struct iovec* iov, size_t iov_len); | |
60 | |
61 // Invalidate all currently readable bytes. | |
62 // Returns the number of bytes invalidated. | |
63 size_t FlushBufferedFrames(); | |
64 | |
65 // Returns the readable region of valid data in iovec format. The readable | |
66 // region is the buffer region where there is valid data not yet read by | |
67 // client. ReadAndInvalidate() and WriteAtOffset() change the readable region. | |
68 // The return value of this function is the number of iovec entries | |
69 // filled into in iov. If the region is empty, one iovec entry with 0 length | |
70 // is returned, and the function returns 0. If there are more readable | |
71 // regions than iov_size, the function only processes the first | |
72 // iov_size of them. | |
73 int GetReadableRegions(struct iovec* iov, int iov_len) const; | |
74 | |
75 // Fills in one iovec with the next readable region. |timestamp| is | |
76 // data arrived at the sequencer, and is used for measuring head of | |
77 // line blocking (HOL). Returns false if there is no readable | |
78 // region available. | |
79 bool GetReadableRegion(iovec* iov, QuicTime* timestamp) const; | |
80 | |
81 // Called after GetReadableRegions() to accumulate total_bytes_read_ and free | |
82 // up block when all data in it have been read out. | |
83 // Pre-requisite: bytes_used <= ReadableBytes() | |
84 bool IncreaseTotalReadAndInvalidate(size_t bytes_used); | |
85 | |
86 // Whether there are bytes can be read out (offset == total_bytes_read_) | |
87 bool HasBytesToRead() const; | |
88 | |
89 size_t size() const { return frame_list_.size(); } | |
90 | |
91 QuicStreamOffset total_bytes_read() const { return total_bytes_read_; } | |
92 | 54 |
93 private: | 55 private: |
94 friend class test::QuicStreamSequencerPeer; | 56 friend class test::QuicStreamSequencerPeer; |
95 | 57 |
96 list<FrameData>::iterator FindInsertionPoint(QuicStreamOffset offset, | 58 list<FrameData>::iterator FindInsertionPoint(QuicStreamOffset offset, |
97 size_t len); | 59 size_t len); |
98 | 60 |
99 bool FrameOverlapsBufferedData( | 61 bool FrameOverlapsBufferedData( |
100 QuicStreamOffset offset, | 62 QuicStreamOffset offset, |
101 size_t data_len, | 63 size_t data_len, |
102 list<FrameData>::const_iterator insertion_point) const; | 64 list<FrameData>::const_iterator insertion_point) const; |
103 | 65 |
104 bool IsDuplicate(QuicStreamOffset offset, | 66 bool IsDuplicate(QuicStreamOffset offset, |
105 size_t data_len, | 67 size_t data_len, |
106 list<FrameData>::const_iterator insertion_point) const; | 68 list<FrameData>::const_iterator insertion_point) const; |
107 | 69 |
108 list<FrameData> frame_list_; | 70 list<FrameData> frame_list_; |
| 71 |
| 72 // Number of bytes in buffer. |
| 73 size_t num_bytes_buffered_ = 0; |
| 74 |
109 QuicStreamOffset total_bytes_read_ = 0; | 75 QuicStreamOffset total_bytes_read_ = 0; |
110 }; | 76 }; |
111 | 77 |
112 } // namespace net_quic | 78 } // namespace net |
113 | 79 |
114 #endif // NET_QUIC_QUIC_FRAME_LIST_H_ | 80 #endif // NET_QUIC_QUIC_FRAME_LIST_H_ |
OLD | NEW |