Skip to content

Commit c6b8d96

Browse files
committed
Auto merge of #24526 - klutzy:getrandom-fix, r=alexcrichton
Fixes #21538.
2 parents ddf25c8 + 4d80a82 commit c6b8d96

File tree

1 file changed

+10
-11
lines changed

1 file changed

+10
-11
lines changed

src/libstd/rand/os.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -97,25 +97,24 @@ mod imp {
9797
target_arch = "powerpc")))]
9898
fn is_getrandom_available() -> bool {
9999
use sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT, Ordering};
100+
use sync::{Once, ONCE_INIT};
100101

101-
static GETRANDOM_CHECKED: AtomicBool = ATOMIC_BOOL_INIT;
102-
static GETRANDOM_AVAILABLE: AtomicBool = ATOMIC_BOOL_INIT;
102+
static CHECKER: Once = ONCE_INIT;
103+
static AVAILABLE: AtomicBool = ATOMIC_BOOL_INIT;
103104

104-
if !GETRANDOM_CHECKED.load(Ordering::Relaxed) {
105+
CHECKER.call_once(|| {
105106
let mut buf: [u8; 0] = [];
106107
let result = getrandom(&mut buf);
107108
let available = if result == -1 {
108-
let err = errno() as libc::c_int;
109-
err != libc::ENOSYS
109+
let err = io::Error::last_os_error().raw_os_error();
110+
err != Some(libc::ENOSYS)
110111
} else {
111112
true
112113
};
113-
GETRANDOM_AVAILABLE.store(available, Ordering::Relaxed);
114-
GETRANDOM_CHECKED.store(true, Ordering::Relaxed);
115-
available
116-
} else {
117-
GETRANDOM_AVAILABLE.load(Ordering::Relaxed)
118-
}
114+
AVAILABLE.store(available, Ordering::Relaxed);
115+
});
116+
117+
AVAILABLE.load(Ordering::Relaxed)
119118
}
120119

121120
#[cfg(not(all(target_os = "linux",

0 commit comments

Comments
 (0)