From 4256da7fb6ad25a3caab6f656607aaf047cb6446 Mon Sep 17 00:00:00 2001 From: LoGin Date: Mon, 25 Mar 2024 15:47:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8ADevice=20trait=E7=9A=84set=5Fclass?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E8=AE=BE=E7=BD=AEWeak=E6=8C=87=E9=92=88?= =?UTF-8?q?=EF=BC=8C=E4=BB=A5=E9=81=BF=E5=85=8D=E5=BE=AA=E7=8E=AF=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E9=97=AE=E9=A2=98=E3=80=82=20(#666)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/base/cpu.rs | 2 +- kernel/src/driver/base/device/mod.rs | 2 +- .../src/driver/base/platform/platform_device.rs | 2 +- kernel/src/driver/base/subsys.rs | 8 +++++++- kernel/src/driver/disk/ahci/ahcidisk.rs | 2 +- .../driver/input/ps2_mouse/ps_mouse_device.rs | 12 +++++++++--- .../src/driver/input/serio/i8042/i8042_device.rs | 12 ++++++++++-- .../src/driver/input/serio/i8042/i8042_ports.rs | 13 +++++++++++-- kernel/src/driver/serial/serial8250/mod.rs | 2 +- kernel/src/driver/tty/tty_device.rs | 2 +- kernel/src/driver/video/fbdev/base/fbcon/mod.rs | 2 +- kernel/src/driver/video/fbdev/base/fbmem.rs | 2 +- kernel/src/driver/video/fbdev/vesafb.rs | 16 ++++++++++++++-- 13 files changed, 59 insertions(+), 18 deletions(-) diff --git a/kernel/src/driver/base/cpu.rs b/kernel/src/driver/base/cpu.rs index 6da39c6a..cfe344ce 100644 --- a/kernel/src/driver/base/cpu.rs +++ b/kernel/src/driver/base/cpu.rs @@ -185,7 +185,7 @@ impl Device for CpuSubSystemFakeRootDevice { true } - fn set_class(&self, _class: Option>) { + fn set_class(&self, _class: Option>) { todo!() } } diff --git a/kernel/src/driver/base/device/mod.rs b/kernel/src/driver/base/device/mod.rs index e4a90787..fc706ff0 100644 --- a/kernel/src/driver/base/device/mod.rs +++ b/kernel/src/driver/base/device/mod.rs @@ -165,7 +165,7 @@ pub trait Device: KObject { /// 设置当前设备所属的类 /// /// 注意,如果实现了当前方法,那么必须实现`class()`方法 - fn set_class(&self, class: Option>); + fn set_class(&self, class: Option>); /// 返回已经与当前设备匹配好的驱动程序 fn driver(&self) -> Option>; diff --git a/kernel/src/driver/base/platform/platform_device.rs b/kernel/src/driver/base/platform/platform_device.rs index 5185dbb7..88d43eeb 100644 --- a/kernel/src/driver/base/platform/platform_device.rs +++ b/kernel/src/driver/base/platform/platform_device.rs @@ -320,7 +320,7 @@ impl Device for PlatformBusDevice { todo!() } - fn set_class(&self, _class: Option>) { + fn set_class(&self, _class: Option>) { todo!() } } diff --git a/kernel/src/driver/base/subsys.rs b/kernel/src/driver/base/subsys.rs index 754df504..68d4f464 100644 --- a/kernel/src/driver/base/subsys.rs +++ b/kernel/src/driver/base/subsys.rs @@ -99,7 +99,13 @@ impl SubSysPrivate { #[allow(dead_code)] #[inline] pub fn class(&self) -> Option> { - 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>) { diff --git a/kernel/src/driver/disk/ahci/ahcidisk.rs b/kernel/src/driver/disk/ahci/ahcidisk.rs index 02e8af3f..abc8e73d 100644 --- a/kernel/src/driver/disk/ahci/ahcidisk.rs +++ b/kernel/src/driver/disk/ahci/ahcidisk.rs @@ -528,7 +528,7 @@ impl Device for LockedAhciDisk { todo!() } - fn set_class(&self, _class: Option>) { + fn set_class(&self, _class: Option>) { todo!() } } diff --git a/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs b/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs index ecac846b..8bbb1615 100644 --- a/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs +++ b/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs @@ -412,7 +412,7 @@ impl Ps2MouseDevice { #[derive(Debug)] struct InnerPs2MouseDevice { bus: Option>, - class: Option>, + class: Option>, driver: Option>, kern_inode: Option>, parent: Option>, @@ -447,7 +447,7 @@ impl Device for Ps2MouseDevice { self.inner.lock_irqsave().bus = bus; } - fn set_class(&self, class: Option>) { + fn set_class(&self, class: Option>) { self.inner.lock_irqsave().class = class; } @@ -474,7 +474,13 @@ impl Device for Ps2MouseDevice { } fn class(&self) -> Option> { - 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; } } diff --git a/kernel/src/driver/input/serio/i8042/i8042_device.rs b/kernel/src/driver/input/serio/i8042/i8042_device.rs index 1523f446..9ad0be2a 100644 --- a/kernel/src/driver/input/serio/i8042/i8042_device.rs +++ b/kernel/src/driver/input/serio/i8042/i8042_device.rs @@ -50,7 +50,7 @@ impl I8042PlatformDevice { #[derive(Debug)] pub struct InnerI8042PlatformDevice { bus: Option>, - class: Option>, + class: Option>, driver: Option>, kern_inode: Option>, parent: Option>, @@ -77,8 +77,16 @@ impl Device for I8042PlatformDevice { fn set_bus(&self, bus: Option>) { self.inner.lock().bus = bus; } + fn class(&self) -> Option> { + 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>) { + return r; + } + fn set_class(&self, class: Option>) { self.inner.lock().class = class; } diff --git a/kernel/src/driver/input/serio/i8042/i8042_ports.rs b/kernel/src/driver/input/serio/i8042/i8042_ports.rs index 5823f336..bada7fdf 100644 --- a/kernel/src/driver/input/serio/i8042/i8042_ports.rs +++ b/kernel/src/driver/input/serio/i8042/i8042_ports.rs @@ -33,7 +33,7 @@ pub struct I8042AuxPort { #[derive(Debug)] pub struct InnerI8042AuxPort { bus: Option>, - class: Option>, + class: Option>, driver: Option>, kern_inode: Option>, parent: Option>, @@ -76,10 +76,19 @@ impl Device for I8042AuxPort { self.inner.lock().bus = bus; } - fn set_class(&self, class: Option>) { + fn set_class(&self, class: Option>) { self.inner.lock().class = class; } + fn class(&self) -> Option> { + 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> { self.inner.lock().driver.clone()?.upgrade() } diff --git a/kernel/src/driver/serial/serial8250/mod.rs b/kernel/src/driver/serial/serial8250/mod.rs index 1b0b5a93..cab939d8 100644 --- a/kernel/src/driver/serial/serial8250/mod.rs +++ b/kernel/src/driver/serial/serial8250/mod.rs @@ -249,7 +249,7 @@ impl Device for Serial8250ISADevices { true } - fn set_class(&self, _class: Option>) { + fn set_class(&self, _class: Option>) { todo!() } } diff --git a/kernel/src/driver/tty/tty_device.rs b/kernel/src/driver/tty/tty_device.rs index 3f4c4461..898f3d77 100644 --- a/kernel/src/driver/tty/tty_device.rs +++ b/kernel/src/driver/tty/tty_device.rs @@ -425,7 +425,7 @@ impl Device for TtyDevice { self.inner.write().bus = bus } - fn set_class(&self, _class: Option>) { + fn set_class(&self, _class: Option>) { todo!() } diff --git a/kernel/src/driver/video/fbdev/base/fbcon/mod.rs b/kernel/src/driver/video/fbdev/base/fbcon/mod.rs index 2d0b346c..3d95e85a 100644 --- a/kernel/src/driver/video/fbdev/base/fbcon/mod.rs +++ b/kernel/src/driver/video/fbdev/base/fbcon/mod.rs @@ -197,7 +197,7 @@ impl Device for FbConsoleDevice { self.inner.lock().bus.clone() } - fn set_class(&self, _class: Option>) { + fn set_class(&self, _class: Option>) { // 不允许修改 kwarn!("fbcon's class can not be changed"); } diff --git a/kernel/src/driver/video/fbdev/base/fbmem.rs b/kernel/src/driver/video/fbdev/base/fbmem.rs index cce48c87..ce69251d 100644 --- a/kernel/src/driver/video/fbdev/base/fbmem.rs +++ b/kernel/src/driver/video/fbdev/base/fbmem.rs @@ -343,7 +343,7 @@ impl Device for FbDevice { fn class(&self) -> Option> { sys_class_graphics_instance().map(|ins| ins.clone() as Arc) } - fn set_class(&self, _class: Option>) { + fn set_class(&self, _class: Option>) { // do nothing } diff --git a/kernel/src/driver/video/fbdev/vesafb.rs b/kernel/src/driver/video/fbdev/vesafb.rs index c191f05b..572bced3 100644 --- a/kernel/src/driver/video/fbdev/vesafb.rs +++ b/kernel/src/driver/video/fbdev/vesafb.rs @@ -122,7 +122,7 @@ impl VesaFb { #[derive(Debug)] struct InnerVesaFb { bus: Option>, - class: Option>, + class: Option>, driver: Option>, kern_inode: Option>, parent: Option>, @@ -189,10 +189,22 @@ impl Device for VesaFb { self.inner.lock().bus = bus; } - fn set_class(&self, class: Option>) { + fn set_class(&self, class: Option>) { self.inner.lock().class = class; } + fn class(&self) -> Option> { + 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> { self.inner.lock().driver.clone()?.upgrade() }