diff --git a/src/praetor/mod.rs b/src/praetor/mod.rs index b7db74d..0a06d4c 100644 --- a/src/praetor/mod.rs +++ b/src/praetor/mod.rs @@ -85,8 +85,7 @@ mod util { pub fn ptr(&self, order: Ordering) -> NonNull { unsafe { - NonNull::new_unchecked(self.0.load(order) as _) - .map_addr(|addr| NonZero::new_unchecked(addr.get() & !Self::mask())) + NonNull::new_unchecked(self.0.load(order).map_addr(|addr| addr & !Self::mask()) as _) } } @@ -113,8 +112,8 @@ mod util { let mask = Self::mask(); let old_ptr = self.0.load(failure); - let old = old_ptr.with_addr((old_ptr.addr() & !mask) | (old & mask)); - let new = old_ptr.with_addr((old_ptr.addr() & !mask) | (new & mask)); + let old = old_ptr.map_addr(|addr| (addr & !mask) | (old & mask)); + let new = old_ptr.map_addr(|addr| (addr & !mask) | (new & mask)); let result = cmpxchg(&self.0, old, new, success, failure); @@ -182,6 +181,7 @@ mod util { loop { let ptr = self.0.load(failure); let new = ptr.with_addr((ptr.addr() & !mask) | (tag & mask)); + if self .0 .compare_exchange_weak(ptr, new, success, failure) @@ -196,8 +196,8 @@ mod util { let mask = Self::mask(); let ptr = self.0.load(order); let tag = ptr.addr() & mask; - let addr = ptr.addr() & !mask; - let ptr = unsafe { NonNull::new_unchecked(ptr.with_addr(addr).cast()) }; + let ptr = ptr.map_addr(|addr| addr & !mask); + let ptr = unsafe { NonNull::new_unchecked(ptr.cast()) }; (ptr, tag) } }