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