diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-09-30 11:43:54 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-09-30 11:43:54 +0200 |
| commit | ee4096101da245a792cd4df68973585305d09087 (patch) | |
| tree | 982df6acd03b7a13d24a9eae665d7905376e54b3 /kernel/kapi/interrupts.stress.cpp | |
| parent | 5bad38935238da045d9fd467eae9dfd958deea34 (diff) | |
| parent | a8f2e1a0edc37cd1c06447c42ff94f3370e8a6bc (diff) | |
| download | kernel-ee4096101da245a792cd4df68973585305d09087.tar.xz kernel-ee4096101da245a792cd4df68973585305d09087.zip | |
Merge branch 'fmorgner/implement-interrupt-locking' into 'develop'
kapi/interrupts: implement irq_lock
See merge request teachos/kernel!61
Diffstat (limited to 'kernel/kapi/interrupts.stress.cpp')
| -rw-r--r-- | kernel/kapi/interrupts.stress.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
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 <kapi/interrupts.hpp> + +#include <kernel/test_support/cpu.hpp> + +#include <catch2/catch_test_macros.hpp> + +#include <future> +#include <mutex> + +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 |
