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