Index: net/quic/quic_frame_list.cc |
diff --git a/net/quic/quic_frame_list.cc b/net/quic/quic_frame_list.cc |
index a69c7c619991b3991d2b90587093eeec4e8eb858..61c15d41c375720cf6b8ca7edcbf0fd919d5f68d 100644 |
--- a/net/quic/quic_frame_list.cc |
+++ b/net/quic/quic_frame_list.cc |
@@ -8,8 +8,10 @@ |
namespace net { |
-QuicFrameList::FrameData::FrameData(QuicStreamOffset offset, string segment) |
- : offset(offset), segment(segment) {} |
+QuicFrameList::FrameData::FrameData(QuicStreamOffset offset, |
+ string segment, |
+ const QuicTime timestamp) |
+ : offset(offset), segment(segment), timestamp(timestamp) {} |
QuicFrameList::QuicFrameList() {} |
@@ -19,6 +21,7 @@ QuicFrameList::~QuicFrameList() { |
QuicErrorCode QuicFrameList::WriteAtOffset(QuicStreamOffset offset, |
StringPiece data, |
+ QuicTime timestamp, |
size_t* const bytes_written) { |
*bytes_written = 0; |
const size_t data_len = data.size(); |
@@ -33,7 +36,8 @@ QuicErrorCode QuicFrameList::WriteAtOffset(QuicStreamOffset offset, |
DVLOG(1) << "Buffering stream data at offset " << offset; |
// Inserting an empty string and then copying to avoid the extra copy. |
- insertion_point = frame_list_.insert(insertion_point, FrameData(offset, "")); |
+ insertion_point = |
+ frame_list_.insert(insertion_point, FrameData(offset, "", timestamp)); |
data.CopyToString(&insertion_point->segment); |
*bytes_written = data_len; |
return QUIC_NO_ERROR; |
@@ -124,6 +128,19 @@ int QuicFrameList::GetReadableRegions(struct iovec* iov, int iov_len) const { |
return index; |
} |
+bool QuicFrameList::GetReadableRegion(iovec* iov, QuicTime* timestamp) const { |
+ list<FrameData>::const_iterator it = frame_list_.begin(); |
+ if (it == frame_list_.end() || it->offset != total_bytes_read_) { |
+ return false; |
+ } |
+ iov->iov_base = static_cast<void*>(const_cast<char*>(it->segment.data())); |
+ iov->iov_len = it->segment.size(); |
+ if (timestamp) { |
+ *timestamp = it->timestamp; |
+ } |
+ return true; |
+} |
+ |
bool QuicFrameList::IncreaseTotalReadAndInvalidate(size_t bytes_used) { |
size_t end_offset = total_bytes_read_ + bytes_used; |
while (!frame_list_.empty() && end_offset != total_bytes_read_) { |
@@ -143,8 +160,9 @@ bool QuicFrameList::IncreaseTotalReadAndInvalidate(size_t bytes_used) { |
size_t delta = end_offset - it->offset; |
total_bytes_read_ += delta; |
string new_data = it->segment.substr(delta); |
+ const QuicTime timestamp = it->timestamp; |
frame_list_.erase(it); |
- frame_list_.push_front(FrameData(total_bytes_read_, new_data)); |
+ frame_list_.push_front(FrameData(total_bytes_read_, new_data, timestamp)); |
break; |
} |
return true; |
@@ -183,8 +201,9 @@ size_t QuicFrameList::ReadvAndInvalidate(const struct iovec* iov, |
} |
// Done copying. If there is a partial frame, update it. |
if (frame_offset != 0) { |
- frame_list_.push_front( |
- FrameData(it->offset + frame_offset, it->segment.substr(frame_offset))); |
+ frame_list_.push_front(FrameData(it->offset + frame_offset, |
+ it->segment.substr(frame_offset), |
+ it->timestamp)); |
frame_list_.erase(it); |
total_bytes_read_ += frame_offset; |
} |