#[cfg(feature = "smr-epoch")]
mod epoch;
#[cfg(feature = "smr-hazard")]
pub mod hazard;
pub mod no_op;
#[cfg(feature = "smr-seize")]
mod seize;
use core::num::NonZeroU64;
#[cfg(feature = "smr-epoch")]
pub use epoch::Epoch;
#[doc(inline)]
#[cfg(feature = "smr-hazard")]
pub use hazard::Hazard;
pub use no_op::NoOp;
#[cfg(feature = "smr-seize")]
pub use seize::Seize;
cfg_select! {
feature = "smr-seize" => {
pub type Default = Seize;
}
_ => {
pub type Default = NoOp;
}
}
use crate::Key;
use crate::concurrent::Value;
use crate::stat;
pub trait Smr<K: Key, V: Value> {
type Guard<'g>: Guard<V>
where
V: 'g,
Self: 'g;
fn guard<'g>(&'g self, prefix: K::Read<'_>) -> Self::Guard<'g>
where
V: 'g;
fn garbage(&self) -> u32 {
0
}
}
pub trait Guard<V: Value> {
unsafe fn retire_node(&mut self, bits: usize, node: NonZeroU64);
unsafe fn retire_value(&mut self, value: u64);
}
pub unsafe fn deallocate_node(node: NonZeroU64) {
stat::increment(stat::Counter::FreeRetire);
unsafe { ribbit::Packed::<crate::raw::node::Ptr>::from_raw_unchecked(node).deallocate() }
}
pub unsafe fn deallocate_value<V: Value>(value: u64) {
stat::increment(stat::Counter::FreeRetire);
drop(unsafe { V::from_raw_unchecked(value) })
}