xref: /DragonOS/kernel/src/libs/lock_free_flags.rs (revision fae6e9ade46a52976ad5d099643d51cc20876448)
1 use core::{cell::UnsafeCell, fmt::Debug};
2 
3 /// 一个无锁的标志位
4 ///
5 /// 可与bitflags配合使用,以实现无锁的标志位
6 ///
7 /// ## Safety
8 ///
9 /// 由于标识位的修改是无锁,且不保证原子性,因此需要使用者自行在别的机制中,确保
10 /// 哪怕标识位的值是老的,执行动作也不会有问题(或者有状态恢复机制)。
11 pub struct LockFreeFlags<T> {
12     inner: UnsafeCell<T>,
13 }
14 
15 impl<T> LockFreeFlags<T> {
16     pub unsafe fn new(inner: T) -> Self {
17         Self {
18             inner: UnsafeCell::new(inner),
19         }
20     }
21 
22     #[allow(clippy::mut_from_ref)]
23     pub fn get_mut(&self) -> &mut T {
24         unsafe {
25             (self.inner.get().as_ref().unwrap() as *const T as *mut T)
26                 .as_mut()
27                 .unwrap()
28         }
29     }
30 
31     pub fn get(&self) -> &T {
32         unsafe { self.inner.get().as_ref().unwrap() }
33     }
34 }
35 
36 unsafe impl<T: Sync> Sync for LockFreeFlags<T> {}
37 unsafe impl<T: Send> Send for LockFreeFlags<T> {}
38 
39 impl<T: Clone> Clone for LockFreeFlags<T> {
40     fn clone(&self) -> Self {
41         unsafe { Self::new(self.get().clone()) }
42     }
43 }
44 
45 impl<T: Debug> Debug for LockFreeFlags<T> {
46     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
47         f.debug_struct("LockFreeFlags")
48             .field("inner", self.get())
49             .finish()
50     }
51 }
52