106d5e247SLoGin use alloc::{ 206d5e247SLoGin string::String, 306d5e247SLoGin sync::{Arc, Weak}, 406d5e247SLoGin vec::Vec, 506d5e247SLoGin }; 606d5e247SLoGin 706d5e247SLoGin use core::hash::Hash; 806d5e247SLoGin 906d5e247SLoGin use super::kobject::{ 107eda31b2SLoGin DynamicKObjKType, KObjType, KObject, KObjectManager, KObjectState, LockedKObjectState, 1106d5e247SLoGin }; 12*91e9d4abSLoGin use crate::{ 13*91e9d4abSLoGin filesystem::kernfs::KernFSInode, 14*91e9d4abSLoGin libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}, 15*91e9d4abSLoGin }; 16*91e9d4abSLoGin use system_error::SystemError; 1706d5e247SLoGin 1806d5e247SLoGin #[derive(Debug)] 1906d5e247SLoGin pub struct KSet { 2006d5e247SLoGin /// 属于当前kset的kobject 2106d5e247SLoGin kobjects: RwLock<Vec<Weak<dyn KObject>>>, 2206d5e247SLoGin /// 节点的一些信息 2306d5e247SLoGin inner: RwLock<InnerKSet>, 2406d5e247SLoGin /// kobject的状态 2506d5e247SLoGin kobj_state: LockedKObjectState, 2606d5e247SLoGin /// 与父节点有关的一些信息 2706d5e247SLoGin parent_data: RwLock<KSetParentData>, 2806d5e247SLoGin self_ref: Weak<KSet>, 2906d5e247SLoGin } 3006d5e247SLoGin 3106d5e247SLoGin impl Hash for KSet { 321a72a751SLoGin fn hash<H: core::hash::Hasher>(&self, state: &mut H) { 3306d5e247SLoGin self.self_ref.as_ptr().hash(state); 3406d5e247SLoGin self.inner.read().name.hash(state); 3506d5e247SLoGin } 3606d5e247SLoGin } 3706d5e247SLoGin 3806d5e247SLoGin impl core::cmp::Eq for KSet {} 3906d5e247SLoGin 4006d5e247SLoGin impl core::cmp::PartialEq for KSet { 4106d5e247SLoGin fn eq(&self, other: &Self) -> bool { 4206d5e247SLoGin self.self_ref.as_ptr() == other.self_ref.as_ptr() 4306d5e247SLoGin } 4406d5e247SLoGin } 4506d5e247SLoGin 4606d5e247SLoGin impl KSet { 4706d5e247SLoGin pub fn new(name: String) -> Arc<Self> { 4806d5e247SLoGin let r = Self { 4906d5e247SLoGin kobjects: RwLock::new(Vec::new()), 5006d5e247SLoGin inner: RwLock::new(InnerKSet::new(name)), 51a03c4f9dSLoGin kobj_state: LockedKObjectState::new(None), 5206d5e247SLoGin parent_data: RwLock::new(KSetParentData::new(None, None)), 5306d5e247SLoGin self_ref: Weak::default(), 5406d5e247SLoGin }; 5506d5e247SLoGin 5606d5e247SLoGin let r = Arc::new(r); 5706d5e247SLoGin 5806d5e247SLoGin unsafe { 5906d5e247SLoGin let p = r.as_ref() as *const Self as *mut Self; 6006d5e247SLoGin (*p).self_ref = Arc::downgrade(&r); 6106d5e247SLoGin } 6206d5e247SLoGin 6306d5e247SLoGin return r; 6406d5e247SLoGin } 6506d5e247SLoGin 6606d5e247SLoGin /// 创建一个kset,并且设置它的父亲为parent_kobj。然后把这个kset注册到sysfs 6706d5e247SLoGin /// 6806d5e247SLoGin /// ## 参数 6906d5e247SLoGin /// 7006d5e247SLoGin /// - name: kset的名字 7106d5e247SLoGin /// - parent_kobj: 父亲kobject 7206d5e247SLoGin /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中 7306d5e247SLoGin pub fn new_and_add( 7406d5e247SLoGin name: String, 7506d5e247SLoGin parent_kobj: Option<Arc<dyn KObject>>, 7606d5e247SLoGin join_kset: Option<Arc<KSet>>, 7706d5e247SLoGin ) -> Result<Arc<Self>, SystemError> { 7806d5e247SLoGin let kset = KSet::new(name); 7906d5e247SLoGin if let Some(parent_kobj) = parent_kobj { 8006d5e247SLoGin kset.set_parent(Some(Arc::downgrade(&parent_kobj))); 8106d5e247SLoGin } 8206d5e247SLoGin kset.register(join_kset)?; 8306d5e247SLoGin return Ok(kset); 8406d5e247SLoGin } 8506d5e247SLoGin 8608a2ee40SLoGin /// 注册一个kset 8708a2ee40SLoGin /// 8808a2ee40SLoGin /// ## 参数 8908a2ee40SLoGin /// 9008a2ee40SLoGin /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中 9106d5e247SLoGin pub fn register(&self, join_kset: Option<Arc<KSet>>) -> Result<(), SystemError> { 9206d5e247SLoGin return KObjectManager::add_kobj(self.self_ref.upgrade().unwrap(), join_kset); 9306d5e247SLoGin // todo: 引入uevent之后,发送uevent 9406d5e247SLoGin } 9506d5e247SLoGin 9608a2ee40SLoGin /// 注销一个kset 9708a2ee40SLoGin #[allow(dead_code)] 9808a2ee40SLoGin pub fn unregister(&self) { 9908a2ee40SLoGin KObjectManager::remove_kobj(self.self_ref.upgrade().unwrap()); 10008a2ee40SLoGin } 10108a2ee40SLoGin 10206d5e247SLoGin /// 把一个kobject加入到当前kset中。 10306d5e247SLoGin /// 10406d5e247SLoGin /// 该函数不会修改kobj的parent,需要调用者自己视情况修改。 10506d5e247SLoGin /// 10606d5e247SLoGin /// ## Panic 10706d5e247SLoGin /// 10806d5e247SLoGin /// 这个kobject的kset必须是None,否则会panic 10906d5e247SLoGin pub fn join(&self, kobj: &Arc<dyn KObject>) { 11006d5e247SLoGin assert!(kobj.kset().is_none()); 11106d5e247SLoGin kobj.set_kset(self.self_ref.upgrade()); 11206d5e247SLoGin self.kobjects.write().push(Arc::downgrade(&kobj)); 11306d5e247SLoGin } 11406d5e247SLoGin 11506d5e247SLoGin /// 把一个kobject从当前kset中移除。 11606d5e247SLoGin pub fn leave(&self, kobj: &Arc<dyn KObject>) { 11706d5e247SLoGin let mut kobjects = self.kobjects.write(); 11808a2ee40SLoGin kobjects.retain(|x| x.upgrade().is_some()); 11906d5e247SLoGin let index = kobjects.iter().position(|x| { 12006d5e247SLoGin if let Some(x) = x.upgrade() { 12106d5e247SLoGin return Arc::ptr_eq(&x, kobj); 12206d5e247SLoGin } 12306d5e247SLoGin return false; 12406d5e247SLoGin }); 12506d5e247SLoGin if let Some(index) = index { 12606d5e247SLoGin let x = kobjects.remove(index); 12706d5e247SLoGin let x = x.upgrade().unwrap(); 12806d5e247SLoGin drop(kobjects); 12906d5e247SLoGin x.set_kset(None); 13006d5e247SLoGin } 13106d5e247SLoGin } 13206d5e247SLoGin 13306d5e247SLoGin /// 清除所有已经被释放的kobject 13406d5e247SLoGin #[allow(dead_code)] 13506d5e247SLoGin pub fn cleanup_weak(&self) { 13606d5e247SLoGin let mut kobjects = self.kobjects.write(); 1371a72a751SLoGin kobjects.retain(|x| x.upgrade().is_some()); 13806d5e247SLoGin } 13906d5e247SLoGin 14006d5e247SLoGin pub fn as_kobject(&self) -> Arc<dyn KObject> { 14106d5e247SLoGin return self.self_ref.upgrade().unwrap(); 14206d5e247SLoGin } 14308a2ee40SLoGin 14408a2ee40SLoGin pub fn kobjects(&self) -> RwLockReadGuard<Vec<Weak<dyn KObject>>> { 14508a2ee40SLoGin return self.kobjects.read(); 14608a2ee40SLoGin } 14706d5e247SLoGin } 14806d5e247SLoGin 14906d5e247SLoGin impl KObject for KSet { 15006d5e247SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 15106d5e247SLoGin self 15206d5e247SLoGin } 15306d5e247SLoGin 15406d5e247SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 15506d5e247SLoGin self.inner.read().kern_inode.clone() 15606d5e247SLoGin } 15706d5e247SLoGin 15806d5e247SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 15906d5e247SLoGin self.inner.write().kern_inode = inode; 16006d5e247SLoGin } 16106d5e247SLoGin 16206d5e247SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 16306d5e247SLoGin self.parent_data.read().parent.clone() 16406d5e247SLoGin } 16506d5e247SLoGin 16606d5e247SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 16706d5e247SLoGin self.parent_data.write().parent = parent; 16806d5e247SLoGin } 16906d5e247SLoGin 17006d5e247SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 17106d5e247SLoGin self.kobj_state.read() 17206d5e247SLoGin } 17306d5e247SLoGin 17406d5e247SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 17506d5e247SLoGin self.kobj_state.write() 17606d5e247SLoGin } 17706d5e247SLoGin 17806d5e247SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 1797eda31b2SLoGin self.inner.read().ktype 18006d5e247SLoGin } 18106d5e247SLoGin 1827eda31b2SLoGin fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 1837eda31b2SLoGin self.inner.write().ktype = ktype; 184a03c4f9dSLoGin } 185a03c4f9dSLoGin 18606d5e247SLoGin fn kset(&self) -> Option<Arc<KSet>> { 18706d5e247SLoGin self.parent_data.read().kset.clone() 18806d5e247SLoGin } 18906d5e247SLoGin 19006d5e247SLoGin fn set_kset(&self, kset: Option<Arc<KSet>>) { 19106d5e247SLoGin self.parent_data.write().kset = kset; 19206d5e247SLoGin } 19306d5e247SLoGin 19406d5e247SLoGin fn name(&self) -> String { 19506d5e247SLoGin return self.inner.read().name.clone(); 19606d5e247SLoGin } 19706d5e247SLoGin 19806d5e247SLoGin fn set_name(&self, name: String) { 19906d5e247SLoGin self.inner.write().name = name; 20006d5e247SLoGin } 20106d5e247SLoGin 20206d5e247SLoGin fn set_kobj_state(&self, state: KObjectState) { 20306d5e247SLoGin *self.kobj_state.write() = state; 20406d5e247SLoGin } 20506d5e247SLoGin } 20606d5e247SLoGin 20706d5e247SLoGin #[derive(Debug)] 20806d5e247SLoGin struct KSetParentData { 20906d5e247SLoGin parent: Option<Weak<dyn KObject>>, 21006d5e247SLoGin kset: Option<Arc<KSet>>, 21106d5e247SLoGin } 21206d5e247SLoGin 21306d5e247SLoGin impl KSetParentData { 21406d5e247SLoGin fn new(parent: Option<Weak<dyn KObject>>, kset: Option<Arc<KSet>>) -> Self { 21506d5e247SLoGin Self { parent, kset } 21606d5e247SLoGin } 21706d5e247SLoGin } 21806d5e247SLoGin 21906d5e247SLoGin #[derive(Debug)] 22006d5e247SLoGin struct InnerKSet { 22106d5e247SLoGin kern_inode: Option<Arc<KernFSInode>>, 22206d5e247SLoGin name: String, 2237eda31b2SLoGin ktype: Option<&'static dyn KObjType>, 22406d5e247SLoGin } 22506d5e247SLoGin 22606d5e247SLoGin impl InnerKSet { 22706d5e247SLoGin fn new(name: String) -> Self { 22806d5e247SLoGin Self { 22906d5e247SLoGin kern_inode: None, 23006d5e247SLoGin name, 2317eda31b2SLoGin ktype: Some(&DynamicKObjKType), 23206d5e247SLoGin } 23306d5e247SLoGin } 23406d5e247SLoGin } 235