1
Fork 0
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:
Liav A 2021-09-10 14:44:46 +03:00 committed by Andreas Kling
parent c545d4ffcb
commit f5de4f24b2
41 changed files with 142 additions and 57 deletions

View file

@ -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());
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -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 {};
}

View file

@ -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&);
};