@@ -1807,13 +1807,12 @@ new value. Returns a `Result` of `Ok(previous_value)` if the function returned `
18071807
18081808Note: This may call the function multiple times if the value has been changed from other threads in
18091809the meantime, as long as the function returns `Some(_)`, but the function will have been applied
1810- but once to the stored value.
1810+ only 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
18181817Using [`Acquire`] as success ordering makes the store part
18191818of 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
18371835let 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));
18411839assert_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) {
@@ -1882,7 +1878,6 @@ using [`Release`] makes the load part [`Relaxed`].
18821878# Examples
18831879
18841880```
1885- #![feature(atomic_min_max)]
18861881" , $extra_feature, "use std::sync::atomic::{" , stringify!( $atomic_type) , ", Ordering};
18871882
18881883let foo = " , stringify!( $atomic_type) , "::new(23);
@@ -1893,7 +1888,6 @@ assert_eq!(foo.load(Ordering::SeqCst), 42);
18931888If you want to obtain the maximum value in one step, you can use the following:
18941889
18951890```
1896- #![feature(atomic_min_max)]
18971891" , $extra_feature, "use std::sync::atomic::{" , stringify!( $atomic_type) , ", Ordering};
18981892
18991893let foo = " , stringify!( $atomic_type) , "::new(23);
@@ -1902,9 +1896,7 @@ let max_foo = foo.fetch_max(bar, Ordering::SeqCst).max(bar);
19021896assert!(max_foo == 42);
19031897```" ) ,
19041898 #[ inline]
1905- #[ unstable( feature = "atomic_min_max" ,
1906- reason = "easier and faster min/max than writing manual CAS loop" ,
1907- issue = "48655" ) ]
1899+ #[ stable( feature = "atomic_min_max" , since = "1.45.0" ) ]
19081900 #[ $cfg_cas]
19091901 pub fn fetch_max( & self , val: $int_type, order: Ordering ) -> $int_type {
19101902 // SAFETY: data races are prevented by atomic intrinsics.
@@ -1933,7 +1925,6 @@ using [`Release`] makes the load part [`Relaxed`].
19331925# Examples
19341926
19351927```
1936- #![feature(atomic_min_max)]
19371928" , $extra_feature, "use std::sync::atomic::{" , stringify!( $atomic_type) , ", Ordering};
19381929
19391930let foo = " , stringify!( $atomic_type) , "::new(23);
@@ -1946,7 +1937,6 @@ assert_eq!(foo.load(Ordering::Relaxed), 22);
19461937If you want to obtain the minimum value in one step, you can use the following:
19471938
19481939```
1949- #![feature(atomic_min_max)]
19501940" , $extra_feature, "use std::sync::atomic::{" , stringify!( $atomic_type) , ", Ordering};
19511941
19521942let foo = " , stringify!( $atomic_type) , "::new(23);
@@ -1955,9 +1945,7 @@ let min_foo = foo.fetch_min(bar, Ordering::SeqCst).min(bar);
19551945assert_eq!(min_foo, 12);
19561946```" ) ,
19571947 #[ inline]
1958- #[ unstable( feature = "atomic_min_max" ,
1959- reason = "easier and faster min/max than writing manual CAS loop" ,
1960- issue = "48655" ) ]
1948+ #[ stable( feature = "atomic_min_max" , since = "1.45.0" ) ]
19611949 #[ $cfg_cas]
19621950 pub fn fetch_min( & self , val: $int_type, order: Ordering ) -> $int_type {
19631951 // SAFETY: data races are prevented by atomic intrinsics.
0 commit comments