document mode possibilities for all RMW operations

This commit is contained in:
Ralf Jung 2018-08-07 11:57:43 +02:00
parent 1733bd3cbd
commit 6a018a03df

View File

@ -397,9 +397,14 @@ impl AtomicBool {
/// Stores a value into the bool, returning the previous value. /// Stores a value into the bool, returning the previous value.
/// ///
/// `swap` takes an [`Ordering`] argument which describes the memory ordering /// `swap` takes an [`Ordering`] argument which describes the memory ordering
/// of this operation. /// of this operation. All ordering modes are possible. Note that using
/// [`Acquire`] makes the store part of this operation [`Relaxed`], and
/// using [`Release`] makes the load part [`Relaxed`].
/// ///
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// ///
/// # Examples /// # Examples
/// ///
@ -426,8 +431,13 @@ impl AtomicBool {
/// `compare_and_swap` also takes an [`Ordering`] argument which describes the memory /// `compare_and_swap` also takes an [`Ordering`] argument which describes the memory
/// ordering of this operation. Notice that even when using [`AcqRel`], the operation /// ordering of this operation. Notice that even when using [`AcqRel`], the operation
/// might fail and hence just perform an `Acquire` load, but not have `Release` semantics. /// might fail and hence just perform an `Acquire` load, but not have `Release` semantics.
/// Using [`Acquire`] makes the store part of this operation [`Relaxed`] if it
/// happens, and using [`Release`] makes the load part [`Relaxed`].
/// ///
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// [`AcqRel`]: enum.Ordering.html#variant.AcqRel /// [`AcqRel`]: enum.Ordering.html#variant.AcqRel
/// [`bool`]: ../../../std/primitive.bool.html /// [`bool`]: ../../../std/primitive.bool.html
/// ///
@ -462,13 +472,18 @@ impl AtomicBool {
/// `compare_exchange` takes two [`Ordering`] arguments to describe the memory /// `compare_exchange` takes two [`Ordering`] arguments to describe the memory
/// ordering of this operation. The first describes the required ordering if the /// ordering of this operation. The first describes the required ordering if the
/// operation succeeds while the second describes the required ordering when the /// operation succeeds while the second describes the required ordering when the
/// operation fails. The failure ordering can't be [`Release`] or [`AcqRel`] and must /// operation fails. Using [`Acquire`] as success ordering makes the store part
/// be equivalent to or weaker than the success ordering. /// of this operation [`Relaxed`], and using [`Release`] makes the successful load
/// [`Relaxed`]. The failure ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`]
/// and must be equivalent to or weaker than the success ordering.
///
/// ///
/// [`bool`]: ../../../std/primitive.bool.html /// [`bool`]: ../../../std/primitive.bool.html
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release /// [`Release`]: enum.Ordering.html#variant.Release
/// [`AcqRel`]: enum.Ordering.html#variant.Release /// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
/// ///
/// # Examples /// # Examples
/// ///
@ -515,16 +530,20 @@ impl AtomicBool {
/// previous value. /// previous value.
/// ///
/// `compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory /// `compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory
/// ordering of this operation. The first describes the required ordering if the operation /// ordering of this operation. The first describes the required ordering if the
/// succeeds while the second describes the required ordering when the operation fails. The /// operation succeeds while the second describes the required ordering when the
/// failure ordering can't be [`Release`] or [`AcqRel`] and must be equivalent or /// operation fails. Using [`Acquire`] as success ordering makes the store part
/// weaker than the success ordering. /// of this operation [`Relaxed`], and using [`Release`] makes the successful load
/// [`Relaxed`]. The failure ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`]
/// and must be equivalent to or weaker than the success ordering.
/// ///
/// [`bool`]: ../../../std/primitive.bool.html /// [`bool`]: ../../../std/primitive.bool.html
/// [`compare_exchange`]: #method.compare_exchange /// [`compare_exchange`]: #method.compare_exchange
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release /// [`Release`]: enum.Ordering.html#variant.Release
/// [`AcqRel`]: enum.Ordering.html#variant.Release /// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
/// ///
/// # Examples /// # Examples
/// ///
@ -565,6 +584,16 @@ impl AtomicBool {
/// ///
/// Returns the previous value. /// Returns the previous value.
/// ///
/// `fetch_and` takes an [`Ordering`] argument which describes the memory ordering
/// of this operation. All ordering modes are possible. Note that using
/// [`Acquire`] makes the store part of this operation [`Relaxed`], and
/// using [`Release`] makes the load part [`Relaxed`].
///
/// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
///
/// # Examples /// # Examples
/// ///
/// ``` /// ```
@ -596,6 +625,16 @@ impl AtomicBool {
/// ///
/// Returns the previous value. /// Returns the previous value.
/// ///
/// `fetch_nand` takes an [`Ordering`] argument which describes the memory ordering
/// of this operation. All ordering modes are possible. Note that using
/// [`Acquire`] makes the store part of this operation [`Relaxed`], and
/// using [`Release`] makes the load part [`Relaxed`].
///
/// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
///
/// # Examples /// # Examples
/// ///
/// ``` /// ```
@ -640,6 +679,16 @@ impl AtomicBool {
/// ///
/// Returns the previous value. /// Returns the previous value.
/// ///
/// `fetch_or` takes an [`Ordering`] argument which describes the memory ordering
/// of this operation. All ordering modes are possible. Note that using
/// [`Acquire`] makes the store part of this operation [`Relaxed`], and
/// using [`Release`] makes the load part [`Relaxed`].
///
/// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
///
/// # Examples /// # Examples
/// ///
/// ``` /// ```
@ -671,6 +720,16 @@ impl AtomicBool {
/// ///
/// Returns the previous value. /// Returns the previous value.
/// ///
/// `fetch_xor` takes an [`Ordering`] argument which describes the memory ordering
/// of this operation. All ordering modes are possible. Note that using
/// [`Acquire`] makes the store part of this operation [`Relaxed`], and
/// using [`Release`] makes the load part [`Relaxed`].
///
/// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
///
/// # Examples /// # Examples
/// ///
/// ``` /// ```
@ -824,9 +883,14 @@ impl<T> AtomicPtr<T> {
/// Stores a value into the pointer, returning the previous value. /// Stores a value into the pointer, returning the previous value.
/// ///
/// `swap` takes an [`Ordering`] argument which describes the memory ordering /// `swap` takes an [`Ordering`] argument which describes the memory ordering
/// of this operation. /// of this operation. All ordering modes are possible. Note that using
/// [`Acquire`] makes the store part of this operation [`Relaxed`], and
/// using [`Release`] makes the load part [`Relaxed`].
/// ///
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// ///
/// # Examples /// # Examples
/// ///
@ -855,8 +919,14 @@ impl<T> AtomicPtr<T> {
/// `compare_and_swap` also takes an [`Ordering`] argument which describes the memory /// `compare_and_swap` also takes an [`Ordering`] argument which describes the memory
/// ordering of this operation. Notice that even when using [`AcqRel`], the operation /// ordering of this operation. Notice that even when using [`AcqRel`], the operation
/// might fail and hence just perform an `Acquire` load, but not have `Release` semantics. /// might fail and hence just perform an `Acquire` load, but not have `Release` semantics.
/// Using [`Acquire`] makes the store part of this operation [`Relaxed`] if it
/// happens, and using [`Release`] makes the load part [`Relaxed`].
/// ///
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// [`AcqRel`]: enum.Ordering.html#variant.AcqRel
/// ///
/// # Examples /// # Examples
/// ///
@ -887,14 +957,18 @@ impl<T> AtomicPtr<T> {
/// the previous value. On success this value is guaranteed to be equal to `current`. /// the previous value. On success this value is guaranteed to be equal to `current`.
/// ///
/// `compare_exchange` takes two [`Ordering`] arguments to describe the memory /// `compare_exchange` takes two [`Ordering`] arguments to describe the memory
/// ordering of this operation. The first describes the required ordering if /// ordering of this operation. The first describes the required ordering if the
/// the operation succeeds while the second describes the required ordering when /// operation succeeds while the second describes the required ordering when the
/// the operation fails. The failure ordering can't be [`Release`] or [`AcqRel`] /// operation fails. Using [`Acquire`] as success ordering makes the store part
/// and must be equivalent or weaker than the success ordering. /// of this operation [`Relaxed`], and using [`Release`] makes the successful load
/// [`Relaxed`]. The failure ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`]
/// and must be equivalent to or weaker than the success ordering.
/// ///
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release /// [`Release`]: enum.Ordering.html#variant.Release
/// [`AcqRel`]: enum.Ordering.html#variant.AcqRel /// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
/// ///
/// # Examples /// # Examples
/// ///
@ -940,15 +1014,19 @@ impl<T> AtomicPtr<T> {
/// previous value. /// previous value.
/// ///
/// `compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory /// `compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory
/// ordering of this operation. The first describes the required ordering if the operation /// ordering of this operation. The first describes the required ordering if the
/// succeeds while the second describes the required ordering when the operation fails. The /// operation succeeds while the second describes the required ordering when the
/// failure ordering can't be [`Release`] or [`AcqRel`] and must be equivalent or /// operation fails. Using [`Acquire`] as success ordering makes the store part
/// weaker than the success ordering. /// of this operation [`Relaxed`], and using [`Release`] makes the successful load
/// [`Relaxed`]. The failure ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`]
/// and must be equivalent to or weaker than the success ordering.
/// ///
/// [`compare_exchange`]: #method.compare_exchange /// [`compare_exchange`]: #method.compare_exchange
/// [`Ordering`]: enum.Ordering.html /// [`Ordering`]: enum.Ordering.html
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
/// [`Release`]: enum.Ordering.html#variant.Release /// [`Release`]: enum.Ordering.html#variant.Release
/// [`AcqRel`]: enum.Ordering.html#variant.AcqRel /// [`Acquire`]: enum.Ordering.html#variant.Acquire
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
/// ///
/// # Examples /// # Examples
/// ///
@ -1191,9 +1269,15 @@ assert_eq!(some_var.load(Ordering::Relaxed), 10);
doc_comment! { doc_comment! {
concat!("Stores a value into the atomic integer, returning the previous value. concat!("Stores a value into the atomic integer, returning the previous value.
`swap` takes an [`Ordering`] argument which describes the memory ordering of this operation. `swap` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html [`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
@ -1222,8 +1306,14 @@ value was updated.
`compare_and_swap` also takes an [`Ordering`] argument which describes the memory `compare_and_swap` also takes an [`Ordering`] argument which describes the memory
ordering of this operation. Notice that even when using [`AcqRel`], the operation ordering of this operation. Notice that even when using [`AcqRel`], the operation
might fail and hence just perform an `Acquire` load, but not have `Release` semantics. might fail and hence just perform an `Acquire` load, but not have `Release` semantics.
Using [`Acquire`] makes the store part of this operation [`Relaxed`] if it
happens, and using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html [`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
[`AcqRel`]: enum.Ordering.html#variant.AcqRel
# Examples # Examples
@ -1264,14 +1354,18 @@ containing the previous value. On success this value is guaranteed to be equal t
`current`. `current`.
`compare_exchange` takes two [`Ordering`] arguments to describe the memory `compare_exchange` takes two [`Ordering`] arguments to describe the memory
ordering of this operation. The first describes the required ordering if ordering of this operation. The first describes the required ordering if the
the operation succeeds while the second describes the required ordering when operation succeeds while the second describes the required ordering when the
the operation fails. The failure ordering can't be [`Release`] or [`AcqRel`] and operation fails. Using [`Acquire`] as success ordering makes the store part
must be equivalent or weaker than the success ordering. of this operation [`Relaxed`], and using [`Release`] makes the successful load
[`Relaxed`]. The failure ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`]
and must be equivalent to or weaker than the success ordering.
[`Ordering`]: enum.Ordering.html [`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release [`Release`]: enum.Ordering.html#variant.Release
[`AcqRel`]: enum.Ordering.html#variant.AcqRel [`Acquire`]: enum.Ordering.html#variant.Acquire
[`SeqCst`]: enum.Ordering.html#variant.SeqCst
# Examples # Examples
@ -1316,13 +1410,17 @@ written and containing the previous value.
`compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory `compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory
ordering of this operation. The first describes the required ordering if the ordering of this operation. The first describes the required ordering if the
operation succeeds while the second describes the required ordering when the operation succeeds while the second describes the required ordering when the
operation fails. The failure ordering can't be [`Release`] or [`AcqRel`] and operation fails. Using [`Acquire`] as success ordering makes the store part
must be equivalent or weaker than the success ordering. of this operation [`Relaxed`], and using [`Release`] makes the successful load
[`Relaxed`]. The failure ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`]
and must be equivalent to or weaker than the success ordering.
[`compare_exchange`]: #method.compare_exchange [`compare_exchange`]: #method.compare_exchange
[`Ordering`]: enum.Ordering.html [`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release [`Release`]: enum.Ordering.html#variant.Release
[`AcqRel`]: enum.Ordering.html#variant.AcqRel [`Acquire`]: enum.Ordering.html#variant.Acquire
[`SeqCst`]: enum.Ordering.html#variant.SeqCst
# Examples # Examples
@ -1358,6 +1456,16 @@ loop {
This operation wraps around on overflow. This operation wraps around on overflow.
`fetch_add` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```
@ -1379,6 +1487,16 @@ assert_eq!(foo.load(Ordering::SeqCst), 10);
This operation wraps around on overflow. This operation wraps around on overflow.
`fetch_sub` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```
@ -1403,6 +1521,16 @@ sets the new value to the result.
Returns the previous value. Returns the previous value.
`fetch_and` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```
@ -1427,6 +1555,16 @@ sets the new value to the result.
Returns the previous value. Returns the previous value.
`fetch_nand` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```
@ -1452,6 +1590,16 @@ sets the new value to the result.
Returns the previous value. Returns the previous value.
`fetch_or` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```
@ -1476,6 +1624,16 @@ sets the new value to the result.
Returns the previous value. Returns the previous value.
`fetch_xor` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```
@ -1501,6 +1659,25 @@ Note: This may call the function multiple times if the value has been changed fr
the meantime, as long as the function returns `Some(_)`, but the function will have been applied the meantime, as long as the function returns `Some(_)`, but the function will have been applied
but once to the stored value. but once to the stored value.
`fetch_update` takes two [`Ordering`] arguments to describe the memory
ordering of this operation. The first describes the required ordering for loads
and failed updates while the second describes the required ordering when the
operation finally succeeds. Beware that this is different from the two
modes in [`compare_exchange`]!
Using [`Acquire`] as success ordering makes the store part
of this operation [`Relaxed`], and using [`Release`] makes the final successful load
[`Relaxed`]. The (failed) load ordering can only be [`SeqCst`], [`Acquire`] or [`Relaxed`]
and must be equivalent to or weaker than the success ordering.
[`bool`]: ../../../std/primitive.bool.html
[`compare_exchange`]: #method.compare_exchange
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
[`SeqCst`]: enum.Ordering.html#variant.SeqCst
# Examples # Examples
```rust ```rust
@ -1541,6 +1718,16 @@ sets the new value to the result.
Returns the previous value. Returns the previous value.
`fetch_max` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```
@ -1580,6 +1767,16 @@ sets the new value to the result.
Returns the previous value. Returns the previous value.
`fetch_min` takes an [`Ordering`] argument which describes the memory ordering
of this operation. All ordering modes are possible. Note that using
[`Acquire`] makes the store part of this operation [`Relaxed`], and
using [`Release`] makes the load part [`Relaxed`].
[`Ordering`]: enum.Ordering.html
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
[`Release`]: enum.Ordering.html#variant.Release
[`Acquire`]: enum.Ordering.html#variant.Acquire
# Examples # Examples
``` ```