|
@@ -1,7 +1,7 @@
|
|
|
//! stdlib implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/stdlib.h.html
|
|
|
|
|
|
use core::{intrinsics, iter, mem, ptr, slice};
|
|
|
-use rand::distributions::Alphanumeric;
|
|
|
+use rand::distributions::{Alphanumeric, Distribution, Uniform};
|
|
|
use rand::prng::XorShiftRng;
|
|
|
use rand::rngs::JitterRng;
|
|
|
use rand::{Rng, SeedableRng};
|
|
@@ -34,6 +34,10 @@ pub const MB_LEN_MAX: c_int = 4;
|
|
|
static mut ATEXIT_FUNCS: [Option<extern "C" fn()>; 32] = [None; 32];
|
|
|
static mut RNG: Option<XorShiftRng> = None;
|
|
|
|
|
|
+lazy_static! {
|
|
|
+ static ref RNG_SAMPLER: Uniform<c_int> = Uniform::new_inclusive(0, RAND_MAX);
|
|
|
+}
|
|
|
+
|
|
|
#[no_mangle]
|
|
|
pub extern "C" fn _Exit(status: c_int) {
|
|
|
unistd::_exit(status);
|
|
@@ -618,10 +622,10 @@ pub extern "C" fn qsort(
|
|
|
#[no_mangle]
|
|
|
pub unsafe extern "C" fn rand() -> c_int {
|
|
|
match RNG {
|
|
|
- Some(ref mut rng) => rng.gen_range(0, RAND_MAX),
|
|
|
+ Some(ref mut rng) => RNG_SAMPLER.sample(rng),
|
|
|
None => {
|
|
|
let mut rng = XorShiftRng::from_seed([1; 16]);
|
|
|
- let ret = rng.gen_range(0, RAND_MAX);
|
|
|
+ let ret = RNG_SAMPLER.sample(&mut rng);
|
|
|
RNG = Some(rng);
|
|
|
ret
|
|
|
}
|
|
@@ -637,7 +641,7 @@ pub unsafe extern "C" fn rand_r(seed: *mut c_uint) -> c_int {
|
|
|
let seed_arr: [u8; 16] = mem::transmute([*seed; 16 / mem::size_of::<c_uint>()]);
|
|
|
|
|
|
let mut rng = XorShiftRng::from_seed(seed_arr);
|
|
|
- let ret = rng.gen_range(0, RAND_MAX);
|
|
|
+ let ret = RNG_SAMPLER.sample(&mut rng);
|
|
|
|
|
|
*seed = ret as _;
|
|
|
|