summary refs log tree commit diff
path: root/src/libstd/sys_common/util.rs
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2016-09-30 23:26:44 +0000
committerBrian Anderson <banderson@mozilla.com>2016-11-01 17:08:24 +0000
commitca30691813836e1c6896e5ba5d4397eb717e7270 (patch)
tree9079226fb2fa666135049c929ee654af15b635e9 /src/libstd/sys_common/util.rs
parentf3a709dc52bb3e617ccb016a8b20a741c23da77d (diff)
downloadrust-ca30691813836e1c6896e5ba5d4397eb717e7270.tar.gz
rust-ca30691813836e1c6896e5ba5d4397eb717e7270.zip
std: Move sys_common to libstd/sys_common
Make the directory structure reflect the module structure. I've always
found the existing structure confusing.
Diffstat (limited to 'src/libstd/sys_common/util.rs')
-rw-r--r--src/libstd/sys_common/util.rs50
1 files changed, 50 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..daa0c15920b
--- /dev/null
+++ b/src/libstd/sys_common/util.rs
@@ -0,0 +1,50 @@
+// 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 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));
+}
+
+// Other platforms should use the appropriate platform-specific mechanism for
+// aborting the process.  If no platform-specific mechanism is available,
+// ::intrinsics::abort() may be used instead.  The above implementations cover
+// all targets currently supported by libstd.
+
+pub fn abort(args: fmt::Arguments) -> ! {
+    dumb_print(format_args!("fatal runtime error: {}\n", args));
+    unsafe { ::sys::abort_internal(); }
+}
+
+#[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\n",
+                            thread::current().name().unwrap_or("<unknown>")));
+}