aboutsummaryrefslogtreecommitdiff
path: root/embassy-sync/src
diff options
context:
space:
mode:
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 }