11use crate :: cell:: UnsafeCell ;
22use crate :: mem;
3+ use crate :: mem:: MaybeUninit ;
34use crate :: sync:: atomic:: { AtomicU32 , Ordering } ;
45use crate :: sys:: cloudabi:: abi;
56use crate :: sys:: rwlock:: { self , RWLock } ;
@@ -47,24 +48,27 @@ impl Mutex {
4748}
4849
4950pub struct ReentrantMutex {
50- lock : UnsafeCell < AtomicU32 > ,
51- recursion : UnsafeCell < u32 > ,
51+ lock : UnsafeCell < MaybeUninit < AtomicU32 > > ,
52+ recursion : UnsafeCell < MaybeUninit < u32 > > ,
5253}
5354
5455impl ReentrantMutex {
5556 pub unsafe fn uninitialized ( ) -> ReentrantMutex {
56- mem:: uninitialized ( )
57+ ReentrantMutex {
58+ lock : UnsafeCell :: new ( MaybeUninit :: uninit ( ) ) ,
59+ recursion : UnsafeCell :: new ( MaybeUninit :: uninit ( ) )
60+ }
5761 }
5862
5963 pub unsafe fn init ( & mut self ) {
60- self . lock = UnsafeCell :: new ( AtomicU32 :: new ( abi:: LOCK_UNLOCKED . 0 ) ) ;
61- self . recursion = UnsafeCell :: new ( 0 ) ;
64+ self . lock = UnsafeCell :: new ( MaybeUninit :: new ( AtomicU32 :: new ( abi:: LOCK_UNLOCKED . 0 ) ) ) ;
65+ self . recursion = UnsafeCell :: new ( MaybeUninit :: new ( 0 ) ) ;
6266 }
6367
6468 pub unsafe fn try_lock ( & self ) -> bool {
6569 // Attempt to acquire the lock.
66- let lock = self . lock . get ( ) ;
67- let recursion = self . recursion . get ( ) ;
70+ let lock = ( * self . lock . get ( ) ) . as_mut_ptr ( ) ;
71+ let recursion = ( * self . recursion . get ( ) ) . as_mut_ptr ( ) ;
6872 if let Err ( old) = ( * lock) . compare_exchange (
6973 abi:: LOCK_UNLOCKED . 0 ,
7074 __pthread_thread_id. 0 | abi:: LOCK_WRLOCKED . 0 ,
@@ -109,8 +113,8 @@ impl ReentrantMutex {
109113 }
110114
111115 pub unsafe fn unlock ( & self ) {
112- let lock = self . lock . get ( ) ;
113- let recursion = self . recursion . get ( ) ;
116+ let lock = ( * self . lock . get ( ) ) . as_mut_ptr ( ) ;
117+ let recursion = ( * self . recursion . get ( ) ) . as_mut_ptr ( ) ;
114118 assert_eq ! (
115119 ( * lock) . load( Ordering :: Relaxed ) & !abi:: LOCK_KERNEL_MANAGED . 0 ,
116120 __pthread_thread_id. 0 | abi:: LOCK_WRLOCKED . 0 ,
@@ -136,8 +140,8 @@ impl ReentrantMutex {
136140 }
137141
138142 pub unsafe fn destroy ( & self ) {
139- let lock = self . lock . get ( ) ;
140- let recursion = self . recursion . get ( ) ;
143+ let lock = ( * self . lock . get ( ) ) . as_mut_ptr ( ) ;
144+ let recursion = ( * self . recursion . get ( ) ) . as_mut_ptr ( ) ;
141145 assert_eq ! (
142146 ( * lock) . load( Ordering :: Relaxed ) ,
143147 abi:: LOCK_UNLOCKED . 0 ,
0 commit comments