@@ -953,8 +953,8 @@ thread_local!(
953953 static THREAD_RNG_KEY : Rc <RefCell <ReseedingRng <StdRng , EntropyRng >>> = {
954954 const THREAD_RNG_RESEED_THRESHOLD : u64 = 32_768 ;
955955 let mut entropy_source = EntropyRng :: new( ) ;
956- let r = StdRng :: from_rng( & mut entropy_source)
957- . expect ( "could not initialize thread_rng" ) ;
956+ let r = StdRng :: from_rng( & mut entropy_source) . unwrap_or_else ( |err|
957+ panic! ( "could not initialize thread_rng: {}" , err ) ) ;
958958 let rng = ReseedingRng :: new( r,
959959 THREAD_RNG_RESEED_THRESHOLD ,
960960 entropy_source) ;
@@ -1063,7 +1063,8 @@ impl Rng for EntropyRng {
10631063 }
10641064
10651065 fn fill_bytes ( & mut self , dest : & mut [ u8 ] ) {
1066- self . try_fill_bytes ( dest) . unwrap ( ) ;
1066+ self . try_fill_bytes ( dest) . unwrap_or_else ( |err|
1067+ panic ! ( "all entropy sources failed; first error: {}" , err) )
10671068 }
10681069
10691070 fn try_fill_bytes ( & mut self , dest : & mut [ u8 ] ) -> Result < ( ) , Error > {
@@ -1087,13 +1088,15 @@ impl Rng for EntropyRng {
10871088 let os_rng_result = try_os_new ( dest) ;
10881089 match os_rng_result {
10891090 Ok ( os_rng) => {
1091+ debug ! ( "EntropyRng: using OsRng" ) ;
10901092 switch_rng = Some ( EntropySource :: Os ( os_rng) ) ;
10911093 }
10921094 Err ( os_rng_error) => {
10931095 warn ! ( "EntropyRng: OsRng failed [falling back to JitterRng]: {}" ,
10941096 os_rng_error) ;
10951097 match try_jitter_new ( dest) {
10961098 Ok ( jitter_rng) => {
1099+ debug ! ( "EntropyRng: using JitterRng" ) ;
10971100 switch_rng = Some ( EntropySource :: Jitter ( jitter_rng) ) ;
10981101 }
10991102 Err ( _jitter_error) => {
@@ -1112,6 +1115,7 @@ impl Rng for EntropyRng {
11121115 os_rng_error) ;
11131116 match try_jitter_new ( dest) {
11141117 Ok ( jitter_rng) => {
1118+ debug ! ( "EntropyRng: using JitterRng" ) ;
11151119 switch_rng = Some ( EntropySource :: Jitter ( jitter_rng) ) ;
11161120 }
11171121 Err ( _jitter_error) => {
@@ -1124,7 +1128,7 @@ impl Rng for EntropyRng {
11241128 }
11251129 EntropySource :: Jitter ( ref mut rng) => {
11261130 if let Ok ( os_rng) = try_os_new ( dest) {
1127- info ! ( "EntropyRng: OsRng available [switching back from JitterRng] " ) ;
1131+ debug ! ( "EntropyRng: using OsRng " ) ;
11281132 switch_rng = Some ( EntropySource :: Os ( os_rng) ) ;
11291133 } else {
11301134 return rng. try_fill_bytes ( dest) ; // use JitterRng
@@ -1217,7 +1221,7 @@ pub fn sample<T, I, R>(rng: &mut R, iterable: I, amount: usize) -> Vec<T>
12171221mod test {
12181222 use impls;
12191223 #[ cfg( feature="std" ) ]
1220- use super :: { random, thread_rng} ;
1224+ use super :: { random, thread_rng, EntropyRng } ;
12211225 use super :: { Rng , SeedableRng , StdRng } ;
12221226 #[ cfg( feature="alloc" ) ]
12231227 use alloc:: boxed:: Box ;
@@ -1263,6 +1267,13 @@ mod test {
12631267 impls:: fill_bytes_via_u64 ( self , dest)
12641268 }
12651269 }
1270+
1271+ #[ test]
1272+ #[ cfg( feature="std" ) ]
1273+ fn test_entropy ( ) {
1274+ let mut rng = EntropyRng :: new ( ) ;
1275+ rng. next_u32 ( ) ;
1276+ }
12661277
12671278 #[ test]
12681279 fn test_fill_bytes_default ( ) {
0 commit comments