use std::sync::Arc;
use super::internal::ManagedResourcePoolInner;
use crate::resource::ResourceQuantity;
#[must_use = "dropping the permit releases its acquired capacity"]
#[derive(Debug)]
pub struct ManagedResourcePermit<R, Q = u64>
where
Q: ResourceQuantity,
{
inner: Option<Arc<ManagedResourcePoolInner<R, Q>>>,
amount: Q,
}
impl<R, Q> ManagedResourcePermit<R, Q>
where
Q: ResourceQuantity,
{
#[inline]
pub(super) fn new(inner: Arc<ManagedResourcePoolInner<R, Q>>, amount: Q) -> Self {
Self {
inner: Some(inner),
amount,
}
}
#[must_use]
#[inline(always)]
pub fn resource(&self) -> &R {
self.inner
.as_ref()
.expect("a live managed resource permit always retains its pool")
.limit
.resource()
}
#[must_use]
#[inline(always)]
pub const fn amount(&self) -> Q {
self.amount
}
pub fn release(mut self) {
self.release_inner();
}
#[inline]
fn release_inner(&mut self) {
if let Some(inner) = self.inner.take() {
inner.release(self.amount);
}
}
}
impl<R, Q> Drop for ManagedResourcePermit<R, Q>
where
Q: ResourceQuantity,
{
fn drop(&mut self) {
self.release_inner();
}
}