1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #if !defined(PMIX_THREAD_USAGE_H)
27 #define PMIX_THREAD_USAGE_H
28
29 #include "pmix_config.h"
30
31 #include "src/atomics/sys/atomic.h"
32 #include "src/include/prefetch.h"
33
34
35
36
37
38
39 #define PMIX_THREAD_DEFINE_ATOMIC_OP(type, name, operator, suffix) \
40 __pmix_attribute_always_inline__ static inline type pmix_thread_ ## name ## _fetch_ ## suffix (pmix_atomic_ ## type *addr, type delta) \
41 { \
42 return pmix_atomic_ ## name ## _fetch_ ## suffix (addr, delta); \
43 } \
44 \
45 __pmix_attribute_always_inline__ static inline type pmix_thread_fetch_ ## name ## _ ## suffix (pmix_atomic_ ## type *addr, type delta) \
46 { \
47 return pmix_atomic_fetch_ ## name ## _ ## suffix (addr, delta); \
48 }
49
50 #define PMIX_THREAD_DEFINE_ATOMIC_COMPARE_EXCHANGE(type, addr_type, suffix) \
51 __pmix_attribute_always_inline__ static inline bool pmix_thread_compare_exchange_strong_ ## suffix (pmix_atomic_ ## addr_type *addr, type *compare, type value) \
52 { \
53 return pmix_atomic_compare_exchange_strong_ ## suffix (addr, (addr_type *) compare, (addr_type) value); \
54 }
55
56 #define PMIX_THREAD_DEFINE_ATOMIC_SWAP(type, addr_type, suffix) \
57 __pmix_attribute_always_inline__ static inline type pmix_thread_swap_ ## suffix (pmix_atomic_ ## addr_type *ptr, type newvalue) \
58 { \
59 return (type) pmix_atomic_swap_ ## suffix (ptr, (addr_type) newvalue); \
60 }
61
62 PMIX_THREAD_DEFINE_ATOMIC_OP(int32_t, add, +, 32)
63 PMIX_THREAD_DEFINE_ATOMIC_OP(size_t, add, +, size_t)
64 PMIX_THREAD_DEFINE_ATOMIC_OP(int32_t, and, &, 32)
65 PMIX_THREAD_DEFINE_ATOMIC_OP(int32_t, or, |, 32)
66 PMIX_THREAD_DEFINE_ATOMIC_OP(int32_t, xor, ^, 32)
67 PMIX_THREAD_DEFINE_ATOMIC_OP(int32_t, sub, -, 32)
68 PMIX_THREAD_DEFINE_ATOMIC_OP(size_t, sub, -, size_t)
69
70 PMIX_THREAD_DEFINE_ATOMIC_COMPARE_EXCHANGE(int32_t, int32_t, 32)
71 PMIX_THREAD_DEFINE_ATOMIC_COMPARE_EXCHANGE(void *, intptr_t, ptr)
72 PMIX_THREAD_DEFINE_ATOMIC_SWAP(int32_t, int32_t, 32)
73 PMIX_THREAD_DEFINE_ATOMIC_SWAP(void *, intptr_t, ptr)
74
75 #define PMIX_THREAD_ADD_FETCH32 pmix_thread_add_fetch_32
76 #define PMIX_ATOMIC_ADD_FETCH32 pmix_thread_add_fetch_32
77
78 #define PMIX_THREAD_AND_FETCH32 pmix_thread_and_fetch_32
79 #define PMIX_ATOMIC_AND_FETCH32 pmix_thread_and_fetch_32
80
81 #define PMIX_THREAD_OR_FETCH32 pmix_thread_or_fetch_32
82 #define PMIX_ATOMIC_OR_FETCH32 pmix_thread_or_fetch_32
83
84 #define PMIX_THREAD_XOR_FETCH32 pmix_thread_xor_fetch_32
85 #define PMIX_ATOMIC_XOR_FETCH32 pmix_thread_xor_fetch_32
86
87 #define PMIX_THREAD_ADD_FETCH_SIZE_T pmix_thread_add_fetch_size_t
88 #define PMIX_ATOMIC_ADD_FETCH_SIZE_T pmix_thread_add_fetch_size_t
89
90 #define PMIX_THREAD_SUB_FETCH_SIZE_T pmix_thread_sub_fetch_size_t
91 #define PMIX_ATOMIC_SUB_FETCH_SIZE_T pmix_thread_sub_fetch_size_t
92
93 #define PMIX_THREAD_FETCH_ADD32 pmix_thread_fetch_add_32
94 #define PMIX_ATOMIC_FETCH_ADD32 pmix_thread_fetch_add_32
95
96 #define PMIX_THREAD_FETCH_AND32 pmix_thread_fetch_and_32
97 #define PMIX_ATOMIC_FETCH_AND32 pmix_thread_fetch_and_32
98
99 #define PMIX_THREAD_FETCH_OR32 pmix_thread_fetch_or_32
100 #define PMIX_ATOMIC_FETCH_OR32 pmix_thread_fetch_or_32
101
102 #define PMIX_THREAD_FETCH_XOR32 pmix_thread_fetch_xor_32
103 #define PMIX_ATOMIC_FETCH_XOR32 pmix_thread_fetch_xor_32
104
105 #define PMIX_THREAD_FETCH_ADD_SIZE_T pmix_thread_fetch_add_size_t
106 #define PMIX_ATOMIC_FETCH_ADD_SIZE_T pmix_thread_fetch_add_size_t
107
108 #define PMIX_THREAD_FETCH_SUB_SIZE_T pmix_thread_fetch_sub_size_t
109 #define PMIX_ATOMIC_FETCH_SUB_SIZE_T pmix_thread_fetch_sub_size_t
110
111 #define PMIX_THREAD_COMPARE_EXCHANGE_STRONG_32 pmix_thread_compare_exchange_strong_32
112 #define PMIX_ATOMIC_COMPARE_EXCHANGE_STRONG_32 pmix_thread_compare_exchange_strong_32
113
114 #define PMIX_THREAD_COMPARE_EXCHANGE_STRONG_PTR(x, y, z) pmix_thread_compare_exchange_strong_ptr ((pmix_atomic_intptr_t *) x, (intptr_t *) y, (intptr_t) z)
115 #define PMIX_ATOMIC_COMPARE_EXCHANGE_STRONG_PTR PMIX_THREAD_COMPARE_EXCHANGE_STRONG_PTR
116
117 #define PMIX_THREAD_SWAP_32 pmix_thread_swap_32
118 #define PMIX_ATOMIC_SWAP_32 pmix_thread_swap_32
119
120 #define PMIX_THREAD_SWAP_PTR(x, y) pmix_thread_swap_ptr ((pmix_atomic_intptr_t *) x, (intptr_t) y)
121 #define PMIX_ATOMIC_SWAP_PTR PMIX_THREAD_SWAP_PTR
122
123
124 #if PMIX_HAVE_ATOMIC_MATH_64
125
126 PMIX_THREAD_DEFINE_ATOMIC_OP(int64_t, add, +, 64)
127 PMIX_THREAD_DEFINE_ATOMIC_OP(int64_t, and, &, 64)
128 PMIX_THREAD_DEFINE_ATOMIC_OP(int64_t, or, |, 64)
129 PMIX_THREAD_DEFINE_ATOMIC_OP(int64_t, xor, ^, 64)
130 PMIX_THREAD_DEFINE_ATOMIC_OP(int64_t, sub, -, 64)
131 PMIX_THREAD_DEFINE_ATOMIC_COMPARE_EXCHANGE(int64_t, int64_t, 64)
132 PMIX_THREAD_DEFINE_ATOMIC_SWAP(int64_t, int64_t, 64)
133
134 #define PMIX_THREAD_ADD_FETCH64 pmix_thread_add_fetch_64
135 #define PMIX_ATOMIC_ADD_FETCH64 pmix_thread_add_fetch_64
136
137 #define PMIX_THREAD_AND_FETCH64 pmix_thread_and_fetch_64
138 #define PMIX_ATOMIC_AND_FETCH64 pmix_thread_and_fetch_64
139
140 #define PMIX_THREAD_OR_FETCH64 pmix_thread_or_fetch_64
141 #define PMIX_ATOMIC_OR_FETCH64 pmix_thread_or_fetch_64
142
143 #define PMIX_THREAD_XOR_FETCH64 pmix_thread_xor_fetch_64
144 #define PMIX_ATOMIC_XOR_FETCH64 pmix_thread_xor_fetch_64
145
146 #define PMIX_THREAD_FETCH_ADD64 pmix_thread_fetch_add_64
147 #define PMIX_ATOMIC_FETCH_ADD64 pmix_thread_fetch_add_64
148
149 #define PMIX_THREAD_FETCH_AND64 pmix_thread_fetch_and_64
150 #define PMIX_ATOMIC_FETCH_AND64 pmix_thread_fetch_and_64
151
152 #define PMIX_THREAD_FETCH_OR64 pmix_thread_fetch_or_64
153 #define PMIX_ATOMIC_FETCH_OR64 pmix_thread_fetch_or_64
154
155 #define PMIX_THREAD_FETCH_XOR64 pmix_thread_fetch_xor_64
156 #define PMIX_ATOMIC_FETCH_XOR64 pmix_thread_fetch_xor_64
157
158 #define PMIX_THREAD_COMPARE_EXCHANGE_STRONG_64 pmix_thread_compare_exchange_strong_64
159 #define PMIX_ATOMIC_COMPARE_EXCHANGE_STRONG_64 pmix_thread_compare_exchange_strong_64
160
161 #define PMIX_THREAD_SWAP_64 pmix_thread_swap_64
162 #define PMIX_ATOMIC_SWAP_64 pmix_thread_swap_64
163
164 #endif
165
166
167 #if PMIX_C_HAVE__THREAD_LOCAL
168 #define pmix_thread_local _Thread_local
169 #define PMIX_HAVE_THREAD_LOCAL 1
170
171 #elif PMIX_C_HAVE___THREAD
172 #define pmix_thread_local __thread
173 #define PMIX_HAVE_THREAD_LOCAL 1
174 #endif
175
176 #if !defined(PMIX_HAVE_THREAD_LOCAL)
177 #define PMIX_HAVE_THREAD_LOCAL 0
178 #endif
179
180 #endif