11use alloc:: { boxed:: Box , vec} ;
22use core:: ptr:: NonNull ;
33
4- use esp_hal:: time:: { Duration , Instant } ;
54use esp_radio_rtos_driver:: {
65 queue:: { QueueImplementation , QueuePtr } ,
76 register_queue_implementation,
@@ -131,10 +130,8 @@ impl Queue {
131130 }
132131
133132 unsafe fn send_to_back ( & self , item : * const u8 , timeout_us : Option < u32 > ) -> bool {
134- let deadline = timeout_us. map ( |us| Instant :: now ( ) + Duration :: from_micros ( us as u64 ) ) ;
135-
136- loop {
137- let enqueued = self . inner . with ( |queue| {
133+ if crate :: with_deadline ( timeout_us, |deadline| {
134+ self . inner . with ( |queue| {
138135 if unsafe { queue. try_enqueue ( item) } {
139136 trace ! ( "Queue - notify with item" ) ;
140137 queue. waiting_for_item . notify ( ) ;
@@ -145,25 +142,13 @@ impl Queue {
145142 queue. waiting_for_space . wait_with_deadline ( deadline) ;
146143 false
147144 }
148- } ) ;
149-
150- if enqueued {
151- return true ;
152- }
153-
154- // We are here because the queue was full. Now we've either timed out, or an item has
155- // been removed from the queue. However, any higher priority task can wake up
156- // and preempt us still. Let's just check for the timeout, and try the whole process
157- // again.
158-
159- if let Some ( deadline) = deadline
160- && deadline < Instant :: now ( )
161- {
162- debug ! ( "Queue - send to back - timed out" ) ;
163- // We have a deadline and we've timed out.
164- return false ;
165- }
166- // We can block more, so let's attempt to enqueue again.
145+ } )
146+ } ) {
147+ debug ! ( "Queue - send to back - success" ) ;
148+ true
149+ } else {
150+ debug ! ( "Queue - send to back - timed out" ) ;
151+ false
167152 }
168153 }
169154
@@ -179,11 +164,8 @@ impl Queue {
179164 }
180165
181166 unsafe fn receive ( & self , item : * mut u8 , timeout_us : Option < u32 > ) -> bool {
182- let deadline = timeout_us. map ( |us| Instant :: now ( ) + Duration :: from_micros ( us as u64 ) ) ;
183-
184- loop {
185- // Attempt to dequeue an item from the queue
186- let dequeued = self . inner . with ( |queue| {
167+ if crate :: with_deadline ( timeout_us, |deadline| {
168+ self . inner . with ( |queue| {
187169 if unsafe { queue. try_dequeue ( item) } {
188170 trace ! ( "Queue - notify with space" ) ;
189171 queue. waiting_for_space . notify ( ) ;
@@ -194,25 +176,13 @@ impl Queue {
194176 queue. waiting_for_item . wait_with_deadline ( deadline) ;
195177 false
196178 }
197- } ) ;
198-
199- if dequeued {
200- return true ;
201- }
202-
203- // We are here because we weren't able to dequeue from the queue previously. We've
204- // either timed out, or the queue has an item. However, any higher priority
205- // task can wake up and preempt us still. Let's just check for the timeout,
206- // and try the whole process again.
207-
208- if let Some ( deadline) = deadline
209- && deadline < Instant :: now ( )
210- {
211- // We have a deadline and we've timed out.
212- debug ! ( "Queue - timed out waiting for item" ) ;
213- return false ;
214- }
215- // We can block more, so let's attempt to dequeue again.
179+ } )
180+ } ) {
181+ debug ! ( "Queue - dequeued item" ) ;
182+ true
183+ } else {
184+ debug ! ( "Queue - timed out waiting for item" ) ;
185+ false
216186 }
217187 }
218188
0 commit comments