@@ -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