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/kapi | |
| parent | 4ab9ce4a821e477f097f19e94a0239299fbe25ea (diff) | |
| download | kernel-cf500b301ee3f518ea391ea21e39853b7e7a37c8.tar.xz kernel-cf500b301ee3f518ea391ea21e39853b7e7a37c8.zip | |
kapi: implement a simple, tracked mutex
Diffstat (limited to 'kernel/kapi')
| -rw-r--r-- | kernel/kapi/tracked_mutex.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
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 |
