@@ -3102,37 +3102,25 @@ macro_rules! atomic_int {
31023102 unsafe { atomic_xor( self . v. get( ) , val, order) }
31033103 }
31043104
3105- /// Fetches the value, and applies a function to it that returns an optional
3106- /// new value. Returns a `Result` of `Ok(previous_value)` if the function returned `Some(_)`, else
3107- /// `Err(previous_value)`.
3108- ///
3109- /// Note: This may call the function multiple times if the value has been changed from other threads in
3110- /// the meantime, as long as the function returns `Some(_)`, but the function will have been applied
3111- /// only once to the stored value.
3112- ///
3113- /// `fetch_update` takes two [`Ordering`] arguments to describe the memory ordering of this operation.
3114- /// The first describes the required ordering for when the operation finally succeeds while the second
3115- /// describes the required ordering for loads. These correspond to the success and failure orderings of
3116- #[ doc = concat!( "[`" , stringify!( $atomic_type) , "::compare_exchange`]" ) ]
3117- /// respectively.
3118- ///
3119- /// Using [`Acquire`] as success ordering makes the store part
3120- /// of this operation [`Relaxed`], and using [`Release`] makes the final successful load
3121- /// [`Relaxed`]. The (failed) load ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`].
3105+ /// Loads the current value, applies a closure to it, and optionally tries to store a new value.
3106+ /// If the closure ever returns None, this method will immediately return `Err(current value)`.
3107+ /// If the closure returns Some(new value), then this method calls
3108+ #[ doc = concat!( "[`" , stringify!( $atomic_type) , "::compare_exchange_weak`]" ) ]
3109+ /// to try to store the new value.
3110+ /// If storing a new value fails, because another thread changed the current value,
3111+ /// then the given closure will be called again on the new current value
3112+ /// (that was just returned by compare_exchange_weak),
3113+ /// until either the closure returns None,
3114+ /// or compare_exchange_weak succeeds in storing a new value.
3115+ /// Returns `Ok(previous value)` if it ever succeeds in storing a new value.
3116+ /// Takes a success and a failure [`Ordering`] to pass on to compare_exchange_weak,
3117+ /// and also uses the failure ordering for the initial load.
3118+ ///
3119+ /// Note: susceptible to the [ABA Problem](https://en.wikipedia.org/wiki/ABA_problem).
31223120 ///
31233121 /// **Note**: This method is only available on platforms that support atomic operations on
31243122 #[ doc = concat!( "[`" , $s_int_type, "`]." ) ]
31253123 ///
3126- /// # Considerations
3127- ///
3128- /// This method is not magic; it is not provided by the hardware.
3129- /// It is implemented in terms of
3130- #[ doc = concat!( "[`" , stringify!( $atomic_type) , "::compare_exchange_weak`]," ) ]
3131- /// and suffers from the same drawbacks.
3132- /// In particular, this method will not circumvent the [ABA Problem].
3133- ///
3134- /// [ABA Problem]: https://en.wikipedia.org/wiki/ABA_problem
3135- ///
31363124 /// # Examples
31373125 ///
31383126 /// ```rust
@@ -3149,13 +3137,13 @@ macro_rules! atomic_int {
31493137 #[ $cfg_cas]
31503138 #[ cfg_attr( miri, track_caller) ] // even without panics, this helps for Miri backtraces
31513139 pub fn fetch_update<F >( & self ,
3152- set_order : Ordering ,
3153- fetch_order : Ordering ,
3140+ success : Ordering ,
3141+ failure : Ordering ,
31543142 mut f: F ) -> Result <$int_type, $int_type>
31553143 where F : FnMut ( $int_type) -> Option <$int_type> {
3156- let mut prev = self . load( fetch_order ) ;
3144+ let mut prev = self . load( failure ) ;
31573145 while let Some ( next) = f( prev) {
3158- match self . compare_exchange_weak( prev, next, set_order , fetch_order ) {
3146+ match self . compare_exchange_weak( prev, next, success , failure ) {
31593147 x @ Ok ( _) => return x,
31603148 Err ( next_prev) => prev = next_prev
31613149 }
0 commit comments