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