Struct AtomicArc

Source
pub struct AtomicArc<T>(/* private fields */);
Expand description

An atomic pointer for Arc.

Note: The imlementation manipuates the internal reference count of the original Arc for optimization. This means that the result of Arc::strong_count is incorrect, until the Arc gets rid of this pointer’s control (with AtomicArc::swap). Users who depend on the correctness of Arc::strong_count should be careful.

§Limitations

The implementation borrows some bits from the Arc pointer as an external reference count (a technique called “split reference counting”). It will panic in some extreame scenario when the reference count is increased more than a threshold (2^15) at the same time. This is almost impossible unless someone creates more than 2^15 threads to load the same pointer at the same time.

§Examples

use std::{
    sync::{atomic::Ordering, Arc},
    thread,
};

use atomic_ext::AtomicArc;

let a = Arc::new(1);
let b = Arc::new(2);
let x = Arc::new(AtomicArc::new(a));
{
    let x = x.clone();
    thread::spawn(move || {
        x.swap(b, Ordering::AcqRel) // Returns `a`
    });
}
{
    let x = x.clone();
    thread::spawn(move || {
        x.load(Ordering::Acquire) // Returns either `a` or `b`
    });
};

Implementations§

Source§

impl<T> AtomicArc<T>

Source

pub fn new(value: Arc<T>) -> Self

Creates a AtomicArc with the value.

Source

pub fn load(&self, order: Ordering) -> Arc<T>

Loads an Arc from the pointer.

The fast path uses just one atomic operation to load the Arc and increase its reference count.

Source

pub fn swap(&self, value: Arc<T>, order: Ordering) -> Arc<T>

Stores an Arc into the pointer, returning the previous value.

Source

pub fn compare_exchange( &self, current: &Arc<T>, new: &Arc<T>, success: Ordering, failure: Ordering, ) -> Result<Arc<T>, Arc<T>>

Stores an Arc into the pointer if the current value is the same as current.

Auto Trait Implementations§

§

impl<T> !Freeze for AtomicArc<T>

§

impl<T> RefUnwindSafe for AtomicArc<T>
where T: RefUnwindSafe,

§

impl<T> Send for AtomicArc<T>
where T: Sync + Send,

§

impl<T> Sync for AtomicArc<T>
where T: Sync + Send,

§

impl<T> Unpin for AtomicArc<T>

§

impl<T> UnwindSafe for AtomicArc<T>
where T: RefUnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.