diff --git a/src/ring_buffer/mod.rs b/src/ring_buffer/mod.rs index be7a35cf..fcbc33e9 100644 --- a/src/ring_buffer/mod.rs +++ b/src/ring_buffer/mod.rs @@ -207,7 +207,7 @@ where let tail = self.tail.load_relaxed().into(); if head > tail { - head - tail + self.capacity().into() + 1 - head + tail } else { tail - head } diff --git a/tests/tsan.rs b/tests/tsan.rs index 8168399c..59092f13 100644 --- a/tests/tsan.rs +++ b/tests/tsan.rs @@ -172,3 +172,21 @@ fn len_properly_wraps() { rb.enqueue(4).unwrap(); assert_eq!(rb.len(), 3); } + +#[test] +fn iterator_properly_wraps() { + type N = U3; + let mut rb: RingBuffer = RingBuffer::new(); + + rb.enqueue(1).unwrap(); + rb.dequeue(); + rb.enqueue(2).unwrap(); + rb.enqueue(3).unwrap(); + rb.enqueue(4).unwrap(); + let expected = [2, 3, 4]; + let mut actual = [0, 0, 0]; + for (idx, el) in rb.iter().enumerate() { + actual[idx] = *el; + } + assert_eq!(expected, actual) +}