abs_sync/
sync_lock.rs

1use core::{
2    ops::{Deref, DerefMut, Try},
3    pin::Pin,
4};
5use crate::sync_tasks::TrSyncTask;
6
7pub trait TrSyncRwLock {
8    type Target: ?Sized;
9
10    fn acquire(&self) -> impl TrAcquire<'_, Self::Target>;
11}
12
13pub trait TrAcquire<'a, T>
14where
15    Self: 'a,
16    T: 'a + ?Sized,
17{
18    type ReaderGuard<'g>: TrReaderGuard<'a, 'g, T> where 'a: 'g;
19
20    type WriterGuard<'g>: TrWriterGuard<'a, 'g, T> where 'a: 'g;
21
22    type UpgradableGuard<'g>: TrUpgradableReaderGuard<'a, 'g, T> where 'a: 'g;
23
24    fn try_read<'g>(
25        self: Pin<&'g mut Self>,
26    ) -> impl Try<Output = Self::ReaderGuard<'g>>
27    where
28        'a: 'g;
29
30    fn try_write<'g>(
31        self: Pin<&'g mut Self>,
32    ) -> impl Try<Output = Self::WriterGuard<'g>>
33    where
34        'a: 'g;
35
36    fn try_upgradable_read<'g>(
37        self: Pin<&'g mut Self>,
38    ) -> impl Try<Output = Self::UpgradableGuard<'g>>
39    where
40        'a: 'g;
41
42    fn read<'g>(
43        self: Pin<&'g mut Self>,
44    ) -> impl TrSyncTask<MayCancelOutput = Self::ReaderGuard<'g>>
45    where
46        'a: 'g;
47
48    fn write<'g>(
49        self: Pin<&'g mut Self>,
50    ) -> impl TrSyncTask<MayCancelOutput = Self::WriterGuard<'g>>
51    where
52        'a: 'g;
53
54    fn upgradable_read<'g>(
55        self: Pin<&'g mut Self>,
56    ) -> impl TrSyncTask<MayCancelOutput = Self::UpgradableGuard<'g>>
57    where
58        'a: 'g;
59}
60
61pub trait TrReaderGuard<'a, 'g, T>
62where
63    'a: 'g,
64    Self: 'g + Sized + Deref<Target = T>,
65    T: 'a + ?Sized,
66{
67    type Acquire: TrAcquire<'a, T>;
68
69    fn as_reader_guard(&self) -> &Self {
70        self
71    }
72}
73
74pub trait TrUpgradableReaderGuard<'a, 'g, T>
75where
76    'a: 'g,
77    Self: 'g + TrReaderGuard<'a, 'g, T>,
78    T: 'a + ?Sized,
79{
80    fn downgrade(
81        self,
82    ) -> <Self::Acquire as TrAcquire<'a, T>>::ReaderGuard<'g>;
83
84    fn try_upgrade(
85        self,
86    ) -> Result<<Self::Acquire as TrAcquire<'a, T>>::WriterGuard<'g> , Self>;
87
88    fn upgrade(
89        self,
90    ) -> impl TrUpgrade<'a, 'g, T, Acquire = Self::Acquire>;
91}
92
93pub trait TrWriterGuard<'a, 'g, T>
94where
95    'a: 'g,
96    Self: 'g + TrReaderGuard<'a, 'g, T> + DerefMut<Target = T>,
97    T: 'a + ?Sized,
98{
99    fn downgrade_to_reader(
100        self,
101    ) -> <Self::Acquire as TrAcquire<'a, T>>::ReaderGuard<'g>;
102
103    fn downgrade_to_upgradable(
104        self,
105    ) -> <Self::Acquire as TrAcquire<'a, T>>::UpgradableGuard<'g>;
106}
107
108pub trait TrUpgrade<'a, 'g, T>
109where
110    'a: 'g,
111    T: 'a + ?Sized,
112{
113    type Acquire: TrAcquire<'a, T>;
114
115    fn try_upgrade<'u>(
116        self: Pin<&'u mut Self>,
117    ) -> impl Try<Output =
118            <Self::Acquire as TrAcquire<'a, T>>::WriterGuard<'u>>
119    where
120        'g: 'u;
121
122    fn upgrade<'u>(
123        self: Pin<&'u mut Self>,
124    ) -> impl TrSyncTask<MayCancelOutput =
125            <Self::Acquire as TrAcquire<'a, T>>::WriterGuard<'u>>
126    where
127        'g: 'u;
128
129    fn into_guard(
130        self,
131    ) -> <Self::Acquire as TrAcquire<'a, T>>::UpgradableGuard<'g>;
132}