root/opal/mca/pmix/pmix4x/pmix/src/threads/thread_usage.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   4  *                         University Research and Technology
   5  *                         Corporation.  All rights reserved.
   6  * Copyright (c) 2004-2007 The University of Tennessee and The University
   7  *                         of Tennessee Research Foundation.  All rights
   8  *                         reserved.
   9  * Copyright (c) 2004-2006 High Performance Computing Center Stuttgart,
  10  *                         University of Stuttgart.  All rights reserved.
  11  * Copyright (c) 2004-2005 The Regents of the University of California.
  12  *                         All rights reserved.
  13  * Copyright (c) 2007-2014 Cisco Systems, Inc.  All rights reserved.
  14  * Copyright (c) 2014-2016 Research Organization for Information Science
  15  *                         and Technology (RIST). All rights reserved.
  16  * Copyright (c) 2015-2017 Los Alamos National Security, LLC. All rights
  17  *                         reserved.
  18  * Copyright (c) 2018-2019 Intel, Inc.  All rights reserved.
  19  * $COPYRIGHT$
  20  *
  21  * Additional copyrights may follow
  22  *
  23  * $HEADER$
  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  * Use an atomic operation for increment/decrement
  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 /* define 64-bit macros is 64-bit atomic math is available */
 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 /* thread local storage */
 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 /* PMIX_C_HAVE__THREAD_LOCAL */
 172 #define pmix_thread_local __thread
 173 #define PMIX_HAVE_THREAD_LOCAL 1
 174 #endif /* PMIX_C_HAVE___THREAD */
 175 
 176 #if !defined(PMIX_HAVE_THREAD_LOCAL)
 177 #define PMIX_HAVE_THREAD_LOCAL 0
 178 #endif /* !defined(PMIX_HAVE_THREAD_LOCAL) */
 179 
 180 #endif /* !defined(PMIX_THREAD_USAGE_H) */

/* [<][>][^][v][top][bottom][index][help] */