aboutsummaryrefslogtreecommitdiff
path: root/src/critical_section.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/critical_section.rs')
-rw-r--r--src/critical_section.rs22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/critical_section.rs b/src/critical_section.rs
new file mode 100644
index 0000000..e3d57d1
--- /dev/null
+++ b/src/critical_section.rs
@@ -0,0 +1,22 @@
+use critical_section::{set_impl, Impl, RawRestoreState};
+
+use crate::interrupt;
+use crate::register::primask;
+
+struct SingleCoreCriticalSection;
+set_impl!(SingleCoreCriticalSection);
+
+unsafe impl Impl for SingleCoreCriticalSection {
+ unsafe fn acquire() -> RawRestoreState {
+ let was_active = primask::read().is_active();
+ interrupt::disable();
+ was_active
+ }
+
+ unsafe fn release(was_active: RawRestoreState) {
+ // Only re-enable interrupts if they were enabled before the critical section.
+ if was_active {
+ interrupt::enable()
+ }
+ }
+}