Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _GLIBCXX_ATOMIC_BASE_H
00031 #define _GLIBCXX_ATOMIC_BASE_H 1
00032
00033 #pragma GCC system_header
00034
00035 #include <bits/c++config.h>
00036 #include <stdbool.h>
00037 #include <stdint.h>
00038
00039 namespace std _GLIBCXX_VISIBILITY(default)
00040 {
00041 _GLIBCXX_BEGIN_NAMESPACE_VERSION
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 typedef enum memory_order
00052 {
00053 memory_order_relaxed,
00054 memory_order_consume,
00055 memory_order_acquire,
00056 memory_order_release,
00057 memory_order_acq_rel,
00058 memory_order_seq_cst
00059 } memory_order;
00060
00061 inline memory_order
00062 __calculate_memory_order(memory_order __m)
00063 {
00064 const bool __cond1 = __m == memory_order_release;
00065 const bool __cond2 = __m == memory_order_acq_rel;
00066 memory_order __mo1(__cond1 ? memory_order_relaxed : __m);
00067 memory_order __mo2(__cond2 ? memory_order_acquire : __mo1);
00068 return __mo2;
00069 }
00070
00071
00072 template<typename _Tp>
00073 inline _Tp
00074 kill_dependency(_Tp __y)
00075 {
00076 _Tp __ret(__y);
00077 return __ret;
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 _GLIBCXX_BEGIN_EXTERN_C
00091
00092 struct __atomic_flag_base
00093 {
00094 bool _M_i;
00095 };
00096
00097 _GLIBCXX_END_EXTERN_C
00098
00099 #define ATOMIC_FLAG_INIT { false }
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 namespace __atomic0
00115 {
00116 struct atomic_flag;
00117 struct atomic_address;
00118
00119 template<typename _IntTp>
00120 struct __atomic_base;
00121 }
00122
00123 namespace __atomic2
00124 {
00125 struct atomic_flag;
00126 struct atomic_address;
00127
00128 template<typename _IntTp>
00129 struct __atomic_base;
00130 }
00131
00132 namespace __atomic1
00133 {
00134 using __atomic2::atomic_flag;
00135 using __atomic0::atomic_address;
00136 using __atomic0::__atomic_base;
00137 }
00138
00139
00140 #if defined(_GLIBCXX_ATOMIC_BUILTINS_1) && defined(_GLIBCXX_ATOMIC_BUILTINS_2) \
00141 && defined(_GLIBCXX_ATOMIC_BUILTINS_4) && defined(_GLIBCXX_ATOMIC_BUILTINS_8)
00142 # define _GLIBCXX_ATOMIC_PROPERTY 2
00143 # define _GLIBCXX_ATOMIC_NAMESPACE __atomic2
00144 #elif defined(_GLIBCXX_ATOMIC_BUILTINS_1)
00145 # define _GLIBCXX_ATOMIC_PROPERTY 1
00146 # define _GLIBCXX_ATOMIC_NAMESPACE __atomic1
00147 #else
00148 # define _GLIBCXX_ATOMIC_PROPERTY 0
00149 # define _GLIBCXX_ATOMIC_NAMESPACE __atomic0
00150 #endif
00151
00152 #define ATOMIC_CHAR_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00153 #define ATOMIC_CHAR16_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00154 #define ATOMIC_CHAR32_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00155 #define ATOMIC_WCHAR_T_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00156 #define ATOMIC_SHORT_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00157 #define ATOMIC_INT_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00158 #define ATOMIC_LONG_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00159 #define ATOMIC_LLONG_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00160 #define ATOMIC_ADDRESS_LOCK_FREE _GLIBCXX_ATOMIC_PROPERTY
00161
00162 inline namespace _GLIBCXX_ATOMIC_NAMESPACE { }
00163
00164
00165
00166 typedef __atomic_base<char> atomic_char;
00167
00168
00169 typedef __atomic_base<signed char> atomic_schar;
00170
00171
00172 typedef __atomic_base<unsigned char> atomic_uchar;
00173
00174
00175 typedef __atomic_base<short> atomic_short;
00176
00177
00178 typedef __atomic_base<unsigned short> atomic_ushort;
00179
00180
00181 typedef __atomic_base<int> atomic_int;
00182
00183
00184 typedef __atomic_base<unsigned int> atomic_uint;
00185
00186
00187 typedef __atomic_base<long> atomic_long;
00188
00189
00190 typedef __atomic_base<unsigned long> atomic_ulong;
00191
00192
00193 typedef __atomic_base<long long> atomic_llong;
00194
00195
00196 typedef __atomic_base<unsigned long long> atomic_ullong;
00197
00198
00199 typedef __atomic_base<wchar_t> atomic_wchar_t;
00200
00201
00202 typedef __atomic_base<char16_t> atomic_char16_t;
00203
00204
00205 typedef __atomic_base<char32_t> atomic_char32_t;
00206
00207
00208 typedef __atomic_base<char32_t> atomic_char32_t;
00209
00210
00211
00212 typedef __atomic_base<int_least8_t> atomic_int_least8_t;
00213
00214
00215 typedef __atomic_base<uint_least8_t> atomic_uint_least8_t;
00216
00217
00218 typedef __atomic_base<int_least16_t> atomic_int_least16_t;
00219
00220
00221 typedef __atomic_base<uint_least16_t> atomic_uint_least16_t;
00222
00223
00224 typedef __atomic_base<int_least32_t> atomic_int_least32_t;
00225
00226
00227 typedef __atomic_base<uint_least32_t> atomic_uint_least32_t;
00228
00229
00230 typedef __atomic_base<int_least64_t> atomic_int_least64_t;
00231
00232
00233 typedef __atomic_base<uint_least64_t> atomic_uint_least64_t;
00234
00235
00236
00237 typedef __atomic_base<int_fast8_t> atomic_int_fast8_t;
00238
00239
00240 typedef __atomic_base<uint_fast8_t> atomic_uint_fast8_t;
00241
00242
00243 typedef __atomic_base<int_fast16_t> atomic_int_fast16_t;
00244
00245
00246 typedef __atomic_base<uint_fast16_t> atomic_uint_fast16_t;
00247
00248
00249 typedef __atomic_base<int_fast32_t> atomic_int_fast32_t;
00250
00251
00252 typedef __atomic_base<uint_fast32_t> atomic_uint_fast32_t;
00253
00254
00255 typedef __atomic_base<int_fast64_t> atomic_int_fast64_t;
00256
00257
00258 typedef __atomic_base<uint_fast64_t> atomic_uint_fast64_t;
00259
00260
00261
00262 typedef __atomic_base<intptr_t> atomic_intptr_t;
00263
00264
00265 typedef __atomic_base<uintptr_t> atomic_uintptr_t;
00266
00267
00268 typedef __atomic_base<size_t> atomic_size_t;
00269
00270
00271 typedef __atomic_base<intmax_t> atomic_intmax_t;
00272
00273
00274 typedef __atomic_base<uintmax_t> atomic_uintmax_t;
00275
00276
00277 typedef __atomic_base<ptrdiff_t> atomic_ptrdiff_t;
00278
00279
00280 struct atomic_bool;
00281
00282 #define ATOMIC_VAR_INIT(_VI) { _VI }
00283
00284 template<typename _Tp>
00285 struct atomic;
00286
00287
00288
00289 _GLIBCXX_END_NAMESPACE_VERSION
00290 }
00291
00292 #endif