mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-25 18:23:22 +00:00
把Device trait的set_class改为设置Weak指针,以避免循环引用问题。 (#666)
This commit is contained in:
@ -412,7 +412,7 @@ impl Ps2MouseDevice {
|
||||
#[derive(Debug)]
|
||||
struct InnerPs2MouseDevice {
|
||||
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>>,
|
||||
@ -447,7 +447,7 @@ impl Device for Ps2MouseDevice {
|
||||
self.inner.lock_irqsave().bus = bus;
|
||||
}
|
||||
|
||||
fn set_class(&self, class: Option<alloc::sync::Arc<dyn Class>>) {
|
||||
fn set_class(&self, class: Option<alloc::sync::Weak<dyn Class>>) {
|
||||
self.inner.lock_irqsave().class = class;
|
||||
}
|
||||
|
||||
@ -474,7 +474,13 @@ impl Device for Ps2MouseDevice {
|
||||
}
|
||||
|
||||
fn class(&self) -> Option<Arc<dyn Class>> {
|
||||
self.inner.lock_irqsave().class.clone()
|
||||
let mut guard = self.inner.lock_irqsave();
|
||||
let r = guard.class.clone()?.upgrade();
|
||||
if r.is_none() {
|
||||
guard.class = None;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ impl I8042PlatformDevice {
|
||||
#[derive(Debug)]
|
||||
pub struct InnerI8042PlatformDevice {
|
||||
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>>,
|
||||
@ -77,8 +77,16 @@ impl Device for I8042PlatformDevice {
|
||||
fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
|
||||
self.inner.lock().bus = bus;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
fn set_class(&self, class: Option<Arc<dyn Class>>) {
|
||||
return r;
|
||||
}
|
||||
fn set_class(&self, class: Option<Weak<dyn Class>>) {
|
||||
self.inner.lock().class = class;
|
||||
}
|
||||
|
||||
|
@ -33,7 +33,7 @@ pub struct I8042AuxPort {
|
||||
#[derive(Debug)]
|
||||
pub struct InnerI8042AuxPort {
|
||||
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>>,
|
||||
@ -76,10 +76,19 @@ impl Device for I8042AuxPort {
|
||||
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()
|
||||
}
|
||||
|
Reference in New Issue
Block a user