annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <type_traits> // std::remove_reference
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include "synchro_win.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #include "synchro_nix.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 class dummyLock {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 void enterRead() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void enterWrite() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 void leaveRead() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 void leaveWrite() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 void enter() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 void leave() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 void lock() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 void unlock() noexcept {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 template<typename mutex_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 class mutexScope_ {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 typedef mutexScope_<mutex_t> self_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 mutexScope_( mutex_t * m ) noexcept : m_mutex(m) { m_mutex->enter(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 mutexScope_( mutex_t & m ) noexcept : m_mutex(&m) { m_mutex->enter(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 ~mutexScope_( ) noexcept {m_mutex->leave();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 void operator=( const self_t & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 mutexScope_(const self_t & ) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 mutex_t * m_mutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 typedef mutexScope_<mutexBase_t> mutexScope;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 template<typename lock_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 class _readWriteLock_scope_read {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 _readWriteLock_scope_read( lock_t & lock ) noexcept : m_lock( lock ) { m_lock.enterRead(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 ~_readWriteLock_scope_read() noexcept {m_lock.leaveRead();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 _readWriteLock_scope_read( const _readWriteLock_scope_read &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 void operator=( const _readWriteLock_scope_read &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 lock_t & m_lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 template<typename lock_t>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 class _readWriteLock_scope_write {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 _readWriteLock_scope_write( lock_t & lock ) noexcept : m_lock( lock ) { m_lock.enterWrite(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 ~_readWriteLock_scope_write() noexcept {m_lock.leaveWrite();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 _readWriteLock_scope_write( const _readWriteLock_scope_write &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 void operator=( const _readWriteLock_scope_write &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 lock_t & m_lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 #define PFC_INSYNC_READ( X ) ::pfc::_readWriteLock_scope_read<typename std::remove_reference<decltype(X)>::type > _asdf_l_readWriteLock_scope_read( X )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 #define PFC_INSYNC_WRITE( X ) ::pfc::_readWriteLock_scope_write<typename std::remove_reference<decltype(X)>::type > _asdf_l_readWriteLock_scope_write( X )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 typedef pfc::mutexScope c_insync;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 #define PFC_INSYNC(X) pfc::mutexScope_< typename std::remove_reference<decltype(X)>::type > blah____sync(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 // Legacy macros
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 #define inReadSync( X ) PFC_INSYNC_READ(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 #define inWriteSync( X ) PFC_INSYNC_WRITE(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 #define insync( X ) PFC_INSYNC(X)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76