aboutsummaryrefslogtreecommitdiff
path: root/rtic-sync/src/channel.rs
diff options
context:
space:
mode:
authordatdenkikniet <jcdra1@gmail.com>2025-03-13 21:42:02 +0100
committerEmil Fresk <emil.fresk@gmail.com>2025-03-16 11:19:22 +0000
commite59848075d26096188940d87f5b7b2364b2539bb (patch)
tree1096eaf8aad6fdaae81c728722ea9f5ff7bb1630 /rtic-sync/src/channel.rs
parent76631309efe237080fc48e5a29e4274230e0a11f (diff)
rtic-sync: improve safety comments
Diffstat (limited to 'rtic-sync/src/channel.rs')
-rw-r--r--rtic-sync/src/channel.rs11
1 files changed, 5 insertions, 6 deletions
diff --git a/rtic-sync/src/channel.rs b/rtic-sync/src/channel.rs
index a83cfb2..a788880 100644
--- a/rtic-sync/src/channel.rs
+++ b/rtic-sync/src/channel.rs
@@ -216,7 +216,7 @@ impl SlotPtr {
/// Replace the value of this slot with `new_value`, and return
/// the old value.
///
- /// SAFETY: the pointer in this `SlotPtr` must still be valid.
+ /// SAFETY: the pointer in this `SlotPtr` must be valid for writes.
unsafe fn replace(
&mut self,
new_value: Option<u8>,
@@ -317,7 +317,7 @@ impl<T, const N: usize> Sender<'_, T, N> {
// is no way for anything else to access the free slot ptr. Gotta think
// about this a bit more...
//
- // SAFETY(replace): the data pointed to by `free_slot_ptr2` is still alive.
+ // SAFETY(replace): `free_slot_ptr2` is valid for writes.
critical_section::with(|cs| {
if let Some(freed_slot) = unsafe { free_slot_ptr2.replace(None, cs) } {
debug_assert!(!self.0.access(cs).freeq.is_full());
@@ -362,9 +362,8 @@ impl<T, const N: usize> Sender<'_, T, N> {
}
}
- // SAFETY: the value pointed to by `free_slot_ptr` is still alive.
- let slot = unsafe { free_slot_ptr.replace(None, cs) }
- .or_else(|| self.0.access(cs).freeq.pop_back());
+ // SAFETY: `free_slot_ptr` is valid for writes, as `free_slot_ptr` is still alive.
+ let slot = unsafe { free_slot_ptr.replace(None, cs) };
if let Some(slot) = slot {
Poll::Ready(Ok(slot))
@@ -475,7 +474,7 @@ impl<T, const N: usize> Receiver<'_, T, N> {
// If someone is waiting in the WaiterQueue, wake the first one up & hand it the free slot.
if let Some((wait_head, mut freeq_slot)) = self.0.wait_queue.pop() {
- // SAFETY: the value pointed to by `freeq_slot` is still alive: we are in a critical
+ // SAFETY: `freeq_slot` is valid for writes: we are in a critical
// section & the `SlotPtr` lives for at least the duration of the wait queue link.
unsafe { freeq_slot.replace(Some(rs), cs) };
wait_head.wake();