use std::collections::BTreeMap;
use std::fmt::{self, Debug};
use std::sync::atomic::AtomicUsize;
use std::sync::atomic::Ordering::SeqCst;
use bincode::{Infinite, deserialize, serialize};
use serde::de::DeserializeOwned;
use serde::Serialize;
use coco::epoch::Ptr;
use super::*;
mod page_cache;
mod hash;
mod lru;
pub use self::page_cache::PageCache;
pub trait Materializer {
type MaterializedPage;
type PartialPage;
type Recovery;
fn materialize(&self, &[Self::PartialPage]) -> Self::MaterializedPage;
fn consolidate(&self, &[Self::PartialPage]) -> Vec<Self::PartialPage>;
fn recover(&self, &Self::PartialPage) -> Option<Self::Recovery>;
}
#[derive(Debug, Clone, PartialEq)]
pub enum CacheEntry<M> {
Resident(Vec<M>, LogID),
PartialFlush(LogID),
Flush(LogID),
}
unsafe impl<M: Send> Send for CacheEntry<M> {}
#[derive(Debug, Clone)]
pub struct CasKey<P> {
ptr: *const stack::Node<CacheEntry<P>>,
tag: usize,
}
impl<'s, P> From<Ptr<'s, stack::Node<CacheEntry<P>>>> for CasKey<P> {
fn from(ptr: Ptr<'s, stack::Node<CacheEntry<P>>>) -> CasKey<P> {
CasKey {
ptr: ptr.as_raw(),
tag: ptr.tag(),
}
}
}
impl<'s, P> Into<Ptr<'s, stack::Node<CacheEntry<P>>>> for CasKey<P> {
fn into(self) -> Ptr<'s, stack::Node<CacheEntry<P>>> {
unsafe { Ptr::from_raw(self.ptr).with_tag(self.tag) }
}
}
#[serde(bound(deserialize = ""))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub(super) struct LoggedUpdate<PartialPage>
where PartialPage: Serialize + DeserializeOwned
{
pid: PageID,
update: Update<PartialPage>,
}
#[serde(bound(deserialize = ""))]
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
enum Update<PartialPage>
where PartialPage: DeserializeOwned + Serialize
{
Append(Vec<PartialPage>),
Compact(Vec<PartialPage>),
Del,
Alloc,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
struct Snapshot<R> {
pub max_lid: LogID,
pub max_pid: PageID,
pub pt: BTreeMap<PageID, Vec<LogID>>,
pub free: Vec<PageID>,
pub recovery: Option<R>,
}
impl<R> Default for Snapshot<R> {
fn default() -> Snapshot<R> {
Snapshot {
max_lid: 0,
max_pid: 0,
pt: BTreeMap::new(),
free: vec![],
recovery: None,
}
}
}