@@ -232,7 +232,7 @@ impl<T: ?Sized> RwLock<T> {
232
232
#[ inline]
233
233
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
234
234
pub fn try_write ( & self ) -> TryLockResult < RwLockWriteGuard < T > > {
235
- if unsafe { self . inner . lock . try_read ( ) } {
235
+ if unsafe { self . inner . lock . try_write ( ) } {
236
236
Ok ( try!( RwLockWriteGuard :: new ( & * self . inner , & self . data ) ) )
237
237
} else {
238
238
Err ( TryLockError :: WouldBlock )
@@ -413,7 +413,7 @@ mod tests {
413
413
use rand:: { self , Rng } ;
414
414
use sync:: mpsc:: channel;
415
415
use thread;
416
- use sync:: { Arc , RwLock , StaticRwLock , RW_LOCK_INIT } ;
416
+ use sync:: { Arc , RwLock , StaticRwLock , TryLockError , RW_LOCK_INIT } ;
417
417
418
418
#[ test]
419
419
fn smoke ( ) {
@@ -577,4 +577,21 @@ mod tests {
577
577
let comp: & [ i32 ] = & [ 4 , 2 , 5 ] ;
578
578
assert_eq ! ( & * rw. read( ) . unwrap( ) , comp) ;
579
579
}
580
+
581
+ #[ test]
582
+ fn test_rwlock_try_write ( ) {
583
+ use mem:: drop;
584
+
585
+ let lock = RwLock :: new ( 0isize ) ;
586
+ let read_guard = lock. read ( ) . unwrap ( ) ;
587
+
588
+ let write_result = lock. try_write ( ) ;
589
+ match write_result {
590
+ Err ( TryLockError :: WouldBlock ) => ( ) ,
591
+ Ok ( _) => assert ! ( false , "try_write should not succeed while read_guard is in scope" ) ,
592
+ Err ( _) => assert ! ( false , "unexpected error" ) ,
593
+ }
594
+
595
+ drop ( read_guard) ;
596
+ }
580
597
}
0 commit comments