diff options
| author | bors <bors@rust-lang.org> | 2014-01-22 20:41:29 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-01-22 20:41:29 -0800 |
| commit | 7ea063ea0f9a28920fafbbf21064f20eb7ca02a8 (patch) | |
| tree | 429ddb0b6f5287ee3dbe962261f68c09d910db42 /src/libstd/rt/mod.rs | |
| parent | fce792249e72a181f2ad52413b25b1db643c371f (diff) | |
| parent | b8e43838cf7e97b81bf2f7ce6e3d1f8a05c166f5 (diff) | |
| download | rust-7ea063ea0f9a28920fafbbf21064f20eb7ca02a8.tar.gz rust-7ea063ea0f9a28920fafbbf21064f20eb7ca02a8.zip | |
auto merge of #11294 : alexcrichton/rust/native-timer, r=brson
Commit messages have the fun details Closes #10925
Diffstat (limited to 'src/libstd/rt/mod.rs')
| -rw-r--r-- | src/libstd/rt/mod.rs | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/libstd/rt/mod.rs b/src/libstd/rt/mod.rs index 40e9a3ec5b2..7aa966802f2 100644 --- a/src/libstd/rt/mod.rs +++ b/src/libstd/rt/mod.rs @@ -127,6 +127,9 @@ mod util; // Global command line argument storage pub mod args; +// Support for running procedures when a program has exited. +mod at_exit_imp; + /// The default error code of the rust runtime if the main task fails instead /// of exiting cleanly. pub static DEFAULT_ERROR_CODE: int = 101; @@ -171,9 +174,27 @@ pub fn init(argc: int, argv: **u8) { env::init(); logging::init(); local_ptr::init(); + at_exit_imp::init(); } } +/// Enqueues a procedure to run when the runtime is cleaned up +/// +/// The procedure passed to this function will be executed as part of the +/// runtime cleanup phase. For normal rust programs, this means that it will run +/// after all other tasks have exited. +/// +/// The procedure is *not* executed with a local `Task` available to it, so +/// primitives like logging, I/O, channels, spawning, etc, are *not* available. +/// This is meant for "bare bones" usage to clean up runtime details, this is +/// not meant as a general-purpose "let's clean everything up" function. +/// +/// It is forbidden for procedures to register more `at_exit` handlers when they +/// are running, and doing so will lead to a process abort. +pub fn at_exit(f: proc()) { + at_exit_imp::push(f); +} + /// One-time runtime cleanup. /// /// This function is unsafe because it performs no checks to ensure that the @@ -184,6 +205,7 @@ pub fn init(argc: int, argv: **u8) { /// Invoking cleanup while portions of the runtime are still in use may cause /// undefined behavior. pub unsafe fn cleanup() { + at_exit_imp::run(); args::cleanup(); local_ptr::cleanup(); } |
