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}