aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd/include
diff options
context:
space:
mode:
Diffstat (limited to 'libs/kstd/include')
-rw-r--r--libs/kstd/include/kstd/mutex.hpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/libs/kstd/include/kstd/mutex.hpp b/libs/kstd/include/kstd/mutex.hpp
new file mode 100644
index 0000000..cf8549f
--- /dev/null
+++ b/libs/kstd/include/kstd/mutex.hpp
@@ -0,0 +1,60 @@
+#ifndef KSTD_MUTEX_HPP
+#define KSTD_MUTEX_HPP
+
+#include <atomic>
+
+namespace kstd
+{
+ /**
+ * @brief Custom mutex implementation, that simply wraps an atomic boolean to keep track if the mutex is already in
+ * use by another thread or not.
+ */
+ struct mutex
+ {
+ /**
+ * @brief Defaulted constructor.
+ */
+ mutex() = default;
+
+ /**
+ * @brief Defaulted destructor.
+ */
+ ~mutex() = default;
+
+ /**
+ * @brief Deleted copy constructor.
+ */
+ mutex(const mutex &) = delete;
+
+ /**
+ * @brief Deleted assignment operator.
+ */
+ mutex & operator=(const mutex &) = delete;
+
+ /**
+ * @brief Lock the mutex (blocks for as long as it is not available).
+ */
+ [[gnu::section(".stl_text")]]
+ auto lock() -> void;
+
+ /**
+ * @brief Try to lock the mutex (non-blocking).
+ *
+ * @return True if lock has been acquired and false otherwise.
+ */
+ [[gnu::section(".stl_text")]]
+ auto try_lock() -> bool;
+
+ /**
+ * @brief Unlock the mutex.
+ */
+ [[gnu::section(".stl_text")]]
+ auto unlock() -> void;
+
+ private:
+ std::atomic<bool> locked = {false}; // Atomic boolean to track if mutex is locked or not.
+ };
+
+} // namespace kstd
+
+#endif \ No newline at end of file