@@ -7,7 +7,7 @@ use crate::coroutine::suspender::Suspender;
77use crate :: coroutine:: Coroutine ;
88use crate :: { co, impl_current_for, impl_display_by_debug, impl_for_named} ;
99use dashmap:: DashMap ;
10- use std:: collections:: { BinaryHeap , VecDeque } ;
10+ use std:: collections:: { BinaryHeap , HashMap , VecDeque } ;
1111use std:: ffi:: c_longlong;
1212use std:: io:: { Error , ErrorKind } ;
1313use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
@@ -90,7 +90,6 @@ pub struct Scheduler<'s> {
9090 suspend : BinaryHeap < SuspendItem < ' s > > ,
9191 syscall : DashMap < & ' s str , SchedulableCoroutine < ' s > > ,
9292 syscall_suspend : BinaryHeap < SyscallSuspendItem < ' s > > ,
93- results : DashMap < & ' s str , Result < Option < usize > , & ' s str > > ,
9493}
9594
9695impl Default for Scheduler < ' _ > {
@@ -107,9 +106,10 @@ impl Drop for Scheduler<'_> {
107106 if std:: thread:: panicking ( ) {
108107 return ;
109108 }
109+ let name = self . name . clone ( ) ;
110110 _ = self
111111 . try_timed_schedule ( Duration :: from_secs ( 30 ) )
112- . unwrap_or_else ( |_ | panic ! ( "Failed to stop scheduler {} !" , self . name ( ) ) ) ;
112+ . unwrap_or_else ( |e | panic ! ( "Failed to stop scheduler {name} due to {e} !" ) ) ;
113113 assert ! (
114114 self . ready. is_empty( ) ,
115115 "There are still coroutines to be carried out in the ready queue:{:#?} !" ,
@@ -134,6 +134,7 @@ impl_current_for!(SCHEDULER, Scheduler<'s>);
134134
135135impl_display_by_debug ! ( Scheduler <' s>) ;
136136
137+ #[ allow( clippy:: type_complexity) ]
137138impl < ' s > Scheduler < ' s > {
138139 /// Creates a new scheduler.
139140 #[ must_use]
@@ -149,7 +150,6 @@ impl<'s> Scheduler<'s> {
149150 suspend : BinaryHeap :: default ( ) ,
150151 syscall : DashMap :: default ( ) ,
151152 syscall_suspend : BinaryHeap :: default ( ) ,
152- results : DashMap :: default ( ) ,
153153 }
154154 }
155155
@@ -229,8 +229,9 @@ impl<'s> Scheduler<'s> {
229229 ///
230230 /// # Errors
231231 /// see `try_timeout_schedule`.
232- pub fn try_schedule ( & mut self ) -> std:: io:: Result < ( ) > {
233- self . try_timeout_schedule ( u64:: MAX ) . map ( |_| ( ) )
232+ pub fn try_schedule ( & mut self ) -> std:: io:: Result < HashMap < & str , Result < Option < usize > , & str > > > {
233+ self . try_timeout_schedule ( u64:: MAX )
234+ . map ( |( _, results) | results)
234235 }
235236
236237 /// Try scheduling the coroutines for up to `dur`.
@@ -240,7 +241,10 @@ impl<'s> Scheduler<'s> {
240241 ///
241242 /// # Errors
242243 /// see `try_timeout_schedule`.
243- pub fn try_timed_schedule ( & mut self , dur : Duration ) -> std:: io:: Result < u64 > {
244+ pub fn try_timed_schedule (
245+ & mut self ,
246+ dur : Duration ,
247+ ) -> std:: io:: Result < ( u64 , HashMap < & str , Result < Option < usize > , & str > > ) > {
244248 self . try_timeout_schedule ( get_timeout_time ( dur) )
245249 }
246250
@@ -253,18 +257,25 @@ impl<'s> Scheduler<'s> {
253257 ///
254258 /// # Errors
255259 /// if change to ready fails.
256- pub fn try_timeout_schedule ( & mut self , timeout_time : u64 ) -> std:: io:: Result < u64 > {
260+ pub fn try_timeout_schedule (
261+ & mut self ,
262+ timeout_time : u64 ,
263+ ) -> std:: io:: Result < ( u64 , HashMap < & str , Result < Option < usize > , & str > > ) > {
257264 Self :: init_current ( self ) ;
258- let left_time = self . do_schedule ( timeout_time) ;
265+ let r = self . do_schedule ( timeout_time) ;
259266 Self :: clean_current ( ) ;
260- left_time
267+ r
261268 }
262269
263- fn do_schedule ( & mut self , timeout_time : u64 ) -> std:: io:: Result < u64 > {
270+ fn do_schedule (
271+ & mut self ,
272+ timeout_time : u64 ,
273+ ) -> std:: io:: Result < ( u64 , HashMap < & str , Result < Option < usize > , & str > > ) > {
274+ let mut results = HashMap :: new ( ) ;
264275 loop {
265276 let left_time = timeout_time. saturating_sub ( now ( ) ) ;
266277 if 0 == left_time {
267- return Ok ( 0 ) ;
278+ return Ok ( ( 0 , results ) ) ;
268279 }
269280 self . check_ready ( ) ?;
270281 // schedule coroutines
@@ -295,14 +306,14 @@ impl<'s> Scheduler<'s> {
295306 CoroutineState :: Complete ( result) => {
296307 let co_name = Box :: leak ( Box :: from ( coroutine. name ( ) ) ) ;
297308 assert ! (
298- self . results. insert( co_name, Ok ( result) ) . is_none( ) ,
309+ results. insert( co_name, Ok ( result) ) . is_none( ) ,
299310 "not consume result"
300311 ) ;
301312 }
302313 CoroutineState :: Error ( message) => {
303314 let co_name = Box :: leak ( Box :: from ( coroutine. name ( ) ) ) ;
304315 assert ! (
305- self . results. insert( co_name, Err ( message) ) . is_none( ) ,
316+ results. insert( co_name, Err ( message) ) . is_none( ) ,
306317 "not consume result"
307318 ) ;
308319 }
@@ -315,7 +326,7 @@ impl<'s> Scheduler<'s> {
315326 }
316327 continue ;
317328 }
318- return Ok ( left_time) ;
329+ return Ok ( ( left_time, results ) ) ;
319330 }
320331 }
321332
0 commit comments