@@ -156,7 +156,7 @@ impl FutureState<'_> {
156156
157157 /// Handles the `event{0,1,2}` event codes and returns a corresponding
158158 /// return code along with a flag whether this future is "done" or not.
159- fn callback ( & mut self , event0 : u32 , event1 : u32 , event2 : u32 ) -> ( u32 , bool ) {
159+ fn callback ( & mut self , event0 : u32 , event1 : u32 , event2 : u32 ) -> CallbackCode {
160160 match event0 {
161161 EVENT_NONE => rtdebug ! ( "EVENT_NONE" ) ,
162162 EVENT_SUBTASK => rtdebug ! ( "EVENT_SUBTASK({event1:#x}, {event2:#x})" ) ,
@@ -171,7 +171,7 @@ impl FutureState<'_> {
171171 // code/bool indicating we're done. The caller will then
172172 // appropriately deallocate this `FutureState` which will
173173 // transitively run all destructors.
174- return ( CALLBACK_CODE_EXIT , true ) ;
174+ return CallbackCode :: Exit ;
175175 }
176176 _ => unreachable ! ( ) ,
177177 }
@@ -198,7 +198,7 @@ impl FutureState<'_> {
198198 ///
199199 /// Returns the code representing what happened along with a boolean as to
200200 /// whether this execution is done.
201- fn poll ( & mut self ) -> ( u32 , bool ) {
201+ fn poll ( & mut self ) -> CallbackCode {
202202 self . with_p3_task_set ( |me| {
203203 let mut context = Context :: from_waker ( & me. waker_clone ) ;
204204
@@ -223,9 +223,9 @@ impl FutureState<'_> {
223223 assert ! ( me. tasks. is_empty( ) ) ;
224224 if me. remaining_work ( ) {
225225 let waitable = me. waitable_set . as_ref ( ) . unwrap ( ) . as_raw ( ) ;
226- break ( CALLBACK_CODE_WAIT | ( waitable << 4 ) , false ) ;
226+ break CallbackCode :: Wait ( waitable) ;
227227 } else {
228- break ( CALLBACK_CODE_EXIT , true ) ;
228+ break CallbackCode :: Exit ;
229229 }
230230 }
231231
@@ -236,12 +236,18 @@ impl FutureState<'_> {
236236 Poll :: Pending => {
237237 assert ! ( !me. tasks. is_empty( ) ) ;
238238 if me. waker . 0 . load ( Ordering :: Relaxed ) {
239- break ( CALLBACK_CODE_YIELD , false ) ;
239+ let code = if me. remaining_work ( ) {
240+ let waitable = me. waitable_set . as_ref ( ) . unwrap ( ) . as_raw ( ) ;
241+ CallbackCode :: Poll ( waitable)
242+ } else {
243+ CallbackCode :: Yield
244+ } ;
245+ break code;
240246 }
241247
242248 assert ! ( me. remaining_work( ) ) ;
243249 let waitable = me. waitable_set . as_ref ( ) . unwrap ( ) . as_raw ( ) ;
244- break ( CALLBACK_CODE_WAIT | ( waitable << 4 ) , false ) ;
250+ break CallbackCode :: Wait ( waitable) ;
245251 }
246252 }
247253 }
@@ -331,10 +337,24 @@ const EVENT_FUTURE_READ: u32 = 4;
331337const EVENT_FUTURE_WRITE : u32 = 5 ;
332338const EVENT_CANCEL : u32 = 6 ;
333339
334- const CALLBACK_CODE_EXIT : u32 = 0 ;
335- const CALLBACK_CODE_YIELD : u32 = 1 ;
336- const CALLBACK_CODE_WAIT : u32 = 2 ;
337- const _CALLBACK_CODE_POLL: u32 = 3 ;
340+ #[ derive( PartialEq , Debug ) ]
341+ enum CallbackCode {
342+ Exit ,
343+ Yield ,
344+ Wait ( u32 ) ,
345+ Poll ( u32 ) ,
346+ }
347+
348+ impl CallbackCode {
349+ fn encode ( self ) -> u32 {
350+ match self {
351+ CallbackCode :: Exit => 0 ,
352+ CallbackCode :: Yield => 1 ,
353+ CallbackCode :: Wait ( waitable) => 2 | ( waitable << 4 ) ,
354+ CallbackCode :: Poll ( waitable) => 3 | ( waitable << 4 ) ,
355+ }
356+ }
357+ }
338358
339359const STATUS_STARTING : u32 = 0 ;
340360const STATUS_STARTED : u32 = 1 ;
@@ -425,14 +445,14 @@ pub unsafe fn callback(event0: u32, event1: u32, event2: u32) -> u32 {
425445 // our future so deallocate it. Otherwise put our future back in
426446 // context-local storage and forward the code.
427447 unsafe {
428- let ( rc , done ) = ( * state) . callback ( event0, event1, event2) ;
429- if done {
448+ let rc = ( * state) . callback ( event0, event1, event2) ;
449+ if rc == CallbackCode :: Exit {
430450 drop ( Box :: from_raw ( state) ) ;
431451 } else {
432452 context_set ( state. cast ( ) ) ;
433453 }
434- rtdebug ! ( " => (cb) {rc:#x }" ) ;
435- rc
454+ rtdebug ! ( " => (cb) {rc:? }" ) ;
455+ rc. encode ( )
436456 }
437457}
438458
@@ -449,12 +469,14 @@ pub fn block_on<T: 'static>(future: impl Future<Output = T>) -> T {
449469 let mut event = ( EVENT_NONE , 0 , 0 ) ;
450470 loop {
451471 match state. callback ( event. 0 , event. 1 , event. 2 ) {
452- ( _ , true ) => {
472+ CallbackCode :: Exit => {
453473 drop ( state) ;
454474 break result. unwrap ( ) ;
455475 }
456- ( CALLBACK_CODE_YIELD , false ) => event = state. waitable_set . as_ref ( ) . unwrap ( ) . poll ( ) ,
457- _ => event = state. waitable_set . as_ref ( ) . unwrap ( ) . wait ( ) ,
476+ CallbackCode :: Yield | CallbackCode :: Poll ( _) => {
477+ event = state. waitable_set . as_ref ( ) . unwrap ( ) . poll ( )
478+ }
479+ CallbackCode :: Wait ( _) => event = state. waitable_set . as_ref ( ) . unwrap ( ) . wait ( ) ,
458480 }
459481 }
460482}
0 commit comments