Skip to content

Commit

Permalink
Auto merge of #95183 - ibraheemdev:arc-count-acquire, r=Amanieu
Browse files Browse the repository at this point in the history
Weaken needlessly restrictive orderings on `Arc::*_count`

There is no apparent reason for these to be `SeqCst`. For reference, [the Boost C++ implementation relies on acquire semantics](https://github.com/boostorg/smart_ptr/blob/f2cc84a23c64b8a73c9b72b34799d0854d7e0787/include/boost/smart_ptr/detail/sp_counted_base_std_atomic.hpp#L137-L140).
  • Loading branch information
bors committed May 6, 2022
2 parents 9a25164 + 7e93032 commit e209e85
Showing 1 changed file with 6 additions and 6 deletions.
12 changes: 6 additions & 6 deletions library/alloc/src/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ use core::ptr::{self, NonNull};
#[cfg(not(no_global_oom_handling))]
use core::slice::from_raw_parts_mut;
use core::sync::atomic;
use core::sync::atomic::Ordering::{Acquire, Relaxed, Release, SeqCst};
use core::sync::atomic::Ordering::{Acquire, Relaxed, Release};

#[cfg(not(no_global_oom_handling))]
use crate::alloc::handle_alloc_error;
Expand Down Expand Up @@ -984,7 +984,7 @@ impl<T: ?Sized> Arc<T> {
#[must_use]
#[stable(feature = "arc_counts", since = "1.15.0")]
pub fn weak_count(this: &Self) -> usize {
let cnt = this.inner().weak.load(SeqCst);
let cnt = this.inner().weak.load(Acquire);
// If the weak count is currently locked, the value of the
// count was 0 just before taking the lock.
if cnt == usize::MAX { 0 } else { cnt - 1 }
Expand Down Expand Up @@ -1014,7 +1014,7 @@ impl<T: ?Sized> Arc<T> {
#[must_use]
#[stable(feature = "arc_counts", since = "1.15.0")]
pub fn strong_count(this: &Self) -> usize {
this.inner().strong.load(SeqCst)
this.inner().strong.load(Acquire)
}

/// Increments the strong reference count on the `Arc<T>` associated with the
Expand Down Expand Up @@ -1976,7 +1976,7 @@ impl<T: ?Sized> Weak<T> {
#[must_use]
#[stable(feature = "weak_counts", since = "1.41.0")]
pub fn strong_count(&self) -> usize {
if let Some(inner) = self.inner() { inner.strong.load(SeqCst) } else { 0 }
if let Some(inner) = self.inner() { inner.strong.load(Acquire) } else { 0 }
}

/// Gets an approximation of the number of `Weak` pointers pointing to this
Expand All @@ -1995,8 +1995,8 @@ impl<T: ?Sized> Weak<T> {
pub fn weak_count(&self) -> usize {
self.inner()
.map(|inner| {
let weak = inner.weak.load(SeqCst);
let strong = inner.strong.load(SeqCst);
let weak = inner.weak.load(Acquire);
let strong = inner.strong.load(Acquire);
if strong == 0 {
0
} else {
Expand Down

0 comments on commit e209e85

Please sign in to comment.