1 /* 2 * Distributed under the Boost Software License, Version 1.0. 3 * (See accompanying file LICENSE_1_0.txt or copy at 4 * http://www.boost.org/LICENSE_1_0.txt) 5 * 6 * Copyright (c) 2014 Andrey Semashev 7 */ 8 /*! 9 * \file atomic/capabilities.hpp 10 * 11 * This header defines feature capabilities macros. 12 */ 13 14 #ifndef BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_ 15 #define BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_ 16 17 #include <boost/atomic/detail/config.hpp> 18 #include <boost/atomic/detail/platform.hpp> 19 #include <boost/atomic/detail/int_sizes.hpp> 20 #if !defined(BOOST_ATOMIC_NO_FLOATING_POINT) 21 #include <boost/atomic/detail/float_sizes.hpp> 22 #endif 23 24 #if !defined(BOOST_ATOMIC_EMULATED) 25 #include BOOST_ATOMIC_DETAIL_BACKEND_HEADER(boost/atomic/detail/caps_) 26 #endif 27 28 #ifdef BOOST_HAS_PRAGMA_ONCE 29 #pragma once 30 #endif 31 32 #ifndef BOOST_ATOMIC_INT8_LOCK_FREE 33 #define BOOST_ATOMIC_INT8_LOCK_FREE 0 34 #endif 35 36 #ifndef BOOST_ATOMIC_INT16_LOCK_FREE 37 #define BOOST_ATOMIC_INT16_LOCK_FREE 0 38 #endif 39 40 #ifndef BOOST_ATOMIC_INT32_LOCK_FREE 41 #define BOOST_ATOMIC_INT32_LOCK_FREE 0 42 #endif 43 44 #ifndef BOOST_ATOMIC_INT64_LOCK_FREE 45 #define BOOST_ATOMIC_INT64_LOCK_FREE 0 46 #endif 47 48 #ifndef BOOST_ATOMIC_INT128_LOCK_FREE 49 #define BOOST_ATOMIC_INT128_LOCK_FREE 0 50 #endif 51 52 53 #ifndef BOOST_ATOMIC_CHAR_LOCK_FREE 54 #define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE 55 #endif 56 57 #ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE 58 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 59 #endif 60 61 #ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE 62 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 63 #endif 64 65 #ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE 66 #if BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1 67 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE 68 #elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2 69 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 70 #elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4 71 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 72 #elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8 73 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 74 #else 75 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0 76 #endif 77 #endif 78 79 #ifndef BOOST_ATOMIC_SHORT_LOCK_FREE 80 #if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1 81 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE 82 #elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2 83 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 84 #elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4 85 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 86 #elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8 87 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 88 #else 89 #define BOOST_ATOMIC_SHORT_LOCK_FREE 0 90 #endif 91 #endif 92 93 #ifndef BOOST_ATOMIC_INT_LOCK_FREE 94 #if BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1 95 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE 96 #elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2 97 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 98 #elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4 99 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 100 #elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8 101 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 102 #else 103 #define BOOST_ATOMIC_INT_LOCK_FREE 0 104 #endif 105 #endif 106 107 #ifndef BOOST_ATOMIC_LONG_LOCK_FREE 108 #if BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1 109 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE 110 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2 111 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 112 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4 113 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 114 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8 115 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 116 #else 117 #define BOOST_ATOMIC_LONG_LOCK_FREE 0 118 #endif 119 #endif 120 121 #ifndef BOOST_ATOMIC_LLONG_LOCK_FREE 122 #if BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1 123 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE 124 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2 125 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 126 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4 127 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 128 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8 129 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 130 #else 131 #define BOOST_ATOMIC_LLONG_LOCK_FREE 0 132 #endif 133 #endif 134 135 #ifndef BOOST_ATOMIC_POINTER_LOCK_FREE 136 #if (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 8 137 #define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 138 #elif (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 4 139 #define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 140 #else 141 #define BOOST_ATOMIC_POINTER_LOCK_FREE 0 142 #endif 143 #endif 144 145 #define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE 146 147 #ifndef BOOST_ATOMIC_BOOL_LOCK_FREE 148 // We store bools in 1-byte storage in all backends 149 #define BOOST_ATOMIC_BOOL_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE 150 #endif 151 152 #ifndef BOOST_ATOMIC_FLAG_LOCK_FREE 153 #define BOOST_ATOMIC_FLAG_LOCK_FREE BOOST_ATOMIC_BOOL_LOCK_FREE 154 #endif 155 156 #if !defined(BOOST_ATOMIC_NO_FLOATING_POINT) 157 158 #if !defined(BOOST_ATOMIC_FLOAT_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT) 159 #if BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 2 160 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 161 #elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 4 162 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 163 #elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 8 164 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 165 #elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 16 166 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE 167 #else 168 #define BOOST_ATOMIC_FLOAT_LOCK_FREE 0 169 #endif 170 #endif 171 172 #if !defined(BOOST_ATOMIC_DOUBLE_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE) 173 #if BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 2 174 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 175 #elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 4 176 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 177 #elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 8 178 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 179 #elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 16 180 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE 181 #else 182 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE 0 183 #endif 184 #endif 185 186 #if !defined(BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE) 187 #if BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 2 188 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE 189 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 4 190 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE 191 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 8 192 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE 193 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 16 194 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE 195 #else 196 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE 0 197 #endif 198 #endif 199 200 #endif // !defined(BOOST_ATOMIC_NO_FLOATING_POINT) 201 202 #ifndef BOOST_ATOMIC_THREAD_FENCE 203 #define BOOST_ATOMIC_THREAD_FENCE 0 204 #endif 205 206 #ifndef BOOST_ATOMIC_SIGNAL_FENCE 207 #define BOOST_ATOMIC_SIGNAL_FENCE 0 208 #endif 209 210 #endif // BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_ 211