about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-10-14 16:08:18 -0700
committerBrian Anderson <banderson@mozilla.com>2013-10-14 16:08:18 -0700
commit818ebf2ed6c6f61d0a2ec86cb104c4467b28d75e (patch)
tree02921bb60e0e54f7e7eb2e0a4ef1edcf25514bf5
parentc6e3501da14784cd2401dded3b53f3ce3405b4ec (diff)
downloadrust-818ebf2ed6c6f61d0a2ec86cb104c4467b28d75e.tar.gz
rust-818ebf2ed6c6f61d0a2ec86cb104c4467b28d75e.zip
std::rt: Fix the set up of the main thread so that it doesn't try to steal work
This is causing really awful scheduler behavior where the main thread scheduler is
continually waking up, stealing work, discovering it can't actually run the work,
and sending it off to another scheduler.
-rw-r--r--src/libstd/rt/mod.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs
index 78f0bb0a07c..9ea7b734d24 100644
--- a/src/libstd/rt/mod.rs
+++ b/src/libstd/rt/mod.rs
@@ -310,8 +310,14 @@ fn run_(main: ~fn(), use_main_sched: bool) -> int {
                                                      sleepers.clone(),
                                                      false,
                                                      Some(friend_handle));
-        let main_handle = main_sched.make_handle();
-        handles.push(main_handle);
+        let mut main_handle = main_sched.make_handle();
+        // Allow the scheduler to exit when the main task exits.
+        // Note: sending the shutdown message also prevents the scheduler
+        // from pushing itself to the sleeper list, which is used for
+        // waking up schedulers for work stealing; since this is a
+        // non-work-stealing scheduler it should not be adding itself
+        // to the list.
+        main_handle.send_shutdown();
         Some(main_sched)
     } else {
         None