diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-26 21:46:37 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-26 21:46:37 +0200 |
| commit | 4b28e4626e744ac9b779a680f8e9647014956dda (patch) | |
| tree | 9b5203e083ed27091c70d60e3cdf9284af680c81 /kernel/kapi/devices/device_registry.cpp | |
| parent | e7cb0a5dab291d453fa34c5d1250d85e82478ecf (diff) | |
| download | kernel-4b28e4626e744ac9b779a680f8e9647014956dda.tar.xz kernel-4b28e4626e744ac9b779a680f8e9647014956dda.zip | |
kapi/devices: implement locking discipline
Diffstat (limited to 'kernel/kapi/devices/device_registry.cpp')
| -rw-r--r-- | kernel/kapi/devices/device_registry.cpp | 96 |
1 files changed, 55 insertions, 41 deletions
diff --git a/kernel/kapi/devices/device_registry.cpp b/kernel/kapi/devices/device_registry.cpp index f5c20a6d..80ddde65 100644 --- a/kernel/kapi/devices/device_registry.cpp +++ b/kernel/kapi/devices/device_registry.cpp @@ -4,6 +4,7 @@ #include <kapi/system.hpp> #include <kstd/memory.hpp> +#include <kstd/mutex.hpp> #include <kstd/print.hpp> #include <kstd/string.hpp> #include <kstd/vector.hpp> @@ -27,7 +28,7 @@ namespace kapi::devices system::panic("[OS:DEV] Device registry has already been initialized"); } - instance = device_registry{}; + instance.emplace(); } auto device_registry::get() -> device_registry & @@ -50,33 +51,38 @@ namespace kapi::devices kstd::println("[OS:DEV] Registering device {}", device->name()); auto added = false; - - // TODO: lock the registry - auto found = m_devices.find(device->name()); - if (found != m_devices.end()) { - if (!found->second.expired()) + auto guard = kstd::lock_guard{m_lock}; + + auto found = m_devices.find(device->name()); + if (found != m_devices.end()) { - added = false; - } + if (!found->second.expired()) + { + added = false; + } - found->second = device; - added = true; - } - else - { - added = m_devices.emplace(device->name(), device).second; + found->second = device; + added = true; + } + else + { + added = m_devices.emplace(device->name(), device).second; + } } - // TODO: unlock registry if (!added) { return false; } - // TODO: consider if we need to lock the registry observers here, since somebody may add an observer in the meantime - // once multiple codepaths can run at the same time. - for (auto const & observer : m_observers) + auto observers = kstd::vector<kstd::weak_ptr<device_registry_observer>>{}; + { + auto guard = kstd::lock_guard{m_lock}; + observers = m_observers; + } + + for (auto const & observer : observers) { if (auto locked_observer = observer.lock()) { @@ -84,36 +90,43 @@ namespace kapi::devices } } - // TODO: lock registry - erase_if(m_observers, [](auto const & observer) { return observer.expired(); }); - // TODO: unlock registry + { + auto guard = kstd::lock_guard{m_lock}; + erase_if(m_observers, [](auto const & observer) { return observer.expired(); }); + } return true; } auto device_registry::remove(device & device) -> bool { - // TODO: lock registry - - auto found = m_devices.find(device.name()); - if (found == m_devices.end()) { - return false; - } + auto guard = kstd::lock_guard{m_lock}; - auto locked = found->second.lock(); - if (!locked || locked.get() != &device) - { - return false; - } + auto found = m_devices.find(device.name()); + if (found == m_devices.end()) + { + return false; + } - found->second = kstd::weak_ptr<struct device>{}; + auto locked = found->second.lock(); + if (!locked || locked.get() != &device) + { + return false; + } - // TODO: unlock registry + found->second = kstd::weak_ptr<struct device>{}; + } kstd::println("[OS:DEV] Unregistering device {}", device.name()); - for (auto const & observer : m_observers) + auto observers = kstd::vector<kstd::weak_ptr<device_registry_observer>>{}; + { + auto guard = kstd::lock_guard{m_lock}; + observers = m_observers; + } + + for (auto const & observer : observers) { if (auto locked_observer = observer.lock()) { @@ -121,16 +134,17 @@ namespace kapi::devices } } - // TODO: lock registry - erase_if(m_observers, [](auto const & observer) { return observer.expired(); }); - // TODO: unlock registry + { + auto guard = kstd::lock_guard{m_lock}; + erase_if(m_observers, [](auto const & observer) { return observer.expired(); }); + } return true; } auto device_registry::find(std::string_view name) const -> kstd::shared_ptr<device> { - // TODO: lock registry + auto guard = kstd::lock_guard{m_lock}; auto found = m_devices.find(kstd::string{name}); if (found == m_devices.end()) @@ -143,7 +157,7 @@ namespace kapi::devices auto device_registry::all() const -> kstd::vector<kstd::shared_ptr<device>> { - // TODO: lock registry + auto guard = kstd::lock_guard{m_lock}; auto result = kstd::vector<kstd::shared_ptr<device>>{}; @@ -160,7 +174,7 @@ namespace kapi::devices auto device_registry::subscribe(kstd::weak_ptr<device_registry_observer> observer) -> void { - // TODO: lock registry + auto guard = kstd::lock_guard{m_lock}; erase_if(m_observers, [](auto const & observer) { return observer.expired(); }); m_observers.push_back(observer); |
