diff options
| author | Dario Nieuwenhuis <[email protected]> | 2022-12-19 01:15:32 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2022-12-19 01:22:41 +0100 |
| commit | feaeb533fb5963e9d603ccb5143662b21daed2d8 (patch) | |
| tree | 250ffae600d8edd9a9fc60abc570d7c905313ecd /embassy-hal-common/src/atomic_ring_buffer.rs | |
| parent | ebc735008f0b1725b22c944cc5f95fe1aacc665b (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.rs | 24 |
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 | } |
