Rollup merge of #53106 - RalfJung:ordering, r=stjepang
atomic ordering docs Discussion in https://github.com/rust-lang/rfcs/pull/2503 revealed that this could be improved. I hope this helps.
This commit is contained in:
commit
db74946803
1 changed files with 327 additions and 74 deletions
|
|
@ -29,7 +29,7 @@
|
|||
//!
|
||||
//! [`Ordering`]: enum.Ordering.html
|
||||
//!
|
||||
//! [1]: http://llvm.org/docs/LangRef.html#memory-model-for-concurrent-operations
|
||||
//! [1]: https://llvm.org/docs/LangRef.html#memory-model-for-concurrent-operations
|
||||
//! [2]: ../../../nomicon/atomics.html
|
||||
//!
|
||||
//! Atomic variables are safe to share between threads (they implement [`Sync`])
|
||||
|
|
@ -178,7 +178,7 @@ unsafe impl<T> Sync for AtomicPtr<T> {}
|
|||
/// "relaxed" atomics allow all reorderings.
|
||||
///
|
||||
/// Rust's memory orderings are [the same as
|
||||
/// LLVM's](http://llvm.org/docs/LangRef.html#memory-model-for-concurrent-operations).
|
||||
/// LLVM's](https://llvm.org/docs/LangRef.html#memory-model-for-concurrent-operations).
|
||||
///
|
||||
/// For more information see the [nomicon].
|
||||
///
|
||||
|
|
@ -190,35 +190,70 @@ pub enum Ordering {
|
|||
///
|
||||
/// Corresponds to LLVM's [`Monotonic`] ordering.
|
||||
///
|
||||
/// [`Monotonic`]: http://llvm.org/docs/Atomics.html#monotonic
|
||||
/// [`Monotonic`]: https://llvm.org/docs/Atomics.html#monotonic
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
Relaxed,
|
||||
/// When coupled with a store, all previous writes become visible
|
||||
/// to the other threads that perform a load with [`Acquire`] ordering
|
||||
/// on the same value.
|
||||
/// When coupled with a store, all previous operations become ordered
|
||||
/// before any load of this value with [`Acquire`] (or stronger) ordering.
|
||||
/// In particular, all previous writes become visible to all threads
|
||||
/// that perform an [`Acquire`] (or stronger) load of this value.
|
||||
///
|
||||
/// [`Acquire`]: http://llvm.org/docs/Atomics.html#acquire
|
||||
/// Notice that using this ordering for an operation that combines loads
|
||||
/// and stores leads to a [`Relaxed`] load operation!
|
||||
///
|
||||
/// This ordering is only applicable for operations that can perform a store.
|
||||
///
|
||||
/// Corresponds to LLVM's [`Release`] ordering.
|
||||
///
|
||||
/// [`Release`]: https://llvm.org/docs/Atomics.html#release
|
||||
/// [`Acquire`]: https://llvm.org/docs/Atomics.html#acquire
|
||||
/// [`Relaxed`]: https://llvm.org/docs/Atomics.html#monotonic
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
Release,
|
||||
/// When coupled with a load, all subsequent loads will see data
|
||||
/// written before a store with [`Release`] ordering on the same value
|
||||
/// in other threads.
|
||||
/// When coupled with a load, if the loaded value was written by a store operation with
|
||||
/// [`Release`] (or stronger) ordering, then all subsequent operations
|
||||
/// become ordered after that store. In particular, all subsequent loads will see data
|
||||
/// written before the store.
|
||||
///
|
||||
/// [`Release`]: http://llvm.org/docs/Atomics.html#release
|
||||
/// Notice that using this ordering for an operation that combines loads
|
||||
/// and stores leads to a [`Relaxed`] store operation!
|
||||
///
|
||||
/// This ordering is only applicable for operations that can perform a load.
|
||||
///
|
||||
/// Corresponds to LLVM's [`Acquire`] ordering.
|
||||
///
|
||||
/// [`Acquire`]: https://llvm.org/docs/Atomics.html#acquire
|
||||
/// [`Release`]: https://llvm.org/docs/Atomics.html#release
|
||||
/// [`Relaxed`]: https://llvm.org/docs/Atomics.html#monotonic
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
Acquire,
|
||||
/// Has the effects of both [`Acquire`] and [`Release`] together.
|
||||
/// Has the effects of both [`Acquire`] and [`Release`] together:
|
||||
/// For loads it uses [`Acquire`] ordering. For stores it uses the [`Release`] ordering.
|
||||
///
|
||||
/// Notice that in the case of `compare_and_swap`, it is possible that the operation ends up
|
||||
/// not performing any store and hence it has just `Acquire` ordering. However,
|
||||
/// `AcqRel` will never perform [`Relaxed`] accesses.
|
||||
///
|
||||
/// This ordering is only applicable for operations that combine both loads and stores.
|
||||
///
|
||||
/// For loads it uses [`Acquire`] ordering. For stores it uses the [`Release`] ordering.
|
||||
/// Corresponds to LLVM's [`AcquireRelease`] ordering.
|
||||
///
|
||||
/// [`Acquire`]: http://llvm.org/docs/Atomics.html#acquire
|
||||
/// [`Release`]: http://llvm.org/docs/Atomics.html#release
|
||||
/// [`AcquireRelease`]: https://llvm.org/docs/Atomics.html#acquirerelease
|
||||
/// [`Acquire`]: https://llvm.org/docs/Atomics.html#acquire
|
||||
/// [`Release`]: https://llvm.org/docs/Atomics.html#release
|
||||
/// [`Relaxed`]: https://llvm.org/docs/Atomics.html#monotonic
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
AcqRel,
|
||||
/// Like `AcqRel` with the additional guarantee that all threads see all
|
||||
/// Like [`Acquire`]/[`Release`]/[`AcqRel`] (for load, store, and load-with-store
|
||||
/// operations, respectively) with the additional guarantee that all threads see all
|
||||
/// sequentially consistent operations in the same order.
|
||||
///
|
||||
/// Corresponds to LLVM's [`SequentiallyConsistent`] ordering.
|
||||
///
|
||||
/// [`SequentiallyConsistent`]: https://llvm.org/docs/Atomics.html#sequentiallyconsistent
|
||||
/// [`Acquire`]: https://llvm.org/docs/Atomics.html#acquire
|
||||
/// [`Release`]: https://llvm.org/docs/Atomics.html#release
|
||||
/// [`AcqRel`]: https://llvm.org/docs/Atomics.html#acquirerelease
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
SeqCst,
|
||||
// Prevent exhaustive matching to allow for future extension
|
||||
|
|
@ -297,15 +332,18 @@ impl AtomicBool {
|
|||
/// Loads a value from the bool.
|
||||
///
|
||||
/// `load` takes an [`Ordering`] argument which describes the memory ordering
|
||||
/// of this operation.
|
||||
/// of this operation. Possible values are [`SeqCst`], [`Acquire`] and [`Relaxed`].
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `order` is [`Release`] or [`AcqRel`].
|
||||
///
|
||||
/// [`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
|
||||
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
@ -325,9 +363,18 @@ impl AtomicBool {
|
|||
/// Stores a value into the bool.
|
||||
///
|
||||
/// `store` takes an [`Ordering`] argument which describes the memory ordering
|
||||
/// of this operation.
|
||||
/// of this operation. Possible values are [`SeqCst`], [`Release`] and [`Relaxed`].
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `order` is [`Acquire`] or [`AcqRel`].
|
||||
///
|
||||
/// [`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
|
||||
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
@ -339,13 +386,6 @@ impl AtomicBool {
|
|||
/// some_bool.store(false, Ordering::Relaxed);
|
||||
/// assert_eq!(some_bool.load(Ordering::Relaxed), false);
|
||||
/// ```
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `order` is [`Acquire`] or [`AcqRel`].
|
||||
///
|
||||
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
|
||||
/// [`AcqRel`]: enum.Ordering.html#variant.AcqRel
|
||||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn store(&self, val: bool, order: Ordering) {
|
||||
|
|
@ -357,9 +397,14 @@ impl AtomicBool {
|
|||
/// Stores a value into the bool, returning the previous value.
|
||||
///
|
||||
/// `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
|
||||
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
/// [`Release`]: enum.Ordering.html#variant.Release
|
||||
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
@ -384,9 +429,16 @@ impl AtomicBool {
|
|||
/// was updated.
|
||||
///
|
||||
/// `compare_and_swap` also takes an [`Ordering`] argument which describes the memory
|
||||
/// ordering of this 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.
|
||||
/// 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
|
||||
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
/// [`Release`]: enum.Ordering.html#variant.Release
|
||||
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
|
||||
/// [`AcqRel`]: enum.Ordering.html#variant.AcqRel
|
||||
/// [`bool`]: ../../../std/primitive.bool.html
|
||||
///
|
||||
/// # Examples
|
||||
|
|
@ -420,13 +472,18 @@ impl AtomicBool {
|
|||
/// `compare_exchange` takes two [`Ordering`] arguments to describe the memory
|
||||
/// ordering of this operation. The first describes the required ordering if 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
|
||||
/// be equivalent or weaker than the success ordering.
|
||||
/// operation fails. Using [`Acquire`] as success ordering makes the store part
|
||||
/// 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
|
||||
/// [`Ordering`]: enum.Ordering.html
|
||||
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
/// [`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
|
||||
///
|
||||
|
|
@ -473,16 +530,20 @@ impl AtomicBool {
|
|||
/// previous value.
|
||||
///
|
||||
/// `compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory
|
||||
/// ordering of this operation. The first describes the required ordering if 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 be equivalent or
|
||||
/// weaker than the success ordering.
|
||||
/// ordering of this operation. The first describes the required ordering if the
|
||||
/// operation succeeds while the second describes the required ordering when the
|
||||
/// operation fails. Using [`Acquire`] as success ordering makes the store part
|
||||
/// 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
|
||||
/// [`compare_exchange`]: #method.compare_exchange
|
||||
/// [`Ordering`]: enum.Ordering.html
|
||||
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
/// [`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
|
||||
///
|
||||
|
|
@ -523,6 +584,16 @@ impl AtomicBool {
|
|||
///
|
||||
/// 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
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -554,6 +625,16 @@ impl AtomicBool {
|
|||
///
|
||||
/// 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
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -598,6 +679,16 @@ impl AtomicBool {
|
|||
///
|
||||
/// 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
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -629,6 +720,16 @@ impl AtomicBool {
|
|||
///
|
||||
/// 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
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -714,15 +815,18 @@ impl<T> AtomicPtr<T> {
|
|||
/// Loads a value from the pointer.
|
||||
///
|
||||
/// `load` takes an [`Ordering`] argument which describes the memory ordering
|
||||
/// of this operation.
|
||||
/// of this operation. Possible values are [`SeqCst`], [`Acquire`] and [`Relaxed`].
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `order` is [`Release`] or [`AcqRel`].
|
||||
///
|
||||
/// [`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
|
||||
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
@ -743,9 +847,18 @@ impl<T> AtomicPtr<T> {
|
|||
/// Stores a value into the pointer.
|
||||
///
|
||||
/// `store` takes an [`Ordering`] argument which describes the memory ordering
|
||||
/// of this operation.
|
||||
/// of this operation. Possible values are [`SeqCst`], [`Release`] and [`Relaxed`].
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `order` is [`Acquire`] or [`AcqRel`].
|
||||
///
|
||||
/// [`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
|
||||
/// [`SeqCst`]: enum.Ordering.html#variant.SeqCst
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
@ -759,13 +872,6 @@ impl<T> AtomicPtr<T> {
|
|||
///
|
||||
/// some_ptr.store(other_ptr, Ordering::Relaxed);
|
||||
/// ```
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Panics if `order` is [`Acquire`] or [`AcqRel`].
|
||||
///
|
||||
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
|
||||
/// [`AcqRel`]: enum.Ordering.html#variant.AcqRel
|
||||
#[inline]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn store(&self, ptr: *mut T, order: Ordering) {
|
||||
|
|
@ -777,9 +883,14 @@ impl<T> AtomicPtr<T> {
|
|||
/// Stores a value into the pointer, returning the previous value.
|
||||
///
|
||||
/// `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
|
||||
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
/// [`Release`]: enum.Ordering.html#variant.Release
|
||||
/// [`Acquire`]: enum.Ordering.html#variant.Acquire
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
|
@ -806,9 +917,16 @@ impl<T> AtomicPtr<T> {
|
|||
/// was updated.
|
||||
///
|
||||
/// `compare_and_swap` also takes an [`Ordering`] argument which describes the memory
|
||||
/// ordering of this 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.
|
||||
/// 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
|
||||
/// [`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
|
||||
///
|
||||
|
|
@ -839,14 +957,18 @@ impl<T> AtomicPtr<T> {
|
|||
/// the previous value. On success this value is guaranteed to be equal to `current`.
|
||||
///
|
||||
/// `compare_exchange` takes two [`Ordering`] arguments to describe the memory
|
||||
/// ordering of this operation. The first describes the required ordering if
|
||||
/// 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 be equivalent or weaker than the success ordering.
|
||||
/// ordering of this operation. The first describes the required ordering if the
|
||||
/// operation succeeds while the second describes the required ordering when the
|
||||
/// operation fails. Using [`Acquire`] as success ordering makes the store part
|
||||
/// 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
|
||||
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
/// [`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
|
||||
///
|
||||
|
|
@ -892,15 +1014,19 @@ impl<T> AtomicPtr<T> {
|
|||
/// previous value.
|
||||
///
|
||||
/// `compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory
|
||||
/// ordering of this operation. The first describes the required ordering if 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 be equivalent or
|
||||
/// weaker than the success ordering.
|
||||
/// ordering of this operation. The first describes the required ordering if the
|
||||
/// operation succeeds while the second describes the required ordering when the
|
||||
/// operation fails. Using [`Acquire`] as success ordering makes the store part
|
||||
/// 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
|
||||
/// [`Ordering`]: enum.Ordering.html
|
||||
/// [`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
/// [`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
|
||||
///
|
||||
|
|
@ -1077,14 +1203,18 @@ assert_eq!(some_var.into_inner(), 5);
|
|||
concat!("Loads a value from the atomic integer.
|
||||
|
||||
`load` takes an [`Ordering`] argument which describes the memory ordering of this operation.
|
||||
Possible values are [`SeqCst`], [`Acquire`] and [`Relaxed`].
|
||||
|
||||
# Panics
|
||||
|
||||
Panics if `order` is [`Release`] or [`AcqRel`].
|
||||
|
||||
[`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
|
||||
[`SeqCst`]: enum.Ordering.html#variant.SeqCst
|
||||
|
||||
# Examples
|
||||
|
||||
|
|
@ -1106,8 +1236,18 @@ assert_eq!(some_var.load(Ordering::Relaxed), 5);
|
|||
concat!("Stores a value into the atomic integer.
|
||||
|
||||
`store` takes an [`Ordering`] argument which describes the memory ordering of this operation.
|
||||
Possible values are [`SeqCst`], [`Release`] and [`Relaxed`].
|
||||
|
||||
# Panics
|
||||
|
||||
Panics if `order` is [`Acquire`] or [`AcqRel`].
|
||||
|
||||
[`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
|
||||
[`SeqCst`]: enum.Ordering.html#variant.SeqCst
|
||||
|
||||
# Examples
|
||||
|
||||
|
|
@ -1118,14 +1258,7 @@ let some_var = ", stringify!($atomic_type), "::new(5);
|
|||
|
||||
some_var.store(10, Ordering::Relaxed);
|
||||
assert_eq!(some_var.load(Ordering::Relaxed), 10);
|
||||
```
|
||||
|
||||
# Panics
|
||||
|
||||
Panics if `order` is [`Acquire`] or [`AcqRel`].
|
||||
|
||||
[`Acquire`]: enum.Ordering.html#variant.Acquire
|
||||
[`AcqRel`]: enum.Ordering.html#variant.AcqRel"),
|
||||
```"),
|
||||
#[inline]
|
||||
#[$stable]
|
||||
pub fn store(&self, val: $int_type, order: Ordering) {
|
||||
|
|
@ -1136,9 +1269,15 @@ Panics if `order` is [`Acquire`] or [`AcqRel`].
|
|||
doc_comment! {
|
||||
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
|
||||
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
[`Release`]: enum.Ordering.html#variant.Release
|
||||
[`Acquire`]: enum.Ordering.html#variant.Acquire
|
||||
|
||||
# Examples
|
||||
|
||||
|
|
@ -1165,9 +1304,16 @@ The return value is always the previous value. If it is equal to `current`, then
|
|||
value was updated.
|
||||
|
||||
`compare_and_swap` also takes an [`Ordering`] argument which describes the memory
|
||||
ordering of this 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.
|
||||
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
|
||||
[`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
|
||||
|
||||
|
|
@ -1208,14 +1354,18 @@ containing the previous value. On success this value is guaranteed to be equal t
|
|||
`current`.
|
||||
|
||||
`compare_exchange` takes two [`Ordering`] arguments to describe the memory
|
||||
ordering of this operation. The first describes the required ordering if
|
||||
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 be equivalent or weaker than the success ordering.
|
||||
ordering of this operation. The first describes the required ordering if the
|
||||
operation succeeds while the second describes the required ordering when the
|
||||
operation fails. Using [`Acquire`] as success ordering makes the store part
|
||||
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
|
||||
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
[`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
|
||||
|
||||
|
|
@ -1260,13 +1410,17 @@ written and containing the previous value.
|
|||
`compare_exchange_weak` takes two [`Ordering`] arguments to describe the memory
|
||||
ordering of this operation. The first describes the required ordering if 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 be equivalent or weaker than the success ordering.
|
||||
operation fails. Using [`Acquire`] as success ordering makes the store part
|
||||
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
|
||||
[`Ordering`]: enum.Ordering.html
|
||||
[`Relaxed`]: enum.Ordering.html#variant.Relaxed
|
||||
[`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
|
||||
|
||||
|
|
@ -1302,6 +1456,16 @@ loop {
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
@ -1323,6 +1487,16 @@ assert_eq!(foo.load(Ordering::SeqCst), 10);
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
@ -1347,6 +1521,16 @@ sets the new value to the result.
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
@ -1371,6 +1555,16 @@ sets the new value to the result.
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
@ -1396,6 +1590,16 @@ sets the new value to the result.
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
@ -1420,6 +1624,16 @@ sets the new value to the result.
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
@ -1445,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
|
||||
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
|
||||
|
||||
```rust
|
||||
|
|
@ -1485,6 +1718,16 @@ sets the new value to the result.
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
@ -1524,6 +1767,16 @@ sets the new value to the result.
|
|||
|
||||
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
|
||||
|
||||
```
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue