mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-09 19:36:47 +00:00
把Device trait的set_class改为设置Weak指针,以避免循环引用问题。 (#666)
This commit is contained in:
parent
5c20e05a2e
commit
4256da7fb6
@ -185,7 +185,7 @@ impl Device for CpuSubSystemFakeRootDevice {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_class(&self, _class: Option<Arc<dyn Class>>) {
|
fn set_class(&self, _class: Option<Weak<dyn Class>>) {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ pub trait Device: KObject {
|
|||||||
/// 设置当前设备所属的类
|
/// 设置当前设备所属的类
|
||||||
///
|
///
|
||||||
/// 注意,如果实现了当前方法,那么必须实现`class()`方法
|
/// 注意,如果实现了当前方法,那么必须实现`class()`方法
|
||||||
fn set_class(&self, class: Option<Arc<dyn Class>>);
|
fn set_class(&self, class: Option<Weak<dyn Class>>);
|
||||||
|
|
||||||
/// 返回已经与当前设备匹配好的驱动程序
|
/// 返回已经与当前设备匹配好的驱动程序
|
||||||
fn driver(&self) -> Option<Arc<dyn Driver>>;
|
fn driver(&self) -> Option<Arc<dyn Driver>>;
|
||||||
|
@ -320,7 +320,7 @@ impl Device for PlatformBusDevice {
|
|||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_class(&self, _class: Option<Arc<dyn Class>>) {
|
fn set_class(&self, _class: Option<Weak<dyn Class>>) {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,13 @@ impl SubSysPrivate {
|
|||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn class(&self) -> Option<Weak<dyn Class>> {
|
pub fn class(&self) -> Option<Weak<dyn Class>> {
|
||||||
return self.class.lock().clone();
|
let mut guard = self.class.lock();
|
||||||
|
if let Some(r) = guard.clone() {
|
||||||
|
return Some(r);
|
||||||
|
} else {
|
||||||
|
*guard = None;
|
||||||
|
return None;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_class(&self, class: Option<Weak<dyn Class>>) {
|
pub fn set_class(&self, class: Option<Weak<dyn Class>>) {
|
||||||
|
@ -528,7 +528,7 @@ impl Device for LockedAhciDisk {
|
|||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_class(&self, _class: Option<Arc<dyn Class>>) {
|
fn set_class(&self, _class: Option<Weak<dyn Class>>) {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -412,7 +412,7 @@ impl Ps2MouseDevice {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct InnerPs2MouseDevice {
|
struct InnerPs2MouseDevice {
|
||||||
bus: Option<Weak<dyn Bus>>,
|
bus: Option<Weak<dyn Bus>>,
|
||||||
class: Option<Arc<dyn Class>>,
|
class: Option<Weak<dyn Class>>,
|
||||||
driver: Option<Weak<dyn Driver>>,
|
driver: Option<Weak<dyn Driver>>,
|
||||||
kern_inode: Option<Arc<KernFSInode>>,
|
kern_inode: Option<Arc<KernFSInode>>,
|
||||||
parent: Option<Weak<dyn KObject>>,
|
parent: Option<Weak<dyn KObject>>,
|
||||||
@ -447,7 +447,7 @@ impl Device for Ps2MouseDevice {
|
|||||||
self.inner.lock_irqsave().bus = bus;
|
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;
|
self.inner.lock_irqsave().class = class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -474,7 +474,13 @@ impl Device for Ps2MouseDevice {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn class(&self) -> Option<Arc<dyn Class>> {
|
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)]
|
#[derive(Debug)]
|
||||||
pub struct InnerI8042PlatformDevice {
|
pub struct InnerI8042PlatformDevice {
|
||||||
bus: Option<Weak<dyn Bus>>,
|
bus: Option<Weak<dyn Bus>>,
|
||||||
class: Option<Arc<dyn Class>>,
|
class: Option<Weak<dyn Class>>,
|
||||||
driver: Option<Weak<dyn Driver>>,
|
driver: Option<Weak<dyn Driver>>,
|
||||||
kern_inode: Option<Arc<KernFSInode>>,
|
kern_inode: Option<Arc<KernFSInode>>,
|
||||||
parent: Option<Weak<dyn KObject>>,
|
parent: Option<Weak<dyn KObject>>,
|
||||||
@ -77,8 +77,16 @@ impl Device for I8042PlatformDevice {
|
|||||||
fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
|
fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
|
||||||
self.inner.lock().bus = 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;
|
self.inner.lock().class = class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ pub struct I8042AuxPort {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct InnerI8042AuxPort {
|
pub struct InnerI8042AuxPort {
|
||||||
bus: Option<Weak<dyn Bus>>,
|
bus: Option<Weak<dyn Bus>>,
|
||||||
class: Option<Arc<dyn Class>>,
|
class: Option<Weak<dyn Class>>,
|
||||||
driver: Option<Weak<dyn Driver>>,
|
driver: Option<Weak<dyn Driver>>,
|
||||||
kern_inode: Option<Arc<KernFSInode>>,
|
kern_inode: Option<Arc<KernFSInode>>,
|
||||||
parent: Option<Weak<dyn KObject>>,
|
parent: Option<Weak<dyn KObject>>,
|
||||||
@ -76,10 +76,19 @@ impl Device for I8042AuxPort {
|
|||||||
self.inner.lock().bus = bus;
|
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;
|
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>> {
|
fn driver(&self) -> Option<Arc<dyn Driver>> {
|
||||||
self.inner.lock().driver.clone()?.upgrade()
|
self.inner.lock().driver.clone()?.upgrade()
|
||||||
}
|
}
|
||||||
|
@ -249,7 +249,7 @@ impl Device for Serial8250ISADevices {
|
|||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_class(&self, _class: Option<Arc<dyn Class>>) {
|
fn set_class(&self, _class: Option<Weak<dyn Class>>) {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -425,7 +425,7 @@ impl Device for TtyDevice {
|
|||||||
self.inner.write().bus = bus
|
self.inner.write().bus = bus
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_class(&self, _class: Option<Arc<dyn crate::driver::base::class::Class>>) {
|
fn set_class(&self, _class: Option<Weak<dyn crate::driver::base::class::Class>>) {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ impl Device for FbConsoleDevice {
|
|||||||
self.inner.lock().bus.clone()
|
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");
|
kwarn!("fbcon's class can not be changed");
|
||||||
}
|
}
|
||||||
|
@ -343,7 +343,7 @@ impl Device for FbDevice {
|
|||||||
fn class(&self) -> Option<Arc<dyn Class>> {
|
fn class(&self) -> Option<Arc<dyn Class>> {
|
||||||
sys_class_graphics_instance().map(|ins| ins.clone() as 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
|
// do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,7 +122,7 @@ impl VesaFb {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct InnerVesaFb {
|
struct InnerVesaFb {
|
||||||
bus: Option<Weak<dyn Bus>>,
|
bus: Option<Weak<dyn Bus>>,
|
||||||
class: Option<Arc<dyn Class>>,
|
class: Option<Weak<dyn Class>>,
|
||||||
driver: Option<Weak<dyn Driver>>,
|
driver: Option<Weak<dyn Driver>>,
|
||||||
kern_inode: Option<Arc<KernFSInode>>,
|
kern_inode: Option<Arc<KernFSInode>>,
|
||||||
parent: Option<Weak<dyn KObject>>,
|
parent: Option<Weak<dyn KObject>>,
|
||||||
@ -189,10 +189,22 @@ impl Device for VesaFb {
|
|||||||
self.inner.lock().bus = bus;
|
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;
|
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>> {
|
fn driver(&self) -> Option<Arc<dyn Driver>> {
|
||||||
self.inner.lock().driver.clone()?.upgrade()
|
self.inner.lock().driver.clone()?.upgrade()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user