diff options
| author | NODA, Kai <nodakai@gmail.com> | 2018-06-09 21:13:04 +0800 |
|---|---|---|
| committer | NODA, Kai <nodakai@gmail.com> | 2018-06-17 15:18:32 +0800 |
| commit | b81da278623d9dcda1776008612bd42e1922e9c3 (patch) | |
| tree | 9aea5b4aef36eeffec197b0afb61c160e1b8c2be /src/libstd/io | |
| parent | 0f8f4903f73a21d7f408870551c08acd051abeb0 (diff) | |
| download | rust-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.rs | 21 |
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)(); |
