From 0172082262f2f7185c3159dd3d1a6cf5f17358bd Mon Sep 17 00:00:00 2001 From: Reece Stevens Date: Tue, 19 Jun 2018 23:21:14 -0500 Subject: [PATCH] Fix len miscalculation when head > tail --- src/ring_buffer/mod.rs | 2 +- tests/tsan.rs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) 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); +}