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