diff options
Diffstat (limited to 'kernel/src/generic/lock/mutex.hpp')
| -rw-r--r-- | kernel/src/generic/lock/mutex.hpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/kernel/src/generic/lock/mutex.hpp b/kernel/src/generic/lock/mutex.hpp new file mode 100644 index 0000000..d48b0b4 --- /dev/null +++ b/kernel/src/generic/lock/mutex.hpp @@ -0,0 +1,35 @@ +#pragma once +#include <cstdint> +#include <atomic> + +#include <generic/lock/spinlock.hpp> +#include <generic/scheduling.hpp> + +namespace locks { + class mutex { + private: + std::atomic_flag flag = ATOMIC_FLAG_INIT; + + public: + void lock() { + if(locks::is_disabled) + return; + + while (flag.test_and_set(std::memory_order_acquire)) { + process::yield(); + } + } + + void unlock() { + flag.clear(std::memory_order_release); + } + + bool test() { + return flag.test(); + } + + bool try_lock() { + return !flag.test_and_set(std::memory_order_acquire); + } + }; +};
\ No newline at end of file |
