把Device trait的set_class改为设置Weak指针,以避免循环引用问题。 (#666)

This commit is contained in:
LoGin
2024-03-25 15:47:05 +08:00
committed by GitHub
parent 5c20e05a2e
commit 4256da7fb6
13 changed files with 59 additions and 18 deletions

View File

@ -197,7 +197,7 @@ impl Device for FbConsoleDevice {
self.inner.lock().bus.clone()
}
fn set_class(&self, _class: Option<Arc<dyn Class>>) {
fn set_class(&self, _class: Option<Weak<dyn Class>>) {
// 不允许修改
kwarn!("fbcon's class can not be changed");
}

View File

@ -343,7 +343,7 @@ impl Device for FbDevice {
fn class(&self) -> Option<Arc<dyn Class>> {
sys_class_graphics_instance().map(|ins| ins.clone() as Arc<dyn Class>)
}
fn set_class(&self, _class: Option<Arc<dyn Class>>) {
fn set_class(&self, _class: Option<Weak<dyn Class>>) {
// do nothing
}

View File

@ -122,7 +122,7 @@ impl VesaFb {
#[derive(Debug)]
struct InnerVesaFb {
bus: Option<Weak<dyn Bus>>,
class: Option<Arc<dyn Class>>,
class: Option<Weak<dyn Class>>,
driver: Option<Weak<dyn Driver>>,
kern_inode: Option<Arc<KernFSInode>>,
parent: Option<Weak<dyn KObject>>,
@ -189,10 +189,22 @@ impl Device for VesaFb {
self.inner.lock().bus = bus;
}
fn set_class(&self, class: Option<Arc<dyn Class>>) {
fn set_class(&self, class: Option<Weak<dyn Class>>) {
self.inner.lock().class = class;
}
fn class(&self) -> Option<Arc<dyn Class>> {
let mut guard = self.inner.lock();
let r = guard.class.clone()?.upgrade();
if r.is_none() {
// 为了让弱引用失效
guard.class = None;
}
return r;
}
fn driver(&self) -> Option<Arc<dyn Driver>> {
self.inner.lock().driver.clone()?.upgrade()
}