Skip to content

Commit c7354e6

Browse files
Daniel Pattersonbrson
authored andcommitted
core::rand - adding task local lazily initialized rng, as per #3439
1 parent 4d30b34 commit c7354e6

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

src/libcore/rand.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,33 @@ pub fn seeded_xorshift(x: u32, y: u32, z: u32, w: u32) -> Rng {
308308
{mut x: x, mut y: y, mut z: z, mut w: w} as Rng
309309
}
310310

311+
312+
// used to make space in TLS for a random number generator
313+
fn tls_rng_state(+_v: @RandRes) {}
314+
315+
/**
316+
* Gives back a lazily initialized task-local random number generator,
317+
* seeded by the system. Intended to be used in method chaining style, ie
318+
* task_rng().gen_int().
319+
*/
320+
pub fn task_rng() -> Rng {
321+
let r : Option<@RandRes>;
322+
unsafe {
323+
r = task::local_data::local_data_get(tls_rng_state);
324+
}
325+
match r {
326+
None => {
327+
let rng = @RandRes(rustrt::rand_new());
328+
unsafe {
329+
task::local_data::local_data_set(tls_rng_state, rng);
330+
}
331+
rng as Rng
332+
}
333+
Some(rng) => rng as Rng
334+
}
335+
}
336+
337+
311338
#[cfg(test)]
312339
pub mod tests {
313340
#[test]

0 commit comments

Comments
 (0)