crate::ix!();
#[derive(Getters, Builder)]
#[getset(get = "pub")]
#[builder(setter(into), default)]
#[LOCKABLE]
pub struct Epoch {
raw_epoch: u64,
guarded: bool,
}
impl Default for Epoch {
fn default() -> Self {
Self {
raw_epoch: 0,
guarded: false,
}
}
}
impl Epoch {
#[EXCLUSIVE_LOCKS_REQUIRED(*this)]
pub fn visited(&self, marker: &mut EpochMarker) -> bool {
trace!(
target: "epoch",
"visited? epoch={}, marker={}",
self.raw_epoch,
marker.marker()
);
assert!(
self.guarded,
"visited() called outside of an EpochGuard scope"
);
if *marker.marker() < self.raw_epoch {
marker.update(self.raw_epoch);
trace!(target: "epoch", "first visit this epoch");
false
} else {
true
}
}
pub(crate) fn increment_epoch(&mut self) {
self.raw_epoch = self
.raw_epoch
.checked_add(1)
.expect("epoch counter overflow");
trace!(target: "epoch", "epoch incremented → {}", self.raw_epoch);
}
pub(crate) fn set_guarded(&mut self, value: bool) {
trace!(target: "epoch", "guarded flag set → {}", value);
self.guarded = value;
}
}