nitric_lock/
lock.rs

1use lock_api::RawMutex as Unused0;
2use parking_lot::RawMutex;
3
4pub trait Lock<'a> {
5    type Output;
6
7    unsafe fn lock_info(&self) -> LockInfo<'_>;
8    unsafe fn lock_unchecked(self) -> Self::Output;
9}
10
11pub struct LockInfo<'a> {
12    pub id: usize,
13    pub guard: RawLockGuard<'a>,
14}
15
16pub enum Never {}
17
18pub enum RawLockGuard<'a> {
19    RawMutex(&'a RawMutex),
20
21    #[doc(hidden)]
22    __NonExhaustive(Never),
23}
24
25impl<'a> RawLockGuard<'a> {
26    pub fn lock(&self) {
27        match *self {
28            RawLockGuard::RawMutex(ref raw) => raw.lock(),
29            RawLockGuard::__NonExhaustive(ref n) => match *n {},
30        }
31    }
32
33    pub fn try_lock(&self) -> bool {
34        match *self {
35            RawLockGuard::RawMutex(ref raw) => raw.try_lock(),
36            RawLockGuard::__NonExhaustive(ref n) => match *n {},
37        }
38    }
39}
40
41pub struct Mut<T>(T);
42
43impl<'a, T> Lock<'a> for Mut<T>
44where
45    T: WriteLock<'a>,
46{
47    type Output = <T as WriteLock<'a>>::Output;
48
49    unsafe fn lock_info(&self) -> LockInfo<'_> {
50        <T as WriteLock<'a>>::lock_info(&self.0)
51    }
52
53    unsafe fn lock_unchecked(self) -> Self::Output {
54        <T as WriteLock<'a>>::lock_unchecked(self.0)
55    }
56}
57
58pub struct Ref<T>(T);
59
60impl<'a, T> Lock<'a> for Ref<T>
61where
62    T: ReadLock<'a>,
63{
64    type Output = T::Output;
65
66    unsafe fn lock_info(&self) -> LockInfo<'_> {
67        self.0.lock_info()
68    }
69
70    unsafe fn lock_unchecked(self) -> Self::Output {
71        self.0.lock_unchecked()
72    }
73}
74
75pub trait ReadLock<'a> {
76    type Output;
77
78    fn read(self) -> Ref<Self>
79    where
80        Self: Sized,
81    {
82        Ref(self)
83    }
84
85    unsafe fn lock_info(&self) -> LockInfo<'_>;
86    unsafe fn lock_unchecked(self) -> Self::Output;
87}
88
89pub trait WriteLock<'a> {
90    type Output;
91
92    fn write(self) -> Mut<Self>
93    where
94        Self: Sized,
95    {
96        Mut(self)
97    }
98
99    unsafe fn lock_info(&self) -> LockInfo<'_>;
100    unsafe fn lock_unchecked(self) -> <Self as WriteLock<'a>>::Output;
101}