about summary refs log tree commit diff
path: root/src/libstd/rt
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2013-10-05 21:58:55 -0700
committerAlex Crichton <alex@alexcrichton.com>2013-10-09 12:38:18 -0700
commit8fcf62b6385a5be4ef3a8e1bdb0f01ce907abd26 (patch)
treefd23aa0117a06bc0cf5827b374744abe32506880 /src/libstd/rt
parentacf9783879dca0db0721c10ac79c9078f2dec425 (diff)
downloadrust-8fcf62b6385a5be4ef3a8e1bdb0f01ce907abd26.tar.gz
rust-8fcf62b6385a5be4ef3a8e1bdb0f01ce907abd26.zip
Don't abort if the runtime is run twice.
This changes an `assert_once_ever!` assertion to just a plain old assertion
around an atomic boolean to ensure that one particular runtime doesn't attempt
to exit twice.

Closes #9739
Diffstat (limited to 'src/libstd/rt')
-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 2ece2800cf2..fa9d767ec3f 100644
--- a/src/libstd/rt/mod.rs
+++ b/src/libstd/rt/mod.rs
@@ -70,7 +70,7 @@ use rt::task::{Task, SchedTask, GreenTask, Sched};
 use rt::thread::Thread;
 use rt::work_queue::WorkQueue;
 use rt::uv::uvio::UvEventLoop;
-use unstable::atomics::{AtomicInt, SeqCst};
+use unstable::atomics::{AtomicInt, AtomicBool, SeqCst};
 use unstable::sync::UnsafeArc;
 use vec;
 use vec::{OwnedVector, MutableVector, ImmutableVector};
@@ -298,11 +298,17 @@ fn run_(main: ~fn(), use_main_sched: bool) -> int {
     let exit_code = UnsafeArc::new(AtomicInt::new(0));
     let exit_code_clone = exit_code.clone();
 
+    // Used to sanity check that the runtime only exits once
+    let exited_already = UnsafeArc::new(AtomicBool::new(false));
+
     // When the main task exits, after all the tasks in the main
     // task tree, shut down the schedulers and set the exit code.
     let handles = Cell::new(handles);
     let on_exit: ~fn(bool) = |exit_success| {
-        assert_once_ever!("last task exiting");
+        unsafe {
+            assert!(!(*exited_already.get()).swap(true, SeqCst),
+                    "the runtime already exited");
+        }
 
         let mut handles = handles.take();
         for handle in handles.mut_iter() {