diff options
| author | bors <bors@rust-lang.org> | 2013-10-09 14:21:38 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-10-09 14:21:38 -0700 |
| commit | 11d56706479982fd074130a6c9af2bb74968baf2 (patch) | |
| tree | 10cf4f851abeed7b2114aee01ace5b5e22093119 /src/libstd/rt | |
| parent | 62812f1e38f438dfc666cd9d164b4377063f8794 (diff) | |
| parent | 8fcf62b6385a5be4ef3a8e1bdb0f01ce907abd26 (diff) | |
| download | rust-11d56706479982fd074130a6c9af2bb74968baf2.tar.gz rust-11d56706479982fd074130a6c9af2bb74968baf2.zip | |
auto merge of #9742 : alexcrichton/rust/issue-9739, r=brson
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.rs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs index c7c4d3fc4f6..2db973b602e 100644 --- a/src/libstd/rt/mod.rs +++ b/src/libstd/rt/mod.rs @@ -68,7 +68,7 @@ use rt::sched::{Scheduler, Shutdown}; use rt::sleeper_list::SleeperList; use rt::task::{Task, SchedTask, GreenTask, Sched}; 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}; @@ -311,11 +311,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() { |
