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