aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/devices.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-07-23 01:38:56 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-07-23 01:38:56 +0200
commit526709a1e86d55dd88e2dbdbc471795efce9046b (patch)
tree04d9de462f506f983d3a991179eccfd68300cc14 /kernel/kapi/devices.cpp
parent0361a4912affe1594def1aa24e387fe5440afaee (diff)
downloadkernel-526709a1e86d55dd88e2dbdbc471795efce9046b.tar.xz
kernel-526709a1e86d55dd88e2dbdbc471795efce9046b.zip
kapi: bootstrap owning device tree
Diffstat (limited to 'kernel/kapi/devices.cpp')
-rw-r--r--kernel/kapi/devices.cpp56
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