Skip to content

Commit 2ce3f85

Browse files
committed
Tweak and stabilize AtomicN::fetch_update
1 parent d626e4d commit 2ce3f85

File tree

1 file changed

+10
-14
lines changed

1 file changed

+10
-14
lines changed

src/libcore/sync/atomic.rs

+10-14
Original file line numberDiff line numberDiff line change
@@ -1809,11 +1809,10 @@ Note: This may call the function multiple times if the value has been changed fr
18091809
the meantime, as long as the function returns `Some(_)`, but the function will have been applied
18101810
but once to the stored value.
18111811
1812-
`fetch_update` takes two [`Ordering`] arguments to describe the memory
1813-
ordering of this operation. The first describes the required ordering for loads
1814-
and failed updates while the second describes the required ordering when the
1815-
operation finally succeeds. Beware that this is different from the two
1816-
modes in [`compare_exchange`]!
1812+
`fetch_update` takes two [`Ordering`] arguments to describe the memory ordering of this operation.
1813+
The first describes the required ordering for when the operation finally succeeds while the second
1814+
describes the required ordering for loads. These correspond to the success and failure orderings of
1815+
[`compare_exchange`] respectively.
18171816
18181817
Using [`Acquire`] as success ordering makes the store part
18191818
of this operation [`Relaxed`], and using [`Release`] makes the final successful load
@@ -1831,24 +1830,21 @@ and must be equivalent to or weaker than the success ordering.
18311830
# Examples
18321831
18331832
```rust
1834-
#![feature(no_more_cas)]
18351833
", $extra_feature, "use std::sync::atomic::{", stringify!($atomic_type), ", Ordering};
18361834
18371835
let x = ", stringify!($atomic_type), "::new(7);
1838-
assert_eq!(x.fetch_update(|_| None, Ordering::SeqCst, Ordering::SeqCst), Err(7));
1839-
assert_eq!(x.fetch_update(|x| Some(x + 1), Ordering::SeqCst, Ordering::SeqCst), Ok(7));
1840-
assert_eq!(x.fetch_update(|x| Some(x + 1), Ordering::SeqCst, Ordering::SeqCst), Ok(8));
1836+
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |_| None), Err(7));
1837+
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| Some(x + 1)), Ok(7));
1838+
assert_eq!(x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |x| Some(x + 1)), Ok(8));
18411839
assert_eq!(x.load(Ordering::SeqCst), 9);
18421840
```"),
18431841
#[inline]
1844-
#[unstable(feature = "no_more_cas",
1845-
reason = "no more CAS loops in user code",
1846-
issue = "48655")]
1842+
#[stable(feature = "no_more_cas", since = "1.45.0")]
18471843
#[$cfg_cas]
18481844
pub fn fetch_update<F>(&self,
1849-
mut f: F,
1845+
set_order: Ordering,
18501846
fetch_order: Ordering,
1851-
set_order: Ordering) -> Result<$int_type, $int_type>
1847+
mut f: F) -> Result<$int_type, $int_type>
18521848
where F: FnMut($int_type) -> Option<$int_type> {
18531849
let mut prev = self.load(fetch_order);
18541850
while let Some(next) = f(prev) {

0 commit comments

Comments
 (0)