about summary refs log tree commit diff
path: root/src/libstd/io
diff options
context:
space:
mode:
authorNODA, Kai <nodakai@gmail.com>2018-06-09 21:13:04 +0800
committerNODA, Kai <nodakai@gmail.com>2018-06-17 15:18:32 +0800
commitb81da278623d9dcda1776008612bd42e1922e9c3 (patch)
tree9aea5b4aef36eeffec197b0afb61c160e1b8c2be /src/libstd/io
parent0f8f4903f73a21d7f408870551c08acd051abeb0 (diff)
downloadrust-b81da278623d9dcda1776008612bd42e1922e9c3.tar.gz
rust-b81da278623d9dcda1776008612bd42e1922e9c3.zip
libstd: add an RAII utility for sys_common::mutex::Mutex
Signed-off-by: NODA, Kai <nodakai@gmail.com>
Diffstat (limited to 'src/libstd/io')
-rw-r--r--src/libstd/io/lazy.rs21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/libstd/io/lazy.rs b/src/libstd/io/lazy.rs
index 9cef4e3cdf1..d357966be92 100644
--- a/src/libstd/io/lazy.rs
+++ b/src/libstd/io/lazy.rs
@@ -20,6 +20,9 @@ pub struct Lazy<T> {
     init: fn() -> Arc<T>,
 }
 
+#[inline]
+const fn done<T>() -> *mut Arc<T> { 1_usize as *mut _ }
+
 unsafe impl<T> Sync for Lazy<T> {}
 
 impl<T: Send + Sync + 'static> Lazy<T> {
@@ -33,17 +36,15 @@ impl<T: Send + Sync + 'static> Lazy<T> {
 
     pub fn get(&'static self) -> Option<Arc<T>> {
         unsafe {
-            self.lock.lock();
+            let _guard = self.lock.lock();
             let ptr = self.ptr.get();
-            let ret = if ptr.is_null() {
+            if ptr.is_null() {
                 Some(self.init())
-            } else if ptr as usize == 1 {
+            } else if ptr == done() {
                 None
             } else {
                 Some((*ptr).clone())
-            };
-            self.lock.unlock();
-            return ret
+            }
         }
     }
 
@@ -53,10 +54,10 @@ impl<T: Send + Sync + 'static> Lazy<T> {
         // the at exit handler). Otherwise we just return the freshly allocated
         // `Arc`.
         let registered = sys_common::at_exit(move || {
-            self.lock.lock();
-            let ptr = self.ptr.get();
-            self.ptr.set(1 as *mut _);
-            self.lock.unlock();
+            let ptr = {
+                let _guard = self.lock.lock();
+                self.ptr.replace(done())
+            };
             drop(Box::from_raw(ptr))
         });
         let ret = (self.init)();