use std::sync::Arc;
use std::time::Instant;
use parking_lot::Mutex;
use super::tracker::TrackerInner;
#[derive(Debug)]
pub(crate) struct SubgraphRequestGuard {
inner: Arc<Mutex<TrackerInner>>,
}
impl SubgraphRequestGuard {
pub(in crate::plugins::telemetry) fn new(inner: Arc<Mutex<TrackerInner>>) -> Self {
{
let mut inner_lock = inner.lock();
let prev_count = inner_lock.active_count;
inner_lock.active_count += 1;
if prev_count == 0 {
inner_lock.current_period_start = Some(Instant::now());
}
}
Self { inner }
}
}
impl Drop for SubgraphRequestGuard {
fn drop(&mut self) {
let mut inner = self.inner.lock();
let prev_count = inner.active_count;
inner.active_count -= 1;
if prev_count == 1
&& let Some(period_start) = inner.current_period_start.take()
{
let elapsed = period_start.elapsed();
inner.accumulated_subgraph_time += elapsed;
}
}
}