1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 19:27:44 +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

@ -18,6 +18,7 @@
#include <AK/Function.h>
#include <AK/HashMap.h>
#include <AK/RefPtr.h>
#include <Kernel/API/KResult.h>
#include <Kernel/Devices/AsyncDeviceRequest.h>
#include <Kernel/FileSystem/File.h>
#include <Kernel/FileSystem/SysFS.h>
@ -26,6 +27,14 @@
namespace Kernel {
template<typename DeviceType, typename... Args>
inline KResultOr<NonnullRefPtr<DeviceType>> try_create_device(Args&&... args)
{
auto device = TRY(adopt_nonnull_ref_or_enomem(new DeviceType(forward<Args>(args)...)));
device->after_inserting();
return device;
}
class Device : public File {
protected:
enum class State {
@ -46,7 +55,8 @@ public:
GroupID gid() const { return m_gid; }
virtual bool is_device() const override { return true; }
virtual void before_removing();
virtual void before_removing() override;
virtual void after_inserting();
static void for_each(Function<void(Device&)>);
static Device* get_device(unsigned major, unsigned minor);
@ -82,7 +92,7 @@ private:
Spinlock m_requests_lock;
DoublyLinkedList<RefPtr<AsyncDeviceRequest>> m_requests;
WeakPtr<SysFSDeviceComponent> m_sysfs_component;
RefPtr<SysFSDeviceComponent> m_sysfs_component;
};
}