mlua_codemp_patch/types/
sync.rs

1#[cfg(feature = "send")]
2mod inner {
3    use parking_lot::{RawMutex, RawThreadId};
4    use std::sync::{Arc, Weak};
5
6    pub(crate) type XRc<T> = Arc<T>;
7    pub(crate) type XWeak<T> = Weak<T>;
8
9    pub(crate) type ReentrantMutex<T> = parking_lot::ReentrantMutex<T>;
10
11    pub(crate) type ReentrantMutexGuard<'a, T> = parking_lot::ReentrantMutexGuard<'a, T>;
12
13    pub(crate) type ArcReentrantMutexGuard<T> =
14        parking_lot::lock_api::ArcReentrantMutexGuard<RawMutex, RawThreadId, T>;
15}
16
17#[cfg(not(feature = "send"))]
18mod inner {
19    use std::ops::Deref;
20    use std::rc::{Rc, Weak};
21
22    pub(crate) type XRc<T> = Rc<T>;
23    pub(crate) type XWeak<T> = Weak<T>;
24
25    pub(crate) struct ReentrantMutex<T>(T);
26
27    impl<T> ReentrantMutex<T> {
28        #[inline(always)]
29        pub(crate) fn new(val: T) -> Self {
30            ReentrantMutex(val)
31        }
32
33        #[inline(always)]
34        pub(crate) fn lock(&self) -> ReentrantMutexGuard<T> {
35            ReentrantMutexGuard(&self.0)
36        }
37
38        #[inline(always)]
39        pub(crate) fn lock_arc(self: &XRc<Self>) -> ArcReentrantMutexGuard<T> {
40            ArcReentrantMutexGuard(Rc::clone(self))
41        }
42
43        #[inline(always)]
44        pub(crate) fn into_lock_arc(self: XRc<Self>) -> ArcReentrantMutexGuard<T> {
45            ArcReentrantMutexGuard(self)
46        }
47
48        #[inline(always)]
49        pub(crate) fn data_ptr(&self) -> *const T {
50            &self.0 as *const _
51        }
52    }
53
54    pub(crate) struct ReentrantMutexGuard<'a, T>(&'a T);
55
56    impl<'a, T> Deref for ReentrantMutexGuard<'a, T> {
57        type Target = T;
58
59        #[inline(always)]
60        fn deref(&self) -> &Self::Target {
61            self.0
62        }
63    }
64
65    pub(crate) struct ArcReentrantMutexGuard<T>(XRc<ReentrantMutex<T>>);
66
67    impl<T> Deref for ArcReentrantMutexGuard<T> {
68        type Target = T;
69
70        #[inline(always)]
71        fn deref(&self) -> &Self::Target {
72            &self.0 .0
73        }
74    }
75}
76
77pub(crate) use inner::{ArcReentrantMutexGuard, ReentrantMutex, ReentrantMutexGuard, XRc, XWeak};