Skip to main content

get_size2/impls/std_impls/
sync.rs

1use std::sync::{Mutex, OnceLock, RwLock};
2
3use crate::{GetSize, GetSizeTracker};
4
5impl<T> GetSize for Mutex<T>
6where
7    T: GetSize,
8{
9    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
10        // We assume that a `Mutex` holds its data on the stack.
11        let guard = self
12            .lock()
13            .unwrap_or_else(std::sync::PoisonError::into_inner);
14        T::get_heap_size_with_tracker(&*guard, tracker)
15    }
16}
17
18impl<T> GetSize for RwLock<T>
19where
20    T: GetSize,
21{
22    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
23        // We assume that a `RwLock` holds its data on the stack.
24        let guard = self
25            .read()
26            .unwrap_or_else(std::sync::PoisonError::into_inner);
27        T::get_heap_size_with_tracker(&*guard, tracker)
28    }
29}
30
31impl<T> GetSize for OnceLock<T>
32where
33    T: GetSize,
34{
35    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
36        // We assume that a `OnceLock` holds its data on the stack.
37        match self.get() {
38            None => (0, tracker),
39            Some(value) => T::get_heap_size_with_tracker(value, tracker),
40        }
41    }
42}