re2 1.22.2 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -4
- package/binding.gyp +5 -1
- package/lib/addon.cc +4 -0
- package/lib/new.cc +1 -246
- package/lib/pattern.cc +252 -0
- package/lib/pattern.h +10 -0
- package/lib/set.cc +777 -0
- package/lib/wrapped_re2_set.h +42 -0
- package/package.json +21 -9
- package/re2.d.ts +46 -9
- package/vendor/abseil-cpp/CMake/AbseilDll.cmake +14 -24
- package/vendor/abseil-cpp/CMake/AbseilHelpers.cmake +3 -3
- package/vendor/abseil-cpp/CMake/README.md +2 -2
- package/vendor/abseil-cpp/CMakeLists.txt +3 -3
- package/vendor/abseil-cpp/MODULE.bazel +6 -9
- package/vendor/abseil-cpp/README.md +6 -8
- package/vendor/abseil-cpp/absl/abseil.podspec.gen.py +6 -4
- package/vendor/abseil-cpp/absl/algorithm/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/algorithm/CMakeLists.txt +1 -0
- package/vendor/abseil-cpp/absl/algorithm/container.h +2 -19
- package/vendor/abseil-cpp/absl/algorithm/container_test.cc +4 -11
- package/vendor/abseil-cpp/absl/base/BUILD.bazel +60 -45
- package/vendor/abseil-cpp/absl/base/CMakeLists.txt +57 -38
- package/vendor/abseil-cpp/absl/base/attributes.h +76 -7
- package/vendor/abseil-cpp/absl/base/attributes_test.cc +43 -0
- package/vendor/abseil-cpp/absl/base/call_once.h +11 -12
- package/vendor/abseil-cpp/absl/base/config.h +22 -129
- package/vendor/abseil-cpp/absl/base/exception_safety_testing_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- package/vendor/abseil-cpp/absl/base/{internal/fast_type_id_test.cc → fast_type_id_test.cc} +34 -30
- package/vendor/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- package/vendor/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- package/vendor/abseil-cpp/absl/base/internal/endian.h +34 -38
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
- package/vendor/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -9
- package/vendor/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
- package/vendor/abseil-cpp/absl/base/internal/poison.cc +7 -6
- package/vendor/abseil-cpp/absl/base/internal/spinlock.cc +15 -28
- package/vendor/abseil-cpp/absl/base/internal/spinlock.h +65 -35
- package/vendor/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/sysinfo_test.cc +2 -2
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/base/internal/thread_identity_test.cc +4 -4
- package/vendor/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +4 -0
- package/vendor/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- package/vendor/abseil-cpp/absl/base/no_destructor.h +11 -32
- package/vendor/abseil-cpp/absl/base/no_destructor_test.cc +0 -4
- package/vendor/abseil-cpp/absl/base/nullability.h +83 -72
- package/vendor/abseil-cpp/absl/base/nullability_test.cc +25 -64
- package/vendor/abseil-cpp/absl/base/options.h +3 -80
- package/vendor/abseil-cpp/absl/base/policy_checks.h +7 -7
- package/vendor/abseil-cpp/absl/base/raw_logging_test.cc +15 -0
- package/vendor/abseil-cpp/absl/base/spinlock_test_common.cc +50 -30
- package/vendor/abseil-cpp/absl/cleanup/BUILD.bazel +2 -1
- package/vendor/abseil-cpp/absl/cleanup/CMakeLists.txt +0 -1
- package/vendor/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- package/vendor/abseil-cpp/absl/cleanup/cleanup_test.cc +0 -2
- package/vendor/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- package/vendor/abseil-cpp/absl/container/BUILD.bazel +74 -1
- package/vendor/abseil-cpp/absl/container/CMakeLists.txt +73 -0
- package/vendor/abseil-cpp/absl/container/btree_benchmark.cc +51 -9
- package/vendor/abseil-cpp/absl/container/btree_map.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_set.h +8 -6
- package/vendor/abseil-cpp/absl/container/btree_test.cc +89 -4
- package/vendor/abseil-cpp/absl/container/fixed_array.h +7 -15
- package/vendor/abseil-cpp/absl/container/fixed_array_test.cc +17 -0
- package/vendor/abseil-cpp/absl/container/flat_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/flat_hash_map_test.cc +8 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set.h +19 -14
- package/vendor/abseil-cpp/absl/container/flat_hash_set_test.cc +46 -0
- package/vendor/abseil-cpp/absl/container/inlined_vector.h +7 -6
- package/vendor/abseil-cpp/absl/container/inlined_vector_test.cc +28 -0
- package/vendor/abseil-cpp/absl/container/internal/btree.h +132 -29
- package/vendor/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- package/vendor/abseil-cpp/absl/container/internal/common.h +43 -0
- package/vendor/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple.h +28 -24
- package/vendor/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +4 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory.h +80 -17
- package/vendor/abseil-cpp/absl/container/internal/container_memory_test.cc +32 -2
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults.h +13 -8
- package/vendor/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +1 -52
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.cc +9 -31
- package/vendor/abseil-cpp/absl/container/internal/hash_generator_testing.h +23 -32
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_testing.h +5 -1
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits.h +11 -23
- package/vendor/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +14 -9
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +516 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +23 -6
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler.h +32 -13
- package/vendor/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +8 -8
- package/vendor/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- package/vendor/abseil-cpp/absl/container/internal/layout.h +26 -42
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.cc +1506 -213
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set.h +1095 -1658
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +3 -2
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +31 -29
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +51 -20
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
- package/vendor/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +707 -363
- package/vendor/abseil-cpp/absl/container/node_hash_map.h +20 -15
- package/vendor/abseil-cpp/absl/container/node_hash_map_test.cc +0 -3
- package/vendor/abseil-cpp/absl/container/node_hash_set.h +18 -13
- package/vendor/abseil-cpp/absl/container/sample_element_size_test.cc +3 -8
- package/vendor/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +1 -1
- package/vendor/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +9 -20
- package/vendor/abseil-cpp/absl/copts/GENERATED_copts.bzl +9 -20
- package/vendor/abseil-cpp/absl/copts/copts.py +24 -15
- package/vendor/abseil-cpp/absl/crc/BUILD.bazel +3 -0
- package/vendor/abseil-cpp/absl/crc/crc32c.cc +0 -4
- package/vendor/abseil-cpp/absl/crc/crc32c.h +7 -5
- package/vendor/abseil-cpp/absl/crc/crc32c_benchmark.cc +17 -4
- package/vendor/abseil-cpp/absl/crc/crc32c_test.cc +30 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.cc +17 -0
- package/vendor/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
- package/vendor/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- package/vendor/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
- package/vendor/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +136 -165
- package/vendor/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
- package/vendor/abseil-cpp/absl/debugging/BUILD.bazel +7 -0
- package/vendor/abseil-cpp/absl/debugging/CMakeLists.txt +4 -0
- package/vendor/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- package/vendor/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- package/vendor/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- package/vendor/abseil-cpp/absl/debugging/internal/demangle_test.cc +11 -10
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- package/vendor/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -14
- package/vendor/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
- package/vendor/abseil-cpp/absl/debugging/stacktrace.cc +161 -27
- package/vendor/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- package/vendor/abseil-cpp/absl/debugging/stacktrace_test.cc +435 -1
- package/vendor/abseil-cpp/absl/debugging/symbolize_elf.inc +55 -63
- package/vendor/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- package/vendor/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- package/vendor/abseil-cpp/absl/flags/BUILD.bazel +6 -0
- package/vendor/abseil-cpp/absl/flags/CMakeLists.txt +3 -0
- package/vendor/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/flag.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/flag.cc +14 -13
- package/vendor/abseil-cpp/absl/flags/internal/flag.h +34 -34
- package/vendor/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/internal/registry.h +4 -3
- package/vendor/abseil-cpp/absl/flags/internal/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/parse.cc +10 -6
- package/vendor/abseil-cpp/absl/flags/reflection.cc +9 -7
- package/vendor/abseil-cpp/absl/flags/usage.cc +2 -2
- package/vendor/abseil-cpp/absl/flags/usage_config.cc +2 -2
- package/vendor/abseil-cpp/absl/functional/BUILD.bazel +7 -6
- package/vendor/abseil-cpp/absl/functional/CMakeLists.txt +2 -4
- package/vendor/abseil-cpp/absl/functional/any_invocable.h +15 -15
- package/vendor/abseil-cpp/absl/functional/any_invocable_test.cc +10 -42
- package/vendor/abseil-cpp/absl/functional/function_ref.h +2 -9
- package/vendor/abseil-cpp/absl/functional/function_ref_test.cc +10 -0
- package/vendor/abseil-cpp/absl/functional/function_type_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/functional/internal/any_invocable.h +112 -227
- package/vendor/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- package/vendor/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- package/vendor/abseil-cpp/absl/functional/overload.h +0 -20
- package/vendor/abseil-cpp/absl/functional/overload_test.cc +1 -7
- package/vendor/abseil-cpp/absl/hash/BUILD.bazel +16 -9
- package/vendor/abseil-cpp/absl/hash/CMakeLists.txt +6 -9
- package/vendor/abseil-cpp/absl/hash/hash.h +18 -0
- package/vendor/abseil-cpp/absl/hash/hash_benchmark.cc +3 -0
- package/vendor/abseil-cpp/absl/hash/hash_instantiated_test.cc +1 -1
- package/vendor/abseil-cpp/absl/hash/hash_test.cc +131 -30
- package/vendor/abseil-cpp/absl/hash/hash_testing.h +20 -20
- package/vendor/abseil-cpp/absl/hash/internal/hash.cc +129 -17
- package/vendor/abseil-cpp/absl/hash/internal/hash.h +326 -362
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +54 -151
- package/vendor/abseil-cpp/absl/hash/internal/spy_hash_state.h +14 -2
- package/vendor/abseil-cpp/absl/{strings/cord_buffer.cc → hash/internal/weakly_mixed_integer.h} +14 -6
- package/vendor/abseil-cpp/absl/log/BUILD.bazel +4 -0
- package/vendor/abseil-cpp/absl/log/CMakeLists.txt +7 -0
- package/vendor/abseil-cpp/absl/log/check.h +2 -1
- package/vendor/abseil-cpp/absl/log/check_test_impl.inc +308 -14
- package/vendor/abseil-cpp/absl/log/die_if_null.h +2 -2
- package/vendor/abseil-cpp/absl/log/flags_test.cc +7 -0
- package/vendor/abseil-cpp/absl/log/globals.h +4 -5
- package/vendor/abseil-cpp/absl/log/internal/BUILD.bazel +13 -9
- package/vendor/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- package/vendor/abseil-cpp/absl/log/internal/check_op.cc +24 -22
- package/vendor/abseil-cpp/absl/log/internal/check_op.h +149 -94
- package/vendor/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- package/vendor/abseil-cpp/absl/log/internal/conditions.h +7 -2
- package/vendor/abseil-cpp/absl/log/internal/fnmatch_test.cc +1 -0
- package/vendor/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- package/vendor/abseil-cpp/absl/log/internal/log_message.h +84 -59
- package/vendor/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
- package/vendor/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- package/vendor/abseil-cpp/absl/log/internal/proto.cc +3 -2
- package/vendor/abseil-cpp/absl/log/internal/proto.h +3 -3
- package/vendor/abseil-cpp/absl/log/internal/strip.h +4 -12
- package/vendor/abseil-cpp/absl/log/internal/structured.h +3 -7
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.cc +9 -9
- package/vendor/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- package/vendor/abseil-cpp/absl/log/internal/voidify.h +10 -4
- package/vendor/abseil-cpp/absl/log/log.h +48 -35
- package/vendor/abseil-cpp/absl/log/log_basic_test_impl.inc +45 -0
- package/vendor/abseil-cpp/absl/log/log_entry.cc +241 -19
- package/vendor/abseil-cpp/absl/log/log_entry.h +2 -0
- package/vendor/abseil-cpp/absl/log/log_format_test.cc +412 -6
- package/vendor/abseil-cpp/absl/log/log_modifier_methods_test.cc +20 -0
- package/vendor/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- package/vendor/abseil-cpp/absl/log/log_streamer_test.cc +15 -2
- package/vendor/abseil-cpp/absl/log/scoped_mock_log.h +7 -1
- package/vendor/abseil-cpp/absl/log/structured_test.cc +1 -0
- package/vendor/abseil-cpp/absl/memory/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/BUILD.bazel +2 -0
- package/vendor/abseil-cpp/absl/meta/type_traits.h +46 -175
- package/vendor/abseil-cpp/absl/meta/type_traits_test.cc +1 -478
- package/vendor/abseil-cpp/absl/numeric/BUILD.bazel +7 -3
- package/vendor/abseil-cpp/absl/numeric/CMakeLists.txt +2 -0
- package/vendor/abseil-cpp/absl/numeric/bits.h +68 -2
- package/vendor/abseil-cpp/absl/numeric/bits_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/numeric/bits_test.cc +83 -0
- package/vendor/abseil-cpp/absl/numeric/int128.cc +0 -52
- package/vendor/abseil-cpp/absl/numeric/int128_benchmark.cc +14 -15
- package/vendor/abseil-cpp/absl/numeric/int128_test.cc +13 -8
- package/vendor/abseil-cpp/absl/numeric/internal/bits.h +39 -7
- package/vendor/abseil-cpp/absl/profiling/BUILD.bazel +47 -0
- package/vendor/abseil-cpp/absl/profiling/CMakeLists.txt +38 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.cc +124 -0
- package/vendor/abseil-cpp/absl/profiling/hashtable.h +40 -0
- package/vendor/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.cc +462 -0
- package/vendor/abseil-cpp/absl/profiling/internal/profile_builder.h +138 -0
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
- package/vendor/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +7 -3
- package/vendor/abseil-cpp/absl/random/BUILD.bazel +6 -4
- package/vendor/abseil-cpp/absl/random/CMakeLists.txt +20 -19
- package/vendor/abseil-cpp/absl/random/benchmarks.cc +16 -23
- package/vendor/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- package/vendor/abseil-cpp/absl/random/bit_gen_ref_test.cc +7 -2
- package/vendor/abseil-cpp/absl/random/distributions.h +6 -8
- package/vendor/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- package/vendor/abseil-cpp/absl/random/internal/BUILD.bazel +19 -20
- package/vendor/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +24 -92
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_b.cc → random/internal/entropy_pool.h} +14 -6
- package/vendor/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
- package/vendor/abseil-cpp/absl/random/internal/mock_helpers.h +6 -7
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- package/vendor/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +39 -0
- package/vendor/abseil-cpp/absl/random/internal/randen_benchmarks.cc +8 -6
- package/vendor/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- package/vendor/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- package/vendor/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- package/vendor/abseil-cpp/absl/random/internal/seed_material_test.cc +3 -0
- package/vendor/abseil-cpp/absl/random/mock_distributions_test.cc +5 -4
- package/vendor/abseil-cpp/absl/random/mocking_bit_gen.h +8 -10
- package/vendor/abseil-cpp/absl/random/random.h +88 -53
- package/vendor/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- package/vendor/abseil-cpp/absl/status/BUILD.bazel +26 -0
- package/vendor/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- package/vendor/abseil-cpp/absl/status/internal/status_matchers.cc +4 -3
- package/vendor/abseil-cpp/absl/status/internal/statusor_internal.h +194 -32
- package/vendor/abseil-cpp/absl/status/status.cc +4 -8
- package/vendor/abseil-cpp/absl/status/status.h +8 -8
- package/vendor/abseil-cpp/absl/{base/inline_variable_test_a.cc → status/status_benchmark.cc} +20 -10
- package/vendor/abseil-cpp/absl/status/status_matchers_test.cc +65 -0
- package/vendor/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.cc +2 -2
- package/vendor/abseil-cpp/absl/status/statusor.h +49 -102
- package/vendor/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
- package/vendor/abseil-cpp/absl/status/statusor_test.cc +323 -1
- package/vendor/abseil-cpp/absl/strings/BUILD.bazel +70 -34
- package/vendor/abseil-cpp/absl/strings/CMakeLists.txt +6 -3
- package/vendor/abseil-cpp/absl/strings/ascii.cc +9 -9
- package/vendor/abseil-cpp/absl/strings/ascii.h +18 -18
- package/vendor/abseil-cpp/absl/strings/ascii_benchmark.cc +5 -8
- package/vendor/abseil-cpp/absl/strings/charconv.cc +21 -22
- package/vendor/abseil-cpp/absl/strings/charconv.h +5 -5
- package/vendor/abseil-cpp/absl/strings/charconv_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/charset_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/cord.cc +54 -58
- package/vendor/abseil-cpp/absl/strings/cord.h +94 -84
- package/vendor/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- package/vendor/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- package/vendor/abseil-cpp/absl/strings/cord_test.cc +23 -0
- package/vendor/abseil-cpp/absl/strings/cordz_test_helpers.h +4 -5
- package/vendor/abseil-cpp/absl/strings/escaping.cc +130 -149
- package/vendor/abseil-cpp/absl/strings/escaping.h +9 -10
- package/vendor/abseil-cpp/absl/strings/escaping_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/escaping_test.cc +19 -9
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/internal/cord_internal.h +6 -10
- package/vendor/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- package/vendor/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.cc +5 -9
- package/vendor/abseil-cpp/absl/strings/internal/cordz_info.h +2 -4
- package/vendor/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
- package/vendor/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +1 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- package/vendor/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- package/vendor/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1 -6
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- package/vendor/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +3 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- package/vendor/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
- package/vendor/abseil-cpp/absl/strings/internal/str_split_internal.h +7 -2
- package/vendor/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- package/vendor/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- package/vendor/abseil-cpp/absl/strings/internal/utf8_test.cc +196 -3
- package/vendor/abseil-cpp/absl/strings/numbers.cc +53 -32
- package/vendor/abseil-cpp/absl/strings/numbers.h +87 -58
- package/vendor/abseil-cpp/absl/strings/numbers_benchmark.cc +1 -1
- package/vendor/abseil-cpp/absl/strings/numbers_test.cc +634 -120
- package/vendor/abseil-cpp/absl/strings/str_cat.cc +6 -7
- package/vendor/abseil-cpp/absl/strings/str_cat.h +32 -32
- package/vendor/abseil-cpp/absl/strings/str_cat_benchmark.cc +25 -1
- package/vendor/abseil-cpp/absl/strings/str_cat_test.cc +2 -7
- package/vendor/abseil-cpp/absl/strings/str_format.h +18 -18
- package/vendor/abseil-cpp/absl/strings/str_format_test.cc +8 -14
- package/vendor/abseil-cpp/absl/strings/str_join_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.cc +3 -3
- package/vendor/abseil-cpp/absl/strings/str_replace.h +6 -6
- package/vendor/abseil-cpp/absl/strings/str_replace_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/str_split.h +2 -2
- package/vendor/abseil-cpp/absl/strings/str_split_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/strings/string_view.cc +4 -9
- package/vendor/abseil-cpp/absl/strings/string_view.h +38 -39
- package/vendor/abseil-cpp/absl/strings/string_view_benchmark.cc +4 -6
- package/vendor/abseil-cpp/absl/strings/string_view_test.cc +2 -50
- package/vendor/abseil-cpp/absl/strings/strip.h +4 -4
- package/vendor/abseil-cpp/absl/strings/substitute.cc +5 -4
- package/vendor/abseil-cpp/absl/strings/substitute.h +66 -64
- package/vendor/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
- package/vendor/abseil-cpp/absl/synchronization/BUILD.bazel +6 -1
- package/vendor/abseil-cpp/absl/synchronization/CMakeLists.txt +2 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier.cc +1 -1
- package/vendor/abseil-cpp/absl/synchronization/barrier_test.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
- package/vendor/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +2 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +6 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- package/vendor/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/thread_pool.h +3 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/internal/waiter_test.cc +12 -3
- package/vendor/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- package/vendor/abseil-cpp/absl/synchronization/lifetime_test.cc +4 -4
- package/vendor/abseil-cpp/absl/synchronization/mutex.cc +27 -29
- package/vendor/abseil-cpp/absl/synchronization/mutex.h +205 -126
- package/vendor/abseil-cpp/absl/synchronization/mutex_benchmark.cc +13 -31
- package/vendor/abseil-cpp/absl/synchronization/mutex_test.cc +183 -169
- package/vendor/abseil-cpp/absl/synchronization/notification.cc +5 -5
- package/vendor/abseil-cpp/absl/synchronization/notification.h +1 -1
- package/vendor/abseil-cpp/absl/synchronization/notification_test.cc +3 -3
- package/vendor/abseil-cpp/absl/time/BUILD.bazel +9 -1
- package/vendor/abseil-cpp/absl/time/CMakeLists.txt +3 -1
- package/vendor/abseil-cpp/absl/time/civil_time.cc +1 -0
- package/vendor/abseil-cpp/absl/time/civil_time_test.cc +134 -0
- package/vendor/abseil-cpp/absl/time/clock.cc +11 -14
- package/vendor/abseil-cpp/absl/time/duration.cc +14 -9
- package/vendor/abseil-cpp/absl/time/duration_test.cc +6 -7
- package/vendor/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +14 -3
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +4 -490
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +41 -4
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +22 -23
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- package/vendor/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +1 -488
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +2 -1
- package/vendor/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +1 -1
- package/vendor/abseil-cpp/absl/time/time.h +24 -18
- package/vendor/abseil-cpp/absl/time/time_test.cc +26 -0
- package/vendor/abseil-cpp/absl/types/BUILD.bazel +11 -164
- package/vendor/abseil-cpp/absl/types/CMakeLists.txt +23 -167
- package/vendor/abseil-cpp/absl/types/any.h +9 -484
- package/vendor/abseil-cpp/absl/types/optional.h +7 -747
- package/vendor/abseil-cpp/absl/types/span.h +46 -19
- package/vendor/abseil-cpp/absl/types/span_test.cc +27 -0
- package/vendor/abseil-cpp/absl/types/variant.h +5 -784
- package/vendor/abseil-cpp/absl/types/variant_test.cc +43 -2597
- package/vendor/abseil-cpp/absl/utility/BUILD.bazel +1 -41
- package/vendor/abseil-cpp/absl/utility/CMakeLists.txt +0 -40
- package/vendor/abseil-cpp/absl/utility/utility.h +10 -185
- package/vendor/abseil-cpp/ci/absl_alternate_options.h +2 -3
- package/vendor/abseil-cpp/ci/cmake_common.sh +2 -2
- package/vendor/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +12 -13
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +24 -21
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +12 -12
- package/vendor/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +23 -22
- package/vendor/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +20 -19
- package/vendor/abseil-cpp/ci/linux_docker_containers.sh +4 -4
- package/vendor/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +17 -17
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +10 -10
- package/vendor/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +1 -1
- package/vendor/abseil-cpp/ci/macos_xcode_bazel.sh +9 -10
- package/vendor/abseil-cpp/ci/macos_xcode_cmake.sh +9 -1
- package/vendor/abseil-cpp/ci/windows_clangcl_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_bazel.bat +14 -6
- package/vendor/abseil-cpp/ci/windows_msvc_cmake.bat +1 -1
- package/vendor/re2/.bazelrc +4 -4
- package/vendor/re2/.bcr/metadata.template.json +16 -0
- package/vendor/re2/.bcr/presubmit.yml +57 -0
- package/vendor/re2/.bcr/source.template.json +5 -0
- package/vendor/re2/.github/bazel.sh +1 -7
- package/vendor/re2/.github/workflows/ci-bazel.yml +5 -5
- package/vendor/re2/.github/workflows/ci-cmake.yml +4 -4
- package/vendor/re2/.github/workflows/ci.yml +5 -6
- package/vendor/re2/.github/workflows/pages.yml +3 -3
- package/vendor/re2/.github/workflows/python.yml +29 -24
- package/vendor/re2/.github/workflows/release-bazel.yml +42 -0
- package/vendor/re2/.github/workflows/release.yml +15 -4
- package/vendor/re2/BUILD.bazel +25 -0
- package/vendor/re2/CMakeLists.txt +100 -85
- package/vendor/re2/CONTRIBUTING.md +0 -1
- package/vendor/re2/MODULE.bazel +10 -10
- package/vendor/re2/Makefile +1 -1
- package/vendor/re2/README.md +259 -0
- package/vendor/re2/python/BUILD.bazel +8 -0
- package/vendor/re2/python/re2.py +1 -1
- package/vendor/re2/python/re2_test.py +6 -0
- package/vendor/re2/python/setup.py +3 -3
- package/vendor/re2/re2/bitmap256.cc +3 -4
- package/vendor/re2/re2/bitstate.cc +15 -10
- package/vendor/re2/re2/dfa.cc +1 -2
- package/vendor/re2/re2/parse.cc +3 -4
- package/vendor/re2/re2/prog.cc +1 -2
- package/vendor/re2/re2/prog.h +1 -0
- package/vendor/re2/re2/re2.cc +5 -0
- package/vendor/re2/re2/re2.h +9 -9
- package/vendor/re2/re2/set.cc +6 -0
- package/vendor/re2/re2/set.h +5 -0
- package/vendor/re2/re2/testing/re2_arg_test.cc +3 -3
- package/vendor/re2/re2/testing/re2_test.cc +8 -0
- package/vendor/re2/re2/testing/set_test.cc +5 -0
- package/vendor/re2/re2/walker-inl.h +1 -1
- package/vendor/abseil-cpp/WORKSPACE +0 -76
- package/vendor/abseil-cpp/WORKSPACE.bzlmod +0 -19
- package/vendor/abseil-cpp/absl/base/inline_variable_test.cc +0 -64
- package/vendor/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- package/vendor/abseil-cpp/absl/base/internal/inline_variable_testing.h +0 -46
- package/vendor/abseil-cpp/absl/base/internal/invoke.h +0 -241
- package/vendor/abseil-cpp/absl/base/internal/nullability_impl.h +0 -69
- package/vendor/abseil-cpp/absl/base/invoke_test.cc +0 -331
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -148
- package/vendor/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -54
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- package/vendor/abseil-cpp/absl/random/internal/pool_urbg_test.cc +0 -182
- package/vendor/abseil-cpp/absl/types/any_exception_safety_test.cc +0 -173
- package/vendor/abseil-cpp/absl/types/any_test.cc +0 -778
- package/vendor/abseil-cpp/absl/types/bad_any_cast.cc +0 -64
- package/vendor/abseil-cpp/absl/types/bad_any_cast.h +0 -75
- package/vendor/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- package/vendor/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- package/vendor/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- package/vendor/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- package/vendor/abseil-cpp/absl/types/internal/optional.h +0 -352
- package/vendor/abseil-cpp/absl/types/internal/variant.h +0 -1622
- package/vendor/abseil-cpp/absl/types/optional_exception_safety_test.cc +0 -292
- package/vendor/abseil-cpp/absl/types/optional_test.cc +0 -1615
- package/vendor/abseil-cpp/absl/types/variant_benchmark.cc +0 -222
- package/vendor/abseil-cpp/absl/types/variant_exception_safety_test.cc +0 -532
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr.h +0 -70
- package/vendor/abseil-cpp/absl/utility/internal/if_constexpr_test.cc +0 -79
- package/vendor/abseil-cpp/absl/utility/utility_test.cc +0 -239
- package/vendor/re2/.github/workflows/pr.yml +0 -34
- package/vendor/re2/README +0 -47
|
@@ -23,7 +23,9 @@
|
|
|
23
23
|
#include <cstdlib>
|
|
24
24
|
#include <functional>
|
|
25
25
|
#include <memory>
|
|
26
|
+
#include <mutex> // NOLINT(build/c++11)
|
|
26
27
|
#include <random>
|
|
28
|
+
#include <shared_mutex> // NOLINT(build/c++14)
|
|
27
29
|
#include <string>
|
|
28
30
|
#include <thread> // NOLINT(build/c++11)
|
|
29
31
|
#include <type_traits>
|
|
@@ -36,6 +38,7 @@
|
|
|
36
38
|
#include "absl/log/check.h"
|
|
37
39
|
#include "absl/log/log.h"
|
|
38
40
|
#include "absl/memory/memory.h"
|
|
41
|
+
#include "absl/random/random.h"
|
|
39
42
|
#include "absl/synchronization/internal/create_thread_identity.h"
|
|
40
43
|
#include "absl/synchronization/internal/thread_pool.h"
|
|
41
44
|
#include "absl/time/clock.h"
|
|
@@ -105,7 +108,7 @@ static void CheckSumG0G1(void *v) {
|
|
|
105
108
|
|
|
106
109
|
static void TestMu(TestContext *cxt, int c) {
|
|
107
110
|
for (int i = 0; i != cxt->iterations; i++) {
|
|
108
|
-
absl::MutexLock l(
|
|
111
|
+
absl::MutexLock l(cxt->mu);
|
|
109
112
|
int a = cxt->g0 + 1;
|
|
110
113
|
cxt->g0 = a;
|
|
111
114
|
cxt->g1--;
|
|
@@ -116,17 +119,17 @@ static void TestTry(TestContext *cxt, int c) {
|
|
|
116
119
|
for (int i = 0; i != cxt->iterations; i++) {
|
|
117
120
|
do {
|
|
118
121
|
std::this_thread::yield();
|
|
119
|
-
} while (!cxt->mu.
|
|
122
|
+
} while (!cxt->mu.try_lock());
|
|
120
123
|
int a = cxt->g0 + 1;
|
|
121
124
|
cxt->g0 = a;
|
|
122
125
|
cxt->g1--;
|
|
123
|
-
cxt->mu.
|
|
126
|
+
cxt->mu.unlock();
|
|
124
127
|
}
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
static void TestR20ms(TestContext *cxt, int c) {
|
|
128
131
|
for (int i = 0; i != cxt->iterations; i++) {
|
|
129
|
-
absl::ReaderMutexLock l(
|
|
132
|
+
absl::ReaderMutexLock l(cxt->mu);
|
|
130
133
|
absl::SleepFor(absl::Milliseconds(20));
|
|
131
134
|
cxt->mu.AssertReaderHeld();
|
|
132
135
|
}
|
|
@@ -135,7 +138,7 @@ static void TestR20ms(TestContext *cxt, int c) {
|
|
|
135
138
|
static void TestRW(TestContext *cxt, int c) {
|
|
136
139
|
if ((c & 1) == 0) {
|
|
137
140
|
for (int i = 0; i != cxt->iterations; i++) {
|
|
138
|
-
absl::WriterMutexLock l(
|
|
141
|
+
absl::WriterMutexLock l(cxt->mu);
|
|
139
142
|
cxt->g0++;
|
|
140
143
|
cxt->g1--;
|
|
141
144
|
cxt->mu.AssertHeld();
|
|
@@ -143,7 +146,7 @@ static void TestRW(TestContext *cxt, int c) {
|
|
|
143
146
|
}
|
|
144
147
|
} else {
|
|
145
148
|
for (int i = 0; i != cxt->iterations; i++) {
|
|
146
|
-
absl::ReaderMutexLock l(
|
|
149
|
+
absl::ReaderMutexLock l(cxt->mu);
|
|
147
150
|
CHECK_EQ(cxt->g0, -cxt->g1) << "Error in TestRW";
|
|
148
151
|
cxt->mu.AssertReaderHeld();
|
|
149
152
|
}
|
|
@@ -165,7 +168,7 @@ static void TestAwait(TestContext *cxt, int c) {
|
|
|
165
168
|
MyContext mc;
|
|
166
169
|
mc.target = c;
|
|
167
170
|
mc.cxt = cxt;
|
|
168
|
-
absl::MutexLock l(
|
|
171
|
+
absl::MutexLock l(cxt->mu);
|
|
169
172
|
cxt->mu.AssertHeld();
|
|
170
173
|
while (cxt->g0 < cxt->iterations) {
|
|
171
174
|
cxt->mu.Await(absl::Condition(&mc, &MyContext::MyTurn));
|
|
@@ -181,7 +184,7 @@ static void TestAwait(TestContext *cxt, int c) {
|
|
|
181
184
|
|
|
182
185
|
static void TestSignalAll(TestContext *cxt, int c) {
|
|
183
186
|
int target = c;
|
|
184
|
-
absl::MutexLock l(
|
|
187
|
+
absl::MutexLock l(cxt->mu);
|
|
185
188
|
cxt->mu.AssertHeld();
|
|
186
189
|
while (cxt->g0 < cxt->iterations) {
|
|
187
190
|
while (cxt->g0 != target && cxt->g0 != cxt->iterations) {
|
|
@@ -199,7 +202,7 @@ static void TestSignalAll(TestContext *cxt, int c) {
|
|
|
199
202
|
static void TestSignal(TestContext *cxt, int c) {
|
|
200
203
|
CHECK_EQ(cxt->threads, 2) << "TestSignal should use 2 threads";
|
|
201
204
|
int target = c;
|
|
202
|
-
absl::MutexLock l(
|
|
205
|
+
absl::MutexLock l(cxt->mu);
|
|
203
206
|
cxt->mu.AssertHeld();
|
|
204
207
|
while (cxt->g0 < cxt->iterations) {
|
|
205
208
|
while (cxt->g0 != target && cxt->g0 != cxt->iterations) {
|
|
@@ -216,7 +219,7 @@ static void TestSignal(TestContext *cxt, int c) {
|
|
|
216
219
|
|
|
217
220
|
static void TestCVTimeout(TestContext *cxt, int c) {
|
|
218
221
|
int target = c;
|
|
219
|
-
absl::MutexLock l(
|
|
222
|
+
absl::MutexLock l(cxt->mu);
|
|
220
223
|
cxt->mu.AssertHeld();
|
|
221
224
|
while (cxt->g0 < cxt->iterations) {
|
|
222
225
|
while (cxt->g0 != target && cxt->g0 != cxt->iterations) {
|
|
@@ -240,7 +243,7 @@ static void TestTime(TestContext *cxt, int c, bool use_cv) {
|
|
|
240
243
|
absl::Condition false_cond(&kFalse);
|
|
241
244
|
absl::Condition g0ge2(G0GE2, cxt);
|
|
242
245
|
if (c == 0) {
|
|
243
|
-
absl::MutexLock l(
|
|
246
|
+
absl::MutexLock l(cxt->mu);
|
|
244
247
|
|
|
245
248
|
absl::Time start = absl::Now();
|
|
246
249
|
if (use_cv) {
|
|
@@ -308,7 +311,7 @@ static void TestTime(TestContext *cxt, int c, bool use_cv) {
|
|
|
308
311
|
CHECK_EQ(cxt->g0, cxt->threads) << "TestTime failed";
|
|
309
312
|
|
|
310
313
|
} else if (c == 1) {
|
|
311
|
-
absl::MutexLock l(
|
|
314
|
+
absl::MutexLock l(cxt->mu);
|
|
312
315
|
const absl::Time start = absl::Now();
|
|
313
316
|
if (use_cv) {
|
|
314
317
|
cxt->cv.WaitWithTimeout(&cxt->mu, absl::Milliseconds(500));
|
|
@@ -321,7 +324,7 @@ static void TestTime(TestContext *cxt, int c, bool use_cv) {
|
|
|
321
324
|
<< "TestTime failed";
|
|
322
325
|
cxt->g0++;
|
|
323
326
|
} else if (c == 2) {
|
|
324
|
-
absl::MutexLock l(
|
|
327
|
+
absl::MutexLock l(cxt->mu);
|
|
325
328
|
if (use_cv) {
|
|
326
329
|
while (cxt->g0 < 2) {
|
|
327
330
|
cxt->cv.WaitWithTimeout(&cxt->mu, absl::Seconds(100));
|
|
@@ -332,7 +335,7 @@ static void TestTime(TestContext *cxt, int c, bool use_cv) {
|
|
|
332
335
|
}
|
|
333
336
|
cxt->g0++;
|
|
334
337
|
} else {
|
|
335
|
-
absl::MutexLock l(
|
|
338
|
+
absl::MutexLock l(cxt->mu);
|
|
336
339
|
if (use_cv) {
|
|
337
340
|
while (cxt->g0 < 2) {
|
|
338
341
|
cxt->cv.Wait(&cxt->mu);
|
|
@@ -350,11 +353,11 @@ static void TestCVTime(TestContext *cxt, int c) { TestTime(cxt, c, true); }
|
|
|
350
353
|
|
|
351
354
|
static void EndTest(int *c0, int *c1, absl::Mutex *mu, absl::CondVar *cv,
|
|
352
355
|
const std::function<void(int)> &cb) {
|
|
353
|
-
mu->
|
|
356
|
+
mu->lock();
|
|
354
357
|
int c = (*c0)++;
|
|
355
|
-
mu->
|
|
358
|
+
mu->unlock();
|
|
356
359
|
cb(c);
|
|
357
|
-
absl::MutexLock l(mu);
|
|
360
|
+
absl::MutexLock l(*mu);
|
|
358
361
|
(*c1)++;
|
|
359
362
|
cv->Signal();
|
|
360
363
|
}
|
|
@@ -376,11 +379,11 @@ static int RunTestCommon(TestContext *cxt, void (*test)(TestContext *cxt, int),
|
|
|
376
379
|
&EndTest, &c0, &c1, &mu2, &cv2,
|
|
377
380
|
std::function<void(int)>(std::bind(test, cxt, std::placeholders::_1))));
|
|
378
381
|
}
|
|
379
|
-
mu2.
|
|
382
|
+
mu2.lock();
|
|
380
383
|
while (c1 != threads) {
|
|
381
384
|
cv2.Wait(&mu2);
|
|
382
385
|
}
|
|
383
|
-
mu2.
|
|
386
|
+
mu2.unlock();
|
|
384
387
|
return cxt->g0;
|
|
385
388
|
}
|
|
386
389
|
|
|
@@ -421,7 +424,7 @@ struct TimeoutBugStruct {
|
|
|
421
424
|
static void WaitForA(TimeoutBugStruct *x) {
|
|
422
425
|
x->mu.LockWhen(absl::Condition(&x->a));
|
|
423
426
|
x->a_waiter_count--;
|
|
424
|
-
x->mu.
|
|
427
|
+
x->mu.unlock();
|
|
425
428
|
}
|
|
426
429
|
|
|
427
430
|
static bool NoAWaiters(TimeoutBugStruct *x) { return x->a_waiter_count == 0; }
|
|
@@ -444,27 +447,27 @@ TEST(Mutex, CondVarWaitSignalsAwait) {
|
|
|
444
447
|
// Thread A. Sets barrier, waits for release using Mutex::Await, then
|
|
445
448
|
// signals released_cv.
|
|
446
449
|
pool->Schedule([&state] {
|
|
447
|
-
state.release_mu.
|
|
450
|
+
state.release_mu.lock();
|
|
448
451
|
|
|
449
|
-
state.barrier_mu.
|
|
452
|
+
state.barrier_mu.lock();
|
|
450
453
|
state.barrier = true;
|
|
451
|
-
state.barrier_mu.
|
|
454
|
+
state.barrier_mu.unlock();
|
|
452
455
|
|
|
453
456
|
state.release_mu.Await(absl::Condition(&state.release));
|
|
454
457
|
state.released_cv.Signal();
|
|
455
|
-
state.release_mu.
|
|
458
|
+
state.release_mu.unlock();
|
|
456
459
|
});
|
|
457
460
|
|
|
458
461
|
state.barrier_mu.LockWhen(absl::Condition(&state.barrier));
|
|
459
|
-
state.barrier_mu.
|
|
460
|
-
state.release_mu.
|
|
462
|
+
state.barrier_mu.unlock();
|
|
463
|
+
state.release_mu.lock();
|
|
461
464
|
// Thread A is now blocked on release by way of Mutex::Await().
|
|
462
465
|
|
|
463
466
|
// Set release. Calling released_cv.Wait() should un-block thread A,
|
|
464
467
|
// which will signal released_cv. If not, the test will hang.
|
|
465
468
|
state.release = true;
|
|
466
469
|
state.released_cv.Wait(&state.release_mu);
|
|
467
|
-
state.release_mu.
|
|
470
|
+
state.release_mu.unlock();
|
|
468
471
|
}
|
|
469
472
|
|
|
470
473
|
// Test that a CondVar.WaitWithTimeout(&mutex) can un-block a call to
|
|
@@ -485,20 +488,20 @@ TEST(Mutex, CondVarWaitWithTimeoutSignalsAwait) {
|
|
|
485
488
|
// Thread A. Sets barrier, waits for release using Mutex::Await, then
|
|
486
489
|
// signals released_cv.
|
|
487
490
|
pool->Schedule([&state] {
|
|
488
|
-
state.release_mu.
|
|
491
|
+
state.release_mu.lock();
|
|
489
492
|
|
|
490
|
-
state.barrier_mu.
|
|
493
|
+
state.barrier_mu.lock();
|
|
491
494
|
state.barrier = true;
|
|
492
|
-
state.barrier_mu.
|
|
495
|
+
state.barrier_mu.unlock();
|
|
493
496
|
|
|
494
497
|
state.release_mu.Await(absl::Condition(&state.release));
|
|
495
498
|
state.released_cv.Signal();
|
|
496
|
-
state.release_mu.
|
|
499
|
+
state.release_mu.unlock();
|
|
497
500
|
});
|
|
498
501
|
|
|
499
502
|
state.barrier_mu.LockWhen(absl::Condition(&state.barrier));
|
|
500
|
-
state.barrier_mu.
|
|
501
|
-
state.release_mu.
|
|
503
|
+
state.barrier_mu.unlock();
|
|
504
|
+
state.release_mu.lock();
|
|
502
505
|
// Thread A is now blocked on release by way of Mutex::Await().
|
|
503
506
|
|
|
504
507
|
// Set release. Calling released_cv.Wait() should un-block thread A,
|
|
@@ -509,7 +512,7 @@ TEST(Mutex, CondVarWaitWithTimeoutSignalsAwait) {
|
|
|
509
512
|
<< "; Unrecoverable test failure: CondVar::WaitWithTimeout did not "
|
|
510
513
|
"unblock the absl::Mutex::Await call in another thread.";
|
|
511
514
|
|
|
512
|
-
state.release_mu.
|
|
515
|
+
state.release_mu.unlock();
|
|
513
516
|
}
|
|
514
517
|
|
|
515
518
|
// Test for regression of a bug in loop of TryRemove()
|
|
@@ -535,7 +538,7 @@ TEST(Mutex, MutexTimeoutBug) {
|
|
|
535
538
|
|
|
536
539
|
x.a = true; // wakeup the two waiters on A
|
|
537
540
|
x.mu.Await(absl::Condition(&NoAWaiters, &x)); // wait for them to exit
|
|
538
|
-
x.mu.
|
|
541
|
+
x.mu.unlock();
|
|
539
542
|
}
|
|
540
543
|
|
|
541
544
|
struct CondVarWaitDeadlock : testing::TestWithParam<int> {
|
|
@@ -555,27 +558,27 @@ struct CondVarWaitDeadlock : testing::TestWithParam<int> {
|
|
|
555
558
|
|
|
556
559
|
void Waiter1() {
|
|
557
560
|
if (read_lock1) {
|
|
558
|
-
mu.
|
|
561
|
+
mu.lock_shared();
|
|
559
562
|
while (!cond1) {
|
|
560
563
|
cv.Wait(&mu);
|
|
561
564
|
}
|
|
562
|
-
mu.
|
|
565
|
+
mu.unlock_shared();
|
|
563
566
|
} else {
|
|
564
|
-
mu.
|
|
567
|
+
mu.lock();
|
|
565
568
|
while (!cond1) {
|
|
566
569
|
cv.Wait(&mu);
|
|
567
570
|
}
|
|
568
|
-
mu.
|
|
571
|
+
mu.unlock();
|
|
569
572
|
}
|
|
570
573
|
}
|
|
571
574
|
|
|
572
575
|
void Waiter2() {
|
|
573
576
|
if (read_lock2) {
|
|
574
577
|
mu.ReaderLockWhen(absl::Condition(&cond2));
|
|
575
|
-
mu.
|
|
578
|
+
mu.unlock_shared();
|
|
576
579
|
} else {
|
|
577
580
|
mu.LockWhen(absl::Condition(&cond2));
|
|
578
|
-
mu.
|
|
581
|
+
mu.unlock();
|
|
579
582
|
}
|
|
580
583
|
}
|
|
581
584
|
};
|
|
@@ -599,21 +602,21 @@ TEST_P(CondVarWaitDeadlock, Test) {
|
|
|
599
602
|
absl::SleepFor(absl::Milliseconds(100));
|
|
600
603
|
|
|
601
604
|
// Wake condwaiter.
|
|
602
|
-
mu.
|
|
605
|
+
mu.lock();
|
|
603
606
|
cond1 = true;
|
|
604
607
|
if (signal_unlocked) {
|
|
605
|
-
mu.
|
|
608
|
+
mu.unlock();
|
|
606
609
|
cv.Signal();
|
|
607
610
|
} else {
|
|
608
611
|
cv.Signal();
|
|
609
|
-
mu.
|
|
612
|
+
mu.unlock();
|
|
610
613
|
}
|
|
611
614
|
waiter1.reset(); // "join" waiter1
|
|
612
615
|
|
|
613
616
|
// Wake waiter.
|
|
614
|
-
mu.
|
|
617
|
+
mu.lock();
|
|
615
618
|
cond2 = true;
|
|
616
|
-
mu.
|
|
619
|
+
mu.unlock();
|
|
617
620
|
waiter2.reset(); // "join" waiter2
|
|
618
621
|
}
|
|
619
622
|
|
|
@@ -638,19 +641,19 @@ struct DequeueAllWakeableBugStruct {
|
|
|
638
641
|
|
|
639
642
|
// Test for regression of a bug in loop of DequeueAllWakeable()
|
|
640
643
|
static void AcquireAsReader(DequeueAllWakeableBugStruct *x) {
|
|
641
|
-
x->mu.
|
|
642
|
-
x->mu2.
|
|
644
|
+
x->mu.lock_shared();
|
|
645
|
+
x->mu2.lock();
|
|
643
646
|
x->unfinished_count--;
|
|
644
647
|
x->done1 = (x->unfinished_count == 0);
|
|
645
|
-
x->mu2.
|
|
648
|
+
x->mu2.unlock();
|
|
646
649
|
// make sure that both readers acquired mu before we release it.
|
|
647
650
|
absl::SleepFor(absl::Seconds(2));
|
|
648
|
-
x->mu.
|
|
651
|
+
x->mu.unlock_shared();
|
|
649
652
|
|
|
650
|
-
x->mu2.
|
|
653
|
+
x->mu2.lock();
|
|
651
654
|
x->finished_count--;
|
|
652
655
|
x->done2 = (x->finished_count == 0);
|
|
653
|
-
x->mu2.
|
|
656
|
+
x->mu2.unlock();
|
|
654
657
|
}
|
|
655
658
|
|
|
656
659
|
// Test for regression of a bug in loop of DequeueAllWakeable()
|
|
@@ -662,21 +665,21 @@ TEST(Mutex, MutexReaderWakeupBug) {
|
|
|
662
665
|
x.done1 = false;
|
|
663
666
|
x.finished_count = 2;
|
|
664
667
|
x.done2 = false;
|
|
665
|
-
x.mu.
|
|
668
|
+
x.mu.lock(); // acquire mu exclusively
|
|
666
669
|
// queue two thread that will block on reader locks on x.mu
|
|
667
670
|
tp->Schedule(std::bind(&AcquireAsReader, &x));
|
|
668
671
|
tp->Schedule(std::bind(&AcquireAsReader, &x));
|
|
669
672
|
absl::SleepFor(absl::Seconds(1)); // give time for reader threads to block
|
|
670
|
-
x.mu.
|
|
673
|
+
x.mu.unlock(); // wake them up
|
|
671
674
|
|
|
672
675
|
// both readers should finish promptly
|
|
673
676
|
EXPECT_TRUE(
|
|
674
677
|
x.mu2.LockWhenWithTimeout(absl::Condition(&x.done1), absl::Seconds(10)));
|
|
675
|
-
x.mu2.
|
|
678
|
+
x.mu2.unlock();
|
|
676
679
|
|
|
677
680
|
EXPECT_TRUE(
|
|
678
681
|
x.mu2.LockWhenWithTimeout(absl::Condition(&x.done2), absl::Seconds(10)));
|
|
679
|
-
x.mu2.
|
|
682
|
+
x.mu2.unlock();
|
|
680
683
|
}
|
|
681
684
|
|
|
682
685
|
struct LockWhenTestStruct {
|
|
@@ -688,15 +691,15 @@ struct LockWhenTestStruct {
|
|
|
688
691
|
};
|
|
689
692
|
|
|
690
693
|
static bool LockWhenTestIsCond(LockWhenTestStruct *s) {
|
|
691
|
-
s->mu2.
|
|
694
|
+
s->mu2.lock();
|
|
692
695
|
s->waiting = true;
|
|
693
|
-
s->mu2.
|
|
696
|
+
s->mu2.unlock();
|
|
694
697
|
return s->cond;
|
|
695
698
|
}
|
|
696
699
|
|
|
697
700
|
static void LockWhenTestWaitForIsCond(LockWhenTestStruct *s) {
|
|
698
701
|
s->mu1.LockWhen(absl::Condition(&LockWhenTestIsCond, s));
|
|
699
|
-
s->mu1.
|
|
702
|
+
s->mu1.unlock();
|
|
700
703
|
}
|
|
701
704
|
|
|
702
705
|
TEST(Mutex, LockWhen) {
|
|
@@ -704,11 +707,11 @@ TEST(Mutex, LockWhen) {
|
|
|
704
707
|
|
|
705
708
|
std::thread t(LockWhenTestWaitForIsCond, &s);
|
|
706
709
|
s.mu2.LockWhen(absl::Condition(&s.waiting));
|
|
707
|
-
s.mu2.
|
|
710
|
+
s.mu2.unlock();
|
|
708
711
|
|
|
709
|
-
s.mu1.
|
|
712
|
+
s.mu1.lock();
|
|
710
713
|
s.cond = true;
|
|
711
|
-
s.mu1.
|
|
714
|
+
s.mu1.unlock();
|
|
712
715
|
|
|
713
716
|
t.join();
|
|
714
717
|
}
|
|
@@ -723,20 +726,20 @@ TEST(Mutex, LockWhenGuard) {
|
|
|
723
726
|
bool (*cond_lt_10)(int *) = [](int *p) { return *p < 10; };
|
|
724
727
|
|
|
725
728
|
std::thread t1([&mu, &n, &done, cond_eq_10]() {
|
|
726
|
-
absl::ReaderMutexLock lock(
|
|
729
|
+
absl::ReaderMutexLock lock(mu, absl::Condition(cond_eq_10, &n));
|
|
727
730
|
done = true;
|
|
728
731
|
});
|
|
729
732
|
|
|
730
733
|
std::thread t2[10];
|
|
731
734
|
for (std::thread &t : t2) {
|
|
732
735
|
t = std::thread([&mu, &n, cond_lt_10]() {
|
|
733
|
-
absl::WriterMutexLock lock(
|
|
736
|
+
absl::WriterMutexLock lock(mu, absl::Condition(cond_lt_10, &n));
|
|
734
737
|
++n;
|
|
735
738
|
});
|
|
736
739
|
}
|
|
737
740
|
|
|
738
741
|
{
|
|
739
|
-
absl::MutexLock lock(
|
|
742
|
+
absl::MutexLock lock(mu);
|
|
740
743
|
n = 0;
|
|
741
744
|
}
|
|
742
745
|
|
|
@@ -748,7 +751,7 @@ TEST(Mutex, LockWhenGuard) {
|
|
|
748
751
|
}
|
|
749
752
|
|
|
750
753
|
// --------------------------------------------------------
|
|
751
|
-
// The following test requires Mutex::
|
|
754
|
+
// The following test requires Mutex::lock_shared to be a real shared
|
|
752
755
|
// lock, which is not the case in all builds.
|
|
753
756
|
#if !defined(ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE)
|
|
754
757
|
|
|
@@ -775,9 +778,9 @@ struct ReaderDecrementBugStruct {
|
|
|
775
778
|
// L >= mu, L < mu_waiting_on_cond
|
|
776
779
|
static bool IsCond(void *v) {
|
|
777
780
|
ReaderDecrementBugStruct *x = reinterpret_cast<ReaderDecrementBugStruct *>(v);
|
|
778
|
-
x->mu2.
|
|
781
|
+
x->mu2.lock();
|
|
779
782
|
x->waiting_on_cond = true;
|
|
780
|
-
x->mu2.
|
|
783
|
+
x->mu2.unlock();
|
|
781
784
|
return x->cond;
|
|
782
785
|
}
|
|
783
786
|
|
|
@@ -790,23 +793,23 @@ static bool AllDone(void *v) {
|
|
|
790
793
|
// L={}
|
|
791
794
|
static void WaitForCond(ReaderDecrementBugStruct *x) {
|
|
792
795
|
absl::Mutex dummy;
|
|
793
|
-
absl::MutexLock l(
|
|
796
|
+
absl::MutexLock l(dummy);
|
|
794
797
|
x->mu.LockWhen(absl::Condition(&IsCond, x));
|
|
795
798
|
x->done--;
|
|
796
|
-
x->mu.
|
|
799
|
+
x->mu.unlock();
|
|
797
800
|
}
|
|
798
801
|
|
|
799
802
|
// L={}
|
|
800
803
|
static void GetReadLock(ReaderDecrementBugStruct *x) {
|
|
801
|
-
x->mu.
|
|
802
|
-
x->mu2.
|
|
804
|
+
x->mu.lock_shared();
|
|
805
|
+
x->mu2.lock();
|
|
803
806
|
x->have_reader_lock = true;
|
|
804
807
|
x->mu2.Await(absl::Condition(&x->complete));
|
|
805
|
-
x->mu2.
|
|
806
|
-
x->mu.
|
|
807
|
-
x->mu.
|
|
808
|
+
x->mu2.unlock();
|
|
809
|
+
x->mu.unlock_shared();
|
|
810
|
+
x->mu.lock();
|
|
808
811
|
x->done--;
|
|
809
|
-
x->mu.
|
|
812
|
+
x->mu.unlock();
|
|
810
813
|
}
|
|
811
814
|
|
|
812
815
|
// Test for reader counter being decremented incorrectly by waiter
|
|
@@ -822,32 +825,32 @@ TEST(Mutex, MutexReaderDecrementBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
|
822
825
|
// Run WaitForCond() and wait for it to sleep
|
|
823
826
|
std::thread thread1(WaitForCond, &x);
|
|
824
827
|
x.mu2.LockWhen(absl::Condition(&x.waiting_on_cond));
|
|
825
|
-
x.mu2.
|
|
828
|
+
x.mu2.unlock();
|
|
826
829
|
|
|
827
830
|
// Run GetReadLock(), and wait for it to get the read lock
|
|
828
831
|
std::thread thread2(GetReadLock, &x);
|
|
829
832
|
x.mu2.LockWhen(absl::Condition(&x.have_reader_lock));
|
|
830
|
-
x.mu2.
|
|
833
|
+
x.mu2.unlock();
|
|
831
834
|
|
|
832
835
|
// Get the reader lock ourselves, and release it.
|
|
833
|
-
x.mu.
|
|
834
|
-
x.mu.
|
|
836
|
+
x.mu.lock_shared();
|
|
837
|
+
x.mu.unlock_shared();
|
|
835
838
|
|
|
836
839
|
// The lock should be held in read mode by GetReadLock().
|
|
837
840
|
// If we have the bug, the lock will be free.
|
|
838
841
|
x.mu.AssertReaderHeld();
|
|
839
842
|
|
|
840
843
|
// Wake up all the threads.
|
|
841
|
-
x.mu2.
|
|
844
|
+
x.mu2.lock();
|
|
842
845
|
x.complete = true;
|
|
843
|
-
x.mu2.
|
|
846
|
+
x.mu2.unlock();
|
|
844
847
|
|
|
845
848
|
// TODO(delesley): turn on analysis once lock upgrading is supported.
|
|
846
849
|
// (This call upgrades the lock from shared to exclusive.)
|
|
847
|
-
x.mu.
|
|
850
|
+
x.mu.lock();
|
|
848
851
|
x.cond = true;
|
|
849
852
|
x.mu.Await(absl::Condition(&AllDone, &x));
|
|
850
|
-
x.mu.
|
|
853
|
+
x.mu.unlock();
|
|
851
854
|
|
|
852
855
|
thread1.join();
|
|
853
856
|
thread2.join();
|
|
@@ -868,9 +871,9 @@ TEST(Mutex, LockedMutexDestructionBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
|
868
871
|
auto mu = absl::make_unique<absl::Mutex[]>(kNumLocks);
|
|
869
872
|
for (int j = 0; j != kNumLocks; j++) {
|
|
870
873
|
if ((j % 2) == 0) {
|
|
871
|
-
mu[j].
|
|
874
|
+
mu[j].lock();
|
|
872
875
|
} else {
|
|
873
|
-
mu[j].
|
|
876
|
+
mu[j].lock_shared();
|
|
874
877
|
}
|
|
875
878
|
}
|
|
876
879
|
}
|
|
@@ -1064,18 +1067,17 @@ TEST(Mutex, ConditionSwap) {
|
|
|
1064
1067
|
|
|
1065
1068
|
static void ReaderForReaderOnCondVar(absl::Mutex *mu, absl::CondVar *cv,
|
|
1066
1069
|
int *running) {
|
|
1067
|
-
|
|
1068
|
-
std::mt19937 gen(dev());
|
|
1070
|
+
absl::InsecureBitGen gen;
|
|
1069
1071
|
std::uniform_int_distribution<int> random_millis(0, 15);
|
|
1070
|
-
mu->
|
|
1072
|
+
mu->lock_shared();
|
|
1071
1073
|
while (*running == 3) {
|
|
1072
1074
|
absl::SleepFor(absl::Milliseconds(random_millis(gen)));
|
|
1073
1075
|
cv->WaitWithTimeout(mu, absl::Milliseconds(random_millis(gen)));
|
|
1074
1076
|
}
|
|
1075
|
-
mu->
|
|
1076
|
-
mu->
|
|
1077
|
+
mu->unlock_shared();
|
|
1078
|
+
mu->lock();
|
|
1077
1079
|
(*running)--;
|
|
1078
|
-
mu->
|
|
1080
|
+
mu->unlock();
|
|
1079
1081
|
}
|
|
1080
1082
|
|
|
1081
1083
|
static bool IntIsZero(int *x) { return *x == 0; }
|
|
@@ -1090,10 +1092,10 @@ TEST(Mutex, TestReaderOnCondVar) {
|
|
|
1090
1092
|
tp->Schedule(std::bind(&ReaderForReaderOnCondVar, &mu, &cv, &running));
|
|
1091
1093
|
tp->Schedule(std::bind(&ReaderForReaderOnCondVar, &mu, &cv, &running));
|
|
1092
1094
|
absl::SleepFor(absl::Seconds(2));
|
|
1093
|
-
mu.
|
|
1095
|
+
mu.lock();
|
|
1094
1096
|
running--;
|
|
1095
1097
|
mu.Await(absl::Condition(&IntIsZero, &running));
|
|
1096
|
-
mu.
|
|
1098
|
+
mu.unlock();
|
|
1097
1099
|
}
|
|
1098
1100
|
|
|
1099
1101
|
// --------------------------------------------------------
|
|
@@ -1117,7 +1119,7 @@ static bool ConditionWithAcquire(AcquireFromConditionStruct *x) {
|
|
|
1117
1119
|
bool always_false = false;
|
|
1118
1120
|
x->mu1.LockWhenWithTimeout(absl::Condition(&always_false),
|
|
1119
1121
|
absl::Milliseconds(100));
|
|
1120
|
-
x->mu1.
|
|
1122
|
+
x->mu1.unlock();
|
|
1121
1123
|
}
|
|
1122
1124
|
CHECK_LT(x->value, 4) << "should not be invoked a fourth time";
|
|
1123
1125
|
|
|
@@ -1129,7 +1131,7 @@ static void WaitForCond2(AcquireFromConditionStruct *x) {
|
|
|
1129
1131
|
// wait for cond0 to become true
|
|
1130
1132
|
x->mu0.LockWhen(absl::Condition(&ConditionWithAcquire, x));
|
|
1131
1133
|
x->done = true;
|
|
1132
|
-
x->mu0.
|
|
1134
|
+
x->mu0.unlock();
|
|
1133
1135
|
}
|
|
1134
1136
|
|
|
1135
1137
|
// Test for Condition whose function acquires other Mutexes
|
|
@@ -1145,12 +1147,12 @@ TEST(Mutex, AcquireFromCondition) {
|
|
|
1145
1147
|
// return false.
|
|
1146
1148
|
absl::SleepFor(absl::Milliseconds(500)); // allow T time to hang
|
|
1147
1149
|
|
|
1148
|
-
x.mu0.
|
|
1150
|
+
x.mu0.lock();
|
|
1149
1151
|
x.cv.WaitWithTimeout(&x.mu0, absl::Milliseconds(500)); // wake T
|
|
1150
1152
|
// T will be woken because the Wait() will call ConditionWithAcquire()
|
|
1151
1153
|
// for the second time, and it will return true.
|
|
1152
1154
|
|
|
1153
|
-
x.mu0.
|
|
1155
|
+
x.mu0.unlock();
|
|
1154
1156
|
|
|
1155
1157
|
// T will then acquire the lock and recheck its own condition.
|
|
1156
1158
|
// It will find the condition true, as this is the third invocation,
|
|
@@ -1166,7 +1168,7 @@ TEST(Mutex, AcquireFromCondition) {
|
|
|
1166
1168
|
// is conceptually waiting both on the condition variable, and on mu2.
|
|
1167
1169
|
|
|
1168
1170
|
x.mu0.LockWhen(absl::Condition(&x.done));
|
|
1169
|
-
x.mu0.
|
|
1171
|
+
x.mu0.unlock();
|
|
1170
1172
|
}
|
|
1171
1173
|
|
|
1172
1174
|
TEST(Mutex, DeadlockDetector) {
|
|
@@ -1178,20 +1180,20 @@ TEST(Mutex, DeadlockDetector) {
|
|
|
1178
1180
|
absl::Mutex m3;
|
|
1179
1181
|
absl::Mutex m4;
|
|
1180
1182
|
|
|
1181
|
-
m1.
|
|
1182
|
-
m2.
|
|
1183
|
-
m3.
|
|
1184
|
-
m3.
|
|
1185
|
-
m2.
|
|
1183
|
+
m1.lock(); // m1 gets ID1
|
|
1184
|
+
m2.lock(); // m2 gets ID2
|
|
1185
|
+
m3.lock(); // m3 gets ID3
|
|
1186
|
+
m3.unlock();
|
|
1187
|
+
m2.unlock();
|
|
1186
1188
|
// m1 still held
|
|
1187
1189
|
m1.ForgetDeadlockInfo(); // m1 loses ID
|
|
1188
|
-
m2.
|
|
1189
|
-
m3.
|
|
1190
|
-
m4.
|
|
1191
|
-
m3.
|
|
1192
|
-
m2.
|
|
1193
|
-
m4.
|
|
1194
|
-
m1.
|
|
1190
|
+
m2.lock(); // m2 gets ID2
|
|
1191
|
+
m3.lock(); // m3 gets ID3
|
|
1192
|
+
m4.lock(); // m4 gets ID4
|
|
1193
|
+
m3.unlock();
|
|
1194
|
+
m2.unlock();
|
|
1195
|
+
m4.unlock();
|
|
1196
|
+
m1.unlock();
|
|
1195
1197
|
}
|
|
1196
1198
|
|
|
1197
1199
|
// Bazel has a test "warning" file that programs can write to if the
|
|
@@ -1246,18 +1248,18 @@ TEST(Mutex, DeadlockDetectorBazelWarning) {
|
|
|
1246
1248
|
|
|
1247
1249
|
absl::Mutex mu0;
|
|
1248
1250
|
absl::Mutex mu1;
|
|
1249
|
-
bool got_mu0 = mu0.
|
|
1250
|
-
mu1.
|
|
1251
|
+
bool got_mu0 = mu0.try_lock();
|
|
1252
|
+
mu1.lock(); // acquire mu1 while holding mu0
|
|
1251
1253
|
if (got_mu0) {
|
|
1252
|
-
mu0.
|
|
1254
|
+
mu0.unlock();
|
|
1253
1255
|
}
|
|
1254
|
-
if (mu0.
|
|
1255
|
-
mu0.
|
|
1256
|
+
if (mu0.try_lock()) { // try lock shouldn't cause deadlock detector to fire
|
|
1257
|
+
mu0.unlock();
|
|
1256
1258
|
}
|
|
1257
|
-
mu0.
|
|
1259
|
+
mu0.lock(); // acquire mu0 while holding mu1; should get one deadlock
|
|
1258
1260
|
// report here
|
|
1259
|
-
mu0.
|
|
1260
|
-
mu1.
|
|
1261
|
+
mu0.unlock();
|
|
1262
|
+
mu1.unlock();
|
|
1261
1263
|
|
|
1262
1264
|
absl::SetMutexDeadlockDetectionMode(absl::OnDeadlockCycle::kAbort);
|
|
1263
1265
|
}
|
|
@@ -1272,10 +1274,10 @@ TEST(Mutex, DeadlockDetectorLongCycle) {
|
|
|
1272
1274
|
// Check that we survive a deadlock with a lock cycle.
|
|
1273
1275
|
std::vector<absl::Mutex> mutex(100);
|
|
1274
1276
|
for (size_t i = 0; i != mutex.size(); i++) {
|
|
1275
|
-
mutex[i].
|
|
1276
|
-
mutex[(i + 1) % mutex.size()].
|
|
1277
|
-
mutex[i].
|
|
1278
|
-
mutex[(i + 1) % mutex.size()].
|
|
1277
|
+
mutex[i].lock();
|
|
1278
|
+
mutex[(i + 1) % mutex.size()].lock();
|
|
1279
|
+
mutex[i].unlock();
|
|
1280
|
+
mutex[(i + 1) % mutex.size()].unlock();
|
|
1279
1281
|
}
|
|
1280
1282
|
|
|
1281
1283
|
absl::SetMutexDeadlockDetectionMode(absl::OnDeadlockCycle::kAbort);
|
|
@@ -1295,10 +1297,10 @@ TEST(Mutex, DeadlockDetectorStressTest) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
|
1295
1297
|
int end = std::min(n_locks, i + 5);
|
|
1296
1298
|
// acquire and then release locks i, i+1, ..., i+4
|
|
1297
1299
|
for (int j = i; j < end; j++) {
|
|
1298
|
-
array_of_locks[j].
|
|
1300
|
+
array_of_locks[j].lock();
|
|
1299
1301
|
}
|
|
1300
1302
|
for (int j = i; j < end; j++) {
|
|
1301
|
-
array_of_locks[j].
|
|
1303
|
+
array_of_locks[j].unlock();
|
|
1302
1304
|
}
|
|
1303
1305
|
}
|
|
1304
1306
|
}
|
|
@@ -1319,11 +1321,11 @@ TEST(Mutex, DeadlockIdBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
|
1319
1321
|
absl::Mutex b, c;
|
|
1320
1322
|
|
|
1321
1323
|
// Hold mutex.
|
|
1322
|
-
a->
|
|
1324
|
+
a->lock();
|
|
1323
1325
|
|
|
1324
1326
|
// Force deadlock id assignment by acquiring another lock.
|
|
1325
|
-
b.
|
|
1326
|
-
b.
|
|
1327
|
+
b.lock();
|
|
1328
|
+
b.unlock();
|
|
1327
1329
|
|
|
1328
1330
|
// Delete the mutex. The Mutex destructor tries to remove held locks,
|
|
1329
1331
|
// but the attempt isn't foolproof. It can fail if:
|
|
@@ -1338,8 +1340,8 @@ TEST(Mutex, DeadlockIdBug) ABSL_NO_THREAD_SAFETY_ANALYSIS {
|
|
|
1338
1340
|
// We should end up getting assigned the same deadlock id that was
|
|
1339
1341
|
// freed up when "a" was deleted, which will cause a spurious deadlock
|
|
1340
1342
|
// report if the held lock entry for "a" was not invalidated.
|
|
1341
|
-
c.
|
|
1342
|
-
c.
|
|
1343
|
+
c.lock();
|
|
1344
|
+
c.unlock();
|
|
1343
1345
|
}
|
|
1344
1346
|
|
|
1345
1347
|
// --------------------------------------------------------
|
|
@@ -1357,7 +1359,7 @@ static absl::Duration TimeoutTestAllowedSchedulingDelay() {
|
|
|
1357
1359
|
|
|
1358
1360
|
// Returns true if `actual_delay` is close enough to `expected_delay` to pass
|
|
1359
1361
|
// the timeouts/deadlines test. Otherwise, logs warnings and returns false.
|
|
1360
|
-
|
|
1362
|
+
[[nodiscard]]
|
|
1361
1363
|
static bool DelayIsWithinBounds(absl::Duration expected_delay,
|
|
1362
1364
|
absl::Duration actual_delay) {
|
|
1363
1365
|
bool pass = true;
|
|
@@ -1574,11 +1576,11 @@ TEST_P(TimeoutTest, Await) {
|
|
|
1574
1576
|
std::unique_ptr<absl::synchronization_internal::ThreadPool> pool =
|
|
1575
1577
|
CreateDefaultPool();
|
|
1576
1578
|
RunAfterDelay(params.satisfy_condition_delay, pool.get(), [&] {
|
|
1577
|
-
absl::MutexLock l(
|
|
1579
|
+
absl::MutexLock l(mu);
|
|
1578
1580
|
value = true;
|
|
1579
1581
|
});
|
|
1580
1582
|
|
|
1581
|
-
absl::MutexLock lock(
|
|
1583
|
+
absl::MutexLock lock(mu);
|
|
1582
1584
|
absl::Time start_time = absl::Now();
|
|
1583
1585
|
absl::Condition cond(&value);
|
|
1584
1586
|
bool result =
|
|
@@ -1608,7 +1610,7 @@ TEST_P(TimeoutTest, LockWhen) {
|
|
|
1608
1610
|
std::unique_ptr<absl::synchronization_internal::ThreadPool> pool =
|
|
1609
1611
|
CreateDefaultPool();
|
|
1610
1612
|
RunAfterDelay(params.satisfy_condition_delay, pool.get(), [&] {
|
|
1611
|
-
absl::MutexLock l(
|
|
1613
|
+
absl::MutexLock l(mu);
|
|
1612
1614
|
value = true;
|
|
1613
1615
|
});
|
|
1614
1616
|
|
|
@@ -1618,7 +1620,7 @@ TEST_P(TimeoutTest, LockWhen) {
|
|
|
1618
1620
|
params.use_absolute_deadline
|
|
1619
1621
|
? mu.LockWhenWithDeadline(cond, start_time + params.wait_timeout)
|
|
1620
1622
|
: mu.LockWhenWithTimeout(cond, params.wait_timeout);
|
|
1621
|
-
mu.
|
|
1623
|
+
mu.unlock();
|
|
1622
1624
|
|
|
1623
1625
|
if (DelayIsWithinBounds(params.expected_delay, absl::Now() - start_time)) {
|
|
1624
1626
|
EXPECT_EQ(params.expected_result, result);
|
|
@@ -1643,7 +1645,7 @@ TEST_P(TimeoutTest, ReaderLockWhen) {
|
|
|
1643
1645
|
std::unique_ptr<absl::synchronization_internal::ThreadPool> pool =
|
|
1644
1646
|
CreateDefaultPool();
|
|
1645
1647
|
RunAfterDelay(params.satisfy_condition_delay, pool.get(), [&] {
|
|
1646
|
-
absl::MutexLock l(
|
|
1648
|
+
absl::MutexLock l(mu);
|
|
1647
1649
|
value = true;
|
|
1648
1650
|
});
|
|
1649
1651
|
|
|
@@ -1654,7 +1656,7 @@ TEST_P(TimeoutTest, ReaderLockWhen) {
|
|
|
1654
1656
|
start_time + params.wait_timeout)
|
|
1655
1657
|
: mu.ReaderLockWhenWithTimeout(absl::Condition(&value),
|
|
1656
1658
|
params.wait_timeout);
|
|
1657
|
-
mu.
|
|
1659
|
+
mu.unlock_shared();
|
|
1658
1660
|
|
|
1659
1661
|
if (DelayIsWithinBounds(params.expected_delay, absl::Now() - start_time)) {
|
|
1660
1662
|
EXPECT_EQ(params.expected_result, result);
|
|
@@ -1680,12 +1682,12 @@ TEST_P(TimeoutTest, Wait) {
|
|
|
1680
1682
|
std::unique_ptr<absl::synchronization_internal::ThreadPool> pool =
|
|
1681
1683
|
CreateDefaultPool();
|
|
1682
1684
|
RunAfterDelay(params.satisfy_condition_delay, pool.get(), [&] {
|
|
1683
|
-
absl::MutexLock l(
|
|
1685
|
+
absl::MutexLock l(mu);
|
|
1684
1686
|
value = true;
|
|
1685
1687
|
cv.Signal();
|
|
1686
1688
|
});
|
|
1687
1689
|
|
|
1688
|
-
absl::MutexLock lock(
|
|
1690
|
+
absl::MutexLock lock(mu);
|
|
1689
1691
|
absl::Time start_time = absl::Now();
|
|
1690
1692
|
absl::Duration timeout = params.wait_timeout;
|
|
1691
1693
|
absl::Time deadline = start_time + timeout;
|
|
@@ -1711,13 +1713,13 @@ TEST(Mutex, Logging) {
|
|
|
1711
1713
|
logged_mutex.EnableDebugLog("fido_mutex");
|
|
1712
1714
|
absl::CondVar logged_cv;
|
|
1713
1715
|
logged_cv.EnableDebugLog("rover_cv");
|
|
1714
|
-
logged_mutex.
|
|
1716
|
+
logged_mutex.lock();
|
|
1715
1717
|
logged_cv.WaitWithTimeout(&logged_mutex, absl::Milliseconds(20));
|
|
1716
|
-
logged_mutex.
|
|
1717
|
-
logged_mutex.
|
|
1718
|
-
logged_mutex.
|
|
1719
|
-
logged_mutex.
|
|
1720
|
-
logged_mutex.
|
|
1718
|
+
logged_mutex.unlock();
|
|
1719
|
+
logged_mutex.lock_shared();
|
|
1720
|
+
logged_mutex.unlock_shared();
|
|
1721
|
+
logged_mutex.lock();
|
|
1722
|
+
logged_mutex.unlock();
|
|
1721
1723
|
logged_cv.Signal();
|
|
1722
1724
|
logged_cv.SignalAll();
|
|
1723
1725
|
}
|
|
@@ -1725,7 +1727,7 @@ TEST(Mutex, Logging) {
|
|
|
1725
1727
|
TEST(Mutex, LoggingAddressReuse) {
|
|
1726
1728
|
// Repeatedly re-create a Mutex with debug logging at the same address.
|
|
1727
1729
|
ScopedInvariantDebugging scoped_debugging;
|
|
1728
|
-
alignas(absl::Mutex) char storage[sizeof(absl::Mutex)];
|
|
1730
|
+
alignas(absl::Mutex) unsigned char storage[sizeof(absl::Mutex)];
|
|
1729
1731
|
auto invariant =
|
|
1730
1732
|
+[](void *alive) { EXPECT_TRUE(*static_cast<bool *>(alive)); };
|
|
1731
1733
|
constexpr size_t kIters = 10;
|
|
@@ -1735,8 +1737,8 @@ TEST(Mutex, LoggingAddressReuse) {
|
|
|
1735
1737
|
alive[i] = true;
|
|
1736
1738
|
mu->EnableDebugLog("Mutex");
|
|
1737
1739
|
mu->EnableInvariantDebugging(invariant, &alive[i]);
|
|
1738
|
-
mu->
|
|
1739
|
-
mu->
|
|
1740
|
+
mu->lock();
|
|
1741
|
+
mu->unlock();
|
|
1740
1742
|
mu->~Mutex();
|
|
1741
1743
|
alive[i] = false;
|
|
1742
1744
|
}
|
|
@@ -1762,8 +1764,8 @@ TEST(Mutex, SynchEventRace) {
|
|
|
1762
1764
|
{
|
|
1763
1765
|
absl::Mutex mu;
|
|
1764
1766
|
mu.EnableInvariantDebugging([](void *) {}, nullptr);
|
|
1765
|
-
mu.
|
|
1766
|
-
mu.
|
|
1767
|
+
mu.lock();
|
|
1768
|
+
mu.unlock();
|
|
1767
1769
|
}
|
|
1768
1770
|
{
|
|
1769
1771
|
absl::Mutex mu;
|
|
@@ -1900,7 +1902,7 @@ TEST(Mutex, MuTime) {
|
|
|
1900
1902
|
}
|
|
1901
1903
|
|
|
1902
1904
|
TEST(Mutex, SignalExitedThread) {
|
|
1903
|
-
// The test may expose a race when Mutex::
|
|
1905
|
+
// The test may expose a race when Mutex::unlock signals a thread
|
|
1904
1906
|
// that has already exited.
|
|
1905
1907
|
#if defined(__wasm__) || defined(__asmjs__)
|
|
1906
1908
|
constexpr int kThreads = 1; // OOMs under WASM
|
|
@@ -1913,11 +1915,11 @@ TEST(Mutex, SignalExitedThread) {
|
|
|
1913
1915
|
for (int i = 0; i < kThreads; i++) {
|
|
1914
1916
|
absl::Mutex mu;
|
|
1915
1917
|
std::thread t([&]() {
|
|
1916
|
-
mu.
|
|
1917
|
-
mu.
|
|
1918
|
+
mu.lock();
|
|
1919
|
+
mu.unlock();
|
|
1918
1920
|
});
|
|
1919
|
-
mu.
|
|
1920
|
-
mu.
|
|
1921
|
+
mu.lock();
|
|
1922
|
+
mu.unlock();
|
|
1921
1923
|
t.join();
|
|
1922
1924
|
}
|
|
1923
1925
|
});
|
|
@@ -1931,7 +1933,7 @@ TEST(Mutex, WriterPriority) {
|
|
|
1931
1933
|
std::atomic<bool> saw_wrote{false};
|
|
1932
1934
|
auto readfunc = [&]() {
|
|
1933
1935
|
for (size_t i = 0; i < 10; ++i) {
|
|
1934
|
-
absl::ReaderMutexLock lock(
|
|
1936
|
+
absl::ReaderMutexLock lock(mu);
|
|
1935
1937
|
if (wrote) {
|
|
1936
1938
|
saw_wrote = true;
|
|
1937
1939
|
break;
|
|
@@ -1946,7 +1948,7 @@ TEST(Mutex, WriterPriority) {
|
|
|
1946
1948
|
// PerThreadSynch::priority, so the writer intentionally runs on a new thread.
|
|
1947
1949
|
std::thread t3([&]() {
|
|
1948
1950
|
// The writer should be able squeeze between the two alternating readers.
|
|
1949
|
-
absl::MutexLock lock(
|
|
1951
|
+
absl::MutexLock lock(mu);
|
|
1950
1952
|
wrote = true;
|
|
1951
1953
|
});
|
|
1952
1954
|
t1.join();
|
|
@@ -1978,30 +1980,30 @@ TEST(Mutex, CondVarPriority) {
|
|
|
1978
1980
|
bool morph = false;
|
|
1979
1981
|
std::thread th([&]() {
|
|
1980
1982
|
EXPECT_EQ(0, pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m));
|
|
1981
|
-
mu.
|
|
1983
|
+
mu.lock();
|
|
1982
1984
|
locked = true;
|
|
1983
1985
|
mu.Await(absl::Condition(¬ified));
|
|
1984
|
-
mu.
|
|
1986
|
+
mu.unlock();
|
|
1985
1987
|
EXPECT_EQ(absl::synchronization_internal::GetOrCreateCurrentThreadIdentity()
|
|
1986
1988
|
->per_thread_synch.priority,
|
|
1987
1989
|
param.sched_priority);
|
|
1988
|
-
mu.
|
|
1990
|
+
mu.lock();
|
|
1989
1991
|
mu.Await(absl::Condition(&waiting));
|
|
1990
1992
|
morph = true;
|
|
1991
1993
|
absl::SleepFor(absl::Seconds(1));
|
|
1992
1994
|
cv.Signal();
|
|
1993
|
-
mu.
|
|
1995
|
+
mu.unlock();
|
|
1994
1996
|
});
|
|
1995
|
-
mu.
|
|
1997
|
+
mu.lock();
|
|
1996
1998
|
mu.Await(absl::Condition(&locked));
|
|
1997
1999
|
notified = true;
|
|
1998
|
-
mu.
|
|
1999
|
-
mu.
|
|
2000
|
+
mu.unlock();
|
|
2001
|
+
mu.lock();
|
|
2000
2002
|
waiting = true;
|
|
2001
2003
|
while (!morph) {
|
|
2002
2004
|
cv.Wait(&mu);
|
|
2003
2005
|
}
|
|
2004
|
-
mu.
|
|
2006
|
+
mu.unlock();
|
|
2005
2007
|
th.join();
|
|
2006
2008
|
EXPECT_NE(absl::synchronization_internal::GetOrCreateCurrentThreadIdentity()
|
|
2007
2009
|
->per_thread_synch.priority,
|
|
@@ -2016,22 +2018,34 @@ TEST(Mutex, LockWhenWithTimeoutResult) {
|
|
|
2016
2018
|
const bool kAlwaysTrue = true, kAlwaysFalse = false;
|
|
2017
2019
|
const absl::Condition kTrueCond(&kAlwaysTrue), kFalseCond(&kAlwaysFalse);
|
|
2018
2020
|
EXPECT_TRUE(mu.LockWhenWithTimeout(kTrueCond, absl::Milliseconds(1)));
|
|
2019
|
-
mu.
|
|
2021
|
+
mu.unlock();
|
|
2020
2022
|
EXPECT_FALSE(mu.LockWhenWithTimeout(kFalseCond, absl::Milliseconds(1)));
|
|
2021
2023
|
EXPECT_TRUE(mu.AwaitWithTimeout(kTrueCond, absl::Milliseconds(1)));
|
|
2022
2024
|
EXPECT_FALSE(mu.AwaitWithTimeout(kFalseCond, absl::Milliseconds(1)));
|
|
2023
2025
|
std::thread th1([&]() {
|
|
2024
2026
|
EXPECT_TRUE(mu.LockWhenWithTimeout(kTrueCond, absl::Milliseconds(1)));
|
|
2025
|
-
mu.
|
|
2027
|
+
mu.unlock();
|
|
2026
2028
|
});
|
|
2027
2029
|
std::thread th2([&]() {
|
|
2028
2030
|
EXPECT_FALSE(mu.LockWhenWithTimeout(kFalseCond, absl::Milliseconds(1)));
|
|
2029
|
-
mu.
|
|
2031
|
+
mu.unlock();
|
|
2030
2032
|
});
|
|
2031
2033
|
absl::SleepFor(absl::Milliseconds(100));
|
|
2032
|
-
mu.
|
|
2034
|
+
mu.unlock();
|
|
2033
2035
|
th1.join();
|
|
2034
2036
|
th2.join();
|
|
2035
2037
|
}
|
|
2036
2038
|
|
|
2039
|
+
TEST(Mutex, ScopedLock) {
|
|
2040
|
+
absl::Mutex mu;
|
|
2041
|
+
{
|
|
2042
|
+
std::scoped_lock l(mu);
|
|
2043
|
+
}
|
|
2044
|
+
|
|
2045
|
+
{
|
|
2046
|
+
std::shared_lock l(mu);
|
|
2047
|
+
EXPECT_TRUE(l.owns_lock());
|
|
2048
|
+
}
|
|
2049
|
+
}
|
|
2050
|
+
|
|
2037
2051
|
} // namespace
|