1*06d5e247SLoGin use alloc::{ 2*06d5e247SLoGin string::String, 3*06d5e247SLoGin sync::{Arc, Weak}, 4*06d5e247SLoGin vec::Vec, 5*06d5e247SLoGin }; 6*06d5e247SLoGin 7*06d5e247SLoGin use core::hash::Hash; 8*06d5e247SLoGin 9*06d5e247SLoGin use crate::{ 10*06d5e247SLoGin filesystem::{ 11*06d5e247SLoGin kernfs::KernFSInode, 12*06d5e247SLoGin sysfs::{AttributeGroup, SysFSOps}, 13*06d5e247SLoGin }, 14*06d5e247SLoGin libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}, 15*06d5e247SLoGin syscall::SystemError, 16*06d5e247SLoGin }; 17*06d5e247SLoGin 18*06d5e247SLoGin use super::kobject::{ 19*06d5e247SLoGin KObjType, KObject, KObjectManager, KObjectState, KObjectSysFSOps, LockedKObjectState, 20*06d5e247SLoGin }; 21*06d5e247SLoGin 22*06d5e247SLoGin #[derive(Debug)] 23*06d5e247SLoGin pub struct KSet { 24*06d5e247SLoGin /// 属于当前kset的kobject 25*06d5e247SLoGin kobjects: RwLock<Vec<Weak<dyn KObject>>>, 26*06d5e247SLoGin /// 节点的一些信息 27*06d5e247SLoGin inner: RwLock<InnerKSet>, 28*06d5e247SLoGin /// kobject的状态 29*06d5e247SLoGin kobj_state: LockedKObjectState, 30*06d5e247SLoGin /// 与父节点有关的一些信息 31*06d5e247SLoGin parent_data: RwLock<KSetParentData>, 32*06d5e247SLoGin self_ref: Weak<KSet>, 33*06d5e247SLoGin } 34*06d5e247SLoGin 35*06d5e247SLoGin impl Hash for KSet { 36*06d5e247SLoGin fn hash<H: ~const core::hash::Hasher>(&self, state: &mut H) { 37*06d5e247SLoGin self.self_ref.as_ptr().hash(state); 38*06d5e247SLoGin self.inner.read().name.hash(state); 39*06d5e247SLoGin } 40*06d5e247SLoGin } 41*06d5e247SLoGin 42*06d5e247SLoGin impl core::cmp::Eq for KSet {} 43*06d5e247SLoGin 44*06d5e247SLoGin impl core::cmp::PartialEq for KSet { 45*06d5e247SLoGin fn eq(&self, other: &Self) -> bool { 46*06d5e247SLoGin self.self_ref.as_ptr() == other.self_ref.as_ptr() 47*06d5e247SLoGin } 48*06d5e247SLoGin } 49*06d5e247SLoGin 50*06d5e247SLoGin impl KSet { 51*06d5e247SLoGin pub fn new(name: String) -> Arc<Self> { 52*06d5e247SLoGin let r = Self { 53*06d5e247SLoGin kobjects: RwLock::new(Vec::new()), 54*06d5e247SLoGin inner: RwLock::new(InnerKSet::new(name)), 55*06d5e247SLoGin kobj_state: LockedKObjectState::new(KObjectState::empty()), 56*06d5e247SLoGin parent_data: RwLock::new(KSetParentData::new(None, None)), 57*06d5e247SLoGin self_ref: Weak::default(), 58*06d5e247SLoGin }; 59*06d5e247SLoGin 60*06d5e247SLoGin let r = Arc::new(r); 61*06d5e247SLoGin 62*06d5e247SLoGin unsafe { 63*06d5e247SLoGin let p = r.as_ref() as *const Self as *mut Self; 64*06d5e247SLoGin (*p).self_ref = Arc::downgrade(&r); 65*06d5e247SLoGin } 66*06d5e247SLoGin 67*06d5e247SLoGin return r; 68*06d5e247SLoGin } 69*06d5e247SLoGin 70*06d5e247SLoGin /// 创建一个kset,并且设置它的父亲为parent_kobj。然后把这个kset注册到sysfs 71*06d5e247SLoGin /// 72*06d5e247SLoGin /// ## 参数 73*06d5e247SLoGin /// 74*06d5e247SLoGin /// - name: kset的名字 75*06d5e247SLoGin /// - parent_kobj: 父亲kobject 76*06d5e247SLoGin /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中 77*06d5e247SLoGin pub fn new_and_add( 78*06d5e247SLoGin name: String, 79*06d5e247SLoGin parent_kobj: Option<Arc<dyn KObject>>, 80*06d5e247SLoGin join_kset: Option<Arc<KSet>>, 81*06d5e247SLoGin ) -> Result<Arc<Self>, SystemError> { 82*06d5e247SLoGin let kset = KSet::new(name); 83*06d5e247SLoGin if let Some(parent_kobj) = parent_kobj { 84*06d5e247SLoGin kset.set_parent(Some(Arc::downgrade(&parent_kobj))); 85*06d5e247SLoGin } 86*06d5e247SLoGin kset.register(join_kset)?; 87*06d5e247SLoGin return Ok(kset); 88*06d5e247SLoGin } 89*06d5e247SLoGin 90*06d5e247SLoGin pub fn register(&self, join_kset: Option<Arc<KSet>>) -> Result<(), SystemError> { 91*06d5e247SLoGin return KObjectManager::add_kobj(self.self_ref.upgrade().unwrap(), join_kset); 92*06d5e247SLoGin // todo: 引入uevent之后,发送uevent 93*06d5e247SLoGin } 94*06d5e247SLoGin 95*06d5e247SLoGin /// 把一个kobject加入到当前kset中。 96*06d5e247SLoGin /// 97*06d5e247SLoGin /// 该函数不会修改kobj的parent,需要调用者自己视情况修改。 98*06d5e247SLoGin /// 99*06d5e247SLoGin /// ## Panic 100*06d5e247SLoGin /// 101*06d5e247SLoGin /// 这个kobject的kset必须是None,否则会panic 102*06d5e247SLoGin pub fn join(&self, kobj: &Arc<dyn KObject>) { 103*06d5e247SLoGin assert!(kobj.kset().is_none()); 104*06d5e247SLoGin kobj.set_kset(self.self_ref.upgrade()); 105*06d5e247SLoGin self.kobjects.write().push(Arc::downgrade(&kobj)); 106*06d5e247SLoGin } 107*06d5e247SLoGin 108*06d5e247SLoGin /// 把一个kobject从当前kset中移除。 109*06d5e247SLoGin pub fn leave(&self, kobj: &Arc<dyn KObject>) { 110*06d5e247SLoGin let mut kobjects = self.kobjects.write(); 111*06d5e247SLoGin let index = kobjects.iter().position(|x| { 112*06d5e247SLoGin if let Some(x) = x.upgrade() { 113*06d5e247SLoGin return Arc::ptr_eq(&x, kobj); 114*06d5e247SLoGin } 115*06d5e247SLoGin return false; 116*06d5e247SLoGin }); 117*06d5e247SLoGin if let Some(index) = index { 118*06d5e247SLoGin let x = kobjects.remove(index); 119*06d5e247SLoGin let x = x.upgrade().unwrap(); 120*06d5e247SLoGin drop(kobjects); 121*06d5e247SLoGin x.set_kset(None); 122*06d5e247SLoGin } 123*06d5e247SLoGin } 124*06d5e247SLoGin 125*06d5e247SLoGin /// 清除所有已经被释放的kobject 126*06d5e247SLoGin #[allow(dead_code)] 127*06d5e247SLoGin pub fn cleanup_weak(&self) { 128*06d5e247SLoGin let mut kobjects = self.kobjects.write(); 129*06d5e247SLoGin kobjects.drain_filter(|x| x.upgrade().is_none()); 130*06d5e247SLoGin } 131*06d5e247SLoGin 132*06d5e247SLoGin pub fn as_kobject(&self) -> Arc<dyn KObject> { 133*06d5e247SLoGin return self.self_ref.upgrade().unwrap(); 134*06d5e247SLoGin } 135*06d5e247SLoGin } 136*06d5e247SLoGin 137*06d5e247SLoGin impl KObject for KSet { 138*06d5e247SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 139*06d5e247SLoGin self 140*06d5e247SLoGin } 141*06d5e247SLoGin 142*06d5e247SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 143*06d5e247SLoGin self.inner.read().kern_inode.clone() 144*06d5e247SLoGin } 145*06d5e247SLoGin 146*06d5e247SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 147*06d5e247SLoGin self.inner.write().kern_inode = inode; 148*06d5e247SLoGin } 149*06d5e247SLoGin 150*06d5e247SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 151*06d5e247SLoGin self.parent_data.read().parent.clone() 152*06d5e247SLoGin } 153*06d5e247SLoGin 154*06d5e247SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 155*06d5e247SLoGin self.parent_data.write().parent = parent; 156*06d5e247SLoGin } 157*06d5e247SLoGin 158*06d5e247SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 159*06d5e247SLoGin self.kobj_state.read() 160*06d5e247SLoGin } 161*06d5e247SLoGin 162*06d5e247SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 163*06d5e247SLoGin self.kobj_state.write() 164*06d5e247SLoGin } 165*06d5e247SLoGin 166*06d5e247SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 167*06d5e247SLoGin Some(&KSetKObjType) 168*06d5e247SLoGin } 169*06d5e247SLoGin 170*06d5e247SLoGin fn kset(&self) -> Option<Arc<KSet>> { 171*06d5e247SLoGin self.parent_data.read().kset.clone() 172*06d5e247SLoGin } 173*06d5e247SLoGin 174*06d5e247SLoGin fn set_kset(&self, kset: Option<Arc<KSet>>) { 175*06d5e247SLoGin self.parent_data.write().kset = kset; 176*06d5e247SLoGin } 177*06d5e247SLoGin 178*06d5e247SLoGin fn name(&self) -> String { 179*06d5e247SLoGin return self.inner.read().name.clone(); 180*06d5e247SLoGin } 181*06d5e247SLoGin 182*06d5e247SLoGin fn set_name(&self, name: String) { 183*06d5e247SLoGin self.inner.write().name = name; 184*06d5e247SLoGin } 185*06d5e247SLoGin 186*06d5e247SLoGin fn set_kobj_state(&self, state: KObjectState) { 187*06d5e247SLoGin *self.kobj_state.write() = state; 188*06d5e247SLoGin } 189*06d5e247SLoGin } 190*06d5e247SLoGin 191*06d5e247SLoGin #[derive(Debug)] 192*06d5e247SLoGin struct KSetParentData { 193*06d5e247SLoGin parent: Option<Weak<dyn KObject>>, 194*06d5e247SLoGin kset: Option<Arc<KSet>>, 195*06d5e247SLoGin } 196*06d5e247SLoGin 197*06d5e247SLoGin impl KSetParentData { 198*06d5e247SLoGin fn new(parent: Option<Weak<dyn KObject>>, kset: Option<Arc<KSet>>) -> Self { 199*06d5e247SLoGin Self { parent, kset } 200*06d5e247SLoGin } 201*06d5e247SLoGin } 202*06d5e247SLoGin 203*06d5e247SLoGin #[derive(Debug)] 204*06d5e247SLoGin struct InnerKSet { 205*06d5e247SLoGin kern_inode: Option<Arc<KernFSInode>>, 206*06d5e247SLoGin name: String, 207*06d5e247SLoGin } 208*06d5e247SLoGin 209*06d5e247SLoGin impl InnerKSet { 210*06d5e247SLoGin fn new(name: String) -> Self { 211*06d5e247SLoGin Self { 212*06d5e247SLoGin kern_inode: None, 213*06d5e247SLoGin name, 214*06d5e247SLoGin } 215*06d5e247SLoGin } 216*06d5e247SLoGin } 217*06d5e247SLoGin 218*06d5e247SLoGin #[derive(Debug)] 219*06d5e247SLoGin pub struct KSetKObjType; 220*06d5e247SLoGin 221*06d5e247SLoGin impl KObjType for KSetKObjType { 222*06d5e247SLoGin fn sysfs_ops(&self) -> Option<&dyn SysFSOps> { 223*06d5e247SLoGin Some(&KObjectSysFSOps) 224*06d5e247SLoGin } 225*06d5e247SLoGin 226*06d5e247SLoGin fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> { 227*06d5e247SLoGin None 228*06d5e247SLoGin } 229*06d5e247SLoGin } 230