From 569f0e50663095e8ba7363cdab5421d0aeb9e6c3 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Tue, 29 Sep 2026 12:40:48 +0200 Subject: kapi/interrupts: add tests --- kernel/kapi/interrupts.stress.cpp | 65 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 kernel/kapi/interrupts.stress.cpp (limited to 'kernel/kapi/interrupts.stress.cpp') diff --git a/kernel/kapi/interrupts.stress.cpp b/kernel/kapi/interrupts.stress.cpp new file mode 100644 index 00000000..d3baf7b8 --- /dev/null +++ b/kernel/kapi/interrupts.stress.cpp @@ -0,0 +1,65 @@ +#include + +#include + +#include + +#include +#include + +SCENARIO("irq_lock remote unlock protection", "[kapi][interrupts]") +{ + GIVEN("a simple irq_lock") + { + auto lock = kapi::interrupts::irq_lock{}; + + WHEN("it is locked on the main core") + { + auto guard = std::lock_guard{lock}; + + THEN("unlocking it on a different core panics") + { + auto unlocker = [&] { + try + { + lock.unlock(); + return false; + } + catch (kernel::tests::cpu::halt const &) + { + return true; + } + }; + + auto result = std::async(std::launch::async, unlocker); + + REQUIRE(result.get()); + } + } + } + + GIVEN("A heap allocated irq_lock") + { + // We use plain new-delete here, since the destruction path of std::shared_ptr is fully noexcept. + auto lock = new kapi::interrupts::irq_lock<>{}; + + THEN("destroying it on a different core panics") + { + auto destroyer = [&] { + try + { + delete lock; + return false; + } + catch (kernel::tests::cpu::halt const &) + { + return true; + } + }; + + auto result = std::async(std::launch::async, destroyer); + + REQUIRE(result.get()); + } + } +} \ No newline at end of file -- cgit v1.2.3