diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-02-21 21:51:43 +0100 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-02-21 22:13:35 +0100 |
| commit | 1f17fdf84ee30f989a1a5bd8945a76a9f5edac4b (patch) | |
| tree | cf3a55b9b72cd836b79ac56b5ce0d36b5a9100d7 /embassy-hal-internal/src/atomic_ring_buffer.rs | |
| parent | c2e429205d2834f255e065475cefd123448d156a (diff) | |
nrf/buffered_uart: refactor so rx/tx halves are independent.
Diffstat (limited to 'embassy-hal-internal/src/atomic_ring_buffer.rs')
| -rw-r--r-- | embassy-hal-internal/src/atomic_ring_buffer.rs | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/embassy-hal-internal/src/atomic_ring_buffer.rs b/embassy-hal-internal/src/atomic_ring_buffer.rs index b4f2cec28..34ceac852 100644 --- a/embassy-hal-internal/src/atomic_ring_buffer.rs +++ b/embassy-hal-internal/src/atomic_ring_buffer.rs | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | //! Atomic reusable ringbuffer. | 1 | //! Atomic reusable ringbuffer. |
| 2 | use core::slice; | ||
| 3 | use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; | 2 | use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; |
| 3 | use core::{ptr, slice}; | ||
| 4 | 4 | ||
| 5 | /// Atomic reusable ringbuffer | 5 | /// Atomic reusable ringbuffer |
| 6 | /// | 6 | /// |
| @@ -73,6 +73,7 @@ impl RingBuffer { | |||
| 73 | pub unsafe fn deinit(&self) { | 73 | pub unsafe fn deinit(&self) { |
| 74 | // Ordering: it's OK to use `Relaxed` because this is not called | 74 | // Ordering: it's OK to use `Relaxed` because this is not called |
| 75 | // concurrently with other methods. | 75 | // concurrently with other methods. |
| 76 | self.buf.store(ptr::null_mut(), Ordering::Relaxed); | ||
| 76 | self.len.store(0, Ordering::Relaxed); | 77 | self.len.store(0, Ordering::Relaxed); |
| 77 | self.start.store(0, Ordering::Relaxed); | 78 | self.start.store(0, Ordering::Relaxed); |
| 78 | self.end.store(0, Ordering::Relaxed); | 79 | self.end.store(0, Ordering::Relaxed); |
| @@ -82,20 +83,46 @@ impl RingBuffer { | |||
| 82 | /// | 83 | /// |
| 83 | /// # Safety | 84 | /// # Safety |
| 84 | /// | 85 | /// |
| 85 | /// Only one reader can exist at a time. | 86 | /// - Only one reader can exist at a time. |
| 87 | /// - Ringbuffer must be initialized. | ||
| 86 | pub unsafe fn reader(&self) -> Reader<'_> { | 88 | pub unsafe fn reader(&self) -> Reader<'_> { |
| 87 | Reader(self) | 89 | Reader(self) |
| 88 | } | 90 | } |
| 89 | 91 | ||
| 92 | /// Try creating a reader, fails if not initialized. | ||
| 93 | /// | ||
| 94 | /// # Safety | ||
| 95 | /// | ||
| 96 | /// Only one reader can exist at a time. | ||
| 97 | pub unsafe fn try_reader(&self) -> Option<Reader<'_>> { | ||
| 98 | if self.buf.load(Ordering::Relaxed).is_null() { | ||
| 99 | return None; | ||
| 100 | } | ||
| 101 | Some(Reader(self)) | ||
| 102 | } | ||
| 103 | |||
| 90 | /// Create a writer. | 104 | /// Create a writer. |
| 91 | /// | 105 | /// |
| 92 | /// # Safety | 106 | /// # Safety |
| 93 | /// | 107 | /// |
| 94 | /// Only one writer can exist at a time. | 108 | /// - Only one writer can exist at a time. |
| 109 | /// - Ringbuffer must be initialized. | ||
| 95 | pub unsafe fn writer(&self) -> Writer<'_> { | 110 | pub unsafe fn writer(&self) -> Writer<'_> { |
| 96 | Writer(self) | 111 | Writer(self) |
| 97 | } | 112 | } |
| 98 | 113 | ||
| 114 | /// Try creating a writer, fails if not initialized. | ||
| 115 | /// | ||
| 116 | /// # Safety | ||
| 117 | /// | ||
| 118 | /// Only one writer can exist at a time. | ||
| 119 | pub unsafe fn try_writer(&self) -> Option<Writer<'_>> { | ||
| 120 | if self.buf.load(Ordering::Relaxed).is_null() { | ||
| 121 | return None; | ||
| 122 | } | ||
| 123 | Some(Writer(self)) | ||
| 124 | } | ||
| 125 | |||
| 99 | /// Return length of buffer. | 126 | /// Return length of buffer. |
| 100 | pub fn len(&self) -> usize { | 127 | pub fn len(&self) -> usize { |
| 101 | self.len.load(Ordering::Relaxed) | 128 | self.len.load(Ordering::Relaxed) |
