#include "kapi/devices/bus.hpp" #include "kapi/devices.hpp" #include "kapi/system.hpp" #include #include #include #include #include #include #include namespace kapi::devices { bus::bus(std::size_t major, std::size_t minor, kstd::string const & name) : device(major, minor, name) {} auto bus::init() -> bool { if (m_initialized.test_and_set()) { return true; } if (!probe()) { return false; } return std::ranges::fold_left(m_devices, true, [&](bool acc, auto & child) -> bool { kstd::println("[OS:DEV] Initializing child device {}@{}", child->name(), name()); return child->init() && acc; }); } auto bus::add_child(kstd::unique_ptr child) -> void { auto observer = m_observers.emplace_back(child.get()); m_devices.push_back(std::move(child)); kapi::devices::register_device(*observer); if (m_initialized.test()) { kstd::println("[OS:DEV] Initializing child device {}@{}", observer->name(), name()); if (!observer->init()) { kapi::system::panic("[OS:DEV] Failed to initialize child device"); } } } [[nodiscard]] auto bus::children() const -> kstd::vector> const & { return m_observers; } auto bus::probe() -> bool { return true; } } // namespace kapi::devices