@@ -4,6 +4,7 @@ mod tests;
4
4
use crate :: cell:: UnsafeCell ;
5
5
use crate :: fmt;
6
6
use crate :: ops:: { Deref , DerefMut } ;
7
+ use crate :: ptr:: NonNull ;
7
8
use crate :: sync:: { poison, LockResult , TryLockError , TryLockResult } ;
8
9
use crate :: sys_common:: rwlock as sys;
9
10
@@ -101,7 +102,7 @@ unsafe impl<T: ?Sized + Send + Sync> Sync for RwLock<T> {}
101
102
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
102
103
#[ clippy:: has_significant_drop]
103
104
pub struct RwLockReadGuard < ' a , T : ?Sized + ' a > {
104
- data : * const T ,
105
+ data : NonNull < T > ,
105
106
inner_lock : & ' a sys:: MovableRwLock ,
106
107
}
107
108
@@ -510,15 +511,23 @@ impl<T> From<T> for RwLock<T> {
510
511
}
511
512
512
513
impl < ' rwlock , T : ?Sized > RwLockReadGuard < ' rwlock , T > {
514
+ /// Create a new instance of `RwLockReadGuard<T>` from a `RwLock<T>`.
515
+ ///
516
+ /// It is safe to call this function if and only if `lock.inner.read()` (or
517
+ /// `lock.inner.try_read()`) has been successfully called before instantiating this object.
513
518
unsafe fn new ( lock : & ' rwlock RwLock < T > ) -> LockResult < RwLockReadGuard < ' rwlock , T > > {
514
519
poison:: map_result ( lock. poison . borrow ( ) , |( ) | RwLockReadGuard {
520
+ data : NonNull :: new_unchecked ( lock. data . get ( ) ) ,
515
521
inner_lock : & lock. inner ,
516
- data : lock. data . get ( ) ,
517
522
} )
518
523
}
519
524
}
520
525
521
526
impl < ' rwlock , T : ?Sized > RwLockWriteGuard < ' rwlock , T > {
527
+ /// Create a new instance of `RwLockReadGuard<T>` from a `RwLock<T>`.
528
+ ///
529
+ /// It is safe to call this function if and only if `lock.inner.write()` (or
530
+ /// `lock.inner.try_write()`) has been successfully called before instantiating this object.
522
531
unsafe fn new ( lock : & ' rwlock RwLock < T > ) -> LockResult < RwLockWriteGuard < ' rwlock , T > > {
523
532
poison:: map_result ( lock. poison . guard ( ) , |guard| RwLockWriteGuard { lock, poison : guard } )
524
533
}
@@ -557,7 +566,7 @@ impl<T: ?Sized> Deref for RwLockReadGuard<'_, T> {
557
566
type Target = T ;
558
567
559
568
fn deref ( & self ) -> & T {
560
- unsafe { & * self . data }
569
+ unsafe { self . data . as_ref ( ) }
561
570
}
562
571
}
563
572
0 commit comments