xref: /aosp_15_r20/external/pthreadpool/BUILD.bazel (revision b095b0533730c2930f947df924a4486d266faa1a)
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