about summary refs log tree commit diff
path: root/src/libstd/rt
diff options
context:
space:
mode:
authortoddaaro <github@opprobrio.us>2013-07-01 16:41:17 -0700
committertoddaaro <github@opprobrio.us>2013-07-01 16:41:17 -0700
commit062bfd310af68016d080dabfceb7d47521939f43 (patch)
treee62fe8a2168198774afd4a874ea1dd3bba6f0262 /src/libstd/rt
parent5cfad4b6de3a9ab749c975338c23fc2e20b0beec (diff)
parentddbccecc27e7a6be144c9c55d25a5b56cac0a179 (diff)
downloadrust-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.rs37
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
+}