diff options
Diffstat (limited to 'macros/src')
-rw-r--r-- | macros/src/codegen/resources.rs | 6 | ||||
-rw-r--r-- | macros/src/codegen/util.rs | 12 |
2 files changed, 12 insertions, 6 deletions
diff --git a/macros/src/codegen/resources.rs b/macros/src/codegen/resources.rs index 6788648b..d2edaef7 100644 --- a/macros/src/codegen/resources.rs +++ b/macros/src/codegen/resources.rs @@ -103,12 +103,12 @@ pub fn codegen( } #[inline(always)] - pub unsafe fn is_locked(&self) -> bool { + pub unsafe fn get_locked(&self) -> bool { self.locked.get() } - pub unsafe fn lock(&self) { - self.locked.set(true); + pub unsafe fn set_locked(&self, b: bool) { + self.locked.set(b); } } )); diff --git a/macros/src/codegen/util.rs b/macros/src/codegen/util.rs index 68aca5d1..d8d05453 100644 --- a/macros/src/codegen/util.rs +++ b/macros/src/codegen/util.rs @@ -71,13 +71,17 @@ pub fn impl_mutex( #cfg_core impl<'a> rtic::Mutex for #path<'a> { type T = #ty; - #[inline(always)] fn lock<R>(&mut self, f: impl FnOnce(&mut #ty) -> R) -> R { /// Priority ceiling const CEILING: u8 = #ceiling; - unsafe { + if unsafe { self.get_locked() } { + panic!("Resource locked in sequential context"); + }; + unsafe { self.set_locked(true); } + + let r = unsafe { rtic::export::lock( #ptr, #priority, @@ -85,7 +89,9 @@ pub fn impl_mutex( #device::NVIC_PRIO_BITS, f, ) - } + }; + unsafe { self.set_locked(false); } + r } } ) |