Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(577)

Unified Diff: net/quic/quic_frame_list.h

Issue 1400293002: relnote: refactoring the buffering logic in QUIC's stream sequencer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: disentangle merge of 104894802 Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/net.gypi ('k') | net/quic/quic_frame_list.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/quic_frame_list.h
diff --git a/net/quic/quic_frame_list.h b/net/quic/quic_frame_list.h
new file mode 100644
index 0000000000000000000000000000000000000000..55ee80433d7cc103d4051f27c175d0b78d46e6f6
--- /dev/null
+++ b/net/quic/quic_frame_list.h
@@ -0,0 +1,99 @@
+// Copyright (c) 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_QUIC_QUIC_FRAME_LIST_H_
+#define NET_QUIC_QUIC_FRAME_LIST_H_
+
+#include "net/quic/quic_frame_list.h"
+#include "net/quic/quic_protocol.h"
+
+using base::StringPiece;
+using std::string;
+using std::list;
+
+namespace net {
+
+namespace test {
+class QuicStreamSequencerPeer;
+}
+
+class NET_EXPORT_PRIVATE QuicFrameList {
+ public:
+ // A contiguous segment received by a QUIC stream.
+ struct FrameData {
+ FrameData(QuicStreamOffset offset, string segment);
+
+ const QuicStreamOffset offset;
+ string segment;
+ };
+
+ explicit QuicFrameList();
+
+ ~QuicFrameList();
+
+ // Clear the buffer such that it is in its initial, newly constructed state.
+ void Clear() { frame_list_.clear(); }
+
+ // Returns true if there is nothing to read in this buffer.
+ bool Empty() const { return frame_list_.empty(); }
+
+ // Write the supplied data to this buffer. If the write was successful,
+ // return the number of bytes written in |bytes_written|.
+ // Return QUIC_INVALID_STREAM_DATA if |data| overlaps with existing data.
+ // No data will be written.
+ // Return QUIC_NO_ERROR, if |data| is duplicated with data written previously,
+ // and |bytes_written| = 0
+ QuicErrorCode WriteAtOffset(QuicStreamOffset offset,
+ StringPiece data,
+ size_t* bytes_written);
+
+ // Read from this buffer into given iovec array, upto number of iov_len iovec
+ // objects.
+ // Returns the number of bytes read into iov.
+ size_t ReadvAndInvalidate(const struct iovec* iov, size_t iov_len);
+
+ // Returns the readable region of valid data in iovec format. The readable
+ // region is the buffer region where there is valid data not yet read by
+ // client. ReadAndInvalidate() and WriteAtOffset() change the readable region.
+ // The return value of this function is the number of iovec entries
+ // filled into in iov. If the region is empty, one iovec entry with 0 length
+ // is returned, and the function returns 0. If there are more readable
+ // regions than iov_size, the function only processes the first
+ // iov_size of them.
+ int GetReadableRegions(struct iovec* iov, int iov_len) const;
+
+ // Called after GetReadableRegions() to accumulate total_bytes_read_ and free
+ // up block when all data in it have been read out.
+ // Pre-requisite: bytes_used <= ReadableBytes()
+ bool IncreaseTotalReadAndInvalidate(size_t bytes_used);
+
+ // Whether there are bytes can be read out (offset == total_bytes_read_)
+ bool HasBytesToRead() const;
+
+ size_t size() const { return frame_list_.size(); }
+
+ QuicStreamOffset total_bytes_read() const { return total_bytes_read_; }
+
+ private:
+ friend class test::QuicStreamSequencerPeer;
+
+ list<FrameData>::iterator FindInsertionPoint(QuicStreamOffset offset,
+ size_t len);
+
+ bool FrameOverlapsBufferedData(
+ QuicStreamOffset offset,
+ size_t data_len,
+ list<FrameData>::const_iterator insertion_point) const;
+
+ bool IsDuplicate(QuicStreamOffset offset,
+ size_t data_len,
+ list<FrameData>::const_iterator insertion_point) const;
+
+ list<FrameData> frame_list_;
+ QuicStreamOffset total_bytes_read_ = 0;
+};
+
+} // namespace net_quic
+
+#endif // NET_QUIC_QUIC_FRAME_LIST_H_
« no previous file with comments | « net/net.gypi ('k') | net/quic/quic_frame_list.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698