about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-04-19 17:28:27 +0000
committerbors <bors@rust-lang.org>2015-04-19 17:28:27 +0000
commitc6b8d96abd116090af13f1c2c5fe8d5b7fc494d2 (patch)
tree5f48e3c01526d4b7497b52f34d66bffb891f98ab /src/libstd
parentddf25c890da15142d9645169403a4038f2cfbdf7 (diff)
parent4d80a823818f9953d9ff281f698404004356c328 (diff)
downloadrust-c6b8d96abd116090af13f1c2c5fe8d5b7fc494d2.tar.gz
rust-c6b8d96abd116090af13f1c2c5fe8d5b7fc494d2.zip
Auto merge of #24526 - klutzy:getrandom-fix, r=alexcrichton
Fixes #21538.
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rand/os.rs21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/libstd/rand/os.rs b/src/libstd/rand/os.rs
index 6c107590237..30d5ae5c600 100644
--- a/src/libstd/rand/os.rs
+++ b/src/libstd/rand/os.rs
@@ -97,25 +97,24 @@ mod imp {
                   target_arch = "powerpc")))]
     fn is_getrandom_available() -> bool {
         use sync::atomic::{AtomicBool, ATOMIC_BOOL_INIT, Ordering};
+        use sync::{Once, ONCE_INIT};
 
-        static GETRANDOM_CHECKED: AtomicBool = ATOMIC_BOOL_INIT;
-        static GETRANDOM_AVAILABLE: AtomicBool = ATOMIC_BOOL_INIT;
+        static CHECKER: Once = ONCE_INIT;
+        static AVAILABLE: AtomicBool = ATOMIC_BOOL_INIT;
 
-        if !GETRANDOM_CHECKED.load(Ordering::Relaxed) {
+        CHECKER.call_once(|| {
             let mut buf: [u8; 0] = [];
             let result = getrandom(&mut buf);
             let available = if result == -1 {
-                let err = errno() as libc::c_int;
-                err != libc::ENOSYS
+                let err = io::Error::last_os_error().raw_os_error();
+                err != Some(libc::ENOSYS)
             } else {
                 true
             };
-            GETRANDOM_AVAILABLE.store(available, Ordering::Relaxed);
-            GETRANDOM_CHECKED.store(true, Ordering::Relaxed);
-            available
-        } else {
-            GETRANDOM_AVAILABLE.load(Ordering::Relaxed)
-        }
+            AVAILABLE.store(available, Ordering::Relaxed);
+        });
+
+        AVAILABLE.load(Ordering::Relaxed)
     }
 
     #[cfg(not(all(target_os = "linux",