fast_async_mutex/
utils.rs1#[macro_use]
2mod deref {
3 #[macro_export]
4 macro_rules! impl_deref_mut {
5 ($struct_name:ident) => {
6 $crate::impl_deref!($struct_name);
7 impl<T: ?Sized> std::ops::DerefMut for $struct_name<T> {
8 fn deref_mut(&mut self) -> &mut Self::Target {
9 unsafe { &mut *self.mutex.inner.data.get() }
10 }
11 }
12 };
13 ($struct_name:ident, $lifetime:lifetime) => {
14 $crate::impl_deref!($struct_name, $lifetime);
15 impl<$lifetime, T: ?Sized> std::ops::DerefMut for $struct_name<$lifetime, T> {
16 fn deref_mut(&mut self) -> &mut Self::Target {
17 unsafe { &mut *self.mutex.inner.data.get() }
18 }
19 }
20 };
21 }
22
23 #[macro_export]
24 macro_rules! impl_deref {
25 ($struct_name:ident) => {
26 impl<T: ?Sized> std::ops::Deref for $struct_name<T> {
27 type Target = T;
28
29 fn deref(&self) -> &Self::Target {
30 unsafe { &*self.mutex.inner.data.get() }
31 }
32 }
33 };
34 ($struct_name:ident, $lifetime:lifetime) => {
35 impl<$lifetime, T: ?Sized> std::ops::Deref for $struct_name<$lifetime, T> {
36 type Target = T;
37
38 fn deref(&self) -> &Self::Target {
39 unsafe { &*self.mutex.inner.data.get() }
40 }
41 }
42 };
43 }
44}
45
46#[macro_use]
47mod drop {
48 #[macro_export]
49 macro_rules! impl_drop_guard {
50 ($struct_name:ident, $unlock_fn:ident) => {
51 impl<T: ?Sized> Drop for $struct_name<T> {
52 fn drop(&mut self) {
53 self.mutex.inner.$unlock_fn()
54 }
55 }
56 };
57 ($struct_name:ident, $lifetime:lifetime, $unlock_fn:ident) => {
58 impl<$lifetime, T: ?Sized> Drop for $struct_name<$lifetime, T> {
59 fn drop(&mut self) {
60 self.mutex.inner.$unlock_fn()
61 }
62 }
63 };
64 }
65 #[macro_export]
66 macro_rules! impl_drop_guard_self {
67 ($struct_name:ident, $unlock_fn:ident) => {
68 impl<T: ?Sized> Drop for $struct_name<T> {
69 fn drop(&mut self) {
70 self.mutex.$unlock_fn()
71 }
72 }
73 };
74 ($struct_name:ident, $lifetime:lifetime, $unlock_fn:ident) => {
75 impl<$lifetime, T: ?Sized> Drop for $struct_name<$lifetime, T> {
76 fn drop(&mut self) {
77 self.mutex.$unlock_fn()
78 }
79 }
80 };
81 }
82
83 #[macro_export]
84 macro_rules! impl_drop_guard_future {
85 ($struct_name:ident, $unlock_fn:ident) => {
86 impl<T: ?Sized> Drop for $struct_name<T> {
87 fn drop(&mut self) {
88 if !self.is_realized {
89 self.mutex.inner.$unlock_fn()
90 }
91 }
92 }
93 };
94 ($struct_name:ident, $lifetime:lifetime, $unlock_fn:ident) => {
95 impl<$lifetime, T: ?Sized> Drop for $struct_name<$lifetime, T> {
96 fn drop(&mut self) {
97 if !self.is_realized {
98 self.mutex.inner.$unlock_fn()
99 }
100 }
101 }
102 };
103 }
104}
105
106#[macro_use]
107mod sync {
108 #[macro_export]
109 macro_rules! impl_send_sync_rwlock {
110 ($mutex_name:ident, $read_guard:ident, $read_guard_owned:ident, $write_guard:ident, $write_guard_owned:ident) => {
111 unsafe impl<T> Send for $mutex_name<T> where T: Send + ?Sized {}
112 unsafe impl<T> Sync for $mutex_name<T> where T: Send + Sync + ?Sized {}
113
114 unsafe impl<T> Send for $read_guard<'_, T> where T: ?Sized + Send {}
115 unsafe impl<T> Sync for $read_guard<'_, T> where T: Send + Sync + ?Sized {}
116
117 unsafe impl<T> Send for $read_guard_owned<T> where T: ?Sized + Send {}
118 unsafe impl<T> Sync for $read_guard_owned<T> where T: Send + Sync + ?Sized {}
119
120 unsafe impl<T> Send for $write_guard<'_, T> where T: ?Sized + Send {}
121 unsafe impl<T> Sync for $write_guard<'_, T> where T: Send + Sync + ?Sized {}
122
123 unsafe impl<T> Send for $write_guard_owned<T> where T: ?Sized + Send {}
124 unsafe impl<T> Sync for $write_guard_owned<T> where T: Send + Sync + ?Sized {}
125 };
126 }
127
128 #[macro_export]
129 macro_rules! impl_send_sync_mutex {
130 ($mutex_name:ident, $mutex_guard:ident, $mutex_guard_owned:ident) => {
131 unsafe impl<T> Send for $mutex_name<T> where T: Send + ?Sized {}
132 unsafe impl<T> Sync for $mutex_name<T> where T: Send + Sync + ?Sized {}
133
134 unsafe impl<T> Send for $mutex_guard<'_, T> where T: ?Sized + Send {}
135 unsafe impl<T> Sync for $mutex_guard<'_, T> where T: Send + Sync + ?Sized {}
136
137 unsafe impl<T> Send for $mutex_guard_owned<T> where T: ?Sized + Send {}
138 unsafe impl<T> Sync for $mutex_guard_owned<T> where T: Send + Sync + ?Sized {}
139 };
140 }
141}