1# 2# Copyright 2017 The Abseil Authors. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# https://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") 18load( 19 "//absl:copts/configure_copts.bzl", 20 "ABSL_DEFAULT_COPTS", 21 "ABSL_DEFAULT_LINKOPTS", 22 "ABSL_TEST_COPTS", 23) 24 25package(default_visibility = ["//visibility:public"]) 26 27licenses(["notice"]) 28 29# Internal data structure for efficiently detecting mutex dependency cycles 30cc_library( 31 name = "graphcycles_internal", 32 srcs = [ 33 "internal/graphcycles.cc", 34 ], 35 hdrs = [ 36 "internal/graphcycles.h", 37 ], 38 copts = ABSL_DEFAULT_COPTS, 39 linkopts = ABSL_DEFAULT_LINKOPTS, 40 visibility = [ 41 "//absl:__subpackages__", 42 ], 43 deps = [ 44 "//absl/base", 45 "//absl/base:base_internal", 46 "//absl/base:config", 47 "//absl/base:core_headers", 48 "//absl/base:malloc_internal", 49 "//absl/base:raw_logging_internal", 50 ], 51) 52 53cc_library( 54 name = "kernel_timeout_internal", 55 hdrs = ["internal/kernel_timeout.h"], 56 copts = ABSL_DEFAULT_COPTS, 57 linkopts = ABSL_DEFAULT_LINKOPTS, 58 visibility = [ 59 "//absl/synchronization:__pkg__", 60 ], 61 deps = [ 62 "//absl/base:core_headers", 63 "//absl/base:raw_logging_internal", 64 "//absl/time", 65 ], 66) 67 68cc_library( 69 name = "synchronization", 70 srcs = [ 71 "barrier.cc", 72 "blocking_counter.cc", 73 "internal/create_thread_identity.cc", 74 "internal/per_thread_sem.cc", 75 "internal/waiter.cc", 76 "notification.cc", 77 ] + select({ 78 "//conditions:default": ["mutex.cc"], 79 }), 80 hdrs = [ 81 "barrier.h", 82 "blocking_counter.h", 83 "internal/create_thread_identity.h", 84 "internal/mutex_nonprod.inc", 85 "internal/per_thread_sem.h", 86 "internal/waiter.h", 87 "mutex.h", 88 "notification.h", 89 ], 90 copts = ABSL_DEFAULT_COPTS, 91 linkopts = select({ 92 "//absl:windows": [], 93 "//absl:wasm": [], 94 "//conditions:default": ["-pthread"], 95 }) + ABSL_DEFAULT_LINKOPTS, 96 deps = [ 97 ":graphcycles_internal", 98 ":kernel_timeout_internal", 99 "//absl/base", 100 "//absl/base:atomic_hook", 101 "//absl/base:base_internal", 102 "//absl/base:config", 103 "//absl/base:core_headers", 104 "//absl/base:dynamic_annotations", 105 "//absl/base:malloc_internal", 106 "//absl/base:raw_logging_internal", 107 "//absl/debugging:stacktrace", 108 "//absl/debugging:symbolize", 109 "//absl/time", 110 ], 111) 112 113cc_test( 114 name = "barrier_test", 115 size = "small", 116 srcs = ["barrier_test.cc"], 117 copts = ABSL_TEST_COPTS, 118 linkopts = ABSL_DEFAULT_LINKOPTS, 119 deps = [ 120 ":synchronization", 121 "//absl/time", 122 "@com_google_googletest//:gtest_main", 123 ], 124) 125 126cc_test( 127 name = "blocking_counter_test", 128 size = "small", 129 srcs = ["blocking_counter_test.cc"], 130 copts = ABSL_TEST_COPTS, 131 linkopts = ABSL_DEFAULT_LINKOPTS, 132 deps = [ 133 ":synchronization", 134 "//absl/time", 135 "@com_google_googletest//:gtest_main", 136 ], 137) 138 139cc_test( 140 name = "graphcycles_test", 141 size = "medium", 142 srcs = ["internal/graphcycles_test.cc"], 143 copts = ABSL_TEST_COPTS, 144 linkopts = ABSL_DEFAULT_LINKOPTS, 145 deps = [ 146 ":graphcycles_internal", 147 "//absl/base:core_headers", 148 "//absl/base:raw_logging_internal", 149 "@com_google_googletest//:gtest_main", 150 ], 151) 152 153cc_test( 154 name = "graphcycles_benchmark", 155 srcs = ["internal/graphcycles_benchmark.cc"], 156 copts = ABSL_TEST_COPTS, 157 linkopts = ABSL_DEFAULT_LINKOPTS, 158 tags = [ 159 "benchmark", 160 ], 161 deps = [ 162 ":graphcycles_internal", 163 "//absl/base:raw_logging_internal", 164 "@com_github_google_benchmark//:benchmark_main", 165 ], 166) 167 168cc_library( 169 name = "thread_pool", 170 testonly = 1, 171 hdrs = ["internal/thread_pool.h"], 172 linkopts = ABSL_DEFAULT_LINKOPTS, 173 visibility = [ 174 "//absl:__subpackages__", 175 ], 176 deps = [ 177 ":synchronization", 178 "//absl/base:core_headers", 179 ], 180) 181 182cc_test( 183 name = "mutex_test", 184 size = "large", 185 srcs = ["mutex_test.cc"], 186 copts = ABSL_TEST_COPTS, 187 linkopts = ABSL_DEFAULT_LINKOPTS, 188 shard_count = 25, 189 deps = [ 190 ":synchronization", 191 ":thread_pool", 192 "//absl/base", 193 "//absl/base:config", 194 "//absl/base:core_headers", 195 "//absl/base:raw_logging_internal", 196 "//absl/memory", 197 "//absl/time", 198 "@com_google_googletest//:gtest_main", 199 ], 200) 201 202cc_library( 203 name = "mutex_benchmark_common", 204 testonly = 1, 205 srcs = ["mutex_benchmark.cc"], 206 copts = ABSL_TEST_COPTS, 207 linkopts = ABSL_DEFAULT_LINKOPTS, 208 visibility = [ 209 "//absl/synchronization:__pkg__", 210 ], 211 deps = [ 212 ":synchronization", 213 ":thread_pool", 214 "//absl/base", 215 "//absl/base:config", 216 "@com_github_google_benchmark//:benchmark_main", 217 ], 218 alwayslink = 1, 219) 220 221cc_binary( 222 name = "mutex_benchmark", 223 testonly = 1, 224 copts = ABSL_DEFAULT_COPTS, 225 linkopts = ABSL_DEFAULT_LINKOPTS, 226 visibility = ["//visibility:private"], 227 deps = [ 228 ":mutex_benchmark_common", 229 ], 230) 231 232cc_test( 233 name = "notification_test", 234 size = "small", 235 srcs = ["notification_test.cc"], 236 copts = ABSL_TEST_COPTS, 237 linkopts = ABSL_DEFAULT_LINKOPTS, 238 deps = [ 239 ":synchronization", 240 "//absl/time", 241 "@com_google_googletest//:gtest_main", 242 ], 243) 244 245cc_library( 246 name = "per_thread_sem_test_common", 247 testonly = 1, 248 srcs = ["internal/per_thread_sem_test.cc"], 249 copts = ABSL_TEST_COPTS, 250 linkopts = ABSL_DEFAULT_LINKOPTS, 251 deps = [ 252 ":synchronization", 253 "//absl/base", 254 "//absl/base:config", 255 "//absl/strings", 256 "//absl/time", 257 "@com_google_googletest//:gtest", 258 ], 259 alwayslink = 1, 260) 261 262cc_test( 263 name = "per_thread_sem_test", 264 size = "medium", 265 copts = ABSL_TEST_COPTS, 266 linkopts = ABSL_DEFAULT_LINKOPTS, 267 deps = [ 268 ":per_thread_sem_test_common", 269 ":synchronization", 270 "//absl/strings", 271 "//absl/time", 272 "@com_google_googletest//:gtest_main", 273 ], 274) 275 276cc_test( 277 name = "lifetime_test", 278 srcs = [ 279 "lifetime_test.cc", 280 ], 281 copts = ABSL_TEST_COPTS, 282 linkopts = ABSL_DEFAULT_LINKOPTS, 283 tags = ["no_test_ios_x86_64"], 284 deps = [ 285 ":synchronization", 286 "//absl/base:core_headers", 287 "//absl/base:raw_logging_internal", 288 ], 289) 290