From 95468d6ff6906e496c8c40ef36a212404ef28684 Mon Sep 17 00:00:00 2001 From: Daniel Patterson Date: Mon, 1 Oct 2012 23:29:34 -0400 Subject: [PATCH 1/2] core::rand - adding task local lazily initialized rng, as per #3439 --- src/libcore/rand.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/libcore/rand.rs b/src/libcore/rand.rs index 73d2cc73c1cf6..9498a3415f887 100644 --- a/src/libcore/rand.rs +++ b/src/libcore/rand.rs @@ -308,6 +308,33 @@ pub fn seeded_xorshift(x: u32, y: u32, z: u32, w: u32) -> Rng { {mut x: x, mut y: y, mut z: z, mut w: w} as Rng } + +// used to make space in TLS for a random number generator +fn tls_rng_state(+_v: @RandRes) {} + +/** + * Gives back a lazily initialized task-local random number generator, + * seeded by the system. Intended to be used in method chaining style, ie + * task_rng().gen_int(). + */ +pub fn task_rng() -> Rng { + let r : Option<@RandRes>; + unsafe { + r = task::local_data::local_data_get(tls_rng_state); + } + match r { + None => { + let rng = @RandRes(rustrt::rand_new()); + unsafe { + task::local_data::local_data_set(tls_rng_state, rng); + } + rng as Rng + } + Some(rng) => rng as Rng + } +} + + #[cfg(test)] pub mod tests { #[test] From 4cf12858d81b16faabf0ceb467989222747779df Mon Sep 17 00:00:00 2001 From: Daniel Patterson Date: Mon, 1 Oct 2012 23:48:33 -0400 Subject: [PATCH 2/2] core::rand - adding test for task_rng() --- src/libcore/rand.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/libcore/rand.rs b/src/libcore/rand.rs index 9498a3415f887..501afc0c4bca4 100644 --- a/src/libcore/rand.rs +++ b/src/libcore/rand.rs @@ -487,6 +487,14 @@ pub mod tests { assert r.shuffle(~[]) == empty; assert r.shuffle(~[1, 1, 1]) == ~[1, 1, 1]; } + + #[test] + pub fn task_rng() { + let r = rand::task_rng(); + r.gen_int(); + assert r.shuffle(~[1, 1, 1]) == ~[1, 1, 1]; + assert r.gen_uint_range(0u, 1u) == 0u; + } }