1 #pragma once
2 
3 #ifndef PTHREADPOOL_USE_CPUINFO
4 	#define PTHREADPOOL_USE_CPUINFO 0
5 #endif
6 
7 #ifndef PTHREADPOOL_USE_FUTEX
8 	#if defined(__linux__)
9 		#define PTHREADPOOL_USE_FUTEX 1
10 	#elif defined(__EMSCRIPTEN__)
11 		#define PTHREADPOOL_USE_FUTEX 1
12 	#else
13 		#define PTHREADPOOL_USE_FUTEX 0
14 	#endif
15 #endif
16 
17 #ifndef PTHREADPOOL_USE_GCD
18 	#if defined(__APPLE__)
19 		#define PTHREADPOOL_USE_GCD 1
20 	#else
21 		#define PTHREADPOOL_USE_GCD 0
22 	#endif
23 #endif
24 
25 #ifndef PTHREADPOOL_USE_EVENT
26 	#if defined(_WIN32) || defined(__CYGWIN__)
27 		#define PTHREADPOOL_USE_EVENT 1
28 	#else
29 		#define PTHREADPOOL_USE_EVENT 0
30 	#endif
31 #endif
32 
33 #ifndef PTHREADPOOL_USE_CONDVAR
34 	#if PTHREADPOOL_USE_GCD || PTHREADPOOL_USE_FUTEX || PTHREADPOOL_USE_EVENT
35 		#define PTHREADPOOL_USE_CONDVAR 0
36 	#else
37 		#define PTHREADPOOL_USE_CONDVAR 1
38 	#endif
39 #endif
40 
41 
42 /* Number of iterations in spin-wait loop before going into futex/condvar wait */
43 #define PTHREADPOOL_SPIN_WAIT_ITERATIONS 1000000
44 
45 #define PTHREADPOOL_CACHELINE_SIZE 64
46 #if defined(__GNUC__)
47 	#define PTHREADPOOL_CACHELINE_ALIGNED __attribute__((__aligned__(PTHREADPOOL_CACHELINE_SIZE)))
48 #elif defined(_MSC_VER)
49 	#define PTHREADPOOL_CACHELINE_ALIGNED __declspec(align(PTHREADPOOL_CACHELINE_SIZE))
50 #else
51 	#error "Platform-specific implementation of PTHREADPOOL_CACHELINE_ALIGNED required"
52 #endif
53 
54 #if defined(__clang__)
55 	#if __has_extension(c_static_assert) || __has_feature(c_static_assert)
56 		#define PTHREADPOOL_STATIC_ASSERT(predicate, message) _Static_assert((predicate), message)
57 	#else
58 		#define PTHREADPOOL_STATIC_ASSERT(predicate, message)
59 	#endif
60 #elif defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4) && (__GNUC_MINOR__ >= 6))
61 	/* Static assert is supported by gcc >= 4.6 */
62 	#define PTHREADPOOL_STATIC_ASSERT(predicate, message) _Static_assert((predicate), message)
63 #else
64 	#define PTHREADPOOL_STATIC_ASSERT(predicate, message)
65 #endif
66 
67 #ifndef PTHREADPOOL_INTERNAL
68 	#if defined(__ELF__)
69 		#define PTHREADPOOL_INTERNAL __attribute__((__visibility__("internal")))
70 	#elif defined(__MACH__)
71 		#define PTHREADPOOL_INTERNAL __attribute__((__visibility__("hidden")))
72 	#else
73 		#define PTHREADPOOL_INTERNAL
74 	#endif
75 #endif
76