From 04c09f9466c57dca50c643c6099c0f9957d62220 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 28 Aug 2015 10:50:16 -0700 Subject: std: Run at_exit cleanup on process::exit This adds a call to `rt::cleanup` on `process::exit` to make sure we clean up after ourselves on the way out from Rust. Closes #28065 --- src/libstd/rt/args.rs | 1 - src/libstd/rt/at_exit_imp.rs | 4 ---- src/libstd/rt/mod.rs | 20 ++++++++------------ 3 files changed, 8 insertions(+), 17 deletions(-) (limited to 'src/libstd/rt') diff --git a/src/libstd/rt/args.rs b/src/libstd/rt/args.rs index cf8bac31057..8de713aeac8 100644 --- a/src/libstd/rt/args.rs +++ b/src/libstd/rt/args.rs @@ -64,7 +64,6 @@ mod imp { pub unsafe fn cleanup() { take(); - LOCK.destroy(); } pub fn take() -> Option>> { diff --git a/src/libstd/rt/at_exit_imp.rs b/src/libstd/rt/at_exit_imp.rs index 17d2940a6f1..405575fda32 100644 --- a/src/libstd/rt/at_exit_imp.rs +++ b/src/libstd/rt/at_exit_imp.rs @@ -12,10 +12,6 @@ //! //! Documentation can be found on the `rt::at_exit` function. -// FIXME: switch this to use atexit. Currently this -// segfaults (the queue's memory is mysteriously gone), so -// instead the cleanup is tied to the `std::rt` entry point. - use alloc::boxed::FnBox; use boxed::Box; use sys_common::mutex::Mutex; diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs index 5464e7f9d89..2cbf81b2fc7 100644 --- a/src/libstd/rt/mod.rs +++ b/src/libstd/rt/mod.rs @@ -23,6 +23,7 @@ #![allow(missing_docs)] use prelude::v1::*; +use sync::Once; use sys; use thread; @@ -124,16 +125,11 @@ pub fn at_exit(f: F) -> Result<(), ()> { } /// One-time runtime cleanup. -/// -/// This function is unsafe because it performs no checks to ensure that the -/// runtime has completely ceased running. It is the responsibility of the -/// caller to ensure that the runtime is entirely shut down and nothing will be -/// poking around at the internal components. -/// -/// Invoking cleanup while portions of the runtime are still in use may cause -/// undefined behavior. -pub unsafe fn cleanup() { - args::cleanup(); - sys::stack_overflow::cleanup(); - at_exit_imp::cleanup(); +pub fn cleanup() { + static CLEANUP: Once = Once::new(); + CLEANUP.call_once(|| unsafe { + args::cleanup(); + sys::stack_overflow::cleanup(); + at_exit_imp::cleanup(); + }); } -- cgit 1.4.1-3-g733a5