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
impl Guard
sourcepub fn defer(&self, collectible: Box<dyn Collectible>)
pub fn defer(&self, collectible: Box<dyn Collectible>)
Defers dropping and memory reclamation of the supplied Box of a type implementing
Collectible.
§Examples
use sdd::{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);sourcepub fn defer_execute<F: 'static + FnOnce() + Sync>(&self, f: F)
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 sdd::Guard;
let guard = Guard::new();
guard.defer_execute(|| println!("deferred"));