[][src]Struct pagecache::Atomic

pub struct Atomic<T> { /* fields omitted */ }

An atomic pointer that can be safely shared between threads.

The pointer must be properly aligned. Since it is aligned, a tag can be stored into the unused least significant bits of the address. More precisely, a tag should be less than (1 << mem::align_of::<T>().trailing_zeros()).

Any method that loads the pointer must be passed a reference to a Guard.

Methods

impl<T> Atomic<T>[src]

pub fn null() -> Atomic<T>[src]

Returns a new null atomic pointer.

Examples

use crossbeam_epoch::Atomic;

let a = Atomic::<i32>::null();

pub fn new(value: T) -> Atomic<T>[src]

Allocates value on the heap and returns a new atomic pointer pointing to it.

Examples

use crossbeam_epoch::Atomic;

let a = Atomic::new(1234);

pub fn load(&self, ord: Ordering, &'g Guard) -> Shared<'g, T>[src]

Loads a Shared from the atomic pointer.

This method takes an Ordering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::new(1234);
let guard = &epoch::pin();
let p = a.load(SeqCst, guard);

pub fn load_consume(&self, &'g Guard) -> Shared<'g, T>[src]

Loads a Shared from the atomic pointer using a "consume" memory ordering.

This is similar to the "acquire" ordering, except that an ordering is only guaranteed with operations that "depend on" the result of the load. However consume loads are usually much faster than acquire loads on architectures with a weak memory model since they don't require memory fence instructions.

The exact definition of "depend on" is a bit vague, but it works as you would expect in practice since a lot of software, especially the Linux kernel, rely on this behavior.

Examples

use crossbeam_epoch::{self as epoch, Atomic};

let a = Atomic::new(1234);
let guard = &epoch::pin();
let p = a.load_consume(guard);

pub fn store<P>(&self, new: P, ord: Ordering) where
    P: Pointer<T>, 
[src]

Stores a Shared or Owned pointer into the atomic pointer.

This method takes an Ordering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::new(1234);
a.store(Shared::null(), SeqCst);
a.store(Owned::new(1234), SeqCst);

pub fn swap<P>(&self, new: P, ord: Ordering, &'g Guard) -> Shared<'g, T> where
    P: Pointer<T>, 
[src]

Stores a Shared or Owned pointer into the atomic pointer, returning the previous Shared.

This method takes an Ordering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::new(1234);
let guard = &epoch::pin();
let p = a.swap(Shared::null(), SeqCst, guard);

pub fn compare_and_set<O, P>(
    &self,
    current: Shared<T>,
    new: P,
    ord: O,
    &'g Guard
) -> Result<Shared<'g, T>, CompareAndSetError<'g, T, P>> where
    O: CompareAndSetOrdering,
    P: Pointer<T>, 
[src]

Stores the pointer new (either Shared or Owned) into the atomic pointer if the current value is the same as current. The tag is also taken into account, so two pointers to the same object, but with different tags, will not be considered equal.

The return value is a result indicating whether the new pointer was written. On success the pointer that was written is returned. On failure the actual current value and new are returned.

This method takes a CompareAndSetOrdering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::new(1234);

let guard = &epoch::pin();
let mut curr = a.load(SeqCst, guard);
let res1 = a.compare_and_set(curr, Shared::null(), SeqCst, guard);
let res2 = a.compare_and_set(curr, Owned::new(5678), SeqCst, guard);

pub fn compare_and_set_weak<O, P>(
    &self,
    current: Shared<T>,
    new: P,
    ord: O,
    &'g Guard
) -> Result<Shared<'g, T>, CompareAndSetError<'g, T, P>> where
    O: CompareAndSetOrdering,
    P: Pointer<T>, 
[src]

Stores the pointer new (either Shared or Owned) into the atomic pointer if the current value is the same as current. The tag is also taken into account, so two pointers to the same object, but with different tags, will not be considered equal.

Unlike compare_and_set, this method is allowed to spuriously fail even when comparison succeeds, which can result in more efficient code on some platforms. The return value is a result indicating whether the new pointer was written. On success the pointer that was written is returned. On failure the actual current value and new are returned.

This method takes a CompareAndSetOrdering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::new(1234);
let guard = &epoch::pin();

let mut new = Owned::new(5678);
let mut ptr = a.load(SeqCst, guard);
loop {
    match a.compare_and_set_weak(ptr, new, SeqCst, guard) {
        Ok(p) => {
            ptr = p;
            break;
        }
        Err(err) => {
            ptr = err.current;
            new = err.new;
        }
    }
}

let mut curr = a.load(SeqCst, guard);
loop {
    match a.compare_and_set_weak(curr, Shared::null(), SeqCst, guard) {
        Ok(_) => break,
        Err(err) => curr = err.current,
    }
}

pub fn fetch_and(&self, val: usize, ord: Ordering, &'g Guard) -> Shared<'g, T>[src]

Bitwise "and" with the current tag.

Performs a bitwise "and" operation on the current tag and the argument val, and sets the new tag to the result. Returns the previous pointer.

This method takes an Ordering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic, Shared};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::<i32>::from(Shared::null().with_tag(3));
let guard = &epoch::pin();
assert_eq!(a.fetch_and(2, SeqCst, guard).tag(), 3);
assert_eq!(a.load(SeqCst, guard).tag(), 2);

pub fn fetch_or(&self, val: usize, ord: Ordering, &'g Guard) -> Shared<'g, T>[src]

Bitwise "or" with the current tag.

Performs a bitwise "or" operation on the current tag and the argument val, and sets the new tag to the result. Returns the previous pointer.

This method takes an Ordering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic, Shared};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::<i32>::from(Shared::null().with_tag(1));
let guard = &epoch::pin();
assert_eq!(a.fetch_or(2, SeqCst, guard).tag(), 1);
assert_eq!(a.load(SeqCst, guard).tag(), 3);

pub fn fetch_xor(&self, val: usize, ord: Ordering, &'g Guard) -> Shared<'g, T>[src]

Bitwise "xor" with the current tag.

Performs a bitwise "xor" operation on the current tag and the argument val, and sets the new tag to the result. Returns the previous pointer.

This method takes an Ordering argument which describes the memory ordering of this operation.

Examples

use crossbeam_epoch::{self as epoch, Atomic, Shared};
use std::sync::atomic::Ordering::SeqCst;

let a = Atomic::<i32>::from(Shared::null().with_tag(1));
let guard = &epoch::pin();
assert_eq!(a.fetch_xor(3, SeqCst, guard).tag(), 1);
assert_eq!(a.load(SeqCst, guard).tag(), 2);

Trait Implementations

impl<T> Clone for Atomic<T>[src]

fn clone(&self) -> Atomic<T>[src]

Returns a copy of the atomic value.

Note that a Relaxed load is used here. If you need synchronization, use it with other atomics or fences.

fn clone_from(&mut self, source: &Self)
1.0.0
[src]

Performs copy-assignment from source. Read more

impl<T> Sync for Atomic<T> where
    T: Send + Sync
[src]

impl<T> From<Box<T>> for Atomic<T>[src]

impl<T> From<T> for Atomic<T>[src]

impl<T> From<*const T> for Atomic<T>[src]

fn from(raw: *const T) -> Atomic<T>[src]

Returns a new atomic pointer pointing to raw.

Examples

use std::ptr;
use crossbeam_epoch::Atomic;

let a = Atomic::<i32>::from(ptr::null::<i32>());

impl<'g, T> From<Shared<'g, T>> for Atomic<T>[src]

fn from(ptr: Shared<'g, T>) -> Atomic<T>[src]

Returns a new atomic pointer pointing to ptr.

Examples

use crossbeam_epoch::{Atomic, Shared};

let a = Atomic::<i32>::from(Shared::<i32>::null());

impl<T> From<Owned<T>> for Atomic<T>[src]

fn from(owned: Owned<T>) -> Atomic<T>[src]

Returns a new atomic pointer pointing to owned.

Examples

use crossbeam_epoch::{Atomic, Owned};

let a = Atomic::<i32>::from(Owned::new(1234));

impl<T> Pointer for Atomic<T>[src]

impl<T> Default for Atomic<T>[src]

impl<T> Send for Atomic<T> where
    T: Send + Sync
[src]

impl<T> Debug for Atomic<T>[src]

Blanket Implementations

impl<T, U> Into for T where
    U: From<T>, 
[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T> From for T[src]

impl<T, U> TryFrom for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T> Borrow for T where
    T: ?Sized
[src]

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> BorrowMut for T where
    T: ?Sized
[src]

impl<T, U> TryInto for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.