Struct AtomicArc

Source
pub struct AtomicArc<T> { /* private fields */ }
Expand description

A lightweight atomic pointer to 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(Some(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

Constructs a new AtomicArc.

Source

pub fn load(&self, order: Ordering) -> Option<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.

Returns None if the pointer is null.

Source

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

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

Trait Implementations§

Source§

impl<T> Default for AtomicArc<T>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<T> Drop for AtomicArc<T>

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T> Send for AtomicArc<T>

Source§

impl<T> Sync for AtomicArc<T>

Auto Trait Implementations§

§

impl<T> !Freeze for AtomicArc<T>

§

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

§

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.