use std::panic::{RefUnwindSafe, UnwindSafe};
use std::ptr::NonNull;
use crate::Epoch;
use crate::collectible::DeferredClosure;
use crate::collector::Collector;
#[derive(Debug)]
pub struct Guard {
collector_ptr: NonNull<Collector>,
}
impl Guard {
#[inline]
#[must_use]
pub fn new() -> Self {
let collector_ptr = Collector::current();
Collector::new_guard(collector_ptr.as_ptr(), true);
Self { collector_ptr }
}
#[inline]
#[must_use]
pub fn epoch(&self) -> Epoch {
Collector::current_epoch()
}
#[inline]
pub fn accelerate(&self) {
unsafe {
(*self.collector_ptr.as_ptr()).accelerate();
}
}
#[inline]
pub fn defer_execute<F: 'static + FnOnce()>(&self, f: F) {
Collector::collect(
self.collector_ptr.as_ptr(),
Box::into_raw(Box::new(DeferredClosure::new(f))),
);
}
}
impl Default for Guard {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl Drop for Guard {
#[inline]
fn drop(&mut self) {
Collector::end_guard(self.collector_ptr.as_ptr());
}
}
impl RefUnwindSafe for Guard {}
impl UnwindSafe for Guard {}