Skip to content

Commit 4b1fc46

Browse files
committed
Make the RingBuffer contiguous memory optimization work.
1 parent cd893e6 commit 4b1fc46

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/storage/ring_buffer.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,12 +221,14 @@ impl<'a, T: 'a> RingBuffer<'a, T> {
221221
let max_size = cmp::min(self.len(), capacity - self.read_at);
222222
let (size, result) = f(&mut self.storage[self.read_at..self.read_at + max_size]);
223223
assert!(size <= max_size);
224-
self.read_at = if capacity > 0 {
224+
self.length -= size;
225+
self.read_at = if self.length > 0 {
225226
(self.read_at + size) % capacity
226227
} else {
228+
// Ring is currently empty, reset `read_at` to optimize
229+
// for contiguous space.
227230
0
228231
};
229-
self.length -= size;
230232
(size, result)
231233
}
232234

@@ -659,13 +661,13 @@ mod test {
659661
ring.dequeue_many(6).copy_from_slice(b"ABCDEF");
660662

661663
assert_eq!(ring.write_unallocated(0, b"ghi"), 3);
662-
assert_eq!(&ring.storage[..], b"ABCDEFghi...");
664+
assert_eq!(&ring.storage[..], b"ghiDEF......");
663665

664666
assert_eq!(ring.write_unallocated(3, b"jklmno"), 6);
665-
assert_eq!(&ring.storage[..], b"mnoDEFghijkl");
667+
assert_eq!(&ring.storage[..], b"ghijklmno...");
666668

667669
assert_eq!(ring.write_unallocated(9, b"pqrstu"), 3);
668-
assert_eq!(&ring.storage[..], b"mnopqrghijkl");
670+
assert_eq!(&ring.storage[..], b"ghijklmnopqr");
669671
}
670672

671673
#[test]

0 commit comments

Comments
 (0)