Skip to main content

get_size2/impls/
sync_impls.rs

1use std::cell::RefCell;
2use std::sync::{Mutex, OnceLock, RwLock};
3
4use crate::{GetSize, GetSizeTracker};
5
6impl<T> GetSize for Mutex<T>
7where
8    T: GetSize,
9{
10    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
11        // We assume that a `Mutex` holds its data on the stack.
12        let guard = self
13            .lock()
14            .unwrap_or_else(std::sync::PoisonError::into_inner);
15        T::get_heap_size_with_tracker(&*guard, tracker)
16    }
17}
18
19impl<T> GetSize for RwLock<T>
20where
21    T: GetSize,
22{
23    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
24        // We assume that a `RwLock` holds its data on the stack.
25        let guard = self
26            .read()
27            .unwrap_or_else(std::sync::PoisonError::into_inner);
28        T::get_heap_size_with_tracker(&*guard, tracker)
29    }
30}
31
32impl<T> GetSize for RefCell<T>
33where
34    T: GetSize,
35{
36    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
37        // We assume that a `RefCell` holds its data on the stack.
38        // Use try_borrow to avoid panicking if the RefCell is already mutably borrowed
39        match self.try_borrow() {
40            Ok(borrowed) => T::get_heap_size_with_tracker(&*borrowed, tracker),
41            Err(_) => {
42                // If the RefCell is already mutably borrowed, we cannot safely access it.
43                // Return 0 for heap size to avoid panic, though this is a rare edge case.
44                (0, tracker)
45            }
46        }
47    }
48}
49
50impl<T> GetSize for OnceLock<T>
51where
52    T: GetSize,
53{
54    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
55        // We assume that a `OnceLock` holds its data on the stack.
56        match self.get() {
57            None => (0, tracker),
58            Some(value) => T::get_heap_size_with_tracker(value, tracker),
59        }
60    }
61}