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:
parent
c545d4ffcb
commit
f5de4f24b2
41 changed files with 142 additions and 57 deletions
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue