99//! Thread-local random number generator
1010
1111use std:: cell:: UnsafeCell ;
12- use std:: rc:: Rc ;
1312
1413use { RngCore , CryptoRng , SeedableRng , Error } ;
1514use 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 ) ]
7473pub 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
7878thread_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
9898pub 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
102102impl 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