diff --git a/src/ring_buffer/mod.rs b/src/ring_buffer/mod.rs index 52bbb04a463c968c4a5645442de19e74cd911333..0ae68a7c909c67b0f5f044e8336d7a1da33196f9 100644 --- a/src/ring_buffer/mod.rs +++ b/src/ring_buffer/mod.rs @@ -29,6 +29,10 @@ impl AtomicUsize { unsafe { &mut *self.v.get() } } + pub fn load_acquire(&self) -> usize { + unsafe { intrinsics::atomic_load_acq(self.v.get()) } + } + pub fn load_relaxed(&self) -> usize { unsafe { intrinsics::atomic_load_relaxed(self.v.get()) } } diff --git a/src/ring_buffer/spsc.rs b/src/ring_buffer/spsc.rs index 488c07a87a91a8d34f90a0bf0f55536c4dc2dd5d..082aab71441c92796e2a9ee0c1c4a0e1beb5aadb 100644 --- a/src/ring_buffer/spsc.rs +++ b/src/ring_buffer/spsc.rs @@ -45,7 +45,7 @@ where let n = rb.capacity() + 1; let buffer: &[T] = unsafe { rb.buffer.as_ref() }; - let tail = rb.tail.load_relaxed(); + let tail = rb.tail.load_acquire(); let head = rb.head.load_relaxed(); if head != tail { let item = unsafe { ptr::read(buffer.get_unchecked(head)) };