1- use crate :: sync:: { AtomicBool , Lock , LockGuard } ;
1+ use crate :: sync:: { AtomicBool , ReadGuard , RwLock , WriteGuard } ;
22#[ cfg( parallel_compiler) ]
33use crate :: sync:: { DynSend , DynSync } ;
44use std:: {
@@ -13,7 +13,9 @@ use std::{
1313pub struct Freeze < T > {
1414 data : UnsafeCell < T > ,
1515 frozen : AtomicBool ,
16- lock : Lock < ( ) > ,
16+
17+ /// This lock protects writes to the `data` and `frozen` fields.
18+ lock : RwLock < ( ) > ,
1719}
1820
1921#[ cfg( parallel_compiler) ]
@@ -22,7 +24,7 @@ unsafe impl<T: DynSync + DynSend> DynSync for Freeze<T> {}
2224impl < T > Freeze < T > {
2325 #[ inline]
2426 pub fn new ( value : T ) -> Self {
25- Self { data : UnsafeCell :: new ( value) , frozen : AtomicBool :: new ( false ) , lock : Lock :: new ( ( ) ) }
27+ Self { data : UnsafeCell :: new ( value) , frozen : AtomicBool :: new ( false ) , lock : RwLock :: new ( ( ) ) }
2628 }
2729
2830 #[ inline]
@@ -31,7 +33,7 @@ impl<T> Freeze<T> {
3133 _lock_guard : if self . frozen . load ( Ordering :: Acquire ) {
3234 None
3335 } else {
34- Some ( self . lock . lock ( ) )
36+ Some ( self . lock . read ( ) )
3537 } ,
3638 // SAFETY: If this is not frozen, `_lock_guard` holds the lock to the `UnsafeCell` so
3739 // this has shared access until the `FreezeReadGuard` is dropped. If this is frozen,
@@ -43,7 +45,7 @@ impl<T> Freeze<T> {
4345 #[ inline]
4446 #[ track_caller]
4547 pub fn write ( & self ) -> FreezeWriteGuard < ' _ , T > {
46- let _lock_guard = self . lock . lock ( ) ;
48+ let _lock_guard = self . lock . write ( ) ;
4749 assert ! ( !self . frozen. load( Ordering :: Relaxed ) , "still mutable" ) ;
4850 FreezeWriteGuard {
4951 _lock_guard,
@@ -57,7 +59,7 @@ impl<T> Freeze<T> {
5759 pub fn freeze ( & self ) -> & T {
5860 if !self . frozen . load ( Ordering :: Acquire ) {
5961 // Get the lock to ensure no concurrent writes.
60- let _lock = self . lock . lock ( ) ;
62+ let _lock = self . lock . write ( ) ;
6163 self . frozen . store ( true , Ordering :: Release ) ;
6264 }
6365
@@ -69,7 +71,7 @@ impl<T> Freeze<T> {
6971/// A guard holding shared access to a `Freeze` which is in a locked state or frozen.
7072#[ must_use = "if unused the Freeze may immediately unlock" ]
7173pub struct FreezeReadGuard < ' a , T > {
72- _lock_guard : Option < LockGuard < ' a , ( ) > > ,
74+ _lock_guard : Option < ReadGuard < ' a , ( ) > > ,
7375 data : & ' a T ,
7476}
7577
@@ -84,7 +86,7 @@ impl<'a, T: 'a> Deref for FreezeReadGuard<'a, T> {
8486/// A guard holding mutable access to a `Freeze` which is in a locked state or frozen.
8587#[ must_use = "if unused the Freeze may immediately unlock" ]
8688pub struct FreezeWriteGuard < ' a , T > {
87- _lock_guard : LockGuard < ' a , ( ) > ,
89+ _lock_guard : WriteGuard < ' a , ( ) > ,
8890 data : & ' a mut T ,
8991}
9092
0 commit comments