diff options
author | Liav A <liavalb@gmail.com> | 2021-09-11 09:19:20 +0300 |
---|---|---|
committer | Idan Horowitz <idan.horowitz@gmail.com> | 2021-09-17 01:02:48 +0300 |
commit | aee4786d8e80a2a4b2b2422afc4f8f342433c599 (patch) | |
tree | 1cdedafb91c7f405ff75a53f3c33cacf86d7167b /Kernel/FileSystem | |
parent | 9aa6dd6b786d42f6c131d03cba58e9999e0644d0 (diff) | |
download | serenity-aee4786d8e80a2a4b2b2422afc4f8f342433c599.zip |
Kernel: Introduce the DeviceManagement singleton
This singleton simplifies many aspects that we struggled with before:
1. There's no need to make derived classes of Device expose the
constructor as public anymore. The singleton is a friend of them, so he
can call the constructor. This solves the issue with try_create_device
helper neatly, hopefully for good.
2. Getting a reference of the NullDevice is now being done from this
singleton, which means that NullDevice no longer needs to use its own
singleton, and we can apply the try_create_device helper on it too :)
3. We can now defer registration completely after the Device constructor
which means the Device constructor is merely assigning the major and
minor numbers of the Device, and the try_create_device helper ensures it
calls the after_inserting method immediately after construction. This
creates a great opportunity to make registration more OOM-safe.
Diffstat (limited to 'Kernel/FileSystem')
-rw-r--r-- | Kernel/FileSystem/DevPtsFS.cpp | 3 | ||||
-rw-r--r-- | Kernel/FileSystem/DevTmpFS.cpp | 5 | ||||
-rw-r--r-- | Kernel/FileSystem/VirtualFileSystem.cpp | 3 |
3 files changed, 7 insertions, 4 deletions
diff --git a/Kernel/FileSystem/DevPtsFS.cpp b/Kernel/FileSystem/DevPtsFS.cpp index 9543c26ff2..4c64ef1958 100644 --- a/Kernel/FileSystem/DevPtsFS.cpp +++ b/Kernel/FileSystem/DevPtsFS.cpp @@ -5,6 +5,7 @@ * SPDX-License-Identifier: BSD-2-Clause */ +#include <Kernel/Devices/DeviceManagement.h> #include <Kernel/FileSystem/DevPtsFS.h> #include <Kernel/FileSystem/VirtualFileSystem.h> #include <Kernel/TTY/SlavePTY.h> @@ -58,7 +59,7 @@ KResultOr<NonnullRefPtr<Inode>> DevPtsFS::get_inode(InodeIdentifier inode_id) co return *m_root_inode; unsigned pty_index = inode_index_to_pty_index(inode_id.index()); - auto* device = Device::get_device(201, pty_index); + auto* device = DeviceManagement::the().get_device(201, pty_index); VERIFY(device); auto inode = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DevPtsFSInode(const_cast<DevPtsFS&>(*this), inode_id.index(), static_cast<SlavePTY*>(device)))); diff --git a/Kernel/FileSystem/DevTmpFS.cpp b/Kernel/FileSystem/DevTmpFS.cpp index 5921b8209b..93df86d516 100644 --- a/Kernel/FileSystem/DevTmpFS.cpp +++ b/Kernel/FileSystem/DevTmpFS.cpp @@ -5,6 +5,7 @@ */ #include <AK/StringView.h> +#include <Kernel/Devices/DeviceManagement.h> #include <Kernel/FileSystem/DevTmpFS.h> #include <Kernel/FileSystem/VirtualFileSystem.h> @@ -321,7 +322,7 @@ KResultOr<size_t> DevTmpFSDeviceInode::read_bytes(off_t offset, size_t count, Us { MutexLocker locker(m_inode_lock); VERIFY(!!description); - RefPtr<Device> device = Device::get_device(m_major_number, m_minor_number); + RefPtr<Device> device = DeviceManagement::the().get_device(m_major_number, m_minor_number); if (!device) return KResult(ENODEV); if (!device->can_read(*description, offset)) @@ -336,7 +337,7 @@ KResultOr<size_t> DevTmpFSDeviceInode::write_bytes(off_t offset, size_t count, c { MutexLocker locker(m_inode_lock); VERIFY(!!description); - RefPtr<Device> device = Device::get_device(m_major_number, m_minor_number); + RefPtr<Device> device = DeviceManagement::the().get_device(m_major_number, m_minor_number); if (!device) return KResult(ENODEV); if (!device->can_write(*description, offset)) diff --git a/Kernel/FileSystem/VirtualFileSystem.cpp b/Kernel/FileSystem/VirtualFileSystem.cpp index 5378a58a2d..886c4cf7d3 100644 --- a/Kernel/FileSystem/VirtualFileSystem.cpp +++ b/Kernel/FileSystem/VirtualFileSystem.cpp @@ -9,6 +9,7 @@ #include <AK/StringBuilder.h> #include <Kernel/Debug.h> #include <Kernel/Devices/BlockDevice.h> +#include <Kernel/Devices/DeviceManagement.h> #include <Kernel/FileSystem/Custody.h> #include <Kernel/FileSystem/FileBackedFileSystem.h> #include <Kernel/FileSystem/FileSystem.h> @@ -270,7 +271,7 @@ KResultOr<NonnullRefPtr<OpenFileDescription>> VirtualFileSystem::open(StringView if (metadata.is_device()) { if (custody.mount_flags() & MS_NODEV) return EACCES; - auto device = Device::get_device(metadata.major_device, metadata.minor_device); + auto device = DeviceManagement::the().get_device(metadata.major_device, metadata.minor_device); if (device == nullptr) { return ENODEV; } |