@@ -171,6 +171,79 @@ mod queue_array {
171
171
172
172
pub use self :: queue_array:: * ;
173
173
174
+
175
+ pub mod heapless_shared {
176
+ //! A heapless queue with Clone and Arc support.
177
+
178
+ use core:: sync:: atomic:: { AtomicUsize , Ordering } ;
179
+
180
+ use crate :: FsmError ;
181
+
182
+ use super :: * ;
183
+
184
+ extern crate alloc;
185
+ use alloc:: sync:: Arc ;
186
+ use heapless:: mpmc:: Q64 ;
187
+
188
+ /// An unbound event queue that uses `VecDeque`.
189
+ pub struct FsmEventQueueHeaplessShared < F : FsmBackend > {
190
+ inner : Arc < Inner < F > >
191
+ }
192
+
193
+ impl < F > Clone for FsmEventQueueHeaplessShared < F > where F : FsmBackend {
194
+ fn clone ( & self ) -> Self {
195
+ Self { inner : self . inner . clone ( ) }
196
+ }
197
+ }
198
+
199
+ struct Inner < F : FsmBackend > {
200
+ queue : Q64 < <F as FsmBackend >:: Events > ,
201
+ len : AtomicUsize
202
+ }
203
+
204
+ impl < F : FsmBackend > FsmEventQueueHeaplessShared < F > {
205
+ pub fn new ( ) -> Self {
206
+ let q = Q64 :: new ( ) ;
207
+ let inner = Inner {
208
+ queue : q,
209
+ len : AtomicUsize :: new ( 0 )
210
+ } ;
211
+ FsmEventQueueHeaplessShared {
212
+ inner : Arc :: new ( inner)
213
+ }
214
+ }
215
+ }
216
+
217
+ impl < F : FsmBackend > FsmEventQueue < F > for FsmEventQueueHeaplessShared < F > {
218
+ fn dequeue ( & mut self ) -> Option < <F as FsmBackend >:: Events > {
219
+ match self . inner . queue . dequeue ( ) {
220
+ Some ( e) => {
221
+ self . inner . len . fetch_sub ( 1 , Ordering :: SeqCst ) ;
222
+ Some ( e)
223
+ } ,
224
+ None => None
225
+ }
226
+ }
227
+
228
+ fn len ( & self ) -> usize {
229
+ self . inner . len . load ( Ordering :: SeqCst )
230
+ }
231
+ }
232
+
233
+ impl < F : FsmBackend > FsmEventQueueSender < F > for FsmEventQueueHeaplessShared < F > {
234
+ fn enqueue < E : Into < <F as FsmBackend >:: Events > > ( & mut self , event : E ) -> FsmResult < ( ) > {
235
+ match self . inner . queue . enqueue ( event. into ( ) ) {
236
+ Ok ( _) => {
237
+ self . inner . len . fetch_add ( 1 , Ordering :: SeqCst ) ;
238
+ Ok ( ( ) )
239
+ } ,
240
+ Err ( _) => Err ( FsmError :: QueueOverCapacity )
241
+ }
242
+ }
243
+ }
244
+
245
+ }
246
+
174
247
pub struct FsmEventQueueNull < F > {
175
248
_ty : PhantomData < F >
176
249
}
@@ -260,6 +333,13 @@ fn test_dequeue_vec_shared() {
260
333
test_queue ( queue) ;
261
334
}
262
335
336
+ #[ test]
337
+ fn test_heapless_shared ( ) {
338
+ use self :: heapless_shared:: FsmEventQueueHeaplessShared ;
339
+ let queue = FsmEventQueueHeaplessShared :: < TestFsm > :: new ( ) ;
340
+ test_queue ( queue) ;
341
+ }
342
+
263
343
#[ cfg( test) ]
264
344
fn test_queue < Q : FsmEventQueue < TestFsm > > ( mut queue : Q ) {
265
345
use super :: tests_fsm:: { Events , EventA } ;
0 commit comments