106d5e247SLoGin use alloc::{ 206d5e247SLoGin string::String, 306d5e247SLoGin sync::{Arc, Weak}, 406d5e247SLoGin vec::Vec, 506d5e247SLoGin }; 606d5e247SLoGin 706d5e247SLoGin use core::hash::Hash; 806d5e247SLoGin 906d5e247SLoGin use crate::{ 10*7eda31b2SLoGin filesystem::kernfs::KernFSInode, 1106d5e247SLoGin libs::rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard}, 1206d5e247SLoGin syscall::SystemError, 1306d5e247SLoGin }; 1406d5e247SLoGin 1506d5e247SLoGin use super::kobject::{ 16*7eda31b2SLoGin DynamicKObjKType, KObjType, KObject, KObjectManager, KObjectState, LockedKObjectState, 1706d5e247SLoGin }; 1806d5e247SLoGin 1906d5e247SLoGin #[derive(Debug)] 2006d5e247SLoGin pub struct KSet { 2106d5e247SLoGin /// 属于当前kset的kobject 2206d5e247SLoGin kobjects: RwLock<Vec<Weak<dyn KObject>>>, 2306d5e247SLoGin /// 节点的一些信息 2406d5e247SLoGin inner: RwLock<InnerKSet>, 2506d5e247SLoGin /// kobject的状态 2606d5e247SLoGin kobj_state: LockedKObjectState, 2706d5e247SLoGin /// 与父节点有关的一些信息 2806d5e247SLoGin parent_data: RwLock<KSetParentData>, 2906d5e247SLoGin self_ref: Weak<KSet>, 3006d5e247SLoGin } 3106d5e247SLoGin 3206d5e247SLoGin impl Hash for KSet { 3306d5e247SLoGin fn hash<H: ~const core::hash::Hasher>(&self, state: &mut H) { 3406d5e247SLoGin self.self_ref.as_ptr().hash(state); 3506d5e247SLoGin self.inner.read().name.hash(state); 3606d5e247SLoGin } 3706d5e247SLoGin } 3806d5e247SLoGin 3906d5e247SLoGin impl core::cmp::Eq for KSet {} 4006d5e247SLoGin 4106d5e247SLoGin impl core::cmp::PartialEq for KSet { 4206d5e247SLoGin fn eq(&self, other: &Self) -> bool { 4306d5e247SLoGin self.self_ref.as_ptr() == other.self_ref.as_ptr() 4406d5e247SLoGin } 4506d5e247SLoGin } 4606d5e247SLoGin 4706d5e247SLoGin impl KSet { 4806d5e247SLoGin pub fn new(name: String) -> Arc<Self> { 4906d5e247SLoGin let r = Self { 5006d5e247SLoGin kobjects: RwLock::new(Vec::new()), 5106d5e247SLoGin inner: RwLock::new(InnerKSet::new(name)), 52a03c4f9dSLoGin kobj_state: LockedKObjectState::new(None), 5306d5e247SLoGin parent_data: RwLock::new(KSetParentData::new(None, None)), 5406d5e247SLoGin self_ref: Weak::default(), 5506d5e247SLoGin }; 5606d5e247SLoGin 5706d5e247SLoGin let r = Arc::new(r); 5806d5e247SLoGin 5906d5e247SLoGin unsafe { 6006d5e247SLoGin let p = r.as_ref() as *const Self as *mut Self; 6106d5e247SLoGin (*p).self_ref = Arc::downgrade(&r); 6206d5e247SLoGin } 6306d5e247SLoGin 6406d5e247SLoGin return r; 6506d5e247SLoGin } 6606d5e247SLoGin 6706d5e247SLoGin /// 创建一个kset,并且设置它的父亲为parent_kobj。然后把这个kset注册到sysfs 6806d5e247SLoGin /// 6906d5e247SLoGin /// ## 参数 7006d5e247SLoGin /// 7106d5e247SLoGin /// - name: kset的名字 7206d5e247SLoGin /// - parent_kobj: 父亲kobject 7306d5e247SLoGin /// - join_kset: 如果不为None,那么这个kset会加入到join_kset中 7406d5e247SLoGin pub fn new_and_add( 7506d5e247SLoGin name: String, 7606d5e247SLoGin parent_kobj: Option<Arc<dyn KObject>>, 7706d5e247SLoGin join_kset: Option<Arc<KSet>>, 7806d5e247SLoGin ) -> Result<Arc<Self>, SystemError> { 7906d5e247SLoGin let kset = KSet::new(name); 8006d5e247SLoGin if let Some(parent_kobj) = parent_kobj { 8106d5e247SLoGin kset.set_parent(Some(Arc::downgrade(&parent_kobj))); 8206d5e247SLoGin } 8306d5e247SLoGin kset.register(join_kset)?; 8406d5e247SLoGin return Ok(kset); 8506d5e247SLoGin } 8606d5e247SLoGin 8706d5e247SLoGin pub fn register(&self, join_kset: Option<Arc<KSet>>) -> Result<(), SystemError> { 8806d5e247SLoGin return KObjectManager::add_kobj(self.self_ref.upgrade().unwrap(), join_kset); 8906d5e247SLoGin // todo: 引入uevent之后,发送uevent 9006d5e247SLoGin } 9106d5e247SLoGin 9206d5e247SLoGin /// 把一个kobject加入到当前kset中。 9306d5e247SLoGin /// 9406d5e247SLoGin /// 该函数不会修改kobj的parent,需要调用者自己视情况修改。 9506d5e247SLoGin /// 9606d5e247SLoGin /// ## Panic 9706d5e247SLoGin /// 9806d5e247SLoGin /// 这个kobject的kset必须是None,否则会panic 9906d5e247SLoGin pub fn join(&self, kobj: &Arc<dyn KObject>) { 10006d5e247SLoGin assert!(kobj.kset().is_none()); 10106d5e247SLoGin kobj.set_kset(self.self_ref.upgrade()); 10206d5e247SLoGin self.kobjects.write().push(Arc::downgrade(&kobj)); 10306d5e247SLoGin } 10406d5e247SLoGin 10506d5e247SLoGin /// 把一个kobject从当前kset中移除。 10606d5e247SLoGin pub fn leave(&self, kobj: &Arc<dyn KObject>) { 10706d5e247SLoGin let mut kobjects = self.kobjects.write(); 10806d5e247SLoGin let index = kobjects.iter().position(|x| { 10906d5e247SLoGin if let Some(x) = x.upgrade() { 11006d5e247SLoGin return Arc::ptr_eq(&x, kobj); 11106d5e247SLoGin } 11206d5e247SLoGin return false; 11306d5e247SLoGin }); 11406d5e247SLoGin if let Some(index) = index { 11506d5e247SLoGin let x = kobjects.remove(index); 11606d5e247SLoGin let x = x.upgrade().unwrap(); 11706d5e247SLoGin drop(kobjects); 11806d5e247SLoGin x.set_kset(None); 11906d5e247SLoGin } 12006d5e247SLoGin } 12106d5e247SLoGin 12206d5e247SLoGin /// 清除所有已经被释放的kobject 12306d5e247SLoGin #[allow(dead_code)] 12406d5e247SLoGin pub fn cleanup_weak(&self) { 12506d5e247SLoGin let mut kobjects = self.kobjects.write(); 12606d5e247SLoGin kobjects.drain_filter(|x| x.upgrade().is_none()); 12706d5e247SLoGin } 12806d5e247SLoGin 12906d5e247SLoGin pub fn as_kobject(&self) -> Arc<dyn KObject> { 13006d5e247SLoGin return self.self_ref.upgrade().unwrap(); 13106d5e247SLoGin } 13206d5e247SLoGin } 13306d5e247SLoGin 13406d5e247SLoGin impl KObject for KSet { 13506d5e247SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 13606d5e247SLoGin self 13706d5e247SLoGin } 13806d5e247SLoGin 13906d5e247SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 14006d5e247SLoGin self.inner.read().kern_inode.clone() 14106d5e247SLoGin } 14206d5e247SLoGin 14306d5e247SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 14406d5e247SLoGin self.inner.write().kern_inode = inode; 14506d5e247SLoGin } 14606d5e247SLoGin 14706d5e247SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 14806d5e247SLoGin self.parent_data.read().parent.clone() 14906d5e247SLoGin } 15006d5e247SLoGin 15106d5e247SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 15206d5e247SLoGin self.parent_data.write().parent = parent; 15306d5e247SLoGin } 15406d5e247SLoGin 15506d5e247SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 15606d5e247SLoGin self.kobj_state.read() 15706d5e247SLoGin } 15806d5e247SLoGin 15906d5e247SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 16006d5e247SLoGin self.kobj_state.write() 16106d5e247SLoGin } 16206d5e247SLoGin 16306d5e247SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 164*7eda31b2SLoGin self.inner.read().ktype 16506d5e247SLoGin } 16606d5e247SLoGin 167*7eda31b2SLoGin fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 168*7eda31b2SLoGin self.inner.write().ktype = ktype; 169a03c4f9dSLoGin } 170a03c4f9dSLoGin 17106d5e247SLoGin fn kset(&self) -> Option<Arc<KSet>> { 17206d5e247SLoGin self.parent_data.read().kset.clone() 17306d5e247SLoGin } 17406d5e247SLoGin 17506d5e247SLoGin fn set_kset(&self, kset: Option<Arc<KSet>>) { 17606d5e247SLoGin self.parent_data.write().kset = kset; 17706d5e247SLoGin } 17806d5e247SLoGin 17906d5e247SLoGin fn name(&self) -> String { 18006d5e247SLoGin return self.inner.read().name.clone(); 18106d5e247SLoGin } 18206d5e247SLoGin 18306d5e247SLoGin fn set_name(&self, name: String) { 18406d5e247SLoGin self.inner.write().name = name; 18506d5e247SLoGin } 18606d5e247SLoGin 18706d5e247SLoGin fn set_kobj_state(&self, state: KObjectState) { 18806d5e247SLoGin *self.kobj_state.write() = state; 18906d5e247SLoGin } 19006d5e247SLoGin } 19106d5e247SLoGin 19206d5e247SLoGin #[derive(Debug)] 19306d5e247SLoGin struct KSetParentData { 19406d5e247SLoGin parent: Option<Weak<dyn KObject>>, 19506d5e247SLoGin kset: Option<Arc<KSet>>, 19606d5e247SLoGin } 19706d5e247SLoGin 19806d5e247SLoGin impl KSetParentData { 19906d5e247SLoGin fn new(parent: Option<Weak<dyn KObject>>, kset: Option<Arc<KSet>>) -> Self { 20006d5e247SLoGin Self { parent, kset } 20106d5e247SLoGin } 20206d5e247SLoGin } 20306d5e247SLoGin 20406d5e247SLoGin #[derive(Debug)] 20506d5e247SLoGin struct InnerKSet { 20606d5e247SLoGin kern_inode: Option<Arc<KernFSInode>>, 20706d5e247SLoGin name: String, 208*7eda31b2SLoGin ktype: Option<&'static dyn KObjType>, 20906d5e247SLoGin } 21006d5e247SLoGin 21106d5e247SLoGin impl InnerKSet { 21206d5e247SLoGin fn new(name: String) -> Self { 21306d5e247SLoGin Self { 21406d5e247SLoGin kern_inode: None, 21506d5e247SLoGin name, 216*7eda31b2SLoGin ktype: Some(&DynamicKObjKType), 21706d5e247SLoGin } 21806d5e247SLoGin } 21906d5e247SLoGin } 220