@@ -779,18 +779,15 @@ unsafe impl<T: ?Sized + Sync> std::marker::Send for MappedReadGuard<'_, T> {}
779
779
unsafe impl < T : ?Sized + Sync > std:: marker:: Sync for MappedReadGuard < ' _ , T > { }
780
780
781
781
impl < ' a , T : ' a + ?Sized > MappedReadGuard < ' a , T > {
782
+ #[ inline]
782
783
pub fn map < U : ?Sized , F > ( s : Self , f : F ) -> MappedReadGuard < ' a , U >
783
- where
784
- F : FnOnce ( & T ) -> & U ,
784
+ where
785
+ F : FnOnce ( & T ) -> & U ,
785
786
{
786
787
let raw = s. raw ;
787
788
let data = f ( unsafe { & * s. data } ) ;
788
789
std:: mem:: forget ( s) ;
789
- MappedReadGuard {
790
- raw,
791
- data,
792
- marker : PhantomData ,
793
- }
790
+ MappedReadGuard { raw, data, marker : PhantomData }
794
791
}
795
792
}
796
793
@@ -818,9 +815,55 @@ impl<'a, T: 'a + ?Sized> Drop for MappedReadGuard<'a, T> {
818
815
}
819
816
}
820
817
821
- //pub use std::cell::RefMut;
822
- //pub use parking_lot::MappedRwLockReadGuard as MappedReadGuard;
823
- //pub use parking_lot::MappedRwLockWriteGuard as MappedWriteGuard;
818
+ pub struct MappedWriteGuard < ' a , T : ?Sized > {
819
+ raw : & ' a RwLockRaw ,
820
+ data : * mut T ,
821
+ marker : PhantomData < & ' a mut T > ,
822
+ }
823
+
824
+ unsafe impl < T : ?Sized + Sync > std:: marker:: Send for MappedWriteGuard < ' _ , T > { }
825
+
826
+ impl < ' a , T : ' a + ?Sized > MappedWriteGuard < ' a , T > {
827
+ #[ inline]
828
+ pub fn map < U : ?Sized , F > ( s : Self , f : F ) -> MappedWriteGuard < ' a , U >
829
+ where
830
+ F : FnOnce ( & mut T ) -> & mut U ,
831
+ {
832
+ let raw = s. raw ;
833
+ let data = f ( unsafe { & mut * s. data } ) ;
834
+ std:: mem:: forget ( s) ;
835
+ MappedWriteGuard { raw, data, marker : PhantomData }
836
+ }
837
+ }
838
+
839
+ impl < ' a , T : ' a + ?Sized > Deref for MappedWriteGuard < ' a , T > {
840
+ type Target = T ;
841
+ #[ inline]
842
+ fn deref ( & self ) -> & T {
843
+ unsafe { & * self . data }
844
+ }
845
+ }
846
+
847
+ impl < ' a , T : ' a + ?Sized > DerefMut for MappedWriteGuard < ' a , T > {
848
+ #[ inline]
849
+ fn deref_mut ( & mut self ) -> & mut T {
850
+ unsafe { & mut * self . data }
851
+ }
852
+ }
853
+
854
+ impl < ' a , T : ' a + ?Sized > Drop for MappedWriteGuard < ' a , T > {
855
+ #[ inline]
856
+ fn drop ( & mut self ) {
857
+ if likely ( self . raw . single_thread ) {
858
+ assert_eq ! ( self . raw. borrow. replace( 0 ) , -1 ) ;
859
+ } else {
860
+ // Safety: An RwLockReadGuard always holds a shared lock.
861
+ unsafe {
862
+ self . raw . raw . unlock_exclusive ( ) ;
863
+ }
864
+ }
865
+ }
866
+ }
824
867
825
868
pub struct ReadGuard < ' a , T > {
826
869
rwlock : & ' a RwLock < T > ,
@@ -868,6 +911,18 @@ pub struct WriteGuard<'a, T> {
868
911
marker : PhantomData < & ' a mut T > ,
869
912
}
870
913
914
+ impl < ' a , T : ' a > WriteGuard < ' a , T > {
915
+ pub fn map < U : ?Sized , F > ( s : Self , f : F ) -> MappedWriteGuard < ' a , U >
916
+ where
917
+ F : FnOnce ( & mut T ) -> & mut U ,
918
+ {
919
+ let raw = & s. rwlock . raw ;
920
+ let data = f ( unsafe { & mut * s. rwlock . data . get ( ) } ) ;
921
+ std:: mem:: forget ( s) ;
922
+ MappedWriteGuard { raw, data, marker : PhantomData }
923
+ }
924
+ }
925
+
871
926
impl < ' a , T : ' a > Deref for WriteGuard < ' a , T > {
872
927
type Target = T ;
873
928
#[ inline]
@@ -917,11 +972,7 @@ impl<T: Debug> Debug for RwLock<T> {
917
972
impl < T : Default > Default for RwLock < T > {
918
973
fn default ( ) -> Self {
919
974
RwLock {
920
- raw : RwLockRaw {
921
- single_thread : !active ( ) ,
922
- borrow : Cell :: new ( 0 ) ,
923
- raw : RawRwLock :: INIT ,
924
- } ,
975
+ raw : RwLockRaw { single_thread : !active ( ) , borrow : Cell :: new ( 0 ) , raw : RawRwLock :: INIT } ,
925
976
926
977
data : UnsafeCell :: new ( T :: default ( ) ) ,
927
978
}
@@ -932,14 +983,9 @@ impl<T> RwLock<T> {
932
983
#[ inline( always) ]
933
984
pub fn new ( inner : T ) -> Self {
934
985
RwLock {
935
- raw : RwLockRaw {
936
- single_thread : !active ( ) ,
937
- borrow : Cell :: new ( 0 ) ,
938
- raw : RawRwLock :: INIT ,
939
- } ,
986
+ raw : RwLockRaw { single_thread : !active ( ) , borrow : Cell :: new ( 0 ) , raw : RawRwLock :: INIT } ,
940
987
941
988
data : UnsafeCell :: new ( inner) ,
942
-
943
989
}
944
990
}
945
991
0 commit comments