Struct scc::ebr::Guard

source ·
pub struct Guard { /* private fields */ }
Expand description

Guard allows the user to read AtomicShared and keeps the underlying instance pinned to the thread.

Guard internally prevents the global epoch value from passing through the value announced by the current thread, thus keeping reachable instances in the thread from being garbage collected.

Implementations§

source§

impl Guard

source

pub fn new() -> Self

Creates a new Guard.

§Panics

The maximum number of Guard instances in a thread is limited to u32::MAX; a thread panics when the number of Guard instances in the thread exceeds the limit.

§Examples
use scc::ebr::Guard;

let guard = Guard::new();
source

pub fn defer(&self, collectible: Box<dyn Collectible>)

Defers dropping and memory reclamation of the supplied Box of a type implementing Collectible.

§Examples
use scc::ebr::{Guard, Collectible};
use std::ptr::NonNull;

struct C(usize, Option<NonNull<dyn Collectible>>);

impl Collectible for C {
    fn next_ptr_mut(&mut self) -> &mut Option<NonNull<dyn Collectible>> {
        &mut self.1
    }
}

let boxed: Box<C> = Box::new(C(7, None));

let static_ref: &'static C = unsafe { std::mem::transmute(&*boxed) };

let guard = Guard::new();
guard.defer(boxed);

assert_eq!(static_ref.0, 7);
source

pub fn defer_execute<F: 'static + FnOnce() + Sync>(&self, f: F)

Executes the supplied closure at a later point of time.

It is guaranteed that the closure will be executed after every Guard at the moment when the method was invoked is dropped, however it is totally non-deterministic when exactly the closure will be executed.

Note that the supplied closure is stored in the heap memory, and it has to be Sync as it can be referred to by another thread.

§Examples
use scc::ebr::Guard;

let guard = Guard::new();
guard.defer_execute(|| println!("deferred"));

Trait Implementations§

source§

impl Default for Guard

source§

fn default() -> Self

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

impl Drop for Guard

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl UnwindSafe for Guard

Auto Trait Implementations§

§

impl !RefUnwindSafe for Guard

§

impl !Send for Guard

§

impl !Sync for Guard

§

impl Unpin for Guard

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>,

§

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>,

§

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.