mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 00:27:45 +00:00
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.
This commit is contained in:
parent
c545d4ffcb
commit
f5de4f24b2
41 changed files with 142 additions and 57 deletions
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 {};
|
||||
}
|
||||
|
||||
|
|
|
@ -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&);
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue