xref: /DragonOS/kernel/src/libs/lock_free_flags.rs (revision 0facf623d638816d7d01a700e19a52c3c16a8fa1)
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     pub fn get_mut(&self) -> &mut T {
23         unsafe { &mut *self.inner.get() }
24     }
25 
26     pub fn get(&self) -> &T {
27         unsafe { &*self.inner.get() }
28     }
29 }
30 
31 unsafe impl<T: Sync> Sync for LockFreeFlags<T> {}
32 unsafe impl<T: Send> Send for LockFreeFlags<T> {}
33 
34 impl<T: Clone> Clone for LockFreeFlags<T> {
35     fn clone(&self) -> Self {
36         unsafe { Self::new(self.get().clone()) }
37     }
38 }
39 
40 impl<T: Debug> Debug for LockFreeFlags<T> {
41     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
42         f.debug_struct("LockFreeFlags")
43             .field("inner", self.get())
44             .finish()
45     }
46 }
47