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