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