1*b095b053SXin Liload("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") 2*b095b053SXin Li 3*b095b053SXin Lilicenses(["notice"]) 4*b095b053SXin Li 5*b095b053SXin Li############################## pthreadpool library ############################# 6*b095b053SXin Li 7*b095b053SXin LiINTERNAL_HDRS = [ 8*b095b053SXin Li "src/threadpool-atomics.h", 9*b095b053SXin Li "src/threadpool-common.h", 10*b095b053SXin Li "src/threadpool-object.h", 11*b095b053SXin Li "src/threadpool-utils.h", 12*b095b053SXin Li] 13*b095b053SXin Li 14*b095b053SXin LiPORTABLE_SRCS = [ 15*b095b053SXin Li "src/memory.c", 16*b095b053SXin Li "src/portable-api.c", 17*b095b053SXin Li] 18*b095b053SXin Li 19*b095b053SXin LiARCH_SPECIFIC_SRCS = [ 20*b095b053SXin Li "src/fastpath.c", 21*b095b053SXin Li] 22*b095b053SXin Li 23*b095b053SXin LiPTHREADS_IMPL_SRCS = PORTABLE_SRCS + ["src/pthreads.c"] 24*b095b053SXin Li 25*b095b053SXin LiGCD_IMPL_SRCS = PORTABLE_SRCS + ["src/gcd.c"] 26*b095b053SXin Li 27*b095b053SXin LiWINDOWS_IMPL_SRCS = PORTABLE_SRCS + ["src/windows.c"] 28*b095b053SXin Li 29*b095b053SXin LiSHIM_IMPL_SRCS = ["src/shim.c"] 30*b095b053SXin Li 31*b095b053SXin Licc_library( 32*b095b053SXin Li name = "pthreadpool", 33*b095b053SXin Li srcs = select({ 34*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_condvar": INTERNAL_HDRS + PTHREADS_IMPL_SRCS, 35*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_futex": INTERNAL_HDRS + PTHREADS_IMPL_SRCS, 36*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_gcd": INTERNAL_HDRS + GCD_IMPL_SRCS, 37*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_event": INTERNAL_HDRS + WINDOWS_IMPL_SRCS, 38*b095b053SXin Li ":emscripten_with_threads": INTERNAL_HDRS + PTHREADS_IMPL_SRCS, 39*b095b053SXin Li ":emscripten": INTERNAL_HDRS + SHIM_IMPL_SRCS, 40*b095b053SXin Li ":macos_x86": INTERNAL_HDRS + GCD_IMPL_SRCS, 41*b095b053SXin Li ":macos_x86_64": INTERNAL_HDRS + GCD_IMPL_SRCS, 42*b095b053SXin Li ":ios": INTERNAL_HDRS + GCD_IMPL_SRCS, 43*b095b053SXin Li ":watchos": INTERNAL_HDRS + GCD_IMPL_SRCS, 44*b095b053SXin Li ":tvos": INTERNAL_HDRS + GCD_IMPL_SRCS, 45*b095b053SXin Li ":windows_x86_64": INTERNAL_HDRS + WINDOWS_IMPL_SRCS, 46*b095b053SXin Li "//conditions:default": INTERNAL_HDRS + PTHREADS_IMPL_SRCS, 47*b095b053SXin Li }) + select({ 48*b095b053SXin Li ":linux_x86_64": ARCH_SPECIFIC_SRCS, 49*b095b053SXin Li ":android_x86": ARCH_SPECIFIC_SRCS, 50*b095b053SXin Li ":android_x86_64": ARCH_SPECIFIC_SRCS, 51*b095b053SXin Li ":windows_x86_64": ARCH_SPECIFIC_SRCS, 52*b095b053SXin Li ":macos_x86": ARCH_SPECIFIC_SRCS, 53*b095b053SXin Li ":macos_x86_64": ARCH_SPECIFIC_SRCS, 54*b095b053SXin Li ":ios_x86": ARCH_SPECIFIC_SRCS, 55*b095b053SXin Li ":ios_x86_64": ARCH_SPECIFIC_SRCS, 56*b095b053SXin Li ":watchos_x86": ARCH_SPECIFIC_SRCS, 57*b095b053SXin Li ":watchos_x86_64": ARCH_SPECIFIC_SRCS, 58*b095b053SXin Li ":tvos_x86_64": ARCH_SPECIFIC_SRCS, 59*b095b053SXin Li "//conditions:default": [], 60*b095b053SXin Li }), 61*b095b053SXin Li copts = [ 62*b095b053SXin Li "-std=gnu11", 63*b095b053SXin Li ] + select({ 64*b095b053SXin Li ":optimized_build": ["-O2"], 65*b095b053SXin Li "//conditions:default": [], 66*b095b053SXin Li }) + select({ 67*b095b053SXin Li ":linux_arm": ["-DPTHREADPOOL_USE_CPUINFO=1"], 68*b095b053SXin Li ":linux_armeabi": ["-DPTHREADPOOL_USE_CPUINFO=1"], 69*b095b053SXin Li ":linux_armhf": ["-DPTHREADPOOL_USE_CPUINFO=1"], 70*b095b053SXin Li ":linux_armv7a": ["-DPTHREADPOOL_USE_CPUINFO=1"], 71*b095b053SXin Li ":linux_aarch64": ["-DPTHREADPOOL_USE_CPUINFO=1"], 72*b095b053SXin Li ":android_armv7": ["-DPTHREADPOOL_USE_CPUINFO=1"], 73*b095b053SXin Li ":android_arm64": ["-DPTHREADPOOL_USE_CPUINFO=1"], 74*b095b053SXin Li "//conditions:default": ["-DPTHREADPOOL_USE_CPUINFO=0"], 75*b095b053SXin Li }) + select({ 76*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_condvar": [ 77*b095b053SXin Li "-DPTHREADPOOL_USE_CONDVAR=1", 78*b095b053SXin Li "-DPTHREADPOOL_USE_FUTEX=0", 79*b095b053SXin Li "-DPTHREADPOOL_USE_GCD=0", 80*b095b053SXin Li "-DPTHREADPOOL_USE_EVENT=0", 81*b095b053SXin Li ], 82*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_futex": [ 83*b095b053SXin Li "-DPTHREADPOOL_USE_CONDVAR=0", 84*b095b053SXin Li "-DPTHREADPOOL_USE_FUTEX=1", 85*b095b053SXin Li "-DPTHREADPOOL_USE_GCD=0", 86*b095b053SXin Li "-DPTHREADPOOL_USE_EVENT=0", 87*b095b053SXin Li ], 88*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_gcd": [ 89*b095b053SXin Li "-DPTHREADPOOL_USE_CONDVAR=0", 90*b095b053SXin Li "-DPTHREADPOOL_USE_FUTEX=0", 91*b095b053SXin Li "-DPTHREADPOOL_USE_GCD=1", 92*b095b053SXin Li "-DPTHREADPOOL_USE_EVENT=0", 93*b095b053SXin Li ], 94*b095b053SXin Li ":pthreadpool_sync_primitive_explicit_event": [ 95*b095b053SXin Li "-DPTHREADPOOL_USE_CONDVAR=0", 96*b095b053SXin Li "-DPTHREADPOOL_USE_FUTEX=0", 97*b095b053SXin Li "-DPTHREADPOOL_USE_GCD=0", 98*b095b053SXin Li "-DPTHREADPOOL_USE_EVENT=1", 99*b095b053SXin Li ], 100*b095b053SXin Li "//conditions:default": [], 101*b095b053SXin Li }) + select({ 102*b095b053SXin Li ":linux_x86_64": ["-DPTHREADPOOL_USE_FASTPATH=1"], 103*b095b053SXin Li ":android_x86": ["-DPTHREADPOOL_USE_FASTPATH=1"], 104*b095b053SXin Li ":android_x86_64": ["-DPTHREADPOOL_USE_FASTPATH=1"], 105*b095b053SXin Li ":windows_x86_64": ["-DPTHREADPOOL_USE_FASTPATH=1"], 106*b095b053SXin Li ":macos_x86": ["-DPTHREADPOOL_USE_FASTPATH=1"], 107*b095b053SXin Li ":macos_x86_64": ["-DPTHREADPOOL_USE_FASTPATH=1"], 108*b095b053SXin Li ":ios_x86": ["-DPTHREADPOOL_USE_FASTPATH=1"], 109*b095b053SXin Li ":ios_x86_64": ["-DPTHREADPOOL_USE_FASTPATH=1"], 110*b095b053SXin Li ":watchos_x86": ["-DPTHREADPOOL_USE_FASTPATH=1"], 111*b095b053SXin Li ":watchos_x86_64": ["-DPTHREADPOOL_USE_FASTPATH=1"], 112*b095b053SXin Li ":tvos_x86_64": ["-DPTHREADPOOL_USE_FASTPATH=1"], 113*b095b053SXin Li "//conditions:default": ["-DPTHREADPOOL_USE_FASTPATH=0"], 114*b095b053SXin Li }), 115*b095b053SXin Li hdrs = [ 116*b095b053SXin Li "include/pthreadpool.h", 117*b095b053SXin Li ], 118*b095b053SXin Li defines = [ 119*b095b053SXin Li "PTHREADPOOL_NO_DEPRECATED_API", 120*b095b053SXin Li ], 121*b095b053SXin Li includes = [ 122*b095b053SXin Li "include", 123*b095b053SXin Li ], 124*b095b053SXin Li linkopts = select({ 125*b095b053SXin Li ":emscripten_with_threads": [ 126*b095b053SXin Li "-s ALLOW_BLOCKING_ON_MAIN_THREAD=1", 127*b095b053SXin Li "-s PTHREAD_POOL_SIZE=8", 128*b095b053SXin Li ], 129*b095b053SXin Li "//conditions:default": [], 130*b095b053SXin Li }), 131*b095b053SXin Li strip_include_prefix = "include", 132*b095b053SXin Li deps = [ 133*b095b053SXin Li "@FXdiv", 134*b095b053SXin Li ] + select({ 135*b095b053SXin Li ":linux_arm": ["@cpuinfo"], 136*b095b053SXin Li ":linux_armeabi": ["@cpuinfo"], 137*b095b053SXin Li ":linux_armhf": ["@cpuinfo"], 138*b095b053SXin Li ":linux_armv7a": ["@cpuinfo"], 139*b095b053SXin Li ":linux_aarch64": ["@cpuinfo"], 140*b095b053SXin Li ":android_armv7": ["@cpuinfo"], 141*b095b053SXin Li ":android_arm64": ["@cpuinfo"], 142*b095b053SXin Li "//conditions:default": [], 143*b095b053SXin Li }), 144*b095b053SXin Li visibility = ["//visibility:public"], 145*b095b053SXin Li) 146*b095b053SXin Li 147*b095b053SXin Li################################## Unit tests ################################## 148*b095b053SXin Li 149*b095b053SXin LiEMSCRIPTEN_TEST_LINKOPTS = [ 150*b095b053SXin Li "-s ASSERTIONS=2", 151*b095b053SXin Li "-s ERROR_ON_UNDEFINED_SYMBOLS=1", 152*b095b053SXin Li "-s DEMANGLE_SUPPORT=1", 153*b095b053SXin Li "-s EXIT_RUNTIME=1", 154*b095b053SXin Li "-s ALLOW_MEMORY_GROWTH=0", 155*b095b053SXin Li "-s TOTAL_MEMORY=67108864", # 64M 156*b095b053SXin Li] 157*b095b053SXin Li 158*b095b053SXin Licc_test( 159*b095b053SXin Li name = "pthreadpool_test", 160*b095b053SXin Li srcs = ["test/pthreadpool.cc"], 161*b095b053SXin Li linkopts = select({ 162*b095b053SXin Li ":emscripten": EMSCRIPTEN_TEST_LINKOPTS, 163*b095b053SXin Li "//conditions:default": [], 164*b095b053SXin Li }), 165*b095b053SXin Li deps = [ 166*b095b053SXin Li ":pthreadpool", 167*b095b053SXin Li "@com_google_googletest//:gtest_main", 168*b095b053SXin Li ], 169*b095b053SXin Li) 170*b095b053SXin Li 171*b095b053SXin Li################################## Benchmarks ################################## 172*b095b053SXin Li 173*b095b053SXin LiEMSCRIPTEN_BENCHMARK_LINKOPTS = [ 174*b095b053SXin Li "-s ASSERTIONS=1", 175*b095b053SXin Li "-s ERROR_ON_UNDEFINED_SYMBOLS=1", 176*b095b053SXin Li "-s EXIT_RUNTIME=1", 177*b095b053SXin Li "-s ALLOW_MEMORY_GROWTH=0", 178*b095b053SXin Li] 179*b095b053SXin Li 180*b095b053SXin Licc_binary( 181*b095b053SXin Li name = "latency_bench", 182*b095b053SXin Li srcs = ["bench/latency.cc"], 183*b095b053SXin Li linkopts = select({ 184*b095b053SXin Li ":emscripten": EMSCRIPTEN_BENCHMARK_LINKOPTS, 185*b095b053SXin Li "//conditions:default": [], 186*b095b053SXin Li }), 187*b095b053SXin Li deps = [ 188*b095b053SXin Li ":pthreadpool", 189*b095b053SXin Li "@com_google_benchmark//:benchmark", 190*b095b053SXin Li ], 191*b095b053SXin Li) 192*b095b053SXin Li 193*b095b053SXin Licc_binary( 194*b095b053SXin Li name = "throughput_bench", 195*b095b053SXin Li srcs = ["bench/throughput.cc"], 196*b095b053SXin Li linkopts = select({ 197*b095b053SXin Li ":emscripten": EMSCRIPTEN_BENCHMARK_LINKOPTS, 198*b095b053SXin Li "//conditions:default": [], 199*b095b053SXin Li }), 200*b095b053SXin Li deps = [ 201*b095b053SXin Li ":pthreadpool", 202*b095b053SXin Li "@com_google_benchmark//:benchmark", 203*b095b053SXin Li ], 204*b095b053SXin Li) 205*b095b053SXin Li 206*b095b053SXin Li############################# Build configurations ############################# 207*b095b053SXin Li 208*b095b053SXin Li# Synchronize workers using pthreads condition variable. 209*b095b053SXin Liconfig_setting( 210*b095b053SXin Li name = "pthreadpool_sync_primitive_explicit_condvar", 211*b095b053SXin Li define_values = {"pthreadpool_sync_primitive": "condvar"}, 212*b095b053SXin Li) 213*b095b053SXin Li 214*b095b053SXin Li# Synchronize workers using futex. 215*b095b053SXin Liconfig_setting( 216*b095b053SXin Li name = "pthreadpool_sync_primitive_explicit_futex", 217*b095b053SXin Li define_values = {"pthreadpool_sync_primitive": "futex"}, 218*b095b053SXin Li) 219*b095b053SXin Li 220*b095b053SXin Li# Synchronize workers using Grand Central Dispatch. 221*b095b053SXin Liconfig_setting( 222*b095b053SXin Li name = "pthreadpool_sync_primitive_explicit_gcd", 223*b095b053SXin Li define_values = {"pthreadpool_sync_primitive": "gcd"}, 224*b095b053SXin Li) 225*b095b053SXin Li 226*b095b053SXin Li# Synchronize workers using WinAPI event. 227*b095b053SXin Liconfig_setting( 228*b095b053SXin Li name = "pthreadpool_sync_primitive_explicit_event", 229*b095b053SXin Li define_values = {"pthreadpool_sync_primitive": "event"}, 230*b095b053SXin Li) 231*b095b053SXin Li 232*b095b053SXin Liconfig_setting( 233*b095b053SXin Li name = "optimized_build", 234*b095b053SXin Li values = { 235*b095b053SXin Li "compilation_mode": "opt", 236*b095b053SXin Li }, 237*b095b053SXin Li) 238*b095b053SXin Li 239*b095b053SXin Liconfig_setting( 240*b095b053SXin Li name = "linux_x86_64", 241*b095b053SXin Li values = {"cpu": "k8"}, 242*b095b053SXin Li) 243*b095b053SXin Li 244*b095b053SXin Liconfig_setting( 245*b095b053SXin Li name = "linux_arm", 246*b095b053SXin Li values = {"cpu": "arm"}, 247*b095b053SXin Li) 248*b095b053SXin Li 249*b095b053SXin Liconfig_setting( 250*b095b053SXin Li name = "linux_armeabi", 251*b095b053SXin Li values = {"cpu": "armeabi"}, 252*b095b053SXin Li) 253*b095b053SXin Li 254*b095b053SXin Liconfig_setting( 255*b095b053SXin Li name = "linux_armhf", 256*b095b053SXin Li values = {"cpu": "armhf"}, 257*b095b053SXin Li) 258*b095b053SXin Li 259*b095b053SXin Liconfig_setting( 260*b095b053SXin Li name = "linux_armv7a", 261*b095b053SXin Li values = {"cpu": "armv7a"}, 262*b095b053SXin Li) 263*b095b053SXin Li 264*b095b053SXin Liconfig_setting( 265*b095b053SXin Li name = "linux_aarch64", 266*b095b053SXin Li values = {"cpu": "aarch64"}, 267*b095b053SXin Li) 268*b095b053SXin Li 269*b095b053SXin Liconfig_setting( 270*b095b053SXin Li name = "android_x86", 271*b095b053SXin Li values = { 272*b095b053SXin Li "crosstool_top": "//external:android/crosstool", 273*b095b053SXin Li "cpu": "x86", 274*b095b053SXin Li }, 275*b095b053SXin Li) 276*b095b053SXin Li 277*b095b053SXin Liconfig_setting( 278*b095b053SXin Li name = "android_x86_64", 279*b095b053SXin Li values = { 280*b095b053SXin Li "crosstool_top": "//external:android/crosstool", 281*b095b053SXin Li "cpu": "x86_64", 282*b095b053SXin Li }, 283*b095b053SXin Li) 284*b095b053SXin Li 285*b095b053SXin Liconfig_setting( 286*b095b053SXin Li name = "android_armv7", 287*b095b053SXin Li values = { 288*b095b053SXin Li "crosstool_top": "//external:android/crosstool", 289*b095b053SXin Li "cpu": "armeabi-v7a", 290*b095b053SXin Li }, 291*b095b053SXin Li) 292*b095b053SXin Li 293*b095b053SXin Liconfig_setting( 294*b095b053SXin Li name = "android_arm64", 295*b095b053SXin Li values = { 296*b095b053SXin Li "crosstool_top": "//external:android/crosstool", 297*b095b053SXin Li "cpu": "arm64-v8a", 298*b095b053SXin Li }, 299*b095b053SXin Li) 300*b095b053SXin Li 301*b095b053SXin Li# Note: we need to individually match x86 and x86-64 macOS rather than use 302*b095b053SXin Li# catch-all "apple_platform_type": "macos" because that option defaults to 303*b095b053SXin Li# "macos" even when building on Linux! 304*b095b053SXin Liconfig_setting( 305*b095b053SXin Li name = "macos_x86", 306*b095b053SXin Li values = { 307*b095b053SXin Li "apple_platform_type": "macos", 308*b095b053SXin Li "cpu": "darwin", 309*b095b053SXin Li }, 310*b095b053SXin Li) 311*b095b053SXin Li 312*b095b053SXin Liconfig_setting( 313*b095b053SXin Li name = "macos_x86_64", 314*b095b053SXin Li values = { 315*b095b053SXin Li "apple_platform_type": "macos", 316*b095b053SXin Li "cpu": "darwin_x86_64", 317*b095b053SXin Li }, 318*b095b053SXin Li) 319*b095b053SXin Li 320*b095b053SXin Liconfig_setting( 321*b095b053SXin Li name = "ios", 322*b095b053SXin Li values = { 323*b095b053SXin Li "crosstool_top": "@bazel_tools//tools/cpp:toolchain", 324*b095b053SXin Li "apple_platform_type": "ios", 325*b095b053SXin Li }, 326*b095b053SXin Li) 327*b095b053SXin Li 328*b095b053SXin Liconfig_setting( 329*b095b053SXin Li name = "ios_x86", 330*b095b053SXin Li values = { 331*b095b053SXin Li "apple_platform_type": "ios", 332*b095b053SXin Li "cpu": "ios_i386", 333*b095b053SXin Li }, 334*b095b053SXin Li) 335*b095b053SXin Li 336*b095b053SXin Liconfig_setting( 337*b095b053SXin Li name = "ios_x86_64", 338*b095b053SXin Li values = { 339*b095b053SXin Li "apple_platform_type": "ios", 340*b095b053SXin Li "cpu": "ios_x86_64", 341*b095b053SXin Li }, 342*b095b053SXin Li) 343*b095b053SXin Li 344*b095b053SXin Liconfig_setting( 345*b095b053SXin Li name = "watchos", 346*b095b053SXin Li values = { 347*b095b053SXin Li "crosstool_top": "@bazel_tools//tools/cpp:toolchain", 348*b095b053SXin Li "apple_platform_type": "watchos", 349*b095b053SXin Li }, 350*b095b053SXin Li) 351*b095b053SXin Li 352*b095b053SXin Liconfig_setting( 353*b095b053SXin Li name = "watchos_x86", 354*b095b053SXin Li values = { 355*b095b053SXin Li "apple_platform_type": "watchos", 356*b095b053SXin Li "cpu": "watchos_i386", 357*b095b053SXin Li }, 358*b095b053SXin Li) 359*b095b053SXin Li 360*b095b053SXin Liconfig_setting( 361*b095b053SXin Li name = "watchos_x86_64", 362*b095b053SXin Li values = { 363*b095b053SXin Li "apple_platform_type": "watchos", 364*b095b053SXin Li "cpu": "watchos_x86_64", 365*b095b053SXin Li }, 366*b095b053SXin Li) 367*b095b053SXin Li 368*b095b053SXin Liconfig_setting( 369*b095b053SXin Li name = "tvos", 370*b095b053SXin Li values = { 371*b095b053SXin Li "crosstool_top": "@bazel_tools//tools/cpp:toolchain", 372*b095b053SXin Li "apple_platform_type": "tvos", 373*b095b053SXin Li }, 374*b095b053SXin Li) 375*b095b053SXin Li 376*b095b053SXin Liconfig_setting( 377*b095b053SXin Li name = "tvos_x86_64", 378*b095b053SXin Li values = { 379*b095b053SXin Li "apple_platform_type": "tvos", 380*b095b053SXin Li "cpu": "tvos_x86_64", 381*b095b053SXin Li }, 382*b095b053SXin Li) 383*b095b053SXin Li 384*b095b053SXin Liconfig_setting( 385*b095b053SXin Li name = "windows_x86_64", 386*b095b053SXin Li values = { 387*b095b053SXin Li "cpu": "x64_windows", 388*b095b053SXin Li }, 389*b095b053SXin Li) 390*b095b053SXin Li 391*b095b053SXin Liconfig_setting( 392*b095b053SXin Li name = "emscripten", 393*b095b053SXin Li values = { 394*b095b053SXin Li "crosstool_top": "//toolchain:emscripten", 395*b095b053SXin Li } 396*b095b053SXin Li) 397*b095b053SXin Li 398*b095b053SXin Liconfig_setting( 399*b095b053SXin Li name = "emscripten_with_threads", 400*b095b053SXin Li values = { 401*b095b053SXin Li "crosstool_top": "//toolchain:emscripten", 402*b095b053SXin Li "copt": "-pthread", 403*b095b053SXin Li } 404*b095b053SXin Li) 405