#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_init_was_called.test_and_set()) { kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {}:{}:{} already initialized", name(), major(), minor()); return true; } if (!probe()) { kstd::println(kstd::print_sink::stderr, "[OS:DEV] Bus {}:{}:{} probe failed", name(), major(), minor()); return false; } auto child_status = 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; }); m_initialized.test_and_set(); return child_status; } 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