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