diff options
| author | John Gallagher <jgallagher@bignerdranch.com> | 2015-05-06 11:47:11 -0400 |
|---|---|---|
| committer | John Gallagher <jgallagher@bignerdranch.com> | 2015-05-06 11:47:11 -0400 |
| commit | 30b883b93f94be643e4b29e32bc8dcdbf07bf1d9 (patch) | |
| tree | 7b630d0cb63d0a9f53fa0b08dd52c5527c990a38 /src/libstd/sync | |
| parent | 7bd71637ca40910dbd310813a19abf76db84f8f6 (diff) | |
| download | rust-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.rs | 21 |
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); + } } |
