@@ -269,26 +269,26 @@ impl Scheduler {
269
269
270
270
// First we check for scheduler messages, these are higher
271
271
// priority than regular tasks.
272
- let ( sched, stask) =
273
- match self . interpret_message_queue ( stask, DontTryTooHard ) {
274
- Some ( pair ) => pair ,
275
- None => return
276
- } ;
272
+ let ( sched, stask, did_work ) =
273
+ self . interpret_message_queue ( stask, DontTryTooHard ) ;
274
+ if did_work {
275
+ return stask . put_with_sched ( sched ) ;
276
+ }
277
277
278
278
// This helper will use a randomized work-stealing algorithm
279
279
// to find work.
280
- let ( sched, stask) = match sched. do_work ( stask) {
281
- Some ( pair ) => pair ,
282
- None => return
283
- } ;
280
+ let ( sched, stask, did_work ) = sched. do_work ( stask) ;
281
+ if did_work {
282
+ return stask . put_with_sched ( sched ) ;
283
+ }
284
284
285
285
// Now, before sleeping we need to find out if there really
286
286
// were any messages. Give it your best!
287
- let ( mut sched, stask) =
288
- match sched. interpret_message_queue ( stask, GiveItYourBest ) {
289
- Some ( pair ) => pair ,
290
- None => return
291
- } ;
287
+ let ( mut sched, stask, did_work ) =
288
+ sched. interpret_message_queue ( stask, GiveItYourBest ) ;
289
+ if did_work {
290
+ return stask . put_with_sched ( sched ) ;
291
+ }
292
292
293
293
// If we got here then there was no work to do.
294
294
// Generate a SchedHandle and push it to the sleeper list so
@@ -318,7 +318,7 @@ impl Scheduler {
318
318
// return None.
319
319
fn interpret_message_queue ( mut ~self , stask : ~GreenTask ,
320
320
effort : EffortLevel )
321
- -> Option < ( ~Scheduler , ~GreenTask ) >
321
+ -> ( ~Scheduler , ~GreenTask , bool )
322
322
{
323
323
324
324
let msg = if effort == DontTryTooHard {
@@ -349,25 +349,25 @@ impl Scheduler {
349
349
Some ( PinnedTask ( task) ) => {
350
350
let mut task = task;
351
351
task. give_home ( HomeSched ( self . make_handle ( ) ) ) ;
352
- self . resume_task_immediately ( stask, task) . put ( ) ;
353
- return None ;
352
+ let ( sched , task ) = self . resume_task_immediately ( stask, task) ;
353
+ ( sched , task , true )
354
354
}
355
355
Some ( TaskFromFriend ( task) ) => {
356
356
rtdebug ! ( "got a task from a friend. lovely!" ) ;
357
- self . process_task ( stask, task,
358
- Scheduler :: resume_task_immediately_cl) ;
359
- return None ;
357
+ let ( sched, task) =
358
+ self . process_task ( stask, task,
359
+ Scheduler :: resume_task_immediately_cl) ;
360
+ ( sched, task, true )
360
361
}
361
362
Some ( RunOnce ( task) ) => {
362
363
// bypass the process_task logic to force running this task once
363
364
// on this home scheduler. This is often used for I/O (homing).
364
- self . resume_task_immediately ( stask, task) . put ( ) ;
365
- return None ;
365
+ let ( sched , task ) = self . resume_task_immediately ( stask, task) ;
366
+ ( sched , task , true )
366
367
}
367
368
Some ( Wake ) => {
368
369
self . sleepy = false ;
369
- stask. put_with_sched ( self ) ;
370
- return None ;
370
+ ( self , stask, true )
371
371
}
372
372
Some ( Shutdown ) => {
373
373
rtdebug ! ( "shutting down" ) ;
@@ -389,31 +389,30 @@ impl Scheduler {
389
389
// event loop references we will shut down.
390
390
self . no_sleep = true ;
391
391
self . sleepy = false ;
392
- stask. put_with_sched ( self ) ;
393
- return None ;
392
+ ( self , stask, true )
394
393
}
395
394
Some ( NewNeighbor ( neighbor) ) => {
396
395
self . work_queues . push ( neighbor) ;
397
- return Some ( ( self , stask) ) ;
398
- }
399
- None => {
400
- return Some ( ( self , stask) ) ;
396
+ ( self , stask, false )
401
397
}
398
+ None => ( self , stask, false )
402
399
}
403
400
}
404
401
405
- fn do_work ( mut ~self , stask : ~GreenTask ) -> Option < ( ~Scheduler , ~GreenTask ) > {
402
+ fn do_work ( mut ~self ,
403
+ stask : ~GreenTask ) -> ( ~Scheduler , ~GreenTask , bool ) {
406
404
rtdebug ! ( "scheduler calling do work" ) ;
407
405
match self . find_work ( ) {
408
406
Some ( task) => {
409
407
rtdebug ! ( "found some work! running the task" ) ;
410
- self . process_task ( stask, task,
411
- Scheduler :: resume_task_immediately_cl) ;
412
- return None ;
408
+ let ( sched, task) =
409
+ self . process_task ( stask, task,
410
+ Scheduler :: resume_task_immediately_cl) ;
411
+ ( sched, task, true )
413
412
}
414
413
None => {
415
414
rtdebug ! ( "no work was found, returning the scheduler struct" ) ;
416
- return Some ( ( self , stask) ) ;
415
+ ( self , stask, false )
417
416
}
418
417
}
419
418
}
@@ -486,7 +485,8 @@ impl Scheduler {
486
485
// place.
487
486
488
487
fn process_task ( mut ~self , cur : ~GreenTask ,
489
- mut next : ~GreenTask , schedule_fn : SchedulingFn ) {
488
+ mut next : ~GreenTask ,
489
+ schedule_fn : SchedulingFn ) -> ( ~Scheduler , ~GreenTask ) {
490
490
rtdebug ! ( "processing a task" ) ;
491
491
492
492
match next. take_unwrap_home ( ) {
@@ -495,23 +495,23 @@ impl Scheduler {
495
495
rtdebug ! ( "sending task home" ) ;
496
496
next. give_home ( HomeSched ( home_handle) ) ;
497
497
Scheduler :: send_task_home ( next) ;
498
- cur . put_with_sched ( self ) ;
498
+ ( self , cur )
499
499
} else {
500
500
rtdebug ! ( "running task here" ) ;
501
501
next. give_home ( HomeSched ( home_handle) ) ;
502
- schedule_fn ( self , cur, next) ;
502
+ schedule_fn ( self , cur, next)
503
503
}
504
504
}
505
505
AnySched if self . run_anything => {
506
506
rtdebug ! ( "running anysched task here" ) ;
507
507
next. give_home ( AnySched ) ;
508
- schedule_fn ( self , cur, next) ;
508
+ schedule_fn ( self , cur, next)
509
509
}
510
510
AnySched => {
511
511
rtdebug ! ( "sending task to friend" ) ;
512
512
next. give_home ( AnySched ) ;
513
513
self . send_to_friend ( next) ;
514
- cur . put_with_sched ( self ) ;
514
+ ( self , cur )
515
515
}
516
516
}
517
517
}
@@ -664,18 +664,19 @@ impl Scheduler {
664
664
// * Context Swapping Helpers - Here be ugliness!
665
665
666
666
pub fn resume_task_immediately ( ~self , cur : ~GreenTask ,
667
- next : ~GreenTask ) -> ~ GreenTask {
667
+ next : ~GreenTask ) -> ( ~ Scheduler , ~ GreenTask ) {
668
668
assert ! ( cur. is_sched( ) ) ;
669
- self . change_task_context ( cur, next, |sched, stask| {
669
+ let mut cur = self . change_task_context ( cur, next, |sched, stask| {
670
670
assert ! ( sched. sched_task. is_none( ) ) ;
671
671
sched. sched_task = Some ( stask) ;
672
- } )
672
+ } ) ;
673
+ ( cur. sched . take_unwrap ( ) , cur)
673
674
}
674
675
675
676
fn resume_task_immediately_cl ( sched : ~Scheduler ,
676
677
cur : ~GreenTask ,
677
- next : ~GreenTask ) {
678
- sched. resume_task_immediately ( cur, next) . put ( )
678
+ next : ~GreenTask ) -> ( ~ Scheduler , ~ GreenTask ) {
679
+ sched. resume_task_immediately ( cur, next)
679
680
}
680
681
681
682
/// Block a running task, context switch to the scheduler, then pass the
@@ -741,15 +742,17 @@ impl Scheduler {
741
742
cur. put ( ) ;
742
743
}
743
744
744
- fn switch_task ( sched : ~Scheduler , cur : ~GreenTask , next : ~GreenTask ) {
745
- sched. change_task_context ( cur, next, |sched, last_task| {
745
+ fn switch_task ( sched : ~Scheduler , cur : ~GreenTask ,
746
+ next : ~GreenTask ) -> ( ~Scheduler , ~GreenTask ) {
747
+ let mut cur = sched. change_task_context ( cur, next, |sched, last_task| {
746
748
if last_task. is_sched ( ) {
747
749
assert ! ( sched. sched_task. is_none( ) ) ;
748
750
sched. sched_task = Some ( last_task) ;
749
751
} else {
750
752
sched. enqueue_task ( last_task) ;
751
753
}
752
- } ) . put ( )
754
+ } ) ;
755
+ ( cur. sched . take_unwrap ( ) , cur)
753
756
}
754
757
755
758
// * Task Context Helpers
@@ -769,7 +772,9 @@ impl Scheduler {
769
772
}
770
773
771
774
pub fn run_task ( ~self , cur : ~GreenTask , next : ~GreenTask ) {
772
- self . process_task ( cur, next, Scheduler :: switch_task) ;
775
+ let ( sched, task) =
776
+ self . process_task ( cur, next, Scheduler :: switch_task) ;
777
+ task. put_with_sched ( sched) ;
773
778
}
774
779
775
780
pub fn run_task_later ( mut cur : ~GreenTask , next : ~GreenTask ) {
@@ -836,7 +841,8 @@ impl Scheduler {
836
841
837
842
// Supporting types
838
843
839
- type SchedulingFn = extern "Rust" fn ( ~Scheduler , ~GreenTask , ~GreenTask ) ;
844
+ type SchedulingFn = fn ( ~Scheduler , ~GreenTask , ~GreenTask )
845
+ -> ( ~Scheduler , ~GreenTask ) ;
840
846
841
847
pub enum SchedMessage {
842
848
Wake ,
0 commit comments