diff --git a/src/bytes.rs b/src/bytes.rs index 79a09f398..475a6dba0 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -7,7 +7,7 @@ use alloc::{borrow::Borrow, boxed::Box, string::String, vec::Vec}; use crate::buf::IntoIter; #[allow(unused)] use crate::loom::sync::atomic::AtomicMut; -use crate::loom::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; +use crate::loom::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; use crate::Buf; /// A reference counted contiguous slice of memory. @@ -1046,7 +1046,9 @@ unsafe fn release_shared(ptr: *mut Shared) { // > "acquire" operation before deleting the object. // // [1]: (www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html) - atomic::fence(Ordering::Acquire); + // + // Use atomic load instead of fence for compatibility with ThreadSanitizer. + (*ptr).ref_cnt.load(Ordering::Acquire); // Drop the data Box::from_raw(ptr); diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 802745efa..28f5bda66 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -15,7 +15,7 @@ use crate::buf::IntoIter; use crate::bytes::Vtable; #[allow(unused)] use crate::loom::sync::atomic::AtomicMut; -use crate::loom::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; +use crate::loom::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; use crate::{Buf, BufMut, Bytes}; /// A unique reference to a contiguous slice of memory. @@ -1223,7 +1223,9 @@ unsafe fn release_shared(ptr: *mut Shared) { // > "acquire" operation before deleting the object. // // [1]: (www.boost.org/doc/libs/1_55_0/doc/html/atomic/usage_examples.html) - atomic::fence(Ordering::Acquire); + // + // Use atomic load instead of fence for compatibility with ThreadSanitizer. + (*ptr).ref_count.load(Ordering::Acquire); // Drop the data Box::from_raw(ptr); diff --git a/src/loom.rs b/src/loom.rs index 1cae8812e..9e6b2d5e2 100644 --- a/src/loom.rs +++ b/src/loom.rs @@ -1,7 +1,7 @@ #[cfg(not(all(test, loom)))] pub(crate) mod sync { pub(crate) mod atomic { - pub(crate) use core::sync::atomic::{fence, AtomicPtr, AtomicUsize, Ordering}; + pub(crate) use core::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; pub(crate) trait AtomicMut { fn with_mut(&mut self, f: F) -> R @@ -23,7 +23,7 @@ pub(crate) mod sync { #[cfg(all(test, loom))] pub(crate) mod sync { pub(crate) mod atomic { - pub(crate) use loom::sync::atomic::{fence, AtomicPtr, AtomicUsize, Ordering}; + pub(crate) use loom::sync::atomic::{AtomicPtr, AtomicUsize, Ordering}; pub(crate) trait AtomicMut {} }