diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-03-27 07:05:05 +0100 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-03-27 07:05:05 +0100 |
| commit | 3070bb45b9741165d786b2c5a018ee55c1a82db8 (patch) | |
| tree | 774dd9361ab4ad87b9fa57a4216d30eaa1007be6 /kernel/kapi | |
| parent | 11c6d57e013832983bcd9bb965d470bf4c282ab6 (diff) | |
| download | teachos-3070bb45b9741165d786b2c5a018ee55c1a82db8.tar.xz teachos-3070bb45b9741165d786b2c5a018ee55c1a82db8.zip | |
kernel/interrupts: switch to flat_map for dispatch
Diffstat (limited to 'kernel/kapi')
| -rw-r--r-- | kernel/kapi/interrupts.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/kernel/kapi/interrupts.cpp b/kernel/kapi/interrupts.cpp index e172e70..0e37bc3 100644 --- a/kernel/kapi/interrupts.cpp +++ b/kernel/kapi/interrupts.cpp @@ -1,10 +1,10 @@ #include "kapi/interrupts.hpp" +#include <kstd/flat_map> #include <kstd/print> #include <kstd/vector> #include <algorithm> -#include <array> #include <cstdint> namespace kapi::interrupts @@ -12,13 +12,20 @@ namespace kapi::interrupts namespace { - auto constinit handlers = std::array<kstd::vector<handler *>, 256>{}; + auto constinit handlers = kstd::flat_map<std::uint32_t, kstd::vector<handler *>>{}; } // namespace auto register_handler(std::uint32_t irq_number, handler & handler) -> void { - auto & handler_list = handlers.at(irq_number); - handler_list.push_back(&handler); + if (handlers.contains(irq_number)) + { + auto & handler_list = handlers.at(irq_number); + handler_list.push_back(&handler); + } + else + { + handlers.emplace(irq_number, kstd::vector{&handler}); + } } auto unregister_handler(std::uint32_t irq_number, handler & handler) -> void @@ -30,6 +37,12 @@ namespace kapi::interrupts auto dispatch(std::uint32_t irq_number) -> status { + if (!handlers.contains(irq_number)) + { + kstd::println(kstd::print_sink::stderr, "[OS:interrupts] No handler for IRQ{}", irq_number); + return status::unhandled; + } + auto & handler_list = handlers.at(irq_number); if (handler_list.empty()) |
