use crate::MappedPageError;
use crate::page::MappedPage;
use crate::pager::Pager;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ProtectedPageId(pub u64);
impl ProtectedPageId {
pub fn get<'a>(&self, pager: &'a Pager) -> Result<&'a MappedPage, MappedPageError> {
pager.get_protected_page(*self)
}
pub fn get_mut<'a>(
&self,
pager: &'a mut Pager,
) -> Result<ProtectedPageWriter<'a>, MappedPageError> {
pager.get_protected_page_mut(*self)
}
}
pub struct ProtectedPageWriter<'a> {
pub(crate) pager: &'a mut Pager,
pub(crate) id: ProtectedPageId,
pub(crate) inactive_phys_page: u64,
pub(crate) inactive_slot: u8,
}
impl<'a> ProtectedPageWriter<'a> {
pub fn page_mut(&mut self) -> &mut MappedPage {
let ps = self.pager.page_size;
let off = self.inactive_phys_page as usize * ps;
let slice = &mut self
.pager
.mmap
.as_mut()
.expect("mmap available: verified at ProtectedPageWriter construction")[off..off + ps];
unsafe { MappedPage::from_slice_mut(slice) }
}
pub fn commit(self) -> Result<(), MappedPageError> {
self.pager
.commit_protected_write(self.id, self.inactive_phys_page, self.inactive_slot)
}
}