fast_async_mutex/
utils.rs

1#[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}