about summary refs log tree commit diff
path: root/src/libstd/sync
diff options
context:
space:
mode:
authorJohn Gallagher <jgallagher@bignerdranch.com>2015-05-06 11:47:11 -0400
committerJohn Gallagher <jgallagher@bignerdranch.com>2015-05-06 11:47:11 -0400
commit30b883b93f94be643e4b29e32bc8dcdbf07bf1d9 (patch)
tree7b630d0cb63d0a9f53fa0b08dd52c5527c990a38 /src/libstd/sync
parent7bd71637ca40910dbd310813a19abf76db84f8f6 (diff)
downloadrust-30b883b93f94be643e4b29e32bc8dcdbf07bf1d9.tar.gz
rust-30b883b93f94be643e4b29e32bc8dcdbf07bf1d9.zip
Make RwLock::try_write try to obtain a write lock
Diffstat (limited to 'src/libstd/sync')
-rw-r--r--src/libstd/sync/rwlock.rs21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/libstd/sync/rwlock.rs b/src/libstd/sync/rwlock.rs
index 9294fb64783..9563f6f8213 100644
--- a/src/libstd/sync/rwlock.rs
+++ b/src/libstd/sync/rwlock.rs
@@ -232,7 +232,7 @@ impl<T: ?Sized> RwLock<T> {
     #[inline]
     #[stable(feature = "rust1", since = "1.0.0")]
     pub fn try_write(&self) -> TryLockResult<RwLockWriteGuard<T>> {
-        if unsafe { self.inner.lock.try_read() } {
+        if unsafe { self.inner.lock.try_write() } {
             Ok(try!(RwLockWriteGuard::new(&*self.inner, &self.data)))
         } else {
             Err(TryLockError::WouldBlock)
@@ -413,7 +413,7 @@ mod tests {
     use rand::{self, Rng};
     use sync::mpsc::channel;
     use thread;
-    use sync::{Arc, RwLock, StaticRwLock, RW_LOCK_INIT};
+    use sync::{Arc, RwLock, StaticRwLock, TryLockError, RW_LOCK_INIT};
 
     #[test]
     fn smoke() {
@@ -577,4 +577,21 @@ mod tests {
         let comp: &[i32] = &[4, 2, 5];
         assert_eq!(&*rw.read().unwrap(), comp);
     }
+
+    #[test]
+    fn test_rwlock_try_write() {
+        use mem::drop;
+
+        let lock = RwLock::new(0isize);
+        let read_guard = lock.read().unwrap();
+
+        let write_result = lock.try_write();
+        match write_result {
+            Err(TryLockError::WouldBlock) => (),
+            Ok(_) => assert!(false, "try_write should not succeed while read_guard is in scope"),
+            Err(_) => assert!(false, "unexpected error"),
+        }
+
+        drop(read_guard);
+    }
 }