Skip to content

Commit b55b7f8

Browse files
committed
ThreadRng: remove usage of Rc
1 parent c34a6e4 commit b55b7f8

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

src/rngs/thread.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
//! Thread-local random number generator
1212
1313
use std::cell::UnsafeCell;
14-
use std::rc::Rc;
1514

1615
use {RngCore, CryptoRng, SeedableRng, Error};
1716
use rngs::adapter::ReseedingRng;
@@ -74,18 +73,19 @@ const THREAD_RNG_RESEED_THRESHOLD: u64 = 32*1024*1024; // 32 MiB
7473
/// [HC-128]: ../prng/hc128/struct.Hc128Rng.html
7574
#[derive(Clone, Debug)]
7675
pub struct ThreadRng {
77-
rng: Rc<UnsafeCell<ReseedingRng<Hc128Core, EntropyRng>>>,
76+
// use of raw pointer implies type is neither Send nor Sync
77+
rng: *mut ReseedingRng<Hc128Core, EntropyRng>,
7878
}
7979

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

@@ -98,26 +98,26 @@ thread_local!(
9898
///
9999
/// [`ThreadRng`]: rngs/struct.ThreadRng.html
100100
pub fn thread_rng() -> ThreadRng {
101-
ThreadRng { rng: THREAD_RNG_KEY.with(|t| t.clone()) }
101+
ThreadRng { rng: THREAD_RNG_KEY.with(|t| t.get()) }
102102
}
103103

104104
impl RngCore for ThreadRng {
105105
#[inline(always)]
106106
fn next_u32(&mut self) -> u32 {
107-
unsafe { (*self.rng.get()).next_u32() }
107+
unsafe { (*self.rng).next_u32() }
108108
}
109109

110110
#[inline(always)]
111111
fn next_u64(&mut self) -> u64 {
112-
unsafe { (*self.rng.get()).next_u64() }
112+
unsafe { (*self.rng).next_u64() }
113113
}
114114

115115
fn fill_bytes(&mut self, dest: &mut [u8]) {
116-
unsafe { (*self.rng.get()).fill_bytes(dest) }
116+
unsafe { (*self.rng).fill_bytes(dest) }
117117
}
118118

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

0 commit comments

Comments
 (0)