diff options
Diffstat (limited to 'library/std/src/sys/unix/locks')
| -rw-r--r-- | library/std/src/sys/unix/locks/futex.rs | 3 | ||||
| -rw-r--r-- | library/std/src/sys/unix/locks/mod.rs | 10 | ||||
| -rw-r--r-- | library/std/src/sys/unix/locks/pthread_condvar.rs | 17 | ||||
| -rw-r--r-- | library/std/src/sys/unix/locks/pthread_mutex.rs | 11 | ||||
| -rw-r--r-- | library/std/src/sys/unix/locks/pthread_rwlock.rs | 9 |
5 files changed, 36 insertions, 14 deletions
diff --git a/library/std/src/sys/unix/locks/futex.rs b/library/std/src/sys/unix/locks/futex.rs index 5731ce44286..a9a1a32c5af 100644 --- a/library/std/src/sys/unix/locks/futex.rs +++ b/library/std/src/sys/unix/locks/futex.rs @@ -115,9 +115,6 @@ impl Condvar { Self { futex: AtomicU32::new(0) } } - #[inline] - pub unsafe fn init(&mut self) {} - // All the memory orderings here are `Relaxed`, // because synchronization is done by unlocking and locking the mutex. diff --git a/library/std/src/sys/unix/locks/mod.rs b/library/std/src/sys/unix/locks/mod.rs index 04c5c489fc9..03400efa3c9 100644 --- a/library/std/src/sys/unix/locks/mod.rs +++ b/library/std/src/sys/unix/locks/mod.rs @@ -9,14 +9,14 @@ cfg_if::cfg_if! { ))] { mod futex; mod futex_rwlock; - pub use futex::{Mutex, MovableMutex, Condvar, MovableCondvar}; - pub use futex_rwlock::{RwLock, MovableRwLock}; + pub(crate) use futex::{Mutex, MovableMutex, MovableCondvar}; + pub(crate) use futex_rwlock::{RwLock, MovableRwLock}; } else { mod pthread_mutex; mod pthread_rwlock; mod pthread_condvar; - pub use pthread_mutex::{Mutex, MovableMutex}; - pub use pthread_rwlock::{RwLock, MovableRwLock}; - pub use pthread_condvar::{Condvar, MovableCondvar}; + pub(crate) use pthread_mutex::{Mutex, MovableMutex}; + pub(crate) use pthread_rwlock::{RwLock, MovableRwLock}; + pub(crate) use pthread_condvar::MovableCondvar; } } diff --git a/library/std/src/sys/unix/locks/pthread_condvar.rs b/library/std/src/sys/unix/locks/pthread_condvar.rs index 2488d5a4e06..61c28d696bc 100644 --- a/library/std/src/sys/unix/locks/pthread_condvar.rs +++ b/library/std/src/sys/unix/locks/pthread_condvar.rs @@ -1,12 +1,13 @@ use crate::cell::UnsafeCell; use crate::sys::locks::{pthread_mutex, Mutex}; +use crate::sys_common::lazy_box::{LazyBox, LazyInit}; use crate::time::Duration; pub struct Condvar { inner: UnsafeCell<libc::pthread_cond_t>, } -pub type MovableCondvar = Box<Condvar>; +pub(crate) type MovableCondvar = LazyBox<Condvar>; unsafe impl Send for Condvar {} unsafe impl Sync for Condvar {} @@ -18,6 +19,14 @@ fn saturating_cast_to_time_t(value: u64) -> libc::time_t { if value > <libc::time_t>::MAX as u64 { <libc::time_t>::MAX } else { value as libc::time_t } } +impl LazyInit for Condvar { + fn init() -> Box<Self> { + let mut condvar = Box::new(Self::new()); + unsafe { condvar.init() }; + condvar + } +} + impl Condvar { pub const fn new() -> Condvar { // Might be moved and address is changing it is better to avoid @@ -32,14 +41,14 @@ impl Condvar { target_os = "android", target_os = "redox" ))] - pub unsafe fn init(&mut self) {} + unsafe fn init(&mut self) {} // NOTE: ESP-IDF's PTHREAD_COND_INITIALIZER support is not released yet // So on that platform, init() should always be called // Moreover, that platform does not have pthread_condattr_setclock support, // hence that initialization should be skipped as well #[cfg(target_os = "espidf")] - pub unsafe fn init(&mut self) { + unsafe fn init(&mut self) { let r = libc::pthread_cond_init(self.inner.get(), crate::ptr::null()); assert_eq!(r, 0); } @@ -52,7 +61,7 @@ impl Condvar { target_os = "redox", target_os = "espidf" )))] - pub unsafe fn init(&mut self) { + unsafe fn init(&mut self) { use crate::mem::MaybeUninit; let mut attr = MaybeUninit::<libc::pthread_condattr_t>::uninit(); let r = libc::pthread_condattr_init(attr.as_mut_ptr()); diff --git a/library/std/src/sys/unix/locks/pthread_mutex.rs b/library/std/src/sys/unix/locks/pthread_mutex.rs index 13a234668af..916e898d890 100644 --- a/library/std/src/sys/unix/locks/pthread_mutex.rs +++ b/library/std/src/sys/unix/locks/pthread_mutex.rs @@ -1,12 +1,13 @@ use crate::cell::UnsafeCell; use crate::mem::MaybeUninit; use crate::sys::cvt_nz; +use crate::sys_common::lazy_box::{LazyBox, LazyInit}; pub struct Mutex { inner: UnsafeCell<libc::pthread_mutex_t>, } -pub type MovableMutex = Box<Mutex>; +pub(crate) type MovableMutex = LazyBox<Mutex>; #[inline] pub unsafe fn raw(m: &Mutex) -> *mut libc::pthread_mutex_t { @@ -16,6 +17,14 @@ pub unsafe fn raw(m: &Mutex) -> *mut libc::pthread_mutex_t { unsafe impl Send for Mutex {} unsafe impl Sync for Mutex {} +impl LazyInit for Mutex { + fn init() -> Box<Self> { + let mut mutex = Box::new(Self::new()); + unsafe { mutex.init() }; + mutex + } +} + impl Mutex { pub const fn new() -> Mutex { // Might be moved to a different address, so it is better to avoid diff --git a/library/std/src/sys/unix/locks/pthread_rwlock.rs b/library/std/src/sys/unix/locks/pthread_rwlock.rs index 4f7f4783ad8..75e5759c787 100644 --- a/library/std/src/sys/unix/locks/pthread_rwlock.rs +++ b/library/std/src/sys/unix/locks/pthread_rwlock.rs @@ -1,5 +1,6 @@ use crate::cell::UnsafeCell; use crate::sync::atomic::{AtomicUsize, Ordering}; +use crate::sys_common::lazy_box::{LazyBox, LazyInit}; pub struct RwLock { inner: UnsafeCell<libc::pthread_rwlock_t>, @@ -7,11 +8,17 @@ pub struct RwLock { num_readers: AtomicUsize, } -pub type MovableRwLock = Box<RwLock>; +pub(crate) type MovableRwLock = LazyBox<RwLock>; unsafe impl Send for RwLock {} unsafe impl Sync for RwLock {} +impl LazyInit for RwLock { + fn init() -> Box<Self> { + Box::new(Self::new()) + } +} + impl RwLock { pub const fn new() -> RwLock { RwLock { |
