Przeglądaj źródła

feat(lock): add lock_guards

greatbridf 2 lat temu
rodzic
commit
c1d7c094e0
1 zmienionych plików z 40 dodań i 0 usunięć
  1. 40 0
      include/types/lock.hpp

+ 40 - 0
include/types/lock.hpp

@@ -25,3 +25,43 @@ inline void spin_unlock(uint32_t volatile* lock_addr)
         : "r"(lock_addr)
         : "eax", "memory");
 }
+
+namespace types {
+
+struct mutex {
+    using mtx_t = volatile uint32_t;
+
+    mtx_t m_lock = 0;
+
+    inline void lock(void)
+    {
+        spin_lock(&m_lock);
+    }
+
+    inline void unlock(void)
+    {
+        spin_unlock(&m_lock);
+    }
+};
+
+class lock_guard {
+private:
+    mutex& m_mtx;
+
+public:
+    explicit lock_guard(mutex& mtx)
+        : m_mtx(mtx)
+    {
+        mtx.lock();
+    }
+
+    lock_guard(const lock_guard&) = delete;
+    lock_guard(lock_guard&&) = delete;
+
+    ~lock_guard()
+    {
+        m_mtx.unlock();
+    }
+};
+
+} // namespace types