Skip to content

Commit 0c125ac

Browse files
committed
📝 add more memory fence
1 parent 9f6ee36 commit 0c125ac

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

src/lib.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)