1// Copyright (C) 2001-2003
2// William E. Kempf
3// Copyright (C) 2011-2013 Vicente J. Botet Escriba
4//
5// Distributed under the Boost Software License, Version 1.0. (See accompanying
6// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
8#ifndef BOOST_THREAD_CONFIG_WEK01032003_HPP
9#define BOOST_THREAD_CONFIG_WEK01032003_HPP
10
11#include <boost/config.hpp>
12#include <boost/detail/workaround.hpp>
13#include <boost/thread/detail/platform.hpp>
14
15#define BOOST_THREAD_USEFIXES_TIMESPEC
16//#define BOOST_THREAD_HAS_CONDATTR_SET_CLOCK_MONOTONIC
17//#define BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS
18// ATTRIBUTE_MAY_ALIAS
19
20#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
21
22 // GCC since 3.3 has may_alias attribute that helps to alleviate optimizer issues with
23 // regard to violation of the strict aliasing rules.
24
25 #define BOOST_THREAD_DETAIL_USE_ATTRIBUTE_MAY_ALIAS
26 #define BOOST_THREAD_ATTRIBUTE_MAY_ALIAS __attribute__((__may_alias__))
27#else
28 #define BOOST_THREAD_ATTRIBUTE_MAY_ALIAS
29#endif
30
31
32#if defined BOOST_THREAD_THROW_IF_PRECONDITION_NOT_SATISFIED
33#define BOOST_THREAD_ASSERT_PRECONDITION(EXPR, EX) \
34 if (EXPR) {} else boost::throw_exception(EX)
35#define BOOST_THREAD_VERIFY_PRECONDITION(EXPR, EX) \
36 if (EXPR) {} else boost::throw_exception(EX)
37#define BOOST_THREAD_THROW_ELSE_RETURN(EX, RET) \
38 boost::throw_exception(EX)
39#else
40#define BOOST_THREAD_ASSERT_PRECONDITION(EXPR, EX)
41#define BOOST_THREAD_VERIFY_PRECONDITION(EXPR, EX) \
42 (void)(EXPR)
43#define BOOST_THREAD_THROW_ELSE_RETURN(EX, RET) \
44 return (RET)
45#endif
46
47// This compiler doesn't support Boost.Chrono
48#if defined __IBMCPP__ && (__IBMCPP__ < 1100) \
49 && ! defined BOOST_THREAD_DONT_USE_CHRONO
50#define BOOST_THREAD_DONT_USE_CHRONO
51#if ! defined BOOST_THREAD_USES_DATETIME
52#define BOOST_THREAD_USES_DATETIME
53#endif
54#endif
55
56// This compiler doesn't support Boost.Move
57#if BOOST_WORKAROUND(__SUNPRO_CC, < 0x5100) \
58 && ! defined BOOST_THREAD_DONT_USE_MOVE
59#define BOOST_THREAD_DONT_USE_MOVE
60#endif
61
62// This compiler doesn't support Boost.Container Allocators files
63#if defined __SUNPRO_CC \
64 && ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS
65#define BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS
66#endif
67
68#if defined _WIN32_WCE && _WIN32_WCE==0x501 \
69 && ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS
70#define BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS
71#endif
72
73
74#if defined BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX || defined BOOST_NO_CXX11_HDR_INITIALIZER_LIST
75#define BOOST_THREAD_NO_CXX11_HDR_INITIALIZER_LIST
76#define BOOST_THREAD_NO_MAKE_LOCK_GUARD
77#define BOOST_THREAD_NO_MAKE_STRICT_LOCK
78#define BOOST_THREAD_NO_MAKE_NESTED_STRICT_LOCK
79#endif
80
81#if defined(BOOST_NO_CXX11_HDR_TUPLE) || defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
82#define BOOST_THREAD_NO_MAKE_UNIQUE_LOCKS
83#define BOOST_THREAD_NO_SYNCHRONIZE
84#elif defined _MSC_VER && _MSC_VER <= 1600
85// C++ features supported by VC++ 10 (aka 2010)
86#define BOOST_THREAD_NO_MAKE_UNIQUE_LOCKS
87#define BOOST_THREAD_NO_SYNCHRONIZE
88#endif
89
90/// BASIC_THREAD_ID
91#if ! defined BOOST_THREAD_DONT_PROVIDE_BASIC_THREAD_ID \
92 && ! defined BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
93#define BOOST_THREAD_PROVIDES_BASIC_THREAD_ID
94#endif
95
96/// RVALUE_REFERENCES_DONT_MATCH_FUNTION_PTR
97//#if defined BOOST_NO_CXX11_RVALUE_REFERENCES || defined BOOST_MSVC
98#define BOOST_THREAD_RVALUE_REFERENCES_DONT_MATCH_FUNTION_PTR
99//#endif
100
101// Default version
102#if !defined BOOST_THREAD_VERSION
103#define BOOST_THREAD_VERSION 2
104#else
105#if BOOST_THREAD_VERSION!=2 && BOOST_THREAD_VERSION!=3 && BOOST_THREAD_VERSION!=4 && BOOST_THREAD_VERSION!=5
106#error "BOOST_THREAD_VERSION must be 2, 3, 4 or 5"
107#endif
108#endif
109
110// CHRONO
111// Uses Boost.Chrono by default if not stated the opposite defining BOOST_THREAD_DONT_USE_CHRONO
112#if ! defined BOOST_THREAD_DONT_USE_CHRONO \
113 && ! defined BOOST_THREAD_USES_CHRONO
114#define BOOST_THREAD_USES_CHRONO
115#endif
116
117#if ! defined BOOST_THREAD_DONT_USE_ATOMIC \
118 && ! defined BOOST_THREAD_USES_ATOMIC
119#define BOOST_THREAD_USES_ATOMIC
120//#define BOOST_THREAD_DONT_USE_ATOMIC
121#endif
122
123#if defined BOOST_THREAD_USES_ATOMIC
124// Andrey Semashev
125#define BOOST_THREAD_ONCE_ATOMIC
126#else
127//#elif ! defined BOOST_NO_CXX11_THREAD_LOCAL && ! defined BOOST_NO_THREAD_LOCAL && ! defined BOOST_THREAD_NO_UINT32_PSEUDO_ATOMIC
128// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2444.html#Appendix
129#define BOOST_THREAD_ONCE_FAST_EPOCH
130#endif
131#if BOOST_THREAD_VERSION==2
132
133// PROVIDE_PROMISE_LAZY
134#if ! defined BOOST_THREAD_DONT_PROVIDE_PROMISE_LAZY \
135 && ! defined BOOST_THREAD_PROVIDES_PROMISE_LAZY
136#define BOOST_THREAD_PROVIDES_PROMISE_LAZY
137#endif
138
139// PROVIDE_THREAD_EQ
140#if ! defined BOOST_THREAD_DONT_PROVIDE_THREAD_EQ \
141 && ! defined BOOST_THREAD_PROVIDES_THREAD_EQ
142#define BOOST_THREAD_PROVIDES_THREAD_EQ
143#endif
144
145#endif
146
147#if BOOST_THREAD_VERSION>=3
148
149// ONCE_CXX11
150// fixme BOOST_THREAD_PROVIDES_ONCE_CXX11 doesn't works when thread.cpp is compiled BOOST_THREAD_VERSION 3
151#if ! defined BOOST_THREAD_DONT_PROVIDE_ONCE_CXX11 \
152 && ! defined BOOST_THREAD_PROVIDES_ONCE_CXX11
153#define BOOST_THREAD_DONT_PROVIDE_ONCE_CXX11
154#endif
155
156// THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
157#if ! defined BOOST_THREAD_DONT_PROVIDE_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE \
158 && ! defined BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
159#define BOOST_THREAD_PROVIDES_THREAD_DESTRUCTOR_CALLS_TERMINATE_IF_JOINABLE
160#endif
161
162// THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
163#if ! defined BOOST_THREAD_DONT_PROVIDE_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE \
164 && ! defined BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
165#define BOOST_THREAD_PROVIDES_THREAD_MOVE_ASSIGN_CALLS_TERMINATE_IF_JOINABLE
166#endif
167
168// PROVIDE_FUTURE
169#if ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE \
170 && ! defined BOOST_THREAD_PROVIDES_FUTURE
171#define BOOST_THREAD_PROVIDES_FUTURE
172#endif
173
174// FUTURE_CTOR_ALLOCATORS
175#if ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_CTOR_ALLOCATORS \
176 && ! defined BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
177#define BOOST_THREAD_PROVIDES_FUTURE_CTOR_ALLOCATORS
178#endif
179
180// SHARED_MUTEX_UPWARDS_CONVERSIONS
181#if ! defined BOOST_THREAD_DONT_PROVIDE_SHARED_MUTEX_UPWARDS_CONVERSIONS \
182 && ! defined BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
183#define BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
184#endif
185
186// PROVIDE_EXPLICIT_LOCK_CONVERSION
187#if ! defined BOOST_THREAD_DONT_PROVIDE_EXPLICIT_LOCK_CONVERSION \
188 && ! defined BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
189#define BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
190#endif
191
192// GENERIC_SHARED_MUTEX_ON_WIN
193#if ! defined BOOST_THREAD_DONT_PROVIDE_GENERIC_SHARED_MUTEX_ON_WIN \
194 && ! defined BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
195#define BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
196#endif
197
198// USE_MOVE
199#if ! defined BOOST_THREAD_DONT_USE_MOVE \
200 && ! defined BOOST_THREAD_USES_MOVE
201#define BOOST_THREAD_USES_MOVE
202#endif
203
204#endif
205
206// deprecated since version 4
207#if BOOST_THREAD_VERSION < 4
208
209// NESTED_LOCKS
210#if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS \
211 && ! defined BOOST_THREAD_DONT_PROVIDE_NESTED_LOCKS
212#define BOOST_THREAD_PROVIDES_NESTED_LOCKS
213#endif
214
215// CONDITION
216#if ! defined BOOST_THREAD_PROVIDES_CONDITION \
217 && ! defined BOOST_THREAD_DONT_PROVIDE_CONDITION
218#define BOOST_THREAD_PROVIDES_CONDITION
219#endif
220
221// USE_DATETIME
222#if ! defined BOOST_THREAD_DONT_USE_DATETIME \
223 && ! defined BOOST_THREAD_USES_DATETIME
224#define BOOST_THREAD_USES_DATETIME
225#endif
226#endif
227
228#if BOOST_THREAD_VERSION>=4
229
230// SIGNATURE_PACKAGED_TASK
231#if ! defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK \
232 && ! defined BOOST_THREAD_DONT_PROVIDE_SIGNATURE_PACKAGED_TASK
233#define BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK
234#endif
235
236// VARIADIC_THREAD
237#if ! defined BOOST_THREAD_PROVIDES_VARIADIC_THREAD \
238 && ! defined BOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD
239
240#if ! defined(BOOST_NO_SFINAE_EXPR) && \
241 ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
242 ! defined(BOOST_NO_CXX11_DECLTYPE) && \
243 ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) && \
244 ! defined(BOOST_NO_CXX11_TRAILING_RESULT_TYPES) && \
245 ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \
246 ! defined(BOOST_NO_CXX11_HDR_TUPLE)
247
248#define BOOST_THREAD_PROVIDES_VARIADIC_THREAD
249#endif
250#endif
251
252#if ! defined BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY \
253 && ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_WHEN_ALL_WHEN_ANY
254
255#if ! defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && \
256 ! defined(BOOST_NO_CXX11_HDR_TUPLE)
257
258#define BOOST_THREAD_PROVIDES_FUTURE_WHEN_ALL_WHEN_ANY
259#endif
260#endif
261
262// ! defined(BOOST_NO_SFINAE_EXPR) &&
263// ! defined(BOOST_NO_CXX11_RVALUE_REFERENCES) &&
264// ! defined(BOOST_NO_CXX11_AUTO) &&
265// ! defined(BOOST_NO_CXX11_DECLTYPE) &&
266// ! defined(BOOST_NO_CXX11_DECLTYPE_N3276) &&
267
268
269// MAKE_READY_AT_THREAD_EXIT
270#if ! defined BOOST_THREAD_PROVIDES_MAKE_READY_AT_THREAD_EXIT \
271 && ! defined BOOST_THREAD_DONT_PROVIDE_MAKE_READY_AT_THREAD_EXIT
272
273//#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
274#define BOOST_THREAD_PROVIDES_MAKE_READY_AT_THREAD_EXIT
275//#endif
276#endif
277
278// FUTURE_CONTINUATION
279#if ! defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION \
280 && ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_CONTINUATION
281#define BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
282#endif
283
284#if ! defined BOOST_THREAD_PROVIDES_FUTURE_UNWRAP \
285 && ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_UNWRAP
286#define BOOST_THREAD_PROVIDES_FUTURE_UNWRAP
287#endif
288
289// FUTURE_INVALID_AFTER_GET
290#if ! defined BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET \
291 && ! defined BOOST_THREAD_DONT_PROVIDE_FUTURE_INVALID_AFTER_GET
292#define BOOST_THREAD_PROVIDES_FUTURE_INVALID_AFTER_GET
293#endif
294
295// NESTED_LOCKS
296#if ! defined BOOST_THREAD_PROVIDES_NESTED_LOCKS \
297 && ! defined BOOST_THREAD_DONT_PROVIDE_NESTED_LOCKS
298#define BOOST_THREAD_DONT_PROVIDE_NESTED_LOCKS
299#endif
300
301// CONDITION
302#if ! defined BOOST_THREAD_PROVIDES_CONDITION \
303 && ! defined BOOST_THREAD_DONT_PROVIDE_CONDITION
304#define BOOST_THREAD_DONT_PROVIDE_CONDITION
305#endif
306
307#endif // BOOST_THREAD_VERSION>=4
308
309
310#if BOOST_THREAD_VERSION>=5
311//#define BOOST_THREAD_FUTURE_BLOCKING
312#else
313//#define BOOST_THREAD_FUTURE_BLOCKING
314#define BOOST_THREAD_ASYNC_FUTURE_WAITS
315#endif
316// INTERRUPTIONS
317#if ! defined BOOST_THREAD_PROVIDES_INTERRUPTIONS \
318 && ! defined BOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS
319#define BOOST_THREAD_PROVIDES_INTERRUPTIONS
320#endif
321
322// CORRELATIONS
323
324// EXPLICIT_LOCK_CONVERSION.
325#if defined BOOST_THREAD_PROVIDES_EXPLICIT_LOCK_CONVERSION
326#define BOOST_THREAD_EXPLICIT_LOCK_CONVERSION explicit
327#else
328#define BOOST_THREAD_EXPLICIT_LOCK_CONVERSION
329#endif
330
331// BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN is defined if BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS
332#if defined BOOST_THREAD_PROVIDES_SHARED_MUTEX_UPWARDS_CONVERSIONS \
333&& ! defined BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
334#define BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN
335#endif
336
337// For C++11 call_once interface the compiler MUST support constexpr.
338// Otherwise once_flag would be initialized during dynamic initialization stage, which is not thread-safe.
339#if defined(BOOST_THREAD_PROVIDES_ONCE_CXX11)
340#if defined(BOOST_NO_CXX11_CONSTEXPR)
341#undef BOOST_THREAD_PROVIDES_ONCE_CXX11
342#endif
343#endif
344
345#if defined(BOOST_THREAD_PLATFORM_WIN32) && defined BOOST_THREAD_DONT_USE_DATETIME
346#undef BOOST_THREAD_DONT_USE_DATETIME
347#define BOOST_THREAD_USES_DATETIME
348#endif
349
350#if defined(BOOST_THREAD_PLATFORM_WIN32) && defined BOOST_THREAD_DONT_USE_CHRONO
351#undef BOOST_THREAD_DONT_USE_CHRONO
352#define BOOST_THREAD_USES_CHRONO
353#endif
354
355// BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0 defined by default up to Boost 1.55
356// BOOST_THREAD_DONT_PROVIDE_DEPRECATED_FEATURES_SINCE_V3_0_0 defined by default up to Boost 1.55
357#if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0
358
359#if ! defined BOOST_THREAD_PROVIDES_THREAD_EQ
360#define BOOST_THREAD_PROVIDES_THREAD_EQ
361#endif
362
363#endif
364
365
366//#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES || defined BOOST_THREAD_USES_MOVE
367#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
368#define BOOST_THREAD_FUTURE_USES_OPTIONAL
369#endif
370
371#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
372# pragma warn -8008 // Condition always true/false
373# pragma warn -8080 // Identifier declared but never used
374# pragma warn -8057 // Parameter never used
375# pragma warn -8066 // Unreachable code
376#endif
377
378#include <boost/thread/detail/platform.hpp>
379
380#if defined(BOOST_THREAD_PLATFORM_WIN32)
381#else
382 # if defined(BOOST_HAS_PTHREAD_DELAY_NP) || defined(BOOST_HAS_NANOSLEEP)
383 # define BOOST_THREAD_SLEEP_FOR_IS_STEADY
384 # endif
385#endif
386
387// provided for backwards compatibility, since this
388// macro was used for several releases by mistake.
389#if defined(BOOST_THREAD_DYN_DLL) && ! defined BOOST_THREAD_DYN_LINK
390# define BOOST_THREAD_DYN_LINK
391#endif
392
393// compatibility with the rest of Boost's auto-linking code:
394#if defined(BOOST_THREAD_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
395# undef BOOST_THREAD_USE_LIB
396# if !defined(BOOST_THREAD_USE_DLL)
397# define BOOST_THREAD_USE_DLL
398# endif
399#endif
400
401#if defined(BOOST_THREAD_BUILD_DLL) //Build dll
402#elif defined(BOOST_THREAD_BUILD_LIB) //Build lib
403#elif defined(BOOST_THREAD_USE_DLL) //Use dll
404#elif defined(BOOST_THREAD_USE_LIB) //Use lib
405#else //Use default
406# if defined(BOOST_THREAD_PLATFORM_WIN32)
407# if defined(BOOST_MSVC) || defined(BOOST_INTEL_WIN) \
408 || defined(__MINGW32__) || defined(MINGW32) || defined(BOOST_MINGW32)
409 //For compilers supporting auto-tss cleanup
410 //with Boost.Threads lib, use Boost.Threads lib
411# define BOOST_THREAD_USE_LIB
412# else
413 //For compilers not yet supporting auto-tss cleanup
414 //with Boost.Threads lib, use Boost.Threads dll
415# define BOOST_THREAD_USE_DLL
416# endif
417# else
418# define BOOST_THREAD_USE_LIB
419# endif
420#endif
421
422#if defined(BOOST_HAS_DECLSPEC)
423# if defined(BOOST_THREAD_BUILD_DLL) //Build dll
424# define BOOST_THREAD_DECL BOOST_SYMBOL_EXPORT
425//# define BOOST_THREAD_DECL __declspec(dllexport)
426
427# elif defined(BOOST_THREAD_USE_DLL) //Use dll
428# define BOOST_THREAD_DECL BOOST_SYMBOL_IMPORT
429//# define BOOST_THREAD_DECL __declspec(dllimport)
430# else
431# define BOOST_THREAD_DECL
432# endif
433#elif (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)
434# define BOOST_THREAD_DECL BOOST_SYMBOL_VISIBLE
435
436#else
437# define BOOST_THREAD_DECL
438#endif // BOOST_HAS_DECLSPEC
439
440//
441// Automatically link to the correct build variant where possible.
442//
443#if !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_THREAD_NO_LIB) && !defined(BOOST_THREAD_BUILD_DLL) && !defined(BOOST_THREAD_BUILD_LIB)
444//
445// Tell the autolink to link dynamically, this will get undef'ed by auto_link.hpp
446// once it's done with it:
447//
448#if defined(BOOST_THREAD_USE_DLL)
449# define BOOST_DYN_LINK
450#endif
451//
452// Set the name of our library, this will get undef'ed by auto_link.hpp
453// once it's done with it:
454//
455#if defined(BOOST_THREAD_LIB_NAME)
456# define BOOST_LIB_NAME BOOST_THREAD_LIB_NAME
457#else
458# define BOOST_LIB_NAME boost_thread
459#endif
460//
461// If we're importing code from a dll, then tell auto_link.hpp about it:
462//
463// And include the header that does the work:
464//
465#include <boost/config/auto_link.hpp>
466#endif // auto-linking disabled
467
468#endif // BOOST_THREAD_CONFIG_WEK1032003_HPP
469
470// Change Log:
471// 22 Jan 05 Roland Schwarz (speedsnail)
472// Usage of BOOST_HAS_DECLSPEC macro.
473// Default again is static lib usage.
474// BOOST_DYN_LINK only defined when autolink included.
475