summaryrefslogtreecommitdiff
path: root/Kernel/Devices/HID
diff options
context:
space:
mode:
authorLiav A <liavalb@gmail.com>2021-09-10 14:44:46 +0300
committerAndreas Kling <kling@serenityos.org>2021-09-11 11:41:14 +0200
commitf5de4f24b260515f703a3a6ea183046f45cd4ce8 (patch)
treedadab2487c0fd610f188151ff1bfdcc6bb7c84b8 /Kernel/Devices/HID
parentc545d4ffcb93e95d8226dff996fcb38f92c48d14 (diff)
downloadserenity-f5de4f24b260515f703a3a6ea183046f45cd4ce8.zip
Kernel/Devices: Defer creation of SysFS component after the constructor
Instead of doing so in the constructor, let's do immediately after the constructor, so we can safely pass a reference of a Device, so the SysFSDeviceComponent constructor can use that object to identify whether it's a block device or a character device. This allows to us to not hold a device in SysFSDeviceComponent with a RefPtr. Also, we also call the before_removing method in both SlavePTY::unref and File::unref, so because Device has that method being overrided, it can ensure the device is removed always cleanly.
Diffstat (limited to 'Kernel/Devices/HID')
-rw-r--r--Kernel/Devices/HID/HIDManagement.cpp1
-rw-r--r--Kernel/Devices/HID/PS2KeyboardDevice.cpp8
-rw-r--r--Kernel/Devices/HID/PS2KeyboardDevice.h3
-rw-r--r--Kernel/Devices/HID/PS2MouseDevice.cpp8
-rw-r--r--Kernel/Devices/HID/PS2MouseDevice.h4
-rw-r--r--Kernel/Devices/HID/VMWareMouseDevice.cpp8
-rw-r--r--Kernel/Devices/HID/VMWareMouseDevice.h2
7 files changed, 22 insertions, 12 deletions
diff --git a/Kernel/Devices/HID/HIDManagement.cpp b/Kernel/Devices/HID/HIDManagement.cpp
index 3461e3f7d6..0fdc78839b 100644
--- a/Kernel/Devices/HID/HIDManagement.cpp
+++ b/Kernel/Devices/HID/HIDManagement.cpp
@@ -112,6 +112,7 @@ UNMAP_AFTER_INIT void HIDManagement::enumerate()
m_i8042_controller->detect_devices();
if (m_i8042_controller->mouse())
m_hid_devices.append(m_i8042_controller->mouse().release_nonnull());
+
if (m_i8042_controller->keyboard())
m_hid_devices.append(m_i8042_controller->keyboard().release_nonnull());
}
diff --git a/Kernel/Devices/HID/PS2KeyboardDevice.cpp b/Kernel/Devices/HID/PS2KeyboardDevice.cpp
index e81ea7fa0c..0b569b632f 100644
--- a/Kernel/Devices/HID/PS2KeyboardDevice.cpp
+++ b/Kernel/Devices/HID/PS2KeyboardDevice.cpp
@@ -83,9 +83,11 @@ bool PS2KeyboardDevice::handle_irq(const RegisterState&)
UNMAP_AFTER_INIT RefPtr<PS2KeyboardDevice> PS2KeyboardDevice::try_to_initialize(const I8042Controller& ps2_controller)
{
- auto device = adopt_ref(*new PS2KeyboardDevice(ps2_controller));
- if (device->initialize())
- return device;
+ auto keyboard_device_or_error = try_create_device<PS2KeyboardDevice>(ps2_controller);
+ // FIXME: Find a way to propagate errors
+ VERIFY(!keyboard_device_or_error.is_error());
+ if (keyboard_device_or_error.value()->initialize())
+ return keyboard_device_or_error.release_value();
return nullptr;
}
diff --git a/Kernel/Devices/HID/PS2KeyboardDevice.h b/Kernel/Devices/HID/PS2KeyboardDevice.h
index 8fb9c285cd..cd8feca328 100644
--- a/Kernel/Devices/HID/PS2KeyboardDevice.h
+++ b/Kernel/Devices/HID/PS2KeyboardDevice.h
@@ -35,9 +35,10 @@ public:
enable_irq();
}
-private:
+ // FIXME: We expose this constructor to make try_create_device helper to work
explicit PS2KeyboardDevice(const I8042Controller&);
+private:
// ^IRQHandler
virtual bool handle_irq(const RegisterState&) override;
diff --git a/Kernel/Devices/HID/PS2MouseDevice.cpp b/Kernel/Devices/HID/PS2MouseDevice.cpp
index 15dec13ae1..fce0609e2c 100644
--- a/Kernel/Devices/HID/PS2MouseDevice.cpp
+++ b/Kernel/Devices/HID/PS2MouseDevice.cpp
@@ -174,9 +174,11 @@ void PS2MouseDevice::set_sample_rate(u8 rate)
UNMAP_AFTER_INIT RefPtr<PS2MouseDevice> PS2MouseDevice::try_to_initialize(const I8042Controller& ps2_controller)
{
- auto device = adopt_ref(*new PS2MouseDevice(ps2_controller));
- if (device->initialize())
- return device;
+ auto mouse_device_or_error = try_create_device<PS2MouseDevice>(ps2_controller);
+ // FIXME: Find a way to propagate errors
+ VERIFY(!mouse_device_or_error.is_error());
+ if (mouse_device_or_error.value()->initialize())
+ return mouse_device_or_error.release_value();
return nullptr;
}
diff --git a/Kernel/Devices/HID/PS2MouseDevice.h b/Kernel/Devices/HID/PS2MouseDevice.h
index 1182ce2946..fc3b84cd00 100644
--- a/Kernel/Devices/HID/PS2MouseDevice.h
+++ b/Kernel/Devices/HID/PS2MouseDevice.h
@@ -32,8 +32,10 @@ public:
enable_irq();
}
-protected:
+ // FIXME: We expose this constructor to make try_create_device helper to work
explicit PS2MouseDevice(const I8042Controller&);
+
+protected:
// ^IRQHandler
virtual bool handle_irq(const RegisterState&) override;
diff --git a/Kernel/Devices/HID/VMWareMouseDevice.cpp b/Kernel/Devices/HID/VMWareMouseDevice.cpp
index 46ca4b3984..291cde6a78 100644
--- a/Kernel/Devices/HID/VMWareMouseDevice.cpp
+++ b/Kernel/Devices/HID/VMWareMouseDevice.cpp
@@ -16,9 +16,11 @@ UNMAP_AFTER_INIT RefPtr<VMWareMouseDevice> VMWareMouseDevice::try_to_initialize(
return {};
if (!VMWareBackdoor::the()->vmmouse_is_absolute())
return {};
- auto device = adopt_ref(*new VMWareMouseDevice(ps2_controller));
- if (device->initialize())
- return device;
+ auto mouse_device_or_error = try_create_device<VMWareMouseDevice>(ps2_controller);
+ // FIXME: Find a way to propagate errors
+ VERIFY(!mouse_device_or_error.is_error());
+ if (mouse_device_or_error.value()->initialize())
+ return mouse_device_or_error.release_value();
return {};
}
diff --git a/Kernel/Devices/HID/VMWareMouseDevice.h b/Kernel/Devices/HID/VMWareMouseDevice.h
index 60749639bb..7f17e27392 100644
--- a/Kernel/Devices/HID/VMWareMouseDevice.h
+++ b/Kernel/Devices/HID/VMWareMouseDevice.h
@@ -23,7 +23,7 @@ public:
// ^I8042Device
virtual void irq_handle_byte_read(u8 byte) override;
-private:
+ // FIXME: We expose this constructor to make try_create_device helper to work
explicit VMWareMouseDevice(const I8042Controller&);
};