use core::num::NonZeroU64;
use crate::Key;
use crate::concurrent::Smr;
use crate::concurrent::Value;
use crate::concurrent::smr;
use crate::stat;
#[derive(Default)]
pub struct Epoch;
impl<K: Key, V: Value> Smr<K, V> for Epoch {
type Guard<'g>
= crossbeam_epoch::Guard
where
V: 'g,
Self: 'g;
fn guard<'g>(&'g self, _: K::Read<'_>) -> Self::Guard<'g>
where
V: 'g,
{
crossbeam_epoch::pin()
}
}
impl<V: Value> smr::Guard<V> for crossbeam_epoch::Guard {
unsafe fn retire_node(&mut self, _bits: usize, node: NonZeroU64) {
stat::increment(stat::Counter::Retire);
unsafe {
self.defer_unchecked(move || {
smr::deallocate_node(node);
});
}
}
unsafe fn retire_value(&mut self, value: u64) {
stat::increment(stat::Counter::Retire);
unsafe {
self.defer_unchecked(move || smr::deallocate_value::<V>(value));
}
}
}