about summary refs log tree commit diff
path: root/src/libstd/task
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-07-08 18:06:17 -0700
committerBrian Anderson <banderson@mozilla.com>2013-07-08 18:06:17 -0700
commit29c9443d854073feeceb7ec2afa5841d9d1242af (patch)
treef15338cfc8d0b3e5ac3336eaf33d82e5c7460982 /src/libstd/task
parent7826651335b81f4630aa4d0d43a5de95b96d2311 (diff)
downloadrust-29c9443d854073feeceb7ec2afa5841d9d1242af.tar.gz
rust-29c9443d854073feeceb7ec2afa5841d9d1242af.zip
std: Add a yield implementation for newsched
Diffstat (limited to 'src/libstd/task')
-rw-r--r--src/libstd/task/mod.rs23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/libstd/task/mod.rs b/src/libstd/task/mod.rs
index ae8f1c2101d..5a3ff10ae83 100644
--- a/src/libstd/task/mod.rs
+++ b/src/libstd/task/mod.rs
@@ -497,11 +497,26 @@ pub fn try<T:Send>(f: ~fn() -> T) -> Result<T,()> {
 pub fn yield() {
     //! Yield control to the task scheduler
 
+    use rt::{context, OldTaskContext};
+    use rt::local::Local;
+    use rt::sched::Scheduler;
+
     unsafe {
-        let task_ = rt::rust_get_task();
-        let killed = rt::rust_task_yield(task_);
-        if killed && !failing() {
-            fail!("killed");
+        match context() {
+            OldTaskContext => {
+                let task_ = rt::rust_get_task();
+                let killed = rt::rust_task_yield(task_);
+                if killed && !failing() {
+                    fail!("killed");
+                }
+            }
+            _ => {
+                // XXX: What does yield really mean in newsched?
+                let sched = Local::take::<Scheduler>();
+                do sched.deschedule_running_task_and_then |sched, task| {
+                    sched.enqueue_task(task);
+                }
+            }
         }
     }
 }