monitor/mon/
stat.rs

1use std::collections::HashSet;
2
3use happylock::ThreadKey;
4
5use super::Monitor;
6use crate::gates::{DynlinkStats, HandleStats, MonitorStats};
7
8impl Monitor {
9    #[tracing::instrument(skip(self), level = tracing::Level::DEBUG)]
10    pub fn stats(&self) -> MonitorStats {
11        let (
12            ref mut threads,
13            ref mut comp,
14            ref mut dynlink,
15            ref mut lib_handles,
16            ref mut comp_handles,
17        ) = *self.locks.lock(ThreadKey::get().unwrap());
18        let mut nr_libs = 0;
19        let mut compset = HashSet::new();
20        for lib in dynlink.libraries() {
21            compset.insert(lib.compartment());
22            nr_libs += 1;
23        }
24        let dynlink = DynlinkStats {
25            nr_libs,
26            nr_comps: compset.len(),
27        };
28        let handles = HandleStats {
29            nr_comp_handles: comp_handles.total_count(),
30            nr_lib_handles: lib_handles.total_count(),
31        };
32        MonitorStats {
33            space: self.space.lock().unwrap().stat(),
34            thread_mgr: threads.stat(),
35            comp_mgr: comp.stat(),
36            handles,
37            dynlink,
38        }
39    }
40}