use std::ops::Deref;
use std::sync::Arc;
use crate::store::BufferManager;
use super::view::View;
pub struct Snapshot {
view: Option<View>,
store: Arc<BufferManager>,
epoch: u64,
retired: bool,
}
impl Snapshot {
pub(crate) fn new(view: View, store: Arc<BufferManager>, epoch: u64) -> Self {
Self {
view: Some(view),
store,
epoch,
retired: false,
}
}
#[must_use]
pub fn epoch(&self) -> u64 {
self.epoch
}
#[must_use]
pub fn view(&self) -> &View {
self.view.as_ref().expect("snapshot retired")
}
pub fn retire(mut self) {
self.retire_inner();
}
fn retire_inner(&mut self) {
if !self.retired {
self.retired = true;
drop(self.view.take());
self.store.retire_snapshot(self.epoch);
}
}
}
impl Deref for Snapshot {
type Target = View;
fn deref(&self) -> &View {
self.view()
}
}
impl Drop for Snapshot {
fn drop(&mut self) {
self.retire_inner();
}
}
impl std::fmt::Debug for Snapshot {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Snapshot")
.field("epoch", &self.epoch)
.field("scope", &self.view.as_ref().map(View::scope))
.finish_non_exhaustive()
}
}