diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-26 20:33:10 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-26 20:33:10 +0200 |
| commit | cf500b301ee3f518ea391ea21e39853b7e7a37c8 (patch) | |
| tree | bbaa5d9c31d47714c61ab9447efc783c365b85ed /kernel | |
| parent | 4ab9ce4a821e477f097f19e94a0239299fbe25ea (diff) | |
| download | kernel-cf500b301ee3f518ea391ea21e39853b7e7a37c8.tar.xz kernel-cf500b301ee3f518ea391ea21e39853b7e7a37c8.zip | |
kapi: implement a simple, tracked mutex
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | kernel/kapi/tracked_mutex.cpp | 55 | ||||
| -rw-r--r-- | kernel/kernel/test_support/kapi/cpu.cpp | 7 |
3 files changed, 63 insertions, 0 deletions
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 <kapi/tracked_mutex.hpp> + +#include <kapi/cpu.hpp> +#include <kapi/system.hpp> + +#include <atomic> + +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 <kapi/cpu.hpp> #include <atomic> +#include <functional> #include <stdexcept> +#include <thread> namespace { @@ -34,6 +36,11 @@ namespace kapi::cpu return true; } + auto current_id() -> id + { + return id{.value = std::hash<std::thread::id>{}(std::this_thread::get_id())}; + } + } // namespace kapi::cpu namespace kernel::tests::cpu |
