From 96c3a13680d521387007e2f6575483c24561ecb3 Mon Sep 17 00:00:00 2001 From: Keegan McAllister Date: Fri, 23 Jan 2015 11:47:04 -0800 Subject: [PATCH] sync: Add is_poisoned to Mutex and RwLock --- src/libstd/sync/mutex.rs | 13 +++++++++++++ src/libstd/sync/rwlock.rs | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/libstd/sync/mutex.rs b/src/libstd/sync/mutex.rs index 7531d5b058d7..74692c1273c2 100644 --- a/src/libstd/sync/mutex.rs +++ b/src/libstd/sync/mutex.rs @@ -228,6 +228,17 @@ impl Mutex { Err(TryLockError::WouldBlock) } } + + /// Determine whether the lock is poisoned. + /// + /// If another thread is active, the lock can still become poisoned at any + /// time. You should not trust a `false` value for program correctness + /// without additional synchronization. + #[inline] + #[unstable(feature = "std_misc")] + pub fn is_poisoned(&self) -> bool { + self.inner.poison.get() + } } #[unsafe_destructor] @@ -458,12 +469,14 @@ mod test { #[test] fn test_mutex_arc_poison() { let arc = Arc::new(Mutex::new(1)); + assert!(!arc.is_poisoned()); let arc2 = arc.clone(); let _ = Thread::scoped(move|| { let lock = arc2.lock().unwrap(); assert_eq!(*lock, 2); }).join(); assert!(arc.lock().is_err()); + assert!(arc.is_poisoned()); } #[test] diff --git a/src/libstd/sync/rwlock.rs b/src/libstd/sync/rwlock.rs index 6efbcf894156..c4f1f2ccaddd 100644 --- a/src/libstd/sync/rwlock.rs +++ b/src/libstd/sync/rwlock.rs @@ -237,6 +237,17 @@ impl RwLock { Err(TryLockError::WouldBlock) } } + + /// Determine whether the lock is poisoned. + /// + /// If another thread is active, the lock can still become poisoned at any + /// time. You should not trust a `false` value for program correctness + /// without additional synchronization. + #[inline] + #[unstable(feature = "std_misc")] + pub fn is_poisoned(&self) -> bool { + self.inner.poison.get() + } } #[unsafe_destructor] @@ -451,12 +462,14 @@ mod tests { #[test] fn test_rw_arc_poison_ww() { let arc = Arc::new(RwLock::new(1)); + assert!(!arc.is_poisoned()); let arc2 = arc.clone(); let _: Result = Thread::scoped(move|| { let _lock = arc2.write().unwrap(); panic!(); }).join(); assert!(arc.write().is_err()); + assert!(arc.is_poisoned()); } #[test]