This source file includes following definitions.
- opal_mutex_trylock
- opal_mutex_lock
- opal_mutex_unlock
- opal_mutex_atomic_trylock
- opal_mutex_atomic_lock
- opal_mutex_atomic_unlock
- opal_mutex_atomic_trylock
- opal_mutex_atomic_lock
- opal_mutex_atomic_unlock
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #ifndef OPAL_MUTEX_UNIX_H
25 #define OPAL_MUTEX_UNIX_H 1
26
27
28
29
30
31
32
33
34
35
36
37
38 #include "opal_config.h"
39
40 #include <pthread.h>
41 #include <errno.h>
42 #include <stdio.h>
43
44 #include "opal/class/opal_object.h"
45 #include "opal/sys/atomic.h"
46
47 BEGIN_C_DECLS
48
49 struct opal_mutex_t {
50 opal_object_t super;
51
52 pthread_mutex_t m_lock_pthread;
53
54 #if OPAL_ENABLE_DEBUG
55 int m_lock_debug;
56 const char *m_lock_file;
57 int m_lock_line;
58 #endif
59
60 opal_atomic_lock_t m_lock_atomic;
61 };
62 OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_mutex_t);
63 OPAL_DECLSPEC OBJ_CLASS_DECLARATION(opal_recursive_mutex_t);
64
65 #if defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP)
66 #define OPAL_PTHREAD_RECURSIVE_MUTEX_INITIALIZER PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
67 #elif defined(PTHREAD_RECURSIVE_MUTEX_INITIALIZER)
68 #define OPAL_PTHREAD_RECURSIVE_MUTEX_INITIALIZER PTHREAD_RECURSIVE_MUTEX_INITIALIZER
69 #endif
70
71 #if OPAL_ENABLE_DEBUG
72 #define OPAL_MUTEX_STATIC_INIT \
73 { \
74 .super = OPAL_OBJ_STATIC_INIT(opal_mutex_t), \
75 .m_lock_pthread = PTHREAD_MUTEX_INITIALIZER, \
76 .m_lock_debug = 0, \
77 .m_lock_file = NULL, \
78 .m_lock_line = 0, \
79 .m_lock_atomic = OPAL_ATOMIC_LOCK_INIT, \
80 }
81 #else
82 #define OPAL_MUTEX_STATIC_INIT \
83 { \
84 .super = OPAL_OBJ_STATIC_INIT(opal_mutex_t), \
85 .m_lock_pthread = PTHREAD_MUTEX_INITIALIZER, \
86 .m_lock_atomic = OPAL_ATOMIC_LOCK_INIT, \
87 }
88 #endif
89
90 #if defined(OPAL_PTHREAD_RECURSIVE_MUTEX_INITIALIZER)
91
92 #if OPAL_ENABLE_DEBUG
93 #define OPAL_RECURSIVE_MUTEX_STATIC_INIT \
94 { \
95 .super = OPAL_OBJ_STATIC_INIT(opal_mutex_t), \
96 .m_lock_pthread = OPAL_PTHREAD_RECURSIVE_MUTEX_INITIALIZER, \
97 .m_lock_debug = 0, \
98 .m_lock_file = NULL, \
99 .m_lock_line = 0, \
100 .m_lock_atomic = OPAL_ATOMIC_LOCK_INIT, \
101 }
102 #else
103 #define OPAL_RECURSIVE_MUTEX_STATIC_INIT \
104 { \
105 .super = OPAL_OBJ_STATIC_INIT(opal_mutex_t), \
106 .m_lock_pthread = OPAL_PTHREAD_RECURSIVE_MUTEX_INITIALIZER, \
107 .m_lock_atomic = OPAL_ATOMIC_LOCK_INIT, \
108 }
109 #endif
110
111 #endif
112
113
114
115
116
117
118
119 static inline int opal_mutex_trylock(opal_mutex_t *m)
120 {
121 #if OPAL_ENABLE_DEBUG
122 int ret = pthread_mutex_trylock(&m->m_lock_pthread);
123 if (ret == EDEADLK) {
124 errno = ret;
125 perror("opal_mutex_trylock()");
126 abort();
127 }
128 return ret;
129 #else
130 return pthread_mutex_trylock(&m->m_lock_pthread);
131 #endif
132 }
133
134 static inline void opal_mutex_lock(opal_mutex_t *m)
135 {
136 #if OPAL_ENABLE_DEBUG
137 int ret = pthread_mutex_lock(&m->m_lock_pthread);
138 if (ret == EDEADLK) {
139 errno = ret;
140 perror("opal_mutex_lock()");
141 abort();
142 }
143 #else
144 pthread_mutex_lock(&m->m_lock_pthread);
145 #endif
146 }
147
148 static inline void opal_mutex_unlock(opal_mutex_t *m)
149 {
150 #if OPAL_ENABLE_DEBUG
151 int ret = pthread_mutex_unlock(&m->m_lock_pthread);
152 if (ret == EPERM) {
153 errno = ret;
154 perror("opal_mutex_unlock");
155 abort();
156 }
157 #else
158 pthread_mutex_unlock(&m->m_lock_pthread);
159 #endif
160 }
161
162
163
164
165
166
167
168 #if OPAL_HAVE_ATOMIC_SPINLOCKS
169
170
171
172
173
174 static inline int opal_mutex_atomic_trylock(opal_mutex_t *m)
175 {
176 return opal_atomic_trylock(&m->m_lock_atomic);
177 }
178
179 static inline void opal_mutex_atomic_lock(opal_mutex_t *m)
180 {
181 opal_atomic_lock(&m->m_lock_atomic);
182 }
183
184 static inline void opal_mutex_atomic_unlock(opal_mutex_t *m)
185 {
186 opal_atomic_unlock(&m->m_lock_atomic);
187 }
188
189 #else
190
191
192
193
194
195 static inline int opal_mutex_atomic_trylock(opal_mutex_t *m)
196 {
197 return opal_mutex_trylock(m);
198 }
199
200 static inline void opal_mutex_atomic_lock(opal_mutex_t *m)
201 {
202 opal_mutex_lock(m);
203 }
204
205 static inline void opal_mutex_atomic_unlock(opal_mutex_t *m)
206 {
207 opal_mutex_unlock(m);
208 }
209
210 #endif
211
212 END_C_DECLS
213
214 #endif