aboutsummaryrefslogtreecommitdiff
path: root/libs/kstd
diff options
context:
space:
mode:
Diffstat (limited to 'libs/kstd')
-rw-r--r--libs/kstd/CMakeLists.txt24
-rw-r--r--libs/kstd/include/kstd/mutex.hpp60
-rw-r--r--libs/kstd/src/mutex.cpp16
3 files changed, 100 insertions, 0 deletions
diff --git a/libs/kstd/CMakeLists.txt b/libs/kstd/CMakeLists.txt
new file mode 100644
index 0000000..06083f3
--- /dev/null
+++ b/libs/kstd/CMakeLists.txt
@@ -0,0 +1,24 @@
+cmake_minimum_required(VERSION "3.27")
+
+project("kstd"
+ LANGUAGES CXX
+ VERSION "1.0.0"
+)
+
+add_library("kstd" STATIC)
+add_library("libs::kstd" ALIAS "kstd")
+
+target_sources("kstd" PRIVATE
+ "src/mutex.cpp"
+)
+
+target_sources("kstd" PUBLIC
+ FILE_SET HEADERS
+ BASE_DIRS "include"
+ FILES
+ "include/kstd/mutex.hpp"
+)
+
+target_include_directories("kstd" PUBLIC
+ "include"
+)
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
diff --git a/libs/kstd/src/mutex.cpp b/libs/kstd/src/mutex.cpp
new file mode 100644
index 0000000..cfb1c84
--- /dev/null
+++ b/libs/kstd/src/mutex.cpp
@@ -0,0 +1,16 @@
+#include "kstd/mutex.hpp"
+
+namespace kstd
+{
+ auto mutex::lock() -> void
+ {
+ while (!try_lock())
+ {
+ asm volatile("nop");
+ }
+ }
+
+ auto mutex::try_lock() -> bool { return !locked.exchange(true, std::memory_order_acquire); }
+
+ auto mutex::unlock() -> void { locked.store(false, std::memory_order_release); }
+} // namespace kstd