diff --git a/src/ring_buffer/mod.rs b/src/ring_buffer/mod.rs index 807283da..be7a35cf 100644 --- a/src/ring_buffer/mod.rs +++ b/src/ring_buffer/mod.rs @@ -335,7 +335,7 @@ macro_rules! impl_ { let tail = self.tail.load_relaxed(); if head > tail { - head - tail + self.capacity() + 1 - head + tail } else { tail - head } diff --git a/tests/tsan.rs b/tests/tsan.rs index fe9a36d9..8168399c 100644 --- a/tests/tsan.rs +++ b/tests/tsan.rs @@ -155,3 +155,20 @@ fn unchecked() { assert_eq!(rb.len(), N::to_usize() / 2); } + +#[test] +fn len_properly_wraps() { + type N = U3; + let mut rb: RingBuffer = RingBuffer::new(); + + rb.enqueue(1).unwrap(); + assert_eq!(rb.len(), 1); + rb.dequeue(); + assert_eq!(rb.len(), 0); + rb.enqueue(2).unwrap(); + assert_eq!(rb.len(), 1); + rb.enqueue(3).unwrap(); + assert_eq!(rb.len(), 2); + rb.enqueue(4).unwrap(); + assert_eq!(rb.len(), 3); +}