diff options
| author | toddaaro <github@opprobrio.us> | 2013-07-01 16:41:17 -0700 |
|---|---|---|
| committer | toddaaro <github@opprobrio.us> | 2013-07-01 16:41:17 -0700 |
| commit | 062bfd310af68016d080dabfceb7d47521939f43 (patch) | |
| tree | e62fe8a2168198774afd4a874ea1dd3bba6f0262 /src/libstd/rt | |
| parent | 5cfad4b6de3a9ab749c975338c23fc2e20b0beec (diff) | |
| parent | ddbccecc27e7a6be144c9c55d25a5b56cac0a179 (diff) | |
| download | rust-062bfd310af68016d080dabfceb7d47521939f43.tar.gz rust-062bfd310af68016d080dabfceb7d47521939f43.zip | |
merging task/coroutine refactoring back into upstream
Diffstat (limited to 'src/libstd/rt')
| -rw-r--r-- | src/libstd/rt/sched.rs | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/src/libstd/rt/sched.rs b/src/libstd/rt/sched.rs index ed5cce4b35c..b849bb69033 100644 --- a/src/libstd/rt/sched.rs +++ b/src/libstd/rt/sched.rs @@ -155,7 +155,7 @@ impl Scheduler { rtdebug!("run taking sched"); let sched = Local::take::<Scheduler>(); - // XXX: Reenable this once we're using a per-task queue. With a shared + // XXX: Reenable this once we're using a per-scheduler queue. With a shared // queue this is not true //assert!(sched.work_queue.is_empty()); rtdebug!("scheduler metrics: %s\n", { @@ -191,10 +191,10 @@ impl Scheduler { if sched.resume_task_from_queue() { // We performed a scheduling action. There may be other work // to do yet, so let's try again later. - let mut sched = Local::take::<Scheduler>(); - sched.metrics.tasks_resumed_from_queue += 1; - sched.event_loop.callback(Scheduler::run_sched_once); - Local::put(sched); + do Local::borrow::<Scheduler, ()> |sched| { + sched.metrics.tasks_resumed_from_queue += 1; + sched.event_loop.callback(Scheduler::run_sched_once); + } return; } @@ -202,18 +202,18 @@ impl Scheduler { // Generate a SchedHandle and push it to the sleeper list so // somebody can wake us up later. rtdebug!("no work to do"); - let mut sched = Local::take::<Scheduler>(); - sched.metrics.wasted_turns += 1; - if !sched.sleepy && !sched.no_sleep { - rtdebug!("sleeping"); - sched.metrics.sleepy_times += 1; - sched.sleepy = true; - let handle = sched.make_handle(); - sched.sleeper_list.push(handle); - } else { - rtdebug!("not sleeping"); + do Local::borrow::<Scheduler, ()> |sched| { + sched.metrics.wasted_turns += 1; + if !sched.sleepy && !sched.no_sleep { + rtdebug!("sleeping"); + sched.metrics.sleepy_times += 1; + sched.sleepy = true; + let handle = sched.make_handle(); + sched.sleeper_list.push(handle); + } else { + rtdebug!("not sleeping"); + } } - Local::put(sched); } pub fn make_handle(&mut self) -> SchedHandle { @@ -441,8 +441,7 @@ impl Scheduler { // here we know we are home, execute now OR we know we // aren't homed, and that this sched doesn't care do this.switch_running_tasks_and_then(task) |sched, last_task| { - let last_task = Cell::new(last_task); - sched.enqueue_task(last_task.take()); + sched.enqueue_task(last_task); } } else if !homed && !this.run_anything { // the task isn't homed, but it can't be run here @@ -1141,4 +1140,4 @@ mod test { } } } -} \ No newline at end of file +} |
