nitric_lock_internals/
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 trait ReadLock<'a> {
42    type Output;
43
44    unsafe fn lock_info(&self) -> LockInfo<'_>;
45    unsafe fn lock_unchecked(self) -> Self::Output;
46}
47
48pub trait WriteLock<'a> {
49    type Output;
50
51    unsafe fn lock_info(&self) -> LockInfo<'_>;
52    unsafe fn lock_unchecked(self) -> <Self as WriteLock<'a>>::Output;
53}