Skip to main content

get_size2/impls/feature/
parking_lot.rs

1use crate::{GetSize, GetSizeTracker};
2
3// parking_lot's Mutex/RwLock are infallible (no poisoning) so these are
4// simpler than the std::sync variants in `impls/sync_impls.rs` — no
5// `unwrap_or_else(PoisonError::into_inner)` recovery needed.
6
7impl<T> GetSize for parking_lot::Mutex<T>
8where
9    T: GetSize,
10{
11    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
12        let guard = self.lock();
13        T::get_heap_size_with_tracker(&*guard, tracker)
14    }
15}
16
17impl<T> GetSize for parking_lot::RwLock<T>
18where
19    T: GetSize,
20{
21    fn get_heap_size_with_tracker<Tr: GetSizeTracker>(&self, tracker: Tr) -> (usize, Tr) {
22        let guard = self.read();
23        T::get_heap_size_with_tracker(&*guard, tracker)
24    }
25}
26
27// Tracker-side mirrors of the std::sync impls in `crate::tracker`.
28// Letting a `parking_lot::Mutex<Tracker>` work as a tracker keeps API
29// parity with the existing `Mutex<Tracker>` / `RwLock<Tracker>` /
30// `Arc<Mutex<Tracker>>` / `Arc<RwLock<Tracker>>` patterns.
31
32impl<T: GetSizeTracker> GetSizeTracker for parking_lot::Mutex<T> {
33    fn track<A>(&mut self, addr: *const A) -> bool {
34        GetSizeTracker::track(self.get_mut(), addr)
35    }
36}
37
38impl<T: GetSizeTracker> GetSizeTracker for parking_lot::RwLock<T> {
39    fn track<A>(&mut self, addr: *const A) -> bool {
40        GetSizeTracker::track(self.get_mut(), addr)
41    }
42}
43
44impl<T: GetSizeTracker> GetSizeTracker for std::sync::Arc<parking_lot::Mutex<T>> {
45    fn track<A>(&mut self, addr: *const A) -> bool {
46        let mut guard = self.lock();
47        GetSizeTracker::track(&mut *guard, addr)
48    }
49}
50
51impl<T: GetSizeTracker> GetSizeTracker for std::sync::Arc<parking_lot::RwLock<T>> {
52    fn track<A>(&mut self, addr: *const A) -> bool {
53        let mut guard = self.write();
54        GetSizeTracker::track(&mut *guard, addr)
55    }
56}