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