diff foosdk/sdk/pfc/synchro.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/synchro.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,76 @@
+#pragma once
+
+#include <type_traits> // std::remove_reference
+
+#ifdef _WIN32
+#include "synchro_win.h"
+#else
+#include "synchro_nix.h"
+#endif
+
+namespace pfc {
+    class dummyLock {
+    public:
+        void enterRead() noexcept {}
+        void enterWrite() noexcept {}
+        void leaveRead() noexcept {}
+        void leaveWrite() noexcept {}
+        void enter() noexcept {}
+        void leave() noexcept {}
+        void lock() noexcept {}
+        void unlock() noexcept {}
+    };
+    
+    template<typename mutex_t>
+    class mutexScope_ {
+    private:
+        typedef mutexScope_<mutex_t> self_t;
+    public:
+        mutexScope_( mutex_t * m ) noexcept : m_mutex(m) { m_mutex->enter(); }
+        mutexScope_( mutex_t & m ) noexcept : m_mutex(&m) { m_mutex->enter(); }
+        ~mutexScope_( ) noexcept {m_mutex->leave();}
+    private:
+        void operator=( const self_t & ) = delete;
+        mutexScope_(const self_t & ) = delete;
+        
+        mutex_t * m_mutex;
+    };
+    typedef mutexScope_<mutexBase_t> mutexScope;
+
+    template<typename lock_t>
+    class _readWriteLock_scope_read {
+    public:
+        _readWriteLock_scope_read( lock_t & lock ) noexcept : m_lock( lock ) { m_lock.enterRead(); }
+        ~_readWriteLock_scope_read() noexcept {m_lock.leaveRead();}
+    private:
+        _readWriteLock_scope_read( const _readWriteLock_scope_read &) = delete;
+        void operator=( const _readWriteLock_scope_read &) = delete;
+        lock_t & m_lock;
+    };
+    template<typename lock_t>
+    class _readWriteLock_scope_write {
+    public:
+        _readWriteLock_scope_write( lock_t & lock ) noexcept : m_lock( lock ) { m_lock.enterWrite(); }
+        ~_readWriteLock_scope_write() noexcept {m_lock.leaveWrite();}
+    private:
+        _readWriteLock_scope_write( const _readWriteLock_scope_write &) = delete;
+        void operator=( const _readWriteLock_scope_write &) = delete;
+        lock_t & m_lock;
+    };
+}
+
+
+#define PFC_INSYNC_READ( X ) ::pfc::_readWriteLock_scope_read<typename std::remove_reference<decltype(X)>::type > _asdf_l_readWriteLock_scope_read( X )
+#define PFC_INSYNC_WRITE( X ) ::pfc::_readWriteLock_scope_write<typename std::remove_reference<decltype(X)>::type > _asdf_l_readWriteLock_scope_write( X )
+
+typedef pfc::mutexScope c_insync;
+
+#define PFC_INSYNC(X) pfc::mutexScope_< typename std::remove_reference<decltype(X)>::type > blah____sync(X)
+
+
+
+// Legacy macros
+#define inReadSync( X ) PFC_INSYNC_READ(X)
+#define inWriteSync( X ) PFC_INSYNC_WRITE(X)
+#define insync( X ) PFC_INSYNC(X)
+