@@ -89,3 +89,61 @@ impl<'mutex, T: ?Sized> DerefMut for ExclusiveDataGuardIsr<'mutex, T> {
89
89
unsafe { & mut * self . __data . get ( ) }
90
90
}
91
91
}
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