about summary refs log tree commit diff
path: root/src/libstd/sys/common/util.rs
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2015-09-08 15:53:46 -0700
committerAlex Crichton <alex@alexcrichton.com>2015-09-11 11:19:20 -0700
commitf4be2026dfb507e5db919cc5df8fd934e05fa0b8 (patch)
tree278d5b3916042e7232b7ba98a5ead399a52057eb /src/libstd/sys/common/util.rs
parent192c37537bc6ffaee06e8b4099dd09ae43bcfee7 (diff)
std: Internalize almost all of `std::rt`
This commit does some refactoring to make almost all of the `std::rt` private.
Specifically, the following items are no longer part of its API:

* DEFAULT_ERROR_CODE
* backtrace
* unwind
* args
* at_exit
* cleanup
* heap (this is just alloc::heap)
* min_stack
* util

The module is now tagged as `#[doc(hidden)]` as the only purpose it's serve is
an entry point for the `panic!` macro via the `begin_unwind` and
`begin_unwind_fmt` reexports.
Diffstat (limited to 'src/libstd/sys/common/util.rs')
-rw-r--r--src/libstd/sys/common/util.rs46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/libstd/sys/common/util.rs b/src/libstd/sys/common/util.rs
new file mode 100644
index 00000000000..979f1f48669
--- /dev/null
+++ b/src/libstd/sys/common/util.rs
@@ -0,0 +1,46 @@
+// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use env;
+use fmt;
+use intrinsics;
+use io::prelude::*;
+use sync::atomic::{self, Ordering};
+use sys::stdio::Stderr;
+use thread;
+
+pub fn min_stack() -> usize {
+    static MIN: atomic::AtomicUsize = atomic::AtomicUsize::new(0);
+    match MIN.load(Ordering::SeqCst) {
+        0 => {}
+        n => return n - 1,
+    }
+    let amt = env::var("RUST_MIN_STACK").ok().and_then(|s| s.parse().ok());
+    let amt = amt.unwrap_or(2 * 1024 * 1024);
+    // 0 is our sentinel value, so ensure that we'll never see 0 after
+    // initialization has run
+    MIN.store(amt + 1, Ordering::SeqCst);
+    amt
+}
+
+pub fn dumb_print(args: fmt::Arguments) {
+    let _ = Stderr::new().map(|mut stderr| stderr.write_fmt(args));
+}
+
+pub fn abort(args: fmt::Arguments) -> ! {
+    dumb_print(format_args!("fatal runtime error: {}", args));
+    unsafe { intrinsics::abort(); }
+}
+
+#[allow(dead_code)] // stack overflow detection not enabled on all platforms
+pub unsafe fn report_overflow() {
+    dumb_print(format_args!("\nthread '{}' has overflowed its stack",
+                            thread::current().name().unwrap_or("<unknown>")));
+}