aboutsummaryrefslogtreecommitdiff
path: root/embassy-sync/src
diff options
context:
space:
mode:
authorTobias Naumann <[email protected]>2025-03-31 16:48:13 +0200
committerTobias Naumann <[email protected]>2025-03-31 16:48:13 +0200
commitc29fc3532b34633b2234c26a7e41e8ba6d628e7f (patch)
tree667bc74b504a65592c805fd3f66197bd2126801f /embassy-sync/src
parent14d079ae84ac28ce860015ad6ca8d040edf3f065 (diff)
parent4d9b41714da77d82811f39bd6feabe161e93552c (diff)
Merge branch 'main' into fix/ringbuffered-error-handling to resolve merge conflicts
Diffstat (limited to 'embassy-sync/src')
-rw-r--r--embassy-sync/src/blocking_mutex/mod.rs17
-rw-r--r--embassy-sync/src/zerocopy_channel.rs2
2 files changed, 18 insertions, 1 deletions
diff --git a/embassy-sync/src/blocking_mutex/mod.rs b/embassy-sync/src/blocking_mutex/mod.rs
index beafdb43d..a41bc3569 100644
--- a/embassy-sync/src/blocking_mutex/mod.rs
+++ b/embassy-sync/src/blocking_mutex/mod.rs
@@ -50,6 +50,23 @@ impl<R: RawMutex, T> Mutex<R, T> {
50 f(inner) 50 f(inner)
51 }) 51 })
52 } 52 }
53
54 /// Creates a critical section and grants temporary mutable access to the protected data.
55 ///
56 /// # Safety
57 ///
58 /// This method is marked unsafe because calling this method re-entrantly, i.e. within
59 /// another `lock_mut` or `lock` closure, violates Rust's aliasing rules. Calling this
60 /// method at the same time from different tasks is safe. For a safe alternative with
61 /// mutable access that never causes UB, use a `RefCell` in a `Mutex`.
62 pub unsafe fn lock_mut<U>(&self, f: impl FnOnce(&mut T) -> U) -> U {
63 self.raw.lock(|| {
64 let ptr = self.data.get() as *mut T;
65 // Safety: we have exclusive access to the data, as long as this mutex is not locked re-entrantly
66 let inner = unsafe { &mut *ptr };
67 f(inner)
68 })
69 }
53} 70}
54 71
55impl<R, T> Mutex<R, T> { 72impl<R, T> Mutex<R, T> {
diff --git a/embassy-sync/src/zerocopy_channel.rs b/embassy-sync/src/zerocopy_channel.rs
index ad6fe74c5..e3e5b2538 100644
--- a/embassy-sync/src/zerocopy_channel.rs
+++ b/embassy-sync/src/zerocopy_channel.rs
@@ -195,7 +195,7 @@ pub struct Receiver<'a, M: RawMutex, T> {
195} 195}
196 196
197impl<'a, M: RawMutex, T> Receiver<'a, M, T> { 197impl<'a, M: RawMutex, T> Receiver<'a, M, T> {
198 /// Creates one further [`Sender`] over the same channel. 198 /// Creates one further [`Receiver`] over the same channel.
199 pub fn borrow(&mut self) -> Receiver<'_, M, T> { 199 pub fn borrow(&mut self) -> Receiver<'_, M, T> {
200 Receiver { channel: self.channel } 200 Receiver { channel: self.channel }
201 } 201 }