diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-23 01:38:56 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-23 01:38:56 +0200 |
| commit | 526709a1e86d55dd88e2dbdbc471795efce9046b (patch) | |
| tree | 04d9de462f506f983d3a991179eccfd68300cc14 /kernel/kapi/devices.cpp | |
| parent | 0361a4912affe1594def1aa24e387fe5440afaee (diff) | |
| download | kernel-526709a1e86d55dd88e2dbdbc471795efce9046b.tar.xz kernel-526709a1e86d55dd88e2dbdbc471795efce9046b.zip | |
kapi: bootstrap owning device tree
Diffstat (limited to 'kernel/kapi/devices.cpp')
| -rw-r--r-- | kernel/kapi/devices.cpp | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/kernel/kapi/devices.cpp b/kernel/kapi/devices.cpp index 6da503d9..8f3011fe 100644 --- a/kernel/kapi/devices.cpp +++ b/kernel/kapi/devices.cpp @@ -10,7 +10,6 @@ #include <kstd/print.hpp> #include <kstd/string.hpp> -#include <optional> #include <string_view> #include <utility> @@ -18,37 +17,55 @@ namespace kapi::devices { namespace { - auto constinit root_bus = std::optional<kernel::devices::root_bus>{}; - auto constinit device_tree = kstd::flat_map<kstd::string, kstd::observer_ptr<device>>{}; + auto constinit root_bus = kstd::shared_ptr<kernel::devices::root_bus>{}; + auto constinit device_tree = kstd::flat_map<kstd::string, kstd::weak_ptr<device>>{}; } // namespace auto init() -> void { - if (root_bus.has_value()) + if (root_bus) { kapi::system::panic("[OS:DEV] The device subsystem has already been initialized"); } interface_registry::init(); - auto & bus = root_bus.emplace(); - register_device(bus); - bus.init(); + root_bus = kstd::make_shared<kernel::devices::root_bus>(); + register_device(root_bus); + root_bus->init(); } - auto get_root_bus() -> bus & + auto get_root_bus() -> kstd::shared_ptr<bus> { - if (!root_bus.has_value()) + if (!root_bus) { kapi::system::panic("[OS:DEV] Root bus not initialized!"); } - return *root_bus; + return root_bus; } - auto register_device(device & device) -> bool + auto register_device(kstd::shared_ptr<device> device) -> bool { - kstd::println("[OS:DEV] Registering device {}", device.name()); - return device_tree.emplace(device.name(), &device).second; + if (!device) + { + return false; + } + + kstd::println("[OS:DEV] Registering device {}", device->name()); + + auto found = device_tree.find(device->name()); + if (found != device_tree.end()) + { + if (!found->second.expired()) + { + return false; + } + + found->second = device; + return true; + } + + return device_tree.emplace(device->name(), device).second; } auto unregister_device(device &) -> bool @@ -57,16 +74,15 @@ namespace kapi::devices return false; } - auto find_device(std::string_view name) -> kstd::observer_ptr<device> + auto find_device(std::string_view name) -> kstd::shared_ptr<device> { - for (auto const & [key, value] : device_tree) + auto found = device_tree.find(kstd::string{name}); + if (found == device_tree.end()) { - if (value->name() == name) - { - return value; - } + return nullptr; } - return nullptr; + + return found->second.lock(); } } // namespace kapi::devices |
