Skip to content

Commit cac7ac0

Browse files
authored
Add SuspendScheduler type (#85)
1 parent 8b582b3 commit cac7ac0

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

freertos-rust/src/critical.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,61 @@ impl<'mutex, T: ?Sized> DerefMut for ExclusiveDataGuardIsr<'mutex, T> {
8989
unsafe { &mut *self.__data.get() }
9090
}
9191
}
92+
93+
unsafe impl<T: Send> Send for SuspendScheduler<T> {}
94+
unsafe impl<T: Send> Sync for SuspendScheduler<T> {}
95+
96+
/// Data protected with a critical region, implemented by suspending the
97+
/// FreeRTOS scheduler.
98+
pub struct SuspendScheduler<T: ?Sized> {
99+
data: UnsafeCell<T>,
100+
}
101+
102+
impl<T> SuspendScheduler<T> {
103+
pub const fn new(data: T) -> Self {
104+
SuspendScheduler {
105+
data: UnsafeCell::new(data),
106+
}
107+
}
108+
109+
pub fn lock(&self) -> SuspendSchedulerGuard<T> {
110+
unsafe {
111+
freertos_rs_vTaskSuspendAll();
112+
}
113+
SuspendSchedulerGuard { data: &self.data }
114+
}
115+
116+
pub fn get_mut(&mut self) -> &mut T {
117+
self.data.get_mut()
118+
}
119+
120+
pub fn into_inner(self) -> T {
121+
self.data.into_inner()
122+
}
123+
}
124+
125+
pub struct SuspendSchedulerGuard<'a, T: ?Sized + 'a> {
126+
data: &'a UnsafeCell<T>,
127+
}
128+
129+
impl<'mutex, T: ?Sized> Deref for SuspendSchedulerGuard<'mutex, T> {
130+
type Target = T;
131+
132+
fn deref<'a>(&'a self) -> &'a T {
133+
unsafe { &*self.data.get() }
134+
}
135+
}
136+
137+
impl<'mutex, T: ?Sized> DerefMut for SuspendSchedulerGuard<'mutex, T> {
138+
fn deref_mut<'a>(&'a mut self) -> &'a mut T {
139+
unsafe { &mut *self.data.get() }
140+
}
141+
}
142+
143+
impl<'mutex, T: ?Sized> Drop for SuspendSchedulerGuard<'mutex, T> {
144+
fn drop(&mut self) {
145+
unsafe {
146+
freertos_rs_xTaskResumeAll();
147+
}
148+
}
149+
}

0 commit comments

Comments
 (0)