Skip to content

Commit ea8efea

Browse files
authored
Merge pull request #615 from dhardy/thread-rc
ThreadRng: remove usage of Rc
2 parents 4685924 + b801c5a commit ea8efea

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/rngs/thread.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
//! Thread-local random number generator
1010
1111
use std::cell::UnsafeCell;
12-
use std::rc::Rc;
1312

1413
use {RngCore, CryptoRng, SeedableRng, Error};
1514
use rngs::adapter::ReseedingRng;
@@ -72,18 +71,19 @@ const THREAD_RNG_RESEED_THRESHOLD: u64 = 32*1024*1024; // 32 MiB
7271
/// [HC-128]: ../prng/hc128/struct.Hc128Rng.html
7372
#[derive(Clone, Debug)]
7473
pub struct ThreadRng {
75-
rng: Rc<UnsafeCell<ReseedingRng<Hc128Core, EntropyRng>>>,
74+
// use of raw pointer implies type is neither Send nor Sync
75+
rng: *mut ReseedingRng<Hc128Core, EntropyRng>,
7676
}
7777

7878
thread_local!(
79-
static THREAD_RNG_KEY: Rc<UnsafeCell<ReseedingRng<Hc128Core, EntropyRng>>> = {
79+
static THREAD_RNG_KEY: UnsafeCell<ReseedingRng<Hc128Core, EntropyRng>> = {
8080
let mut entropy_source = EntropyRng::new();
8181
let r = Hc128Core::from_rng(&mut entropy_source).unwrap_or_else(|err|
8282
panic!("could not initialize thread_rng: {}", err));
8383
let rng = ReseedingRng::new(r,
8484
THREAD_RNG_RESEED_THRESHOLD,
8585
entropy_source);
86-
Rc::new(UnsafeCell::new(rng))
86+
UnsafeCell::new(rng)
8787
}
8888
);
8989

@@ -96,26 +96,26 @@ thread_local!(
9696
///
9797
/// [`ThreadRng`]: rngs/struct.ThreadRng.html
9898
pub fn thread_rng() -> ThreadRng {
99-
ThreadRng { rng: THREAD_RNG_KEY.with(|t| t.clone()) }
99+
ThreadRng { rng: THREAD_RNG_KEY.with(|t| t.get()) }
100100
}
101101

102102
impl RngCore for ThreadRng {
103103
#[inline(always)]
104104
fn next_u32(&mut self) -> u32 {
105-
unsafe { (*self.rng.get()).next_u32() }
105+
unsafe { (*self.rng).next_u32() }
106106
}
107107

108108
#[inline(always)]
109109
fn next_u64(&mut self) -> u64 {
110-
unsafe { (*self.rng.get()).next_u64() }
110+
unsafe { (*self.rng).next_u64() }
111111
}
112112

113113
fn fill_bytes(&mut self, dest: &mut [u8]) {
114-
unsafe { (*self.rng.get()).fill_bytes(dest) }
114+
unsafe { (*self.rng).fill_bytes(dest) }
115115
}
116116

117117
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), Error> {
118-
unsafe { (*self.rng.get()).try_fill_bytes(dest) }
118+
unsafe { (*self.rng).try_fill_bytes(dest) }
119119
}
120120
}
121121

0 commit comments

Comments
 (0)