diff options
Diffstat (limited to 'src/libstd/sys/common')
| -rw-r--r-- | src/libstd/sys/common/condvar.rs | 6 | ||||
| -rw-r--r-- | src/libstd/sys/common/mutex.rs | 9 | ||||
| -rw-r--r-- | src/libstd/sys/common/poison.rs | 18 | ||||
| -rw-r--r-- | src/libstd/sys/common/remutex.rs | 2 | ||||
| -rw-r--r-- | src/libstd/sys/common/rwlock.rs | 9 | ||||
| -rw-r--r-- | src/libstd/sys/common/thread_local.rs | 43 |
6 files changed, 41 insertions, 46 deletions
diff --git a/src/libstd/sys/common/condvar.rs b/src/libstd/sys/common/condvar.rs index 9f46b0c3824..33734a88cf3 100644 --- a/src/libstd/sys/common/condvar.rs +++ b/src/libstd/sys/common/condvar.rs @@ -20,16 +20,12 @@ use sys::condvar as imp; /// this type. pub struct Condvar(imp::Condvar); -/// Static initializer for condition variables. -pub const CONDVAR_INIT: Condvar = Condvar(imp::CONDVAR_INIT); - impl Condvar { /// Creates a new condition variable for use. /// /// Behavior is undefined if the condition variable is moved after it is /// first used with any of the functions below. - #[inline] - pub unsafe fn new() -> Condvar { Condvar(imp::Condvar::new()) } + pub const fn new() -> Condvar { Condvar(imp::Condvar::new()) } /// Signals one waiter on this condition variable to wake up. #[inline] diff --git a/src/libstd/sys/common/mutex.rs b/src/libstd/sys/common/mutex.rs index 1f9dd54192c..5a6dfe7fb1a 100644 --- a/src/libstd/sys/common/mutex.rs +++ b/src/libstd/sys/common/mutex.rs @@ -20,10 +20,13 @@ pub struct Mutex(imp::Mutex); unsafe impl Sync for Mutex {} -/// Constant initializer for statically allocated mutexes. -pub const MUTEX_INIT: Mutex = Mutex(imp::MUTEX_INIT); - impl Mutex { + /// Creates a new mutex for use. + /// + /// Behavior is undefined if the mutex is moved after it is + /// first used with any of the functions below. + pub const fn new() -> Mutex { Mutex(imp::Mutex::new()) } + /// Locks the mutex blocking the current thread until it is available. /// /// Behavior is undefined if the mutex has been moved between this and any diff --git a/src/libstd/sys/common/poison.rs b/src/libstd/sys/common/poison.rs index 67679c11a98..48c81982725 100644 --- a/src/libstd/sys/common/poison.rs +++ b/src/libstd/sys/common/poison.rs @@ -10,26 +10,28 @@ use prelude::v1::*; -use marker::Reflect; -use cell::UnsafeCell; +use cell::Cell; use error::{Error}; use fmt; +use marker::Reflect; use thread; -pub struct Flag { failed: UnsafeCell<bool> } +pub struct Flag { failed: Cell<bool> } // This flag is only ever accessed with a lock previously held. Note that this // a totally private structure. unsafe impl Send for Flag {} unsafe impl Sync for Flag {} -pub const FLAG_INIT: Flag = Flag { failed: UnsafeCell { value: false } }; - impl Flag { + pub const fn new() -> Flag { + Flag { failed: Cell::new(false) } + } + #[inline] pub fn borrow(&self) -> LockResult<Guard> { let ret = Guard { panicking: thread::panicking() }; - if unsafe { *self.failed.get() } { + if self.get() { Err(PoisonError::new(ret)) } else { Ok(ret) @@ -39,13 +41,13 @@ impl Flag { #[inline] pub fn done(&self, guard: &Guard) { if !guard.panicking && thread::panicking() { - unsafe { *self.failed.get() = true; } + self.failed.set(true); } } #[inline] pub fn get(&self) -> bool { - unsafe { *self.failed.get() } + self.failed.get() } } diff --git a/src/libstd/sys/common/remutex.rs b/src/libstd/sys/common/remutex.rs index 1a467580672..72f8453233a 100644 --- a/src/libstd/sys/common/remutex.rs +++ b/src/libstd/sys/common/remutex.rs @@ -54,7 +54,7 @@ impl<T> ReentrantMutex<T> { unsafe { let mut mutex = ReentrantMutex { inner: box sys::ReentrantMutex::uninitialized(), - poison: poison::FLAG_INIT, + poison: poison::Flag::new(), data: t, }; mutex.inner.init(); diff --git a/src/libstd/sys/common/rwlock.rs b/src/libstd/sys/common/rwlock.rs index 725a09bcc86..71a4f01ec4c 100644 --- a/src/libstd/sys/common/rwlock.rs +++ b/src/libstd/sys/common/rwlock.rs @@ -17,10 +17,13 @@ use sys::rwlock as imp; /// safer types at the top level of this crate instead of this type. pub struct RWLock(imp::RWLock); -/// Constant initializer for static RWLocks. -pub const RWLOCK_INIT: RWLock = RWLock(imp::RWLOCK_INIT); - impl RWLock { + /// Creates a new reader-writer lock for use. + /// + /// Behavior is undefined if the reader-writer lock is moved after it is + /// first used with any of the functions below. + pub const fn new() -> RWLock { RWLock(imp::RWLock::new()) } + /// Acquires shared access to the underlying lock, blocking the current /// thread to do so. /// diff --git a/src/libstd/sys/common/thread_local.rs b/src/libstd/sys/common/thread_local.rs index 618a389110a..eb4cbfcfbcd 100644 --- a/src/libstd/sys/common/thread_local.rs +++ b/src/libstd/sys/common/thread_local.rs @@ -86,19 +86,13 @@ use sys::thread_local as imp; /// } /// ``` pub struct StaticKey { - /// Inner static TLS key (internals), created with by `INIT_INNER` in this - /// module. - pub inner: StaticKeyInner, + /// Inner static TLS key (internals). + key: AtomicUsize, /// Destructor for the TLS value. /// /// See `Key::new` for information about when the destructor runs and how /// it runs. - pub dtor: Option<unsafe extern fn(*mut u8)>, -} - -/// Inner contents of `StaticKey`, created by the `INIT_INNER` constant. -pub struct StaticKeyInner { - key: AtomicUsize, + dtor: Option<unsafe extern fn(*mut u8)>, } /// A type for a safely managed OS-based TLS slot. @@ -129,19 +123,16 @@ pub struct Key { /// Constant initialization value for static TLS keys. /// /// This value specifies no destructor by default. -pub const INIT: StaticKey = StaticKey { - inner: INIT_INNER, - dtor: None, -}; - -/// Constant initialization value for the inner part of static TLS keys. -/// -/// This value allows specific configuration of the destructor for a TLS key. -pub const INIT_INNER: StaticKeyInner = StaticKeyInner { - key: atomic::ATOMIC_USIZE_INIT, -}; +pub const INIT: StaticKey = StaticKey::new(None); impl StaticKey { + pub const fn new(dtor: Option<unsafe extern fn(*mut u8)>) -> StaticKey { + StaticKey { + key: atomic::AtomicUsize::new(0), + dtor: dtor + } + } + /// Gets the value associated with this TLS key /// /// This will lazily allocate a TLS key from the OS if one has not already @@ -164,7 +155,7 @@ impl StaticKey { /// Note that this does *not* run the user-provided destructor if one was /// specified at definition time. Doing so must be done manually. pub unsafe fn destroy(&self) { - match self.inner.key.swap(0, Ordering::SeqCst) { + match self.key.swap(0, Ordering::SeqCst) { 0 => {} n => { imp::destroy(n as imp::Key) } } @@ -172,7 +163,7 @@ impl StaticKey { #[inline] unsafe fn key(&self) -> imp::Key { - match self.inner.key.load(Ordering::Relaxed) { + match self.key.load(Ordering::Relaxed) { 0 => self.lazy_init() as imp::Key, n => n as imp::Key } @@ -197,7 +188,7 @@ impl StaticKey { key2 }; assert!(key != 0); - match self.inner.key.compare_and_swap(0, key as usize, Ordering::SeqCst) { + match self.key.compare_and_swap(0, key as usize, Ordering::SeqCst) { // The CAS succeeded, so we've created the actual key 0 => key as usize, // If someone beat us to the punch, use their key instead @@ -245,7 +236,7 @@ impl Drop for Key { #[cfg(test)] mod tests { use prelude::v1::*; - use super::{Key, StaticKey, INIT_INNER}; + use super::{Key, StaticKey}; fn assert_sync<T: Sync>() {} fn assert_send<T: Send>() {} @@ -267,8 +258,8 @@ mod tests { #[test] fn statik() { - static K1: StaticKey = StaticKey { inner: INIT_INNER, dtor: None }; - static K2: StaticKey = StaticKey { inner: INIT_INNER, dtor: None }; + static K1: StaticKey = StaticKey::new(None); + static K2: StaticKey = StaticKey::new(None); unsafe { assert!(K1.get().is_null()); |
