aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kapi')
-rw-r--r--kernel/kapi/interrupts.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/kernel/kapi/interrupts.cpp b/kernel/kapi/interrupts.cpp
index 18a1b29d..c5925058 100644
--- a/kernel/kapi/interrupts.cpp
+++ b/kernel/kapi/interrupts.cpp
@@ -1,37 +1,42 @@
#include <kapi/interrupts.hpp>
#include <kstd/flat_map.hpp>
+#include <kstd/memory.hpp>
#include <kstd/print.hpp>
#include <kstd/vector.hpp>
#include <algorithm>
#include <cstdint>
+#include <utility>
namespace kapi::interrupts
{
namespace
{
- auto constinit handlers = kstd::flat_map<std::uint32_t, kstd::vector<handler *>>{};
+ auto constinit handlers = kstd::flat_map<std::uint32_t, kstd::vector<std::pair<handler *, kstd::weak_ptr<void>>>>{};
} // namespace
- auto register_handler(std::uint32_t irq_number, handler & handler) -> void
+ auto register_handler(std::uint32_t irq_number, handler & handler, kstd::weak_ptr<void> context) -> void
{
if (handlers.contains(irq_number))
{
auto & handler_list = handlers.at(irq_number);
- handler_list.push_back(&handler);
+ handler_list.push_back(std::pair{&handler, context});
}
else
{
- handlers.emplace(irq_number, kstd::vector{&handler});
+ handlers.emplace(irq_number, kstd::vector{
+ std::pair{&handler, context}
+ });
}
}
auto unregister_handler(std::uint32_t irq_number, handler & handler) -> void
{
auto & handler_list = handlers.at(irq_number);
- auto [first, last] = std::ranges::remove(handler_list, &handler);
+ auto [first, last] =
+ std::ranges::remove_if(handler_list, [&](auto const & entry) { return entry.first == &handler; });
handler_list.erase(first, last);
}
@@ -51,9 +56,9 @@ namespace kapi::interrupts
return status::unhandled;
}
- for (auto handler : handler_list)
+ for (auto const & [handler, context] : handler_list)
{
- if (handler && handler->handle_interrupt(irq_number) == status::handled)
+ if (handler && handler->handle_interrupt(irq_number, context) == status::handled)
{
return status::handled;
}