nitric_lock_internals/
lock.rs1use 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}