diff options
Diffstat (limited to 'Kernel/Devices/Device.cpp')
-rw-r--r-- | Kernel/Devices/Device.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/Kernel/Devices/Device.cpp b/Kernel/Devices/Device.cpp index 09b1419d1c..833e9da0f3 100644 --- a/Kernel/Devices/Device.cpp +++ b/Kernel/Devices/Device.cpp @@ -25,32 +25,48 @@ */ #include <Kernel/Devices/Device.h> -#include <Kernel/Devices/HardwareEventsManager.h> +#include <Kernel/FileSystem/InodeMetadata.h> #include <LibC/errno_numbers.h> +static HashMap<u32, Device*>* s_all_devices; + +HashMap<u32, Device*>& Device::all_devices() +{ + if (s_all_devices == nullptr) + s_all_devices = new HashMap<u32, Device*>; + return *s_all_devices; +} + void Device::for_each(Function<void(Device&)> callback) { - for (auto* entry : HardwareEventsManager::the().get_devices_list()) { - ASSERT(entry != nullptr); - callback(*entry); - } + for (auto& entry : all_devices()) + callback(*entry.value); } Device* Device::get_device(unsigned major, unsigned minor) { - return HardwareEventsManager::the().get_device(major, minor); + auto it = all_devices().find(encoded_device(major, minor)); + if (it == all_devices().end()) + return nullptr; + return it->value; } -Device::Device(unsigned major, unsigned minor, u8 device_type) +Device::Device(unsigned major, unsigned minor) : m_major(major) , m_minor(minor) { - HardwareEventsManager::the().register_device(*this, device_type); + u32 device_id = encoded_device(major, minor); + auto it = all_devices().find(device_id); + if (it != all_devices().end()) { + dbg() << "Already registered " << major << "," << minor << ": " << it->value->class_name(); + } + ASSERT(!all_devices().contains(device_id)); + all_devices().set(device_id, this); } Device::~Device() { - HardwareEventsManager::the().unregister_device(*this); + all_devices().remove(encoded_device(m_major, m_minor)); } String Device::absolute_path() const |