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