|
1
|
1 #pragma once
|
|
|
2 #include <pthread.h>
|
|
|
3
|
|
|
4 namespace pfc {
|
|
|
5 class mutexAttr {
|
|
|
6 public:
|
|
|
7 mutexAttr() {pthread_mutexattr_init(&attr);}
|
|
|
8 ~mutexAttr() {pthread_mutexattr_destroy(&attr);}
|
|
|
9 void setType(int type) {pthread_mutexattr_settype(&attr, type);}
|
|
|
10 int getType() const {int rv = 0; pthread_mutexattr_gettype(&attr, &rv); return rv; }
|
|
|
11 void setRecursive() {setType(PTHREAD_MUTEX_RECURSIVE);}
|
|
|
12 bool isRecursive() {return getType() == PTHREAD_MUTEX_RECURSIVE;}
|
|
|
13 void setProcessShared() {pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);}
|
|
|
14 operator const pthread_mutexattr_t & () const {return attr;}
|
|
|
15 operator pthread_mutexattr_t & () {return attr;}
|
|
|
16 pthread_mutexattr_t attr;
|
|
|
17 private:
|
|
|
18 mutexAttr(const mutexAttr&) = delete; void operator=(const mutexAttr&) = delete;
|
|
|
19 };
|
|
|
20
|
|
|
21 class mutexBase {
|
|
|
22 public:
|
|
|
23 void lock() noexcept {pthread_mutex_lock(&obj);}
|
|
|
24 void unlock() noexcept {pthread_mutex_unlock(&obj);}
|
|
|
25
|
|
|
26 void enter() noexcept {lock();}
|
|
|
27 void leave() noexcept {unlock();}
|
|
|
28 bool tryEnter() noexcept {return pthread_mutex_trylock(&obj) == 0; }
|
|
|
29
|
|
|
30 void create( const pthread_mutexattr_t * attr );
|
|
|
31 void create( const mutexAttr & );
|
|
|
32 void createRecur();
|
|
|
33 void destroy();
|
|
|
34 protected:
|
|
|
35 mutexBase() {}
|
|
|
36 ~mutexBase() {}
|
|
|
37 private:
|
|
|
38 pthread_mutex_t obj;
|
|
|
39
|
|
|
40 void operator=( const mutexBase & ) = delete;
|
|
|
41 mutexBase( const mutexBase & ) = delete;
|
|
|
42 };
|
|
|
43
|
|
|
44
|
|
|
45
|
|
|
46 class mutex : public mutexBase {
|
|
|
47 public:
|
|
|
48 mutex() {create(NULL);}
|
|
|
49 ~mutex() {destroy();}
|
|
|
50 };
|
|
|
51
|
|
|
52 class mutexRecur : public mutexBase {
|
|
|
53 public:
|
|
|
54 mutexRecur() {createRecur();}
|
|
|
55 ~mutexRecur() {destroy();}
|
|
|
56 };
|
|
|
57
|
|
|
58
|
|
|
59 class mutexRecurStatic : public mutexBase {
|
|
|
60 public:
|
|
|
61 mutexRecurStatic() {createRecur();}
|
|
|
62 };
|
|
|
63
|
|
|
64
|
|
|
65
|
|
|
66 typedef mutexBase mutexBase_t;
|
|
|
67
|
|
|
68
|
|
|
69 class readWriteLockAttr {
|
|
|
70 public:
|
|
|
71 readWriteLockAttr() {pthread_rwlockattr_init( & attr ); }
|
|
|
72 ~readWriteLockAttr() {pthread_rwlockattr_destroy( & attr ) ;}
|
|
|
73
|
|
|
74 void setProcessShared( bool val = true ) {
|
|
|
75 pthread_rwlockattr_setpshared( &attr, val ? PTHREAD_PROCESS_SHARED : PTHREAD_PROCESS_PRIVATE );
|
|
|
76 }
|
|
|
77
|
|
|
78 pthread_rwlockattr_t attr;
|
|
|
79
|
|
|
80 private:
|
|
|
81 readWriteLockAttr(const readWriteLockAttr&) = delete;
|
|
|
82 void operator=(const readWriteLockAttr & ) = delete;
|
|
|
83 };
|
|
|
84
|
|
|
85 class readWriteLockBase {
|
|
|
86 public:
|
|
|
87 void create( const pthread_rwlockattr_t * attr );
|
|
|
88 void create( const readWriteLockAttr & );
|
|
|
89 void destroy() {pthread_rwlock_destroy( & obj ); }
|
|
|
90
|
|
|
91 void enterRead() noexcept {pthread_rwlock_rdlock( &obj ); }
|
|
|
92 void enterWrite() noexcept {pthread_rwlock_wrlock( &obj ); }
|
|
|
93 void leaveRead() noexcept {pthread_rwlock_unlock( &obj ); }
|
|
|
94 void leaveWrite() noexcept {pthread_rwlock_unlock( &obj ); }
|
|
|
95 protected:
|
|
|
96 readWriteLockBase() {}
|
|
|
97 ~readWriteLockBase() {}
|
|
|
98 private:
|
|
|
99 pthread_rwlock_t obj;
|
|
|
100
|
|
|
101 void operator=( const readWriteLockBase & ) = delete;
|
|
|
102 readWriteLockBase( const readWriteLockBase & ) = delete;
|
|
|
103 };
|
|
|
104
|
|
|
105
|
|
|
106 class readWriteLock : public readWriteLockBase {
|
|
|
107 public:
|
|
|
108 readWriteLock() {create(NULL);}
|
|
|
109 ~readWriteLock() {destroy();}
|
|
|
110 };
|
|
|
111
|
|
|
112
|
|
|
113
|
|
|
114 }
|
|
|
115
|
|
|
116
|
|
|
117
|
|
|
118 typedef pfc::mutexRecur critical_section;
|
|
|
119 typedef pfc::mutexRecurStatic critical_section_static;
|