aboutsummaryrefslogtreecommitdiff
path: root/embassy-hal-common/src/atomic_ring_buffer.rs
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2022-12-19 01:15:32 +0100
committerDario Nieuwenhuis <[email protected]>2022-12-19 01:22:41 +0100
commitfeaeb533fb5963e9d603ccb5143662b21daed2d8 (patch)
tree250ffae600d8edd9a9fc60abc570d7c905313ecd /embassy-hal-common/src/atomic_ring_buffer.rs
parentebc735008f0b1725b22c944cc5f95fe1aacc665b (diff)
hal-common/atomic_ring_buffer: fix crashes when len=0
Diffstat (limited to 'embassy-hal-common/src/atomic_ring_buffer.rs')
-rw-r--r--embassy-hal-common/src/atomic_ring_buffer.rs24
1 files changed, 22 insertions, 2 deletions
diff --git a/embassy-hal-common/src/atomic_ring_buffer.rs b/embassy-hal-common/src/atomic_ring_buffer.rs
index c5e444306..3e90b0870 100644
--- a/embassy-hal-common/src/atomic_ring_buffer.rs
+++ b/embassy-hal-common/src/atomic_ring_buffer.rs
@@ -82,10 +82,11 @@ impl RingBuffer {
82 } 82 }
83 83
84 pub fn is_full(&self) -> bool { 84 pub fn is_full(&self) -> bool {
85 let len = self.len.load(Ordering::Relaxed);
85 let start = self.start.load(Ordering::Relaxed); 86 let start = self.start.load(Ordering::Relaxed);
86 let end = self.end.load(Ordering::Relaxed); 87 let end = self.end.load(Ordering::Relaxed);
87 88
88 self.wrap(end + 1) == start 89 len == 0 || self.wrap(end + 1) == start
89 } 90 }
90 91
91 pub fn is_empty(&self) -> bool { 92 pub fn is_empty(&self) -> bool {
@@ -154,7 +155,7 @@ impl<'a> Writer<'a> {
154 let end = self.0.end.load(Ordering::Relaxed); 155 let end = self.0.end.load(Ordering::Relaxed);
155 156
156 let n = if start <= end { 157 let n = if start <= end {
157 len - end - (start == 0) as usize 158 len - end - (start == 0 && len != 0) as usize
158 } else { 159 } else {
159 start - end - 1 160 start - end - 1
160 }; 161 };
@@ -328,4 +329,23 @@ mod tests {
328 assert_eq!(rb.is_full(), true); 329 assert_eq!(rb.is_full(), true);
329 } 330 }
330 } 331 }
332
333 #[test]
334 fn zero_len() {
335 let rb = RingBuffer::new();
336 unsafe {
337 assert_eq!(rb.is_empty(), true);
338 assert_eq!(rb.is_full(), true);
339
340 rb.writer().push(|buf| {
341 assert_eq!(0, buf.len());
342 0
343 });
344
345 rb.reader().pop(|buf| {
346 assert_eq!(0, buf.len());
347 0
348 });
349 }
350 }
331} 351}