Implement QuicStreamSequencerBuffer::PeekRegion().
gfe-relnote: n/a, no functional change.
PiperOrigin-RevId: 254856738
Change-Id: I34f1fd30429f8d5d403fa17fc1f4a127c074f952
diff --git a/quic/core/quic_stream_sequencer_buffer.cc b/quic/core/quic_stream_sequencer_buffer.cc
index 47211cc..f4ff276 100644
--- a/quic/core/quic_stream_sequencer_buffer.cc
+++ b/quic/core/quic_stream_sequencer_buffer.cc
@@ -335,18 +335,23 @@
return GetReadableRegions(iov, 1) == 1;
}
-bool QuicStreamSequencerBuffer::PrefetchNextRegion(iovec* iov) {
- DCHECK(iov != nullptr);
- DCHECK_LE(total_bytes_read_, total_bytes_prefetched_);
- DCHECK_LE(total_bytes_prefetched_, FirstMissingByte());
+bool QuicStreamSequencerBuffer::PeekRegion(QuicStreamOffset offset,
+ iovec* iov) const {
+ DCHECK(iov);
- if (total_bytes_prefetched_ == FirstMissingByte()) {
+ if (offset < total_bytes_read_) {
+ // Data at |offset| has already been consumed.
+ return false;
+ }
+
+ if (offset >= FirstMissingByte()) {
+ // Data at |offset| has not been received yet.
return false;
}
// Beginning of region.
- size_t block_idx = GetBlockIndex(total_bytes_prefetched_);
- size_t block_offset = GetInBlockOffset(total_bytes_prefetched_);
+ size_t block_idx = GetBlockIndex(offset);
+ size_t block_offset = GetInBlockOffset(offset);
iov->iov_base = blocks_[block_idx]->buffer + block_offset;
// Determine if entire block has been received.
@@ -359,6 +364,18 @@
iov->iov_len = GetBlockCapacity(block_idx) - block_offset;
}
+ return true;
+}
+
+bool QuicStreamSequencerBuffer::PrefetchNextRegion(iovec* iov) {
+ DCHECK(iov);
+ DCHECK_LE(total_bytes_read_, total_bytes_prefetched_);
+ DCHECK_LE(total_bytes_prefetched_, FirstMissingByte());
+
+ if (!PeekRegion(total_bytes_prefetched_, iov)) {
+ return false;
+ }
+
total_bytes_prefetched_ += iov->iov_len;
return true;
}