From cf500b301ee3f518ea391ea21e39853b7e7a37c8 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Sun, 26 Jul 2026 20:33:10 +0200 Subject: kapi: implement a simple, tracked mutex --- kernel/CMakeLists.txt | 1 + kernel/kapi/tracked_mutex.cpp | 55 +++++++++++++++++++++++++++++++++ kernel/kernel/test_support/kapi/cpu.cpp | 7 +++++ 3 files changed, 63 insertions(+) create mode 100644 kernel/kapi/tracked_mutex.cpp (limited to 'kernel') diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index d22ad107..a97c1e4a 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -24,6 +24,7 @@ target_sources("kernel_lib" PRIVATE "kapi/interrupts.cpp" "kapi/memory.cpp" "kapi/system.cpp" + "kapi/tracked_mutex.cpp" # Kernel-defined KSTD Implementation "kstd/os.cpp" diff --git a/kernel/kapi/tracked_mutex.cpp b/kernel/kapi/tracked_mutex.cpp new file mode 100644 index 00000000..6608169c --- /dev/null +++ b/kernel/kapi/tracked_mutex.cpp @@ -0,0 +1,55 @@ +#include + +#include +#include + +#include + +namespace kapi +{ + + auto tracked_mutex::lock() -> void + { + auto self = kapi::cpu::current_id(); + auto expected = kapi::cpu::invalid_id; + + while (!m_owner.compare_exchange_weak(expected, self, std::memory_order::acquire, std::memory_order::relaxed)) + { + if (expected == self) + { + system::panic("[OS] CPU {} tried to reacquire a mutex it already holds!", self); + } + expected = kapi::cpu::invalid_id; + } + } + + auto tracked_mutex::try_lock() -> bool + { + auto self = kapi::cpu::current_id(); + auto expected = kapi::cpu::invalid_id; + + if (m_owner.compare_exchange_strong(expected, self, std::memory_order::acquire, std::memory_order::relaxed)) + { + return true; + } + + if (expected == self) + { + system::panic("[OS] CPU {} tried to reacquire a mutex it already holds!", self); + } + + return false; + } + + auto tracked_mutex::unlock() -> void + { + auto self = kapi::cpu::current_id(); + auto expected = self; + + if (!m_owner.compare_exchange_strong(expected, kapi::cpu::invalid_id, std::memory_order::release)) + { + system::panic("[OS] CPU {} released a mutex it did not hold!", self); + } + } + +} // namespace kapi \ No newline at end of file diff --git a/kernel/kernel/test_support/kapi/cpu.cpp b/kernel/kernel/test_support/kapi/cpu.cpp index 5d956331..a82dc348 100644 --- a/kernel/kernel/test_support/kapi/cpu.cpp +++ b/kernel/kernel/test_support/kapi/cpu.cpp @@ -3,7 +3,9 @@ #include #include +#include #include +#include namespace { @@ -34,6 +36,11 @@ namespace kapi::cpu return true; } + auto current_id() -> id + { + return id{.value = std::hash{}(std::this_thread::get_id())}; + } + } // namespace kapi::cpu namespace kernel::tests::cpu -- cgit v1.2.3