@@ -78,6 +78,7 @@ impl<T> LinkWrapper<T> {
7878 backoff. snooze ( ) ;
7979 }
8080
81+ core:: sync:: atomic:: fence ( Ordering :: Acquire ) ;
8182 let addr = old >> LEADING_BITS ;
8283 let ptr = Ptr { addr } . ptr ( ) ;
8384 Self :: ptr_to_arc ( ptr)
@@ -116,7 +117,7 @@ impl<T> LinkWrapper<T> {
116117
117118 #[ inline]
118119 fn inc_ref ( & self ) -> * const T {
119- let addr = self . ptr . fetch_add ( 1 , Ordering :: Release ) ;
120+ let addr = self . ptr . fetch_add ( 1 , Ordering :: Acquire ) ;
120121 let refs = addr & REFCOUNT_MASK ;
121122 assert ! ( refs < REFCOUNT_MASK , "Too many references" ) ;
122123 let addr = ( addr & !REFCOUNT_MASK ) >> LEADING_BITS ;
@@ -141,6 +142,7 @@ impl<T> LinkWrapper<T> {
141142 let v = ManuallyDrop :: new ( Self :: ptr_to_arc ( ptr) ) ;
142143 let cloned = v. as_ref ( ) . cloned ( ) ;
143144 self . dec_ref ( ) ;
145+ core:: sync:: atomic:: fence ( Ordering :: Acquire ) ;
144146 cloned
145147 }
146148
@@ -149,23 +151,24 @@ impl<T> LinkWrapper<T> {
149151 // should be paired used with unlock_update
150152 #[ inline]
151153 fn lock_read ( & self ) -> Option < Arc < T > > {
152- let addr = self . ptr . load ( Ordering :: Relaxed ) ;
154+ use Ordering :: * ;
155+
156+ let addr = self . ptr . load ( Relaxed ) ;
153157 let mut old = addr & !UPDTATE_MASK ; // clear the update flag
154158 let mut new = addr | UPDTATE_MASK ; // set the update flag
155159
156160 let refs = old & UPDATE_REF_MASK ;
157161 assert ! ( refs < UPDATE_REF_MASK , "Too many references" ) ;
158162
159163 let backoff = crossbeam_utils:: Backoff :: new ( ) ;
160- while let Err ( addr) =
161- self . ptr
162- . compare_exchange_weak ( old, new, Ordering :: Acquire , Ordering :: Relaxed )
163- {
164+ while let Err ( addr) = self . ptr . compare_exchange_weak ( old, new, Release , Relaxed ) {
164165 old = addr & !UPDTATE_MASK ;
165166 new = addr | UPDTATE_MASK ;
166167 backoff. snooze ( ) ;
167168 }
168169
170+ core:: sync:: atomic:: fence ( Ordering :: Acquire ) ;
171+
169172 let addr = ( old & !REFCOUNT_MASK ) >> LEADING_BITS ;
170173 let ptr = Ptr { addr } . ptr ( ) ;
171174 let ret = Self :: ptr_to_arc ( ptr) ;
0 commit comments