use super::collector::Collector;
use super::underlying::Underlying;
use super::Arc;
pub struct Barrier {
collector_ptr: *mut Collector,
}
impl Barrier {
#[must_use]
#[inline]
pub fn new() -> Barrier {
let collector_ptr = Collector::current();
unsafe {
(*collector_ptr).new_barrier();
}
Barrier { collector_ptr }
}
pub fn reclaim<T: 'static>(&self, arc: Arc<T>) {
if let Some(ptr) = arc.drop_ref() {
self.reclaim_underlying(ptr);
}
std::mem::forget(arc);
}
pub(super) fn reclaim_underlying<T: 'static>(&self, underlying: *mut Underlying<T>) {
unsafe {
(*self.collector_ptr).reclaim(underlying);
}
}
}
impl Default for Barrier {
#[inline]
fn default() -> Self {
Self::new()
}
}
impl Drop for Barrier {
#[inline]
fn drop(&mut self) {
unsafe {
(*self.collector_ptr).end_barrier();
}
}
}