diff options
author | Liav A <liavalb@gmail.com> | 2021-09-10 14:44:46 +0300 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-09-11 11:41:14 +0200 |
commit | f5de4f24b260515f703a3a6ea183046f45cd4ce8 (patch) | |
tree | dadab2487c0fd610f188151ff1bfdcc6bb7c84b8 /Kernel/Devices/HID | |
parent | c545d4ffcb93e95d8226dff996fcb38f92c48d14 (diff) | |
download | serenity-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.cpp | 1 | ||||
-rw-r--r-- | Kernel/Devices/HID/PS2KeyboardDevice.cpp | 8 | ||||
-rw-r--r-- | Kernel/Devices/HID/PS2KeyboardDevice.h | 3 | ||||
-rw-r--r-- | Kernel/Devices/HID/PS2MouseDevice.cpp | 8 | ||||
-rw-r--r-- | Kernel/Devices/HID/PS2MouseDevice.h | 4 | ||||
-rw-r--r-- | Kernel/Devices/HID/VMWareMouseDevice.cpp | 8 | ||||
-rw-r--r-- | Kernel/Devices/HID/VMWareMouseDevice.h | 2 |
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&); }; |