This commit removes the `rand` crate from the standard library facade as well as the `__rand` module in the standard library. Neither of these were used in any meaningful way in the standard library itself. The only need for randomness in libstd is to initialize the thread-local keys of a `HashMap`, and that unconditionally used `OsRng` defined in the standard library anyway. The cruft of the `rand` crate and the extra `rand` support in the standard library makes libstd slightly more difficult to port to new platforms, namely WebAssembly which doesn't have any randomness at all (without interfacing with JS). The purpose of this commit is to clarify and streamline randomness in libstd, focusing on how it's only required in one location, hashmap seeds. Note that the `rand` crate out of tree has almost always been a drop-in replacement for the `rand` crate in-tree, so any usage (accidental or purposeful) of the crate in-tree should switch to the `rand` crate on crates.io. This then also has the further benefit of avoiding duplication (mostly) between the two crates!
72 lines
2.4 KiB
Rust
72 lines
2.4 KiB
Rust
// 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.
|
|
|
|
//! Runtime services
|
|
//!
|
|
//! The `rt` module provides a narrow set of runtime services,
|
|
//! including the global heap (exported in `heap`) and unwinding and
|
|
//! backtrace support. The APIs in this module are highly unstable,
|
|
//! and should be considered as private implementation details for the
|
|
//! time being.
|
|
|
|
#![unstable(feature = "rt",
|
|
reason = "this public module should not exist and is highly likely \
|
|
to disappear",
|
|
issue = "0")]
|
|
#![doc(hidden)]
|
|
|
|
|
|
// Reexport some of our utilities which are expected by other crates.
|
|
pub use panicking::{begin_panic, begin_panic_fmt, update_panic_count};
|
|
|
|
#[cfg(not(test))]
|
|
#[lang = "start"]
|
|
fn lang_start(main: fn(), argc: isize, argv: *const *const u8) -> isize {
|
|
use panic;
|
|
use sys;
|
|
use sys_common;
|
|
use sys_common::thread_info;
|
|
use thread::Thread;
|
|
#[cfg(not(feature = "backtrace"))]
|
|
use mem;
|
|
|
|
sys::init();
|
|
|
|
let failed = unsafe {
|
|
let main_guard = sys::thread::guard::init();
|
|
sys::stack_overflow::init();
|
|
|
|
// Next, set up the current Thread with the guard information we just
|
|
// created. Note that this isn't necessary in general for new threads,
|
|
// but we just do this to name the main thread and to give it correct
|
|
// info about the stack bounds.
|
|
let thread = Thread::new(Some("main".to_owned()));
|
|
thread_info::set(main_guard, thread);
|
|
|
|
// Store our args if necessary in a squirreled away location
|
|
sys::args::init(argc, argv);
|
|
|
|
// Let's run some code!
|
|
#[cfg(feature = "backtrace")]
|
|
let res = panic::catch_unwind(|| {
|
|
::sys_common::backtrace::__rust_begin_short_backtrace(main)
|
|
});
|
|
#[cfg(not(feature = "backtrace"))]
|
|
let res = panic::catch_unwind(mem::transmute::<_, fn()>(main));
|
|
sys_common::cleanup();
|
|
res.is_err()
|
|
};
|
|
|
|
if failed {
|
|
101
|
|
} else {
|
|
0
|
|
}
|
|
}
|