xref: /DragonOS/kernel/src/libs/rwlock.rs (revision 13776c114b15c406b1e0aaeeb71812ea6e471d2e)
1f1284c35SGou Ngai #![allow(dead_code)]
2f1284c35SGou Ngai use core::{
3f1284c35SGou Ngai     cell::UnsafeCell,
4f1284c35SGou Ngai     hint::spin_loop,
5f1284c35SGou Ngai     mem::{self, ManuallyDrop},
6f1284c35SGou Ngai     ops::{Deref, DerefMut},
7f1284c35SGou Ngai     sync::atomic::{AtomicU32, Ordering},
8f1284c35SGou Ngai };
9f1284c35SGou Ngai 
1078bf93f0SYJwu2023 use crate::syscall::SystemError;
11f1284c35SGou Ngai 
12f1284c35SGou Ngai ///RwLock读写锁
13f1284c35SGou Ngai 
14f1284c35SGou Ngai /// @brief READER位占据从右往左数第三个比特位
15f1284c35SGou Ngai const READER: u32 = 1 << 2;
16f1284c35SGou Ngai 
17f1284c35SGou Ngai /// @brief UPGRADED位占据从右到左数第二个比特位
18f1284c35SGou Ngai const UPGRADED: u32 = 1 << 1;
19f1284c35SGou Ngai 
20f1284c35SGou Ngai /// @brief WRITER位占据最右边的比特位
21f1284c35SGou Ngai const WRITER: u32 = 1;
22f1284c35SGou Ngai 
23f1284c35SGou Ngai const READER_BIT: u32 = 2;
24f1284c35SGou Ngai 
25f1284c35SGou Ngai /// @brief 读写锁的基本数据结构
26f1284c35SGou Ngai /// @param lock 32位原子变量,最右边的两位从左到右分别是UPGRADED,WRITER (标志位)
27f1284c35SGou Ngai ///             剩下的bit位存储READER数量(除了MSB)
28f1284c35SGou Ngai ///             对于标志位,0代表无, 1代表有
29f1284c35SGou Ngai ///             对于剩下的比特位表征READER的数量的多少
30f1284c35SGou Ngai ///             lock的MSB必须为0,否则溢出
31f1284c35SGou Ngai #[derive(Debug)]
32f1284c35SGou Ngai pub struct RwLock<T> {
33f1284c35SGou Ngai     lock: AtomicU32,
34f1284c35SGou Ngai     data: UnsafeCell<T>,
35f1284c35SGou Ngai }
36f1284c35SGou Ngai 
37f1284c35SGou Ngai /// @brief  READER守卫的数据结构
38f1284c35SGou Ngai /// @param lock 是对RwLock的lock属性值的只读引用
39f1284c35SGou Ngai pub struct RwLockReadGuard<'a, T: 'a> {
40f1284c35SGou Ngai     data: *const T,
41f1284c35SGou Ngai     lock: &'a AtomicU32,
42f1284c35SGou Ngai }
43f1284c35SGou Ngai 
44f1284c35SGou Ngai /// @brief UPGRADED是介于READER和WRITER之间的一种锁,它可以升级为WRITER,
45f1284c35SGou Ngai ///        UPGRADED守卫的数据结构,注册UPGRADED锁只需要查看UPGRADED和WRITER的比特位
46f1284c35SGou Ngai ///        但是当UPGRADED守卫注册后,不允许有新的读者锁注册
47f1284c35SGou Ngai /// @param inner    是对RwLock数据结构的只读引用
48f1284c35SGou Ngai pub struct RwLockUpgradableGuard<'a, T: 'a> {
49f1284c35SGou Ngai     data: *const T,
50f1284c35SGou Ngai     inner: &'a RwLock<T>,
51f1284c35SGou Ngai }
52f1284c35SGou Ngai 
53f1284c35SGou Ngai /// @brief WRITER守卫的数据结构
54f1284c35SGou Ngai /// @param data     RwLock的data的可变引用
55f1284c35SGou Ngai /// @param inner    是对RwLock数据结构的只读引用
56f1284c35SGou Ngai pub struct RwLockWriteGuard<'a, T: 'a> {
57f1284c35SGou Ngai     data: *mut T,
58f1284c35SGou Ngai     inner: &'a RwLock<T>,
59f1284c35SGou Ngai }
60f1284c35SGou Ngai 
61f1284c35SGou Ngai unsafe impl<T: Send> Send for RwLock<T> {}
62f1284c35SGou Ngai unsafe impl<T: Send + Sync> Sync for RwLock<T> {}
63f1284c35SGou Ngai 
64f1284c35SGou Ngai /// @brief RwLock的API
65f1284c35SGou Ngai impl<T> RwLock<T> {
66f1284c35SGou Ngai     #[inline]
67f1284c35SGou Ngai     /// @brief  RwLock的初始化
68f1284c35SGou Ngai     pub const fn new(data: T) -> Self {
69f1284c35SGou Ngai         return RwLock {
70f1284c35SGou Ngai             lock: AtomicU32::new(0),
71f1284c35SGou Ngai             data: UnsafeCell::new(data),
72f1284c35SGou Ngai         };
73f1284c35SGou Ngai     }
74f1284c35SGou Ngai 
75f1284c35SGou Ngai     #[allow(dead_code)]
76f1284c35SGou Ngai     #[inline]
77f1284c35SGou Ngai     /// @brief 将读写锁的皮扒掉,返回内在的data,返回的是一个真身而非引用
78f1284c35SGou Ngai     pub fn into_inner(self) -> T {
79f1284c35SGou Ngai         let RwLock { data, .. } = self;
80f1284c35SGou Ngai         return data.into_inner();
81f1284c35SGou Ngai     }
82f1284c35SGou Ngai 
83f1284c35SGou Ngai     #[allow(dead_code)]
84f1284c35SGou Ngai     #[inline]
85f1284c35SGou Ngai     /// @brief 返回data的raw pointer,
86f1284c35SGou Ngai     /// unsafe
87f1284c35SGou Ngai     pub fn as_mut_ptr(&self) -> *mut T {
88f1284c35SGou Ngai         return self.data.get();
89f1284c35SGou Ngai     }
90f1284c35SGou Ngai 
91f1284c35SGou Ngai     #[allow(dead_code)]
92f1284c35SGou Ngai     #[inline]
93f1284c35SGou Ngai     /// @brief 获取实时的读者数并尝试加1,如果增加值成功则返回增加1后的读者数,否则panic
94676b8ef6SMork     fn current_reader(&self) -> Result<u32, SystemError> {
95f1284c35SGou Ngai         const MAX_READERS: u32 = core::u32::MAX >> READER_BIT >> 1; //右移3位
96f1284c35SGou Ngai 
97f1284c35SGou Ngai         let value = self.lock.fetch_add(READER, Ordering::Acquire);
98f1284c35SGou Ngai         //value二进制形式的MSB不能为1, 否则导致溢出
99f1284c35SGou Ngai 
100f1284c35SGou Ngai         if value > MAX_READERS << READER_BIT {
101f1284c35SGou Ngai             self.lock.fetch_sub(READER, Ordering::Release);
102f1284c35SGou Ngai             //panic!("Too many lock readers, cannot safely proceed");
103676b8ef6SMork             return Err(SystemError::EOVERFLOW);
104f1284c35SGou Ngai         } else {
105f1284c35SGou Ngai             return Ok(value);
106f1284c35SGou Ngai         }
107f1284c35SGou Ngai     }
108f1284c35SGou Ngai 
109f1284c35SGou Ngai     #[allow(dead_code)]
110f1284c35SGou Ngai     #[inline]
111f1284c35SGou Ngai     /// @brief 尝试获取READER守卫
112f1284c35SGou Ngai     pub fn try_read(&self) -> Option<RwLockReadGuard<T>> {
113f1284c35SGou Ngai         let reader_value = self.current_reader();
114f1284c35SGou Ngai         //得到自增后的reader_value, 包括了尝试获得READER守卫的进程
115f1284c35SGou Ngai         let value;
116f1284c35SGou Ngai 
117f1284c35SGou Ngai         if reader_value.is_err() {
118f1284c35SGou Ngai             return None; //获取失败
119f1284c35SGou Ngai         } else {
120f1284c35SGou Ngai             value = reader_value.unwrap();
121f1284c35SGou Ngai         }
122f1284c35SGou Ngai 
123f1284c35SGou Ngai         //判断有没有writer和upgrader
124f1284c35SGou Ngai         //注意, 若upgrader存在,已经存在的读者继续占有锁,但新读者不允许获得锁
125f1284c35SGou Ngai         if value & (WRITER | UPGRADED) != 0 {
126f1284c35SGou Ngai             self.lock.fetch_sub(READER, Ordering::Release);
127f1284c35SGou Ngai             return None;
128f1284c35SGou Ngai         } else {
129f1284c35SGou Ngai             return Some(RwLockReadGuard {
130f1284c35SGou Ngai                 data: unsafe { &*self.data.get() },
131f1284c35SGou Ngai                 lock: &self.lock,
132f1284c35SGou Ngai             });
133f1284c35SGou Ngai         }
134f1284c35SGou Ngai     }
135f1284c35SGou Ngai 
136f1284c35SGou Ngai     #[allow(dead_code)]
137f1284c35SGou Ngai     #[inline]
138f1284c35SGou Ngai     /// @brief 获得READER的守卫
139f1284c35SGou Ngai     pub fn read(&self) -> RwLockReadGuard<T> {
140f1284c35SGou Ngai         loop {
141f1284c35SGou Ngai             match self.try_read() {
142f1284c35SGou Ngai                 Some(guard) => return guard,
143f1284c35SGou Ngai                 None => spin_loop(),
144f1284c35SGou Ngai             }
145f1284c35SGou Ngai         } //忙等待
146f1284c35SGou Ngai     }
147f1284c35SGou Ngai 
148f1284c35SGou Ngai     #[allow(dead_code)]
149f1284c35SGou Ngai     #[inline]
150f1284c35SGou Ngai     /// @brief 获取读者+UPGRADER的数量, 不能保证能否获得同步值
151f1284c35SGou Ngai     pub fn reader_count(&self) -> u32 {
152f1284c35SGou Ngai         let state = self.lock.load(Ordering::Relaxed);
153f1284c35SGou Ngai         return state / READER + (state & UPGRADED) / UPGRADED;
154f1284c35SGou Ngai     }
155f1284c35SGou Ngai 
156f1284c35SGou Ngai     #[allow(dead_code)]
157f1284c35SGou Ngai     #[inline]
158f1284c35SGou Ngai     /// @brief 获取写者数量,不能保证能否获得同步值
159f1284c35SGou Ngai     pub fn writer_count(&self) -> u32 {
160f1284c35SGou Ngai         return (self.lock.load(Ordering::Relaxed) & WRITER) / WRITER;
161f1284c35SGou Ngai     }
162f1284c35SGou Ngai 
163f1284c35SGou Ngai     #[cfg(target_arch = "x86_64")]
164f1284c35SGou Ngai     #[allow(dead_code)]
165f1284c35SGou Ngai     #[inline]
166f1284c35SGou Ngai     /// @brief 尝试获得WRITER守卫
167f1284c35SGou Ngai     pub fn try_write(&self) -> Option<RwLockWriteGuard<T>> {
168f1284c35SGou Ngai         let res: bool = self
169f1284c35SGou Ngai             .lock
1701d489963Skong             .compare_exchange(0, WRITER, Ordering::Acquire, Ordering::Relaxed)
1711d489963Skong             .is_ok();
172f1284c35SGou Ngai         //只有lock大小为0的时候能获得写者守卫
173f1284c35SGou Ngai         if res {
174f1284c35SGou Ngai             return Some(RwLockWriteGuard {
175f1284c35SGou Ngai                 data: unsafe { &mut *self.data.get() },
176f1284c35SGou Ngai                 inner: self,
177f1284c35SGou Ngai             });
178f1284c35SGou Ngai         } else {
179f1284c35SGou Ngai             return None;
180f1284c35SGou Ngai         }
181f1284c35SGou Ngai     } //当架构为arm时,有些代码需要作出调整compare_exchange=>compare_exchange_weak
182f1284c35SGou Ngai 
183f1284c35SGou Ngai     #[allow(dead_code)]
184f1284c35SGou Ngai     #[inline]
185f1284c35SGou Ngai     /// @brief 获得WRITER守卫
186f1284c35SGou Ngai     pub fn write(&self) -> RwLockWriteGuard<T> {
187f1284c35SGou Ngai         loop {
188f1284c35SGou Ngai             match self.try_write() {
189f1284c35SGou Ngai                 Some(guard) => return guard,
190f1284c35SGou Ngai                 None => spin_loop(),
191f1284c35SGou Ngai             }
192f1284c35SGou Ngai         }
193f1284c35SGou Ngai     }
194f1284c35SGou Ngai 
195f1284c35SGou Ngai     #[allow(dead_code)]
196f1284c35SGou Ngai     #[inline]
197f1284c35SGou Ngai     /// @brief 尝试获得UPGRADER守卫
198f1284c35SGou Ngai     pub fn try_upgradeable_read(&self) -> Option<RwLockUpgradableGuard<T>> {
199f1284c35SGou Ngai         //获得UPGRADER守卫不需要查看读者位
200f1284c35SGou Ngai         //如果获得读者锁失败,不需要撤回fetch_or的原子操作
201f1284c35SGou Ngai         if self.lock.fetch_or(UPGRADED, Ordering::Acquire) & (WRITER | UPGRADED) == 0 {
202f1284c35SGou Ngai             return Some(RwLockUpgradableGuard {
203f1284c35SGou Ngai                 inner: self,
204f1284c35SGou Ngai                 data: unsafe { &mut *self.data.get() },
205f1284c35SGou Ngai             });
206f1284c35SGou Ngai         } else {
207f1284c35SGou Ngai             return None;
208f1284c35SGou Ngai         }
209f1284c35SGou Ngai     }
210f1284c35SGou Ngai 
211f1284c35SGou Ngai     #[allow(dead_code)]
212f1284c35SGou Ngai     #[inline]
213f1284c35SGou Ngai     /// @brief 获得UPGRADER守卫
214f1284c35SGou Ngai     pub fn upgradeable_read(&self) -> RwLockUpgradableGuard<T> {
215f1284c35SGou Ngai         loop {
216f1284c35SGou Ngai             match self.try_upgradeable_read() {
217f1284c35SGou Ngai                 Some(guard) => return guard,
218f1284c35SGou Ngai                 None => spin_loop(),
219f1284c35SGou Ngai             }
220f1284c35SGou Ngai         }
221f1284c35SGou Ngai     }
222f1284c35SGou Ngai 
223f1284c35SGou Ngai     #[allow(dead_code)]
224f1284c35SGou Ngai     #[inline]
225f1284c35SGou Ngai     //extremely unsafe behavior
226f1284c35SGou Ngai     /// @brief 强制减少READER数
227f1284c35SGou Ngai     pub unsafe fn force_read_decrement(&self) {
228f1284c35SGou Ngai         debug_assert!(self.lock.load(Ordering::Relaxed) & !WRITER > 0);
229f1284c35SGou Ngai         self.lock.fetch_sub(READER, Ordering::Release);
230f1284c35SGou Ngai     }
231f1284c35SGou Ngai 
232f1284c35SGou Ngai     #[allow(dead_code)]
233f1284c35SGou Ngai     #[inline]
234f1284c35SGou Ngai     //extremely unsafe behavior
235f1284c35SGou Ngai     /// @brief 强制给WRITER解锁
236f1284c35SGou Ngai     pub unsafe fn force_write_unlock(&self) {
237f1284c35SGou Ngai         debug_assert_eq!(self.lock.load(Ordering::Relaxed) & !(WRITER | UPGRADED), 0);
238f1284c35SGou Ngai         self.lock.fetch_and(!(WRITER | UPGRADED), Ordering::Release);
239f1284c35SGou Ngai     }
240f1284c35SGou Ngai 
241f1284c35SGou Ngai     #[allow(dead_code)]
242*13776c11Slogin     pub unsafe fn get_mut(&mut self) -> &mut T {
243f1284c35SGou Ngai         unsafe { &mut *self.data.get() }
244f1284c35SGou Ngai     }
245f1284c35SGou Ngai }
246f1284c35SGou Ngai 
247f1284c35SGou Ngai impl<T: Default> Default for RwLock<T> {
248f1284c35SGou Ngai     fn default() -> Self {
249f1284c35SGou Ngai         Self::new(Default::default())
250f1284c35SGou Ngai     }
251f1284c35SGou Ngai }
252f1284c35SGou Ngai 
253f1284c35SGou Ngai /// @brief 由原有的值创建新的锁
254f1284c35SGou Ngai impl<T> From<T> for RwLock<T> {
255f1284c35SGou Ngai     fn from(data: T) -> Self {
256f1284c35SGou Ngai         return Self::new(data);
257f1284c35SGou Ngai     }
258f1284c35SGou Ngai }
259f1284c35SGou Ngai 
260f1284c35SGou Ngai impl<'rwlock, T> RwLockReadGuard<'rwlock, T> {
261f1284c35SGou Ngai     #[allow(dead_code)]
262f1284c35SGou Ngai     #[inline]
263f1284c35SGou Ngai     /// @brief 释放守卫,获得保护的值的不可变引用
264f1284c35SGou Ngai     pub fn leak(this: Self) -> &'rwlock T {
265f1284c35SGou Ngai         let Self { data, .. } = this;
266f1284c35SGou Ngai         return unsafe { &*data };
267f1284c35SGou Ngai     }
268f1284c35SGou Ngai }
269f1284c35SGou Ngai 
270f1284c35SGou Ngai impl<'rwlock, T> RwLockUpgradableGuard<'rwlock, T> {
271f1284c35SGou Ngai     #[allow(dead_code)]
272f1284c35SGou Ngai     #[inline]
273f1284c35SGou Ngai     /// @brief 尝试将UPGRADER守卫升级为WRITER守卫
274f1284c35SGou Ngai     pub fn try_upgrade(self) -> Result<RwLockWriteGuard<'rwlock, T>, Self> {
275f1284c35SGou Ngai         let res = self.inner.lock.compare_exchange(
276f1284c35SGou Ngai             UPGRADED,
277f1284c35SGou Ngai             WRITER,
278f1284c35SGou Ngai             Ordering::Acquire,
279f1284c35SGou Ngai             Ordering::Relaxed,
280f1284c35SGou Ngai         );
281f1284c35SGou Ngai         //当且仅当只有UPGRADED守卫时可以升级
282f1284c35SGou Ngai 
283f1284c35SGou Ngai         if res.is_ok() {
284f1284c35SGou Ngai             let inner = self.inner;
285f1284c35SGou Ngai 
286f1284c35SGou Ngai             mem::forget(self);
287f1284c35SGou Ngai 
288f1284c35SGou Ngai             Ok(RwLockWriteGuard {
289f1284c35SGou Ngai                 data: unsafe { &mut *inner.data.get() },
290f1284c35SGou Ngai                 inner,
291f1284c35SGou Ngai             })
292f1284c35SGou Ngai         } else {
293f1284c35SGou Ngai             Err(self)
294f1284c35SGou Ngai         }
295f1284c35SGou Ngai     }
296f1284c35SGou Ngai 
297f1284c35SGou Ngai     #[allow(dead_code)]
298f1284c35SGou Ngai     #[inline]
299f1284c35SGou Ngai     /// @brief 将upgrader升级成writer
300f1284c35SGou Ngai     pub fn upgrade(mut self) -> RwLockWriteGuard<'rwlock, T> {
301f1284c35SGou Ngai         loop {
302f1284c35SGou Ngai             self = match self.try_upgrade() {
303f1284c35SGou Ngai                 Ok(writeguard) => return writeguard,
304f1284c35SGou Ngai                 Err(former) => former,
305f1284c35SGou Ngai             };
306f1284c35SGou Ngai 
307f1284c35SGou Ngai             spin_loop();
308f1284c35SGou Ngai         }
309f1284c35SGou Ngai     }
310f1284c35SGou Ngai 
311f1284c35SGou Ngai     #[allow(dead_code)]
312f1284c35SGou Ngai     #[inline]
313f1284c35SGou Ngai     /// @brief UPGRADER降级为READER
314f1284c35SGou Ngai     pub fn downgrade(self) -> RwLockReadGuard<'rwlock, T> {
315f1284c35SGou Ngai         while self.inner.current_reader().is_err() {
316f1284c35SGou Ngai             spin_loop();
317f1284c35SGou Ngai         }
318f1284c35SGou Ngai 
319f1284c35SGou Ngai         let inner: &RwLock<T> = self.inner;
320f1284c35SGou Ngai 
321f1284c35SGou Ngai         //自动移去UPGRADED比特位
322f1284c35SGou Ngai         mem::drop(self);
323f1284c35SGou Ngai 
324f1284c35SGou Ngai         RwLockReadGuard {
325f1284c35SGou Ngai             data: unsafe { &*inner.data.get() },
326f1284c35SGou Ngai             lock: &inner.lock,
327f1284c35SGou Ngai         }
328f1284c35SGou Ngai     }
329f1284c35SGou Ngai 
330f1284c35SGou Ngai     #[allow(dead_code)]
331f1284c35SGou Ngai     #[inline]
332f1284c35SGou Ngai     /// @brief 返回内部数据的引用,消除锁
333f1284c35SGou Ngai     pub fn leak(this: Self) -> &'rwlock T {
334f1284c35SGou Ngai         let this = ManuallyDrop::new(this);
335f1284c35SGou Ngai 
336f1284c35SGou Ngai         unsafe { &*this.data }
337f1284c35SGou Ngai     }
338f1284c35SGou Ngai }
339f1284c35SGou Ngai 
340f1284c35SGou Ngai impl<'rwlock, T> RwLockWriteGuard<'rwlock, T> {
341f1284c35SGou Ngai     #[allow(dead_code)]
342f1284c35SGou Ngai     #[inline]
343f1284c35SGou Ngai     /// @brief 返回内部数据的引用,消除锁
344f1284c35SGou Ngai     pub fn leak(this: Self) -> &'rwlock T {
345f1284c35SGou Ngai         let this = ManuallyDrop::new(this);
346f1284c35SGou Ngai 
347f1284c35SGou Ngai         return unsafe { &*this.data };
348f1284c35SGou Ngai     }
349f1284c35SGou Ngai 
350f1284c35SGou Ngai     #[allow(dead_code)]
351f1284c35SGou Ngai     #[inline]
352f1284c35SGou Ngai     /// @brief 将WRITER降级为READER
353f1284c35SGou Ngai     pub fn downgrade(self) -> RwLockReadGuard<'rwlock, T> {
354f1284c35SGou Ngai         while self.inner.current_reader().is_err() {
355f1284c35SGou Ngai             spin_loop();
356f1284c35SGou Ngai         }
357f1284c35SGou Ngai         //本质上来说绝对保证没有任何读者
358f1284c35SGou Ngai 
359f1284c35SGou Ngai         let inner = self.inner;
360f1284c35SGou Ngai 
361f1284c35SGou Ngai         mem::drop(self);
362f1284c35SGou Ngai 
363f1284c35SGou Ngai         return RwLockReadGuard {
364f1284c35SGou Ngai             data: unsafe { &*inner.data.get() },
365f1284c35SGou Ngai             lock: &inner.lock,
366f1284c35SGou Ngai         };
367f1284c35SGou Ngai     }
368f1284c35SGou Ngai 
369f1284c35SGou Ngai     #[allow(dead_code)]
370f1284c35SGou Ngai     #[inline]
371f1284c35SGou Ngai     /// @brief 将WRITER降级为UPGRADER
372f1284c35SGou Ngai     pub fn downgrade_to_upgradeable(self) -> RwLockUpgradableGuard<'rwlock, T> {
373f1284c35SGou Ngai         debug_assert_eq!(
374f1284c35SGou Ngai             self.inner.lock.load(Ordering::Acquire) & (WRITER | UPGRADED),
375f1284c35SGou Ngai             WRITER
376f1284c35SGou Ngai         );
377f1284c35SGou Ngai 
378f1284c35SGou Ngai         self.inner.lock.store(UPGRADED, Ordering::Release);
379f1284c35SGou Ngai 
380f1284c35SGou Ngai         let inner = self.inner;
381f1284c35SGou Ngai 
382f1284c35SGou Ngai         mem::forget(self);
383f1284c35SGou Ngai 
384f1284c35SGou Ngai         return RwLockUpgradableGuard {
385f1284c35SGou Ngai             inner,
386f1284c35SGou Ngai             data: unsafe { &*inner.data.get() },
387f1284c35SGou Ngai         };
388f1284c35SGou Ngai     }
389f1284c35SGou Ngai }
390f1284c35SGou Ngai 
391f1284c35SGou Ngai impl<'rwlock, T> Deref for RwLockReadGuard<'rwlock, T> {
392f1284c35SGou Ngai     type Target = T;
393f1284c35SGou Ngai 
394f1284c35SGou Ngai     fn deref(&self) -> &Self::Target {
395f1284c35SGou Ngai         return unsafe { &*self.data };
396f1284c35SGou Ngai     }
397f1284c35SGou Ngai }
398f1284c35SGou Ngai 
399f1284c35SGou Ngai impl<'rwlock, T> Deref for RwLockUpgradableGuard<'rwlock, T> {
400f1284c35SGou Ngai     type Target = T;
401f1284c35SGou Ngai 
402f1284c35SGou Ngai     fn deref(&self) -> &Self::Target {
403f1284c35SGou Ngai         return unsafe { &*self.data };
404f1284c35SGou Ngai     }
405f1284c35SGou Ngai }
406f1284c35SGou Ngai 
407f1284c35SGou Ngai impl<'rwlock, T> Deref for RwLockWriteGuard<'rwlock, T> {
408f1284c35SGou Ngai     type Target = T;
409f1284c35SGou Ngai 
410f1284c35SGou Ngai     fn deref(&self) -> &Self::Target {
411f1284c35SGou Ngai         return unsafe { &*self.data };
412f1284c35SGou Ngai     }
413f1284c35SGou Ngai }
414f1284c35SGou Ngai 
415f1284c35SGou Ngai impl<'rwlock, T> DerefMut for RwLockWriteGuard<'rwlock, T> {
416f1284c35SGou Ngai     fn deref_mut(&mut self) -> &mut Self::Target {
417f1284c35SGou Ngai         return unsafe { &mut *self.data };
418f1284c35SGou Ngai     }
419f1284c35SGou Ngai }
420f1284c35SGou Ngai 
421f1284c35SGou Ngai impl<'rwlock, T> Drop for RwLockReadGuard<'rwlock, T> {
422f1284c35SGou Ngai     fn drop(&mut self) {
423f1284c35SGou Ngai         debug_assert!(self.lock.load(Ordering::Relaxed) & !(WRITER | UPGRADED) > 0);
424f1284c35SGou Ngai         self.lock.fetch_sub(READER, Ordering::Release);
425f1284c35SGou Ngai     }
426f1284c35SGou Ngai }
427f1284c35SGou Ngai 
428f1284c35SGou Ngai impl<'rwlock, T> Drop for RwLockUpgradableGuard<'rwlock, T> {
429f1284c35SGou Ngai     fn drop(&mut self) {
430f1284c35SGou Ngai         debug_assert_eq!(
431f1284c35SGou Ngai             self.inner.lock.load(Ordering::Relaxed) & (WRITER | UPGRADED),
432f1284c35SGou Ngai             UPGRADED
433f1284c35SGou Ngai         );
434f1284c35SGou Ngai         self.inner.lock.fetch_sub(UPGRADED, Ordering::AcqRel);
435f1284c35SGou Ngai         //这里为啥要AcqRel? Release应该就行了?
436f1284c35SGou Ngai     }
437f1284c35SGou Ngai }
438f1284c35SGou Ngai 
439f1284c35SGou Ngai impl<'rwlock, T> Drop for RwLockWriteGuard<'rwlock, T> {
440f1284c35SGou Ngai     fn drop(&mut self) {
441f1284c35SGou Ngai         debug_assert_eq!(self.inner.lock.load(Ordering::Relaxed) & WRITER, WRITER);
442f1284c35SGou Ngai         self.inner
443f1284c35SGou Ngai             .lock
444f1284c35SGou Ngai             .fetch_and(!(WRITER | UPGRADED), Ordering::Release);
445f1284c35SGou Ngai     }
446f1284c35SGou Ngai }
447