use super::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ResourceLimits {
pub max_bytes: usize,
pub max_entries: usize,
}
impl Default for ResourceLimits {
fn default() -> Self {
Self {
max_bytes: MAX_STORE_BYTES,
max_entries: MAX_ENTRIES,
}
}
}
#[derive(Clone, Default)]
pub struct ResourceStore(pub(super) Arc<Store>);
pub(super) struct Store {
pub(super) bytes: AtomicUsize,
pub(super) entries: Mutex<BTreeMap<CacheKey, Weak<Erased>>>,
pub(super) limits: ResourceLimits,
}
impl Default for Store {
fn default() -> Self {
Self {
bytes: AtomicUsize::new(0),
entries: Mutex::new(BTreeMap::new()),
limits: ResourceLimits::default(),
}
}
}
impl ResourceStore {
pub fn new() -> Self {
Self::default()
}
pub fn with_limits(limits: ResourceLimits) -> crate::Result<Self> {
if limits.max_bytes == 0 || !(1..=MAX_ENTRIES).contains(&limits.max_entries) {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
"Resource limits require positive bytes and 1..=4096 entries",
)
.into());
}
Ok(Self(Arc::new(Store {
limits,
..Store::default()
})))
}
pub fn max_bytes(&self) -> usize {
self.0.limits.max_bytes
}
pub fn max_entries(&self) -> usize {
self.0.limits.max_entries
}
pub fn retained_bytes(&self) -> usize {
self.0.bytes.load(Ordering::Acquire)
}
pub fn same_store(&self, other: &Self) -> bool {
Arc::ptr_eq(&self.0, &other.0)
}
}