diff foosdk/sdk/pfc/threadSafeObj.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/pfc/threadSafeObj.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,39 @@
+#pragma once
+namespace pfc {
+
+    template<typename obj_t_, typename mutex_t_>
+    struct threadSafeObjCommon {
+        typedef mutex_t_ mutex_t;
+        typedef obj_t_ obj_t;
+        template<typename ... arg_t> threadSafeObjCommon( arg_t && ... arg ) : m_obj(std::forward<arg_t>(arg) ... ) {}
+        mutex_t m_mutex;
+        obj_t m_obj;
+    };
+
+    template<typename common_t>
+    class threadSafeObjLock {
+        typedef threadSafeObjLock<common_t> self_t;
+        common_t & m_common;
+    public:
+        typename common_t::obj_t & operator*() { return m_common.m_obj; }
+        typename common_t::obj_t * operator->() { return & m_common.m_obj; }
+        
+        threadSafeObjLock( common_t & arg ) : m_common(arg) { m_common.m_mutex.lock(); }
+        ~threadSafeObjLock( ) { m_common.m_mutex.unlock(); }
+        threadSafeObjLock( const self_t & ) = delete;
+        void operator=( const self_t & ) = delete;
+    };
+
+    template<typename obj_t, typename mutex_t = pfc::mutex>
+    class threadSafeObj {
+        typedef threadSafeObjCommon<obj_t, mutex_t> common_t;
+        typedef threadSafeObjLock<common_t> lock_t;
+        common_t m_common;
+    public:
+        template<typename ... arg_t>
+        threadSafeObj( arg_t && ... arg ) : m_common( std::forward<arg_t>(arg) ... ) {}
+        
+        lock_t get() { return lock_t(m_common); }
+    };
+
+}