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

source code of boost/libs/thread/include/boost/thread/detail/config.hpp