@nxtedition/rocksdb 15.1.5 → 15.2.1

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.
Files changed (1705) hide show
  1. package/.claude/settings.local.json +5 -1
  2. package/binding.cc +84 -47
  3. package/binding.gyp +102 -2
  4. package/deps/abseil-cpp/BUILD.bazel +35 -0
  5. package/deps/abseil-cpp/CMake/AbseilDll.cmake +938 -0
  6. package/deps/abseil-cpp/CMake/AbseilHelpers.cmake +465 -0
  7. package/deps/abseil-cpp/CMake/Googletest/CMakeLists.txt.in +14 -0
  8. package/deps/abseil-cpp/CMake/Googletest/DownloadGTest.cmake +41 -0
  9. package/deps/abseil-cpp/CMake/abslConfig.cmake.in +8 -0
  10. package/deps/abseil-cpp/CMake/install_test_project/CMakeLists.txt +25 -0
  11. package/deps/abseil-cpp/CMake/install_test_project/simple.cc +32 -0
  12. package/deps/abseil-cpp/CMake/install_test_project/test.sh +113 -0
  13. package/deps/abseil-cpp/CMakeLists.txt +280 -0
  14. package/deps/abseil-cpp/LICENSE +203 -0
  15. package/deps/abseil-cpp/MODULE.bazel +43 -0
  16. package/deps/abseil-cpp/PrivacyInfo.xcprivacy +14 -0
  17. package/deps/abseil-cpp/absl/BUILD.bazel +62 -0
  18. package/deps/abseil-cpp/absl/CMakeLists.txt +45 -0
  19. package/deps/abseil-cpp/absl/abseil.podspec.gen.py +245 -0
  20. package/deps/abseil-cpp/absl/algorithm/BUILD.bazel +92 -0
  21. package/deps/abseil-cpp/absl/algorithm/CMakeLists.txt +72 -0
  22. package/deps/abseil-cpp/absl/algorithm/algorithm.h +64 -0
  23. package/deps/abseil-cpp/absl/algorithm/algorithm_test.cc +60 -0
  24. package/deps/abseil-cpp/absl/algorithm/container.h +1864 -0
  25. package/deps/abseil-cpp/absl/algorithm/container_test.cc +2232 -0
  26. package/deps/abseil-cpp/absl/base/BUILD.bazel +1036 -0
  27. package/deps/abseil-cpp/absl/base/CMakeLists.txt +881 -0
  28. package/deps/abseil-cpp/absl/base/attributes.h +1081 -0
  29. package/deps/abseil-cpp/absl/base/attributes_test.cc +43 -0
  30. package/deps/abseil-cpp/absl/base/bit_cast_test.cc +109 -0
  31. package/deps/abseil-cpp/absl/base/c_header_test.c +30 -0
  32. package/deps/abseil-cpp/absl/base/call_once.h +228 -0
  33. package/deps/abseil-cpp/absl/base/call_once_test.cc +107 -0
  34. package/deps/abseil-cpp/absl/base/casts.cc +61 -0
  35. package/deps/abseil-cpp/absl/base/casts.h +313 -0
  36. package/deps/abseil-cpp/absl/base/casts_test.cc +148 -0
  37. package/deps/abseil-cpp/absl/base/config.h +854 -0
  38. package/deps/abseil-cpp/absl/base/config_test.cc +60 -0
  39. package/deps/abseil-cpp/absl/base/const_init.h +76 -0
  40. package/deps/abseil-cpp/absl/base/dynamic_annotations.h +480 -0
  41. package/deps/abseil-cpp/absl/base/exception_safety_testing_test.cc +958 -0
  42. package/deps/abseil-cpp/absl/base/fast_type_id.h +73 -0
  43. package/deps/abseil-cpp/absl/base/fast_type_id_test.cc +130 -0
  44. package/deps/abseil-cpp/absl/base/internal/atomic_hook.h +200 -0
  45. package/deps/abseil-cpp/absl/base/internal/atomic_hook_test.cc +97 -0
  46. package/deps/abseil-cpp/absl/base/internal/atomic_hook_test_helper.cc +32 -0
  47. package/deps/abseil-cpp/absl/base/internal/atomic_hook_test_helper.h +34 -0
  48. package/deps/abseil-cpp/absl/base/internal/cmake_thread_test.cc +22 -0
  49. package/deps/abseil-cpp/absl/base/internal/cycleclock.cc +72 -0
  50. package/deps/abseil-cpp/absl/base/internal/cycleclock.h +144 -0
  51. package/deps/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
  52. package/deps/abseil-cpp/absl/base/internal/direct_mmap.h +170 -0
  53. package/deps/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  54. package/deps/abseil-cpp/absl/base/internal/endian.h +279 -0
  55. package/deps/abseil-cpp/absl/base/internal/endian_test.cc +263 -0
  56. package/deps/abseil-cpp/absl/base/internal/errno_saver.h +43 -0
  57. package/deps/abseil-cpp/absl/base/internal/errno_saver_test.cc +45 -0
  58. package/deps/abseil-cpp/absl/base/internal/exception_safety_testing.cc +79 -0
  59. package/deps/abseil-cpp/absl/base/internal/exception_safety_testing.h +1109 -0
  60. package/deps/abseil-cpp/absl/base/internal/exception_testing.h +42 -0
  61. package/deps/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
  62. package/deps/abseil-cpp/absl/base/internal/iterator_traits.h +75 -0
  63. package/deps/abseil-cpp/absl/base/internal/iterator_traits_test.cc +85 -0
  64. package/deps/abseil-cpp/absl/base/internal/iterator_traits_test_helper.h +97 -0
  65. package/deps/abseil-cpp/absl/base/internal/low_level_alloc.cc +661 -0
  66. package/deps/abseil-cpp/absl/base/internal/low_level_alloc.h +133 -0
  67. package/deps/abseil-cpp/absl/base/internal/low_level_alloc_test.cc +180 -0
  68. package/deps/abseil-cpp/absl/base/internal/low_level_scheduling.h +134 -0
  69. package/deps/abseil-cpp/absl/base/internal/nullability_traits.h +71 -0
  70. package/deps/abseil-cpp/absl/base/internal/nullability_traits_test.cc +98 -0
  71. package/deps/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
  72. package/deps/abseil-cpp/absl/base/internal/poison.cc +85 -0
  73. package/deps/abseil-cpp/absl/base/internal/poison.h +59 -0
  74. package/deps/abseil-cpp/absl/base/internal/poison_test.cc +41 -0
  75. package/deps/abseil-cpp/absl/base/internal/pretty_function.h +33 -0
  76. package/deps/abseil-cpp/absl/base/internal/raw_logging.cc +279 -0
  77. package/deps/abseil-cpp/absl/base/internal/raw_logging.h +217 -0
  78. package/deps/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
  79. package/deps/abseil-cpp/absl/base/internal/scoped_set_env.cc +81 -0
  80. package/deps/abseil-cpp/absl/base/internal/scoped_set_env.h +45 -0
  81. package/deps/abseil-cpp/absl/base/internal/scoped_set_env_test.cc +99 -0
  82. package/deps/abseil-cpp/absl/base/internal/spinlock.cc +225 -0
  83. package/deps/abseil-cpp/absl/base/internal/spinlock.h +310 -0
  84. package/deps/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
  85. package/deps/abseil-cpp/absl/base/internal/spinlock_benchmark.cc +80 -0
  86. package/deps/abseil-cpp/absl/base/internal/spinlock_linux.inc +71 -0
  87. package/deps/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
  88. package/deps/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
  89. package/deps/abseil-cpp/absl/base/internal/spinlock_wait.h +95 -0
  90. package/deps/abseil-cpp/absl/base/internal/spinlock_win32.inc +40 -0
  91. package/deps/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  92. package/deps/abseil-cpp/absl/base/internal/strerror.h +39 -0
  93. package/deps/abseil-cpp/absl/base/internal/strerror_benchmark.cc +29 -0
  94. package/deps/abseil-cpp/absl/base/internal/strerror_test.cc +89 -0
  95. package/deps/abseil-cpp/absl/base/internal/sysinfo.cc +494 -0
  96. package/deps/abseil-cpp/absl/base/internal/sysinfo.h +74 -0
  97. package/deps/abseil-cpp/absl/base/internal/sysinfo_test.cc +82 -0
  98. package/deps/abseil-cpp/absl/base/internal/thread_identity.cc +163 -0
  99. package/deps/abseil-cpp/absl/base/internal/thread_identity.h +273 -0
  100. package/deps/abseil-cpp/absl/base/internal/thread_identity_benchmark.cc +38 -0
  101. package/deps/abseil-cpp/absl/base/internal/thread_identity_test.cc +129 -0
  102. package/deps/abseil-cpp/absl/base/internal/throw_delegate.cc +203 -0
  103. package/deps/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
  104. package/deps/abseil-cpp/absl/base/internal/tracing.cc +39 -0
  105. package/deps/abseil-cpp/absl/base/internal/tracing.h +81 -0
  106. package/deps/abseil-cpp/absl/base/internal/tracing_strong_test.cc +117 -0
  107. package/deps/abseil-cpp/absl/base/internal/tracing_weak_test.cc +34 -0
  108. package/deps/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +68 -0
  109. package/deps/abseil-cpp/absl/base/internal/unaligned_access.h +89 -0
  110. package/deps/abseil-cpp/absl/base/internal/unique_small_name_test.cc +77 -0
  111. package/deps/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +134 -0
  112. package/deps/abseil-cpp/absl/base/internal/unscaledcycleclock.h +113 -0
  113. package/deps/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
  114. package/deps/abseil-cpp/absl/base/log_severity.cc +56 -0
  115. package/deps/abseil-cpp/absl/base/log_severity.h +185 -0
  116. package/deps/abseil-cpp/absl/base/log_severity_test.cc +251 -0
  117. package/deps/abseil-cpp/absl/base/macros.h +243 -0
  118. package/deps/abseil-cpp/absl/base/no_destructor.h +191 -0
  119. package/deps/abseil-cpp/absl/base/no_destructor_benchmark.cc +165 -0
  120. package/deps/abseil-cpp/absl/base/no_destructor_test.cc +205 -0
  121. package/deps/abseil-cpp/absl/base/nullability.h +317 -0
  122. package/deps/abseil-cpp/absl/base/nullability_default_nonnull_test.cc +44 -0
  123. package/deps/abseil-cpp/absl/base/nullability_test.cc +90 -0
  124. package/deps/abseil-cpp/absl/base/optimization.h +310 -0
  125. package/deps/abseil-cpp/absl/base/optimization_test.cc +141 -0
  126. package/deps/abseil-cpp/absl/base/options.h +158 -0
  127. package/deps/abseil-cpp/absl/base/policy_checks.h +115 -0
  128. package/deps/abseil-cpp/absl/base/port.h +25 -0
  129. package/deps/abseil-cpp/absl/base/prefetch.h +209 -0
  130. package/deps/abseil-cpp/absl/base/prefetch_test.cc +64 -0
  131. package/deps/abseil-cpp/absl/base/raw_logging_test.cc +98 -0
  132. package/deps/abseil-cpp/absl/base/spinlock_test_common.cc +302 -0
  133. package/deps/abseil-cpp/absl/base/thread_annotations.h +333 -0
  134. package/deps/abseil-cpp/absl/base/throw_delegate_test.cc +175 -0
  135. package/deps/abseil-cpp/absl/cleanup/BUILD.bazel +74 -0
  136. package/deps/abseil-cpp/absl/cleanup/CMakeLists.txt +55 -0
  137. package/deps/abseil-cpp/absl/cleanup/cleanup.h +142 -0
  138. package/deps/abseil-cpp/absl/cleanup/cleanup_test.cc +309 -0
  139. package/deps/abseil-cpp/absl/cleanup/internal/cleanup.h +99 -0
  140. package/deps/abseil-cpp/absl/container/BUILD.bazel +1394 -0
  141. package/deps/abseil-cpp/absl/container/CMakeLists.txt +1239 -0
  142. package/deps/abseil-cpp/absl/container/btree_benchmark.cc +806 -0
  143. package/deps/abseil-cpp/absl/container/btree_map.h +941 -0
  144. package/deps/abseil-cpp/absl/container/btree_set.h +872 -0
  145. package/deps/abseil-cpp/absl/container/btree_test.cc +3653 -0
  146. package/deps/abseil-cpp/absl/container/btree_test.h +166 -0
  147. package/deps/abseil-cpp/absl/container/chunked_queue.h +755 -0
  148. package/deps/abseil-cpp/absl/container/chunked_queue_benchmark.cc +386 -0
  149. package/deps/abseil-cpp/absl/container/chunked_queue_test.cc +768 -0
  150. package/deps/abseil-cpp/absl/container/fixed_array.h +547 -0
  151. package/deps/abseil-cpp/absl/container/fixed_array_benchmark.cc +67 -0
  152. package/deps/abseil-cpp/absl/container/fixed_array_exception_safety_test.cc +201 -0
  153. package/deps/abseil-cpp/absl/container/fixed_array_test.cc +874 -0
  154. package/deps/abseil-cpp/absl/container/flat_hash_map.h +702 -0
  155. package/deps/abseil-cpp/absl/container/flat_hash_map_test.cc +451 -0
  156. package/deps/abseil-cpp/absl/container/flat_hash_set.h +590 -0
  157. package/deps/abseil-cpp/absl/container/flat_hash_set_test.cc +401 -0
  158. package/deps/abseil-cpp/absl/container/hash_container_defaults.h +45 -0
  159. package/deps/abseil-cpp/absl/container/inlined_vector.h +1025 -0
  160. package/deps/abseil-cpp/absl/container/inlined_vector_benchmark.cc +829 -0
  161. package/deps/abseil-cpp/absl/container/inlined_vector_exception_safety_test.cc +508 -0
  162. package/deps/abseil-cpp/absl/container/inlined_vector_test.cc +2278 -0
  163. package/deps/abseil-cpp/absl/container/internal/btree.h +3149 -0
  164. package/deps/abseil-cpp/absl/container/internal/btree_container.h +876 -0
  165. package/deps/abseil-cpp/absl/container/internal/chunked_queue.h +173 -0
  166. package/deps/abseil-cpp/absl/container/internal/common.h +301 -0
  167. package/deps/abseil-cpp/absl/container/internal/common_policy_traits.h +151 -0
  168. package/deps/abseil-cpp/absl/container/internal/common_policy_traits_test.cc +157 -0
  169. package/deps/abseil-cpp/absl/container/internal/compressed_tuple.h +275 -0
  170. package/deps/abseil-cpp/absl/container/internal/compressed_tuple_test.cc +469 -0
  171. package/deps/abseil-cpp/absl/container/internal/container_memory.h +561 -0
  172. package/deps/abseil-cpp/absl/container/internal/container_memory_test.cc +359 -0
  173. package/deps/abseil-cpp/absl/container/internal/hash_function_defaults.h +281 -0
  174. package/deps/abseil-cpp/absl/container/internal/hash_function_defaults_test.cc +633 -0
  175. package/deps/abseil-cpp/absl/container/internal/hash_generator_testing.cc +54 -0
  176. package/deps/abseil-cpp/absl/container/internal/hash_generator_testing.h +172 -0
  177. package/deps/abseil-cpp/absl/container/internal/hash_policy_testing.h +173 -0
  178. package/deps/abseil-cpp/absl/container/internal/hash_policy_testing_test.cc +45 -0
  179. package/deps/abseil-cpp/absl/container/internal/hash_policy_traits.h +195 -0
  180. package/deps/abseil-cpp/absl/container/internal/hash_policy_traits_test.cc +149 -0
  181. package/deps/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  182. package/deps/abseil-cpp/absl/container/internal/hashtable_control_bytes_test.cc +259 -0
  183. package/deps/abseil-cpp/absl/container/internal/hashtable_debug.h +102 -0
  184. package/deps/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  185. package/deps/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +316 -0
  186. package/deps/abseil-cpp/absl/container/internal/hashtablez_sampler.h +311 -0
  187. package/deps/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +31 -0
  188. package/deps/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc +534 -0
  189. package/deps/abseil-cpp/absl/container/internal/heterogeneous_lookup_testing.h +80 -0
  190. package/deps/abseil-cpp/absl/container/internal/inlined_vector.h +1094 -0
  191. package/deps/abseil-cpp/absl/container/internal/layout.h +828 -0
  192. package/deps/abseil-cpp/absl/container/internal/layout_benchmark.cc +295 -0
  193. package/deps/abseil-cpp/absl/container/internal/layout_test.cc +2034 -0
  194. package/deps/abseil-cpp/absl/container/internal/node_slot_policy.h +95 -0
  195. package/deps/abseil-cpp/absl/container/internal/node_slot_policy_test.cc +71 -0
  196. package/deps/abseil-cpp/absl/container/internal/raw_hash_map.h +382 -0
  197. package/deps/abseil-cpp/absl/container/internal/raw_hash_set.cc +2090 -0
  198. package/deps/abseil-cpp/absl/container/internal/raw_hash_set.h +3763 -0
  199. package/deps/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc +525 -0
  200. package/deps/abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc +696 -0
  201. package/deps/abseil-cpp/absl/container/internal/raw_hash_set_probe_benchmark.cc +583 -0
  202. package/deps/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +79 -0
  203. package/deps/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl_test.cc +66 -0
  204. package/deps/abseil-cpp/absl/container/internal/raw_hash_set_test.cc +4184 -0
  205. package/deps/abseil-cpp/absl/container/internal/test_allocator.h +387 -0
  206. package/deps/abseil-cpp/absl/container/internal/test_instance_tracker.cc +29 -0
  207. package/deps/abseil-cpp/absl/container/internal/test_instance_tracker.h +274 -0
  208. package/deps/abseil-cpp/absl/container/internal/test_instance_tracker_test.cc +184 -0
  209. package/deps/abseil-cpp/absl/container/internal/tracked.h +83 -0
  210. package/deps/abseil-cpp/absl/container/internal/unordered_map_constructor_test.h +435 -0
  211. package/deps/abseil-cpp/absl/container/internal/unordered_map_lookup_test.h +112 -0
  212. package/deps/abseil-cpp/absl/container/internal/unordered_map_members_test.h +87 -0
  213. package/deps/abseil-cpp/absl/container/internal/unordered_map_modifiers_test.h +336 -0
  214. package/deps/abseil-cpp/absl/container/internal/unordered_map_test.cc +50 -0
  215. package/deps/abseil-cpp/absl/container/internal/unordered_set_constructor_test.h +437 -0
  216. package/deps/abseil-cpp/absl/container/internal/unordered_set_lookup_test.h +88 -0
  217. package/deps/abseil-cpp/absl/container/internal/unordered_set_members_test.h +86 -0
  218. package/deps/abseil-cpp/absl/container/internal/unordered_set_modifiers_test.h +215 -0
  219. package/deps/abseil-cpp/absl/container/internal/unordered_set_test.cc +41 -0
  220. package/deps/abseil-cpp/absl/container/linked_hash_map.h +666 -0
  221. package/deps/abseil-cpp/absl/container/linked_hash_map_benchmark.cc +140 -0
  222. package/deps/abseil-cpp/absl/container/linked_hash_map_test.cc +987 -0
  223. package/deps/abseil-cpp/absl/container/linked_hash_set.h +527 -0
  224. package/deps/abseil-cpp/absl/container/linked_hash_set_benchmark.cc +84 -0
  225. package/deps/abseil-cpp/absl/container/linked_hash_set_test.cc +947 -0
  226. package/deps/abseil-cpp/absl/container/node_hash_map.h +698 -0
  227. package/deps/abseil-cpp/absl/container/node_hash_map_test.cc +348 -0
  228. package/deps/abseil-cpp/absl/container/node_hash_set.h +589 -0
  229. package/deps/abseil-cpp/absl/container/node_hash_set_test.cc +188 -0
  230. package/deps/abseil-cpp/absl/container/sample_element_size_test.cc +118 -0
  231. package/deps/abseil-cpp/absl/copts/AbseilConfigureCopts.cmake +106 -0
  232. package/deps/abseil-cpp/absl/copts/GENERATED_AbseilCopts.cmake +303 -0
  233. package/deps/abseil-cpp/absl/copts/GENERATED_copts.bzl +304 -0
  234. package/deps/abseil-cpp/absl/copts/configure_copts.bzl +39 -0
  235. package/deps/abseil-cpp/absl/copts/copts.py +205 -0
  236. package/deps/abseil-cpp/absl/copts/generate_copts.py +109 -0
  237. package/deps/abseil-cpp/absl/crc/BUILD.bazel +228 -0
  238. package/deps/abseil-cpp/absl/crc/CMakeLists.txt +177 -0
  239. package/deps/abseil-cpp/absl/crc/crc32c.cc +95 -0
  240. package/deps/abseil-cpp/absl/crc/crc32c.h +192 -0
  241. package/deps/abseil-cpp/absl/crc/crc32c_benchmark.cc +196 -0
  242. package/deps/abseil-cpp/absl/crc/crc32c_test.cc +257 -0
  243. package/deps/abseil-cpp/absl/crc/internal/cpu_detect.cc +359 -0
  244. package/deps/abseil-cpp/absl/crc/internal/cpu_detect.h +69 -0
  245. package/deps/abseil-cpp/absl/crc/internal/crc.cc +435 -0
  246. package/deps/abseil-cpp/absl/crc/internal/crc.h +83 -0
  247. package/deps/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +278 -0
  248. package/deps/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
  249. package/deps/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
  250. package/deps/abseil-cpp/absl/crc/internal/crc_cord_state.cc +131 -0
  251. package/deps/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
  252. package/deps/abseil-cpp/absl/crc/internal/crc_cord_state_test.cc +124 -0
  253. package/deps/abseil-cpp/absl/crc/internal/crc_internal.h +161 -0
  254. package/deps/abseil-cpp/absl/crc/internal/crc_memcpy.h +122 -0
  255. package/deps/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +78 -0
  256. package/deps/abseil-cpp/absl/crc/internal/crc_memcpy_test.cc +177 -0
  257. package/deps/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +459 -0
  258. package/deps/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
  259. package/deps/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +762 -0
  260. package/deps/abseil-cpp/absl/crc/internal/gen_crc32c_consts.py +90 -0
  261. package/deps/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +81 -0
  262. package/deps/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +195 -0
  263. package/deps/abseil-cpp/absl/crc/internal/non_temporal_memcpy_test.cc +90 -0
  264. package/deps/abseil-cpp/absl/debugging/BUILD.bazel +483 -0
  265. package/deps/abseil-cpp/absl/debugging/CMakeLists.txt +448 -0
  266. package/deps/abseil-cpp/absl/debugging/failure_signal_handler.cc +434 -0
  267. package/deps/abseil-cpp/absl/debugging/failure_signal_handler.h +121 -0
  268. package/deps/abseil-cpp/absl/debugging/failure_signal_handler_test.cc +166 -0
  269. package/deps/abseil-cpp/absl/debugging/internal/address_is_readable.cc +98 -0
  270. package/deps/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  271. package/deps/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  272. package/deps/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.cc +118 -0
  273. package/deps/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer.h +71 -0
  274. package/deps/abseil-cpp/absl/debugging/internal/borrowed_fixup_buffer_test.cc +97 -0
  275. package/deps/abseil-cpp/absl/debugging/internal/bounded_utf8_length_sequence.h +126 -0
  276. package/deps/abseil-cpp/absl/debugging/internal/bounded_utf8_length_sequence_test.cc +126 -0
  277. package/deps/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +258 -0
  278. package/deps/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +55 -0
  279. package/deps/abseil-cpp/absl/debugging/internal/decode_rust_punycode_test.cc +606 -0
  280. package/deps/abseil-cpp/absl/debugging/internal/demangle.cc +2958 -0
  281. package/deps/abseil-cpp/absl/debugging/internal/demangle.h +76 -0
  282. package/deps/abseil-cpp/absl/debugging/internal/demangle_rust.cc +925 -0
  283. package/deps/abseil-cpp/absl/debugging/internal/demangle_rust.h +42 -0
  284. package/deps/abseil-cpp/absl/debugging/internal/demangle_rust_test.cc +584 -0
  285. package/deps/abseil-cpp/absl/debugging/internal/demangle_test.cc +2050 -0
  286. package/deps/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +413 -0
  287. package/deps/abseil-cpp/absl/debugging/internal/elf_mem_image.h +141 -0
  288. package/deps/abseil-cpp/absl/debugging/internal/examine_stack.cc +334 -0
  289. package/deps/abseil-cpp/absl/debugging/internal/examine_stack.h +70 -0
  290. package/deps/abseil-cpp/absl/debugging/internal/stack_consumption.cc +206 -0
  291. package/deps/abseil-cpp/absl/debugging/internal/stack_consumption.h +50 -0
  292. package/deps/abseil-cpp/absl/debugging/internal/stack_consumption_test.cc +50 -0
  293. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +288 -0
  294. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +148 -0
  295. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_config.h +96 -0
  296. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +112 -0
  297. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +114 -0
  298. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +270 -0
  299. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +204 -0
  300. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +25 -0
  301. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +81 -0
  302. package/deps/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +410 -0
  303. package/deps/abseil-cpp/absl/debugging/internal/symbolize.h +153 -0
  304. package/deps/abseil-cpp/absl/debugging/internal/utf8_for_code_point.cc +70 -0
  305. package/deps/abseil-cpp/absl/debugging/internal/utf8_for_code_point.h +47 -0
  306. package/deps/abseil-cpp/absl/debugging/internal/utf8_for_code_point_test.cc +175 -0
  307. package/deps/abseil-cpp/absl/debugging/internal/vdso_support.cc +209 -0
  308. package/deps/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  309. package/deps/abseil-cpp/absl/debugging/leak_check.cc +73 -0
  310. package/deps/abseil-cpp/absl/debugging/leak_check.h +150 -0
  311. package/deps/abseil-cpp/absl/debugging/leak_check_fail_test.cc +41 -0
  312. package/deps/abseil-cpp/absl/debugging/leak_check_test.cc +41 -0
  313. package/deps/abseil-cpp/absl/debugging/stacktrace.cc +244 -0
  314. package/deps/abseil-cpp/absl/debugging/stacktrace.h +302 -0
  315. package/deps/abseil-cpp/absl/debugging/stacktrace_benchmark.cc +78 -0
  316. package/deps/abseil-cpp/absl/debugging/stacktrace_test.cc +505 -0
  317. package/deps/abseil-cpp/absl/debugging/symbolize.cc +44 -0
  318. package/deps/abseil-cpp/absl/debugging/symbolize.h +99 -0
  319. package/deps/abseil-cpp/absl/debugging/symbolize_darwin.inc +102 -0
  320. package/deps/abseil-cpp/absl/debugging/symbolize_elf.inc +1756 -0
  321. package/deps/abseil-cpp/absl/debugging/symbolize_emscripten.inc +63 -0
  322. package/deps/abseil-cpp/absl/debugging/symbolize_test.cc +619 -0
  323. package/deps/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  324. package/deps/abseil-cpp/absl/debugging/symbolize_win32.inc +99 -0
  325. package/deps/abseil-cpp/absl/extend/CMakeLists.txt +140 -0
  326. package/deps/abseil-cpp/absl/extend/internal/BUILD.bazel +127 -0
  327. package/deps/abseil-cpp/absl/extend/internal/aggregate.h +1687 -0
  328. package/deps/abseil-cpp/absl/extend/internal/aggregate_test.cc +867 -0
  329. package/deps/abseil-cpp/absl/extend/internal/dependencies.h +83 -0
  330. package/deps/abseil-cpp/absl/extend/internal/dependencies_test.cc +117 -0
  331. package/deps/abseil-cpp/absl/extend/internal/is_tuple_hashable.h +45 -0
  332. package/deps/abseil-cpp/absl/extend/internal/num_bases.h +87 -0
  333. package/deps/abseil-cpp/absl/extend/internal/num_bases_test.cc +91 -0
  334. package/deps/abseil-cpp/absl/extend/internal/num_initializers.h +113 -0
  335. package/deps/abseil-cpp/absl/extend/internal/num_initializers_test.cc +250 -0
  336. package/deps/abseil-cpp/absl/extend/internal/reflection.cc +112 -0
  337. package/deps/abseil-cpp/absl/extend/internal/reflection.h +75 -0
  338. package/deps/abseil-cpp/absl/extend/internal/tuple.h +51 -0
  339. package/deps/abseil-cpp/absl/flags/BUILD.bazel +618 -0
  340. package/deps/abseil-cpp/absl/flags/CMakeLists.txt +482 -0
  341. package/deps/abseil-cpp/absl/flags/commandlineflag.cc +35 -0
  342. package/deps/abseil-cpp/absl/flags/commandlineflag.h +219 -0
  343. package/deps/abseil-cpp/absl/flags/commandlineflag_test.cc +236 -0
  344. package/deps/abseil-cpp/absl/flags/config.h +68 -0
  345. package/deps/abseil-cpp/absl/flags/config_test.cc +61 -0
  346. package/deps/abseil-cpp/absl/flags/declare.h +77 -0
  347. package/deps/abseil-cpp/absl/flags/flag.h +307 -0
  348. package/deps/abseil-cpp/absl/flags/flag_benchmark.cc +251 -0
  349. package/deps/abseil-cpp/absl/flags/flag_benchmark.lds +13 -0
  350. package/deps/abseil-cpp/absl/flags/flag_test.cc +1381 -0
  351. package/deps/abseil-cpp/absl/flags/flag_test_defs.cc +24 -0
  352. package/deps/abseil-cpp/absl/flags/internal/commandlineflag.cc +26 -0
  353. package/deps/abseil-cpp/absl/flags/internal/commandlineflag.h +68 -0
  354. package/deps/abseil-cpp/absl/flags/internal/flag.cc +712 -0
  355. package/deps/abseil-cpp/absl/flags/internal/flag.h +969 -0
  356. package/deps/abseil-cpp/absl/flags/internal/parse.h +70 -0
  357. package/deps/abseil-cpp/absl/flags/internal/path_util.h +62 -0
  358. package/deps/abseil-cpp/absl/flags/internal/path_util_test.cc +46 -0
  359. package/deps/abseil-cpp/absl/flags/internal/private_handle_accessor.cc +69 -0
  360. package/deps/abseil-cpp/absl/flags/internal/private_handle_accessor.h +64 -0
  361. package/deps/abseil-cpp/absl/flags/internal/program_name.cc +61 -0
  362. package/deps/abseil-cpp/absl/flags/internal/program_name.h +50 -0
  363. package/deps/abseil-cpp/absl/flags/internal/program_name_test.cc +61 -0
  364. package/deps/abseil-cpp/absl/flags/internal/registry.h +98 -0
  365. package/deps/abseil-cpp/absl/flags/internal/sequence_lock.h +187 -0
  366. package/deps/abseil-cpp/absl/flags/internal/sequence_lock_test.cc +169 -0
  367. package/deps/abseil-cpp/absl/flags/internal/usage.cc +558 -0
  368. package/deps/abseil-cpp/absl/flags/internal/usage.h +106 -0
  369. package/deps/abseil-cpp/absl/flags/internal/usage_test.cc +550 -0
  370. package/deps/abseil-cpp/absl/flags/marshalling.cc +276 -0
  371. package/deps/abseil-cpp/absl/flags/marshalling.h +361 -0
  372. package/deps/abseil-cpp/absl/flags/marshalling_test.cc +1220 -0
  373. package/deps/abseil-cpp/absl/flags/parse.cc +952 -0
  374. package/deps/abseil-cpp/absl/flags/parse.h +130 -0
  375. package/deps/abseil-cpp/absl/flags/parse_test.cc +1094 -0
  376. package/deps/abseil-cpp/absl/flags/reflection.cc +368 -0
  377. package/deps/abseil-cpp/absl/flags/reflection.h +90 -0
  378. package/deps/abseil-cpp/absl/flags/reflection_test.cc +268 -0
  379. package/deps/abseil-cpp/absl/flags/usage.cc +66 -0
  380. package/deps/abseil-cpp/absl/flags/usage.h +43 -0
  381. package/deps/abseil-cpp/absl/flags/usage_config.cc +170 -0
  382. package/deps/abseil-cpp/absl/flags/usage_config.h +135 -0
  383. package/deps/abseil-cpp/absl/flags/usage_config_test.cc +205 -0
  384. package/deps/abseil-cpp/absl/functional/BUILD.bazel +173 -0
  385. package/deps/abseil-cpp/absl/functional/CMakeLists.txt +140 -0
  386. package/deps/abseil-cpp/absl/functional/any_invocable.h +336 -0
  387. package/deps/abseil-cpp/absl/functional/any_invocable_test.cc +1687 -0
  388. package/deps/abseil-cpp/absl/functional/bind_front.h +200 -0
  389. package/deps/abseil-cpp/absl/functional/bind_front_test.cc +227 -0
  390. package/deps/abseil-cpp/absl/functional/function_ref.h +249 -0
  391. package/deps/abseil-cpp/absl/functional/function_ref_test.cc +416 -0
  392. package/deps/abseil-cpp/absl/functional/function_type_benchmark.cc +176 -0
  393. package/deps/abseil-cpp/absl/functional/internal/any_invocable.h +787 -0
  394. package/deps/abseil-cpp/absl/functional/internal/front_binder.h +93 -0
  395. package/deps/abseil-cpp/absl/functional/internal/function_ref.h +151 -0
  396. package/deps/abseil-cpp/absl/functional/overload.h +72 -0
  397. package/deps/abseil-cpp/absl/functional/overload_test.cc +207 -0
  398. package/deps/abseil-cpp/absl/hash/BUILD.bazel +220 -0
  399. package/deps/abseil-cpp/absl/hash/CMakeLists.txt +179 -0
  400. package/deps/abseil-cpp/absl/hash/hash.h +466 -0
  401. package/deps/abseil-cpp/absl/hash/hash_benchmark.cc +398 -0
  402. package/deps/abseil-cpp/absl/hash/hash_instantiated_test.cc +224 -0
  403. package/deps/abseil-cpp/absl/hash/hash_test.cc +1320 -0
  404. package/deps/abseil-cpp/absl/hash/hash_testing.h +380 -0
  405. package/deps/abseil-cpp/absl/hash/internal/city.cc +337 -0
  406. package/deps/abseil-cpp/absl/hash/internal/city.h +78 -0
  407. package/deps/abseil-cpp/absl/hash/internal/city_test.cc +597 -0
  408. package/deps/abseil-cpp/absl/hash/internal/hash.cc +430 -0
  409. package/deps/abseil-cpp/absl/hash/internal/hash.h +1563 -0
  410. package/deps/abseil-cpp/absl/hash/internal/hash_test.h +87 -0
  411. package/deps/abseil-cpp/absl/hash/internal/low_level_hash_test.cc +509 -0
  412. package/deps/abseil-cpp/absl/hash/internal/print_hash_of.cc +23 -0
  413. package/deps/abseil-cpp/absl/hash/internal/spy_hash_state.h +286 -0
  414. package/deps/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  415. package/deps/abseil-cpp/absl/log/BUILD.bazel +686 -0
  416. package/deps/abseil-cpp/absl/log/CMakeLists.txt +1239 -0
  417. package/deps/abseil-cpp/absl/log/absl_check.h +117 -0
  418. package/deps/abseil-cpp/absl/log/absl_check_test.cc +58 -0
  419. package/deps/abseil-cpp/absl/log/absl_log.h +115 -0
  420. package/deps/abseil-cpp/absl/log/absl_log_basic_test.cc +22 -0
  421. package/deps/abseil-cpp/absl/log/absl_vlog_is_on.h +95 -0
  422. package/deps/abseil-cpp/absl/log/check.h +210 -0
  423. package/deps/abseil-cpp/absl/log/check_test.cc +58 -0
  424. package/deps/abseil-cpp/absl/log/check_test_impl.inc +1035 -0
  425. package/deps/abseil-cpp/absl/log/die_if_null.cc +34 -0
  426. package/deps/abseil-cpp/absl/log/die_if_null.h +97 -0
  427. package/deps/abseil-cpp/absl/log/die_if_null_test.cc +107 -0
  428. package/deps/abseil-cpp/absl/log/flags.cc +143 -0
  429. package/deps/abseil-cpp/absl/log/flags.h +43 -0
  430. package/deps/abseil-cpp/absl/log/flags_test.cc +195 -0
  431. package/deps/abseil-cpp/absl/log/globals.cc +178 -0
  432. package/deps/abseil-cpp/absl/log/globals.h +230 -0
  433. package/deps/abseil-cpp/absl/log/globals_test.cc +156 -0
  434. package/deps/abseil-cpp/absl/log/initialize.cc +38 -0
  435. package/deps/abseil-cpp/absl/log/initialize.h +45 -0
  436. package/deps/abseil-cpp/absl/log/internal/BUILD.bazel +581 -0
  437. package/deps/abseil-cpp/absl/log/internal/append_truncated.h +75 -0
  438. package/deps/abseil-cpp/absl/log/internal/check_impl.h +151 -0
  439. package/deps/abseil-cpp/absl/log/internal/check_op.cc +147 -0
  440. package/deps/abseil-cpp/absl/log/internal/check_op.h +565 -0
  441. package/deps/abseil-cpp/absl/log/internal/conditions.cc +85 -0
  442. package/deps/abseil-cpp/absl/log/internal/conditions.h +247 -0
  443. package/deps/abseil-cpp/absl/log/internal/config.h +45 -0
  444. package/deps/abseil-cpp/absl/log/internal/container.h +312 -0
  445. package/deps/abseil-cpp/absl/log/internal/container_test.cc +254 -0
  446. package/deps/abseil-cpp/absl/log/internal/flags.h +59 -0
  447. package/deps/abseil-cpp/absl/log/internal/fnmatch.cc +73 -0
  448. package/deps/abseil-cpp/absl/log/internal/fnmatch.h +35 -0
  449. package/deps/abseil-cpp/absl/log/internal/fnmatch_benchmark.cc +29 -0
  450. package/deps/abseil-cpp/absl/log/internal/fnmatch_test.cc +60 -0
  451. package/deps/abseil-cpp/absl/log/internal/globals.cc +145 -0
  452. package/deps/abseil-cpp/absl/log/internal/globals.h +101 -0
  453. package/deps/abseil-cpp/absl/log/internal/log_format.cc +205 -0
  454. package/deps/abseil-cpp/absl/log/internal/log_format.h +78 -0
  455. package/deps/abseil-cpp/absl/log/internal/log_impl.h +280 -0
  456. package/deps/abseil-cpp/absl/log/internal/log_message.cc +787 -0
  457. package/deps/abseil-cpp/absl/log/internal/log_message.h +455 -0
  458. package/deps/abseil-cpp/absl/log/internal/log_sink_set.cc +296 -0
  459. package/deps/abseil-cpp/absl/log/internal/log_sink_set.h +54 -0
  460. package/deps/abseil-cpp/absl/log/internal/nullguard.cc +35 -0
  461. package/deps/abseil-cpp/absl/log/internal/nullguard.h +88 -0
  462. package/deps/abseil-cpp/absl/log/internal/nullstream.h +128 -0
  463. package/deps/abseil-cpp/absl/log/internal/proto.cc +218 -0
  464. package/deps/abseil-cpp/absl/log/internal/proto.h +298 -0
  465. package/deps/abseil-cpp/absl/log/internal/stderr_log_sink_test.cc +105 -0
  466. package/deps/abseil-cpp/absl/log/internal/strip.h +99 -0
  467. package/deps/abseil-cpp/absl/log/internal/structured.h +160 -0
  468. package/deps/abseil-cpp/absl/log/internal/structured_proto.cc +115 -0
  469. package/deps/abseil-cpp/absl/log/internal/structured_proto.h +107 -0
  470. package/deps/abseil-cpp/absl/log/internal/structured_proto_test.cc +120 -0
  471. package/deps/abseil-cpp/absl/log/internal/test_actions.cc +75 -0
  472. package/deps/abseil-cpp/absl/log/internal/test_actions.h +90 -0
  473. package/deps/abseil-cpp/absl/log/internal/test_helpers.cc +82 -0
  474. package/deps/abseil-cpp/absl/log/internal/test_helpers.h +71 -0
  475. package/deps/abseil-cpp/absl/log/internal/test_matchers.cc +216 -0
  476. package/deps/abseil-cpp/absl/log/internal/test_matchers.h +94 -0
  477. package/deps/abseil-cpp/absl/log/internal/vlog_config.cc +347 -0
  478. package/deps/abseil-cpp/absl/log/internal/vlog_config.h +164 -0
  479. package/deps/abseil-cpp/absl/log/internal/vlog_config_benchmark.cc +187 -0
  480. package/deps/abseil-cpp/absl/log/internal/voidify.h +50 -0
  481. package/deps/abseil-cpp/absl/log/log.h +378 -0
  482. package/deps/abseil-cpp/absl/log/log_basic_test.cc +22 -0
  483. package/deps/abseil-cpp/absl/log/log_basic_test_impl.inc +654 -0
  484. package/deps/abseil-cpp/absl/log/log_benchmark.cc +164 -0
  485. package/deps/abseil-cpp/absl/log/log_entry.cc +263 -0
  486. package/deps/abseil-cpp/absl/log/log_entry.h +223 -0
  487. package/deps/abseil-cpp/absl/log/log_entry_test.cc +468 -0
  488. package/deps/abseil-cpp/absl/log/log_format_test.cc +2261 -0
  489. package/deps/abseil-cpp/absl/log/log_macro_hygiene_test.cc +187 -0
  490. package/deps/abseil-cpp/absl/log/log_modifier_methods_test.cc +244 -0
  491. package/deps/abseil-cpp/absl/log/log_sink.cc +23 -0
  492. package/deps/abseil-cpp/absl/log/log_sink.h +71 -0
  493. package/deps/abseil-cpp/absl/log/log_sink_registry.h +64 -0
  494. package/deps/abseil-cpp/absl/log/log_sink_test.cc +418 -0
  495. package/deps/abseil-cpp/absl/log/log_streamer.h +181 -0
  496. package/deps/abseil-cpp/absl/log/log_streamer_test.cc +451 -0
  497. package/deps/abseil-cpp/absl/log/scoped_mock_log.cc +86 -0
  498. package/deps/abseil-cpp/absl/log/scoped_mock_log.h +203 -0
  499. package/deps/abseil-cpp/absl/log/scoped_mock_log_test.cc +295 -0
  500. package/deps/abseil-cpp/absl/log/stripping_test.cc +502 -0
  501. package/deps/abseil-cpp/absl/log/structured.h +75 -0
  502. package/deps/abseil-cpp/absl/log/structured_test.cc +64 -0
  503. package/deps/abseil-cpp/absl/log/vlog_is_on.h +74 -0
  504. package/deps/abseil-cpp/absl/log/vlog_is_on_test.cc +233 -0
  505. package/deps/abseil-cpp/absl/memory/BUILD.bazel +62 -0
  506. package/deps/abseil-cpp/absl/memory/CMakeLists.txt +41 -0
  507. package/deps/abseil-cpp/absl/memory/memory.h +278 -0
  508. package/deps/abseil-cpp/absl/memory/memory_test.cc +222 -0
  509. package/deps/abseil-cpp/absl/meta/BUILD.bazel +112 -0
  510. package/deps/abseil-cpp/absl/meta/CMakeLists.txt +100 -0
  511. package/deps/abseil-cpp/absl/meta/internal/constexpr_testing.h +73 -0
  512. package/deps/abseil-cpp/absl/meta/internal/constexpr_testing_test.cc +40 -0
  513. package/deps/abseil-cpp/absl/meta/internal/requires.h +67 -0
  514. package/deps/abseil-cpp/absl/meta/internal/requires_test.cc +66 -0
  515. package/deps/abseil-cpp/absl/meta/type_traits.h +582 -0
  516. package/deps/abseil-cpp/absl/meta/type_traits_test.cc +378 -0
  517. package/deps/abseil-cpp/absl/numeric/BUILD.bazel +145 -0
  518. package/deps/abseil-cpp/absl/numeric/CMakeLists.txt +104 -0
  519. package/deps/abseil-cpp/absl/numeric/bits.h +262 -0
  520. package/deps/abseil-cpp/absl/numeric/bits_benchmark.cc +73 -0
  521. package/deps/abseil-cpp/absl/numeric/bits_test.cc +724 -0
  522. package/deps/abseil-cpp/absl/numeric/int128.cc +344 -0
  523. package/deps/abseil-cpp/absl/numeric/int128.h +1224 -0
  524. package/deps/abseil-cpp/absl/numeric/int128_benchmark.cc +281 -0
  525. package/deps/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +303 -0
  526. package/deps/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +347 -0
  527. package/deps/abseil-cpp/absl/numeric/int128_stream_test.cc +1400 -0
  528. package/deps/abseil-cpp/absl/numeric/int128_test.cc +1407 -0
  529. package/deps/abseil-cpp/absl/numeric/internal/bits.h +394 -0
  530. package/deps/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  531. package/deps/abseil-cpp/absl/profiling/BUILD.bazel +188 -0
  532. package/deps/abseil-cpp/absl/profiling/CMakeLists.txt +132 -0
  533. package/deps/abseil-cpp/absl/profiling/hashtable.cc +135 -0
  534. package/deps/abseil-cpp/absl/profiling/hashtable.h +40 -0
  535. package/deps/abseil-cpp/absl/profiling/internal/exponential_biased.cc +93 -0
  536. package/deps/abseil-cpp/absl/profiling/internal/exponential_biased.h +130 -0
  537. package/deps/abseil-cpp/absl/profiling/internal/exponential_biased_test.cc +203 -0
  538. package/deps/abseil-cpp/absl/profiling/internal/periodic_sampler.cc +53 -0
  539. package/deps/abseil-cpp/absl/profiling/internal/periodic_sampler.h +211 -0
  540. package/deps/abseil-cpp/absl/profiling/internal/periodic_sampler_benchmark.cc +79 -0
  541. package/deps/abseil-cpp/absl/profiling/internal/periodic_sampler_test.cc +177 -0
  542. package/deps/abseil-cpp/absl/profiling/internal/profile_builder.cc +463 -0
  543. package/deps/abseil-cpp/absl/profiling/internal/profile_builder.h +161 -0
  544. package/deps/abseil-cpp/absl/profiling/internal/sample_recorder.h +253 -0
  545. package/deps/abseil-cpp/absl/profiling/internal/sample_recorder_test.cc +188 -0
  546. package/deps/abseil-cpp/absl/random/BUILD.bazel +550 -0
  547. package/deps/abseil-cpp/absl/random/CMakeLists.txt +1250 -0
  548. package/deps/abseil-cpp/absl/random/benchmarks.cc +376 -0
  549. package/deps/abseil-cpp/absl/random/bernoulli_distribution.h +202 -0
  550. package/deps/abseil-cpp/absl/random/bernoulli_distribution_test.cc +217 -0
  551. package/deps/abseil-cpp/absl/random/beta_distribution.h +429 -0
  552. package/deps/abseil-cpp/absl/random/beta_distribution_test.cc +615 -0
  553. package/deps/abseil-cpp/absl/random/bit_gen_ref.h +187 -0
  554. package/deps/abseil-cpp/absl/random/bit_gen_ref_test.cc +107 -0
  555. package/deps/abseil-cpp/absl/random/discrete_distribution.cc +108 -0
  556. package/deps/abseil-cpp/absl/random/discrete_distribution.h +249 -0
  557. package/deps/abseil-cpp/absl/random/discrete_distribution_test.cc +251 -0
  558. package/deps/abseil-cpp/absl/random/distributions.h +450 -0
  559. package/deps/abseil-cpp/absl/random/distributions_test.cc +516 -0
  560. package/deps/abseil-cpp/absl/random/examples_test.cc +98 -0
  561. package/deps/abseil-cpp/absl/random/exponential_distribution.h +166 -0
  562. package/deps/abseil-cpp/absl/random/exponential_distribution_test.cc +426 -0
  563. package/deps/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  564. package/deps/abseil-cpp/absl/random/gaussian_distribution.h +276 -0
  565. package/deps/abseil-cpp/absl/random/gaussian_distribution_test.cc +561 -0
  566. package/deps/abseil-cpp/absl/random/generators_test.cc +185 -0
  567. package/deps/abseil-cpp/absl/random/internal/BUILD.bazel +863 -0
  568. package/deps/abseil-cpp/absl/random/internal/chi_square.cc +230 -0
  569. package/deps/abseil-cpp/absl/random/internal/chi_square.h +89 -0
  570. package/deps/abseil-cpp/absl/random/internal/chi_square_test.cc +364 -0
  571. package/deps/abseil-cpp/absl/random/internal/distribution_caller.h +96 -0
  572. package/deps/abseil-cpp/absl/random/internal/distribution_test_util.cc +418 -0
  573. package/deps/abseil-cpp/absl/random/internal/distribution_test_util.h +113 -0
  574. package/deps/abseil-cpp/absl/random/internal/distribution_test_util_test.cc +193 -0
  575. package/deps/abseil-cpp/absl/random/internal/entropy_pool.cc +185 -0
  576. package/deps/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  577. package/deps/abseil-cpp/absl/random/internal/entropy_pool_test.cc +119 -0
  578. package/deps/abseil-cpp/absl/random/internal/explicit_seed_seq.h +92 -0
  579. package/deps/abseil-cpp/absl/random/internal/explicit_seed_seq_test.cc +241 -0
  580. package/deps/abseil-cpp/absl/random/internal/fast_uniform_bits.h +271 -0
  581. package/deps/abseil-cpp/absl/random/internal/fast_uniform_bits_test.cc +336 -0
  582. package/deps/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  583. package/deps/abseil-cpp/absl/random/internal/fastmath_test.cc +95 -0
  584. package/deps/abseil-cpp/absl/random/internal/gaussian_distribution_gentables.cc +142 -0
  585. package/deps/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  586. package/deps/abseil-cpp/absl/random/internal/generate_real_test.cc +496 -0
  587. package/deps/abseil-cpp/absl/random/internal/iostream_state_saver.h +248 -0
  588. package/deps/abseil-cpp/absl/random/internal/iostream_state_saver_test.cc +373 -0
  589. package/deps/abseil-cpp/absl/random/internal/mock_helpers.h +160 -0
  590. package/deps/abseil-cpp/absl/random/internal/mock_overload_set.h +122 -0
  591. package/deps/abseil-cpp/absl/random/internal/mock_validators.h +98 -0
  592. package/deps/abseil-cpp/absl/random/internal/nanobenchmark.cc +804 -0
  593. package/deps/abseil-cpp/absl/random/internal/nanobenchmark.h +172 -0
  594. package/deps/abseil-cpp/absl/random/internal/nanobenchmark_test.cc +79 -0
  595. package/deps/abseil-cpp/absl/random/internal/nonsecure_base.h +160 -0
  596. package/deps/abseil-cpp/absl/random/internal/nonsecure_base_test.cc +267 -0
  597. package/deps/abseil-cpp/absl/random/internal/pcg_engine.h +287 -0
  598. package/deps/abseil-cpp/absl/random/internal/pcg_engine_test.cc +638 -0
  599. package/deps/abseil-cpp/absl/random/internal/platform.h +158 -0
  600. package/deps/abseil-cpp/absl/random/internal/randen.cc +91 -0
  601. package/deps/abseil-cpp/absl/random/internal/randen.h +96 -0
  602. package/deps/abseil-cpp/absl/random/internal/randen_benchmarks.cc +177 -0
  603. package/deps/abseil-cpp/absl/random/internal/randen_detect.cc +280 -0
  604. package/deps/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  605. package/deps/abseil-cpp/absl/random/internal/randen_engine.h +265 -0
  606. package/deps/abseil-cpp/absl/random/internal/randen_engine_test.cc +654 -0
  607. package/deps/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  608. package/deps/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  609. package/deps/abseil-cpp/absl/random/internal/randen_hwaes_test.cc +99 -0
  610. package/deps/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  611. package/deps/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  612. package/deps/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  613. package/deps/abseil-cpp/absl/random/internal/randen_slow_test.cc +61 -0
  614. package/deps/abseil-cpp/absl/random/internal/randen_test.cc +75 -0
  615. package/deps/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  616. package/deps/abseil-cpp/absl/random/internal/salted_seed_seq.h +165 -0
  617. package/deps/abseil-cpp/absl/random/internal/salted_seed_seq_test.cc +172 -0
  618. package/deps/abseil-cpp/absl/random/internal/seed_material.cc +249 -0
  619. package/deps/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  620. package/deps/abseil-cpp/absl/random/internal/seed_material_test.cc +205 -0
  621. package/deps/abseil-cpp/absl/random/internal/sequence_urbg.h +60 -0
  622. package/deps/abseil-cpp/absl/random/internal/traits.h +149 -0
  623. package/deps/abseil-cpp/absl/random/internal/traits_test.cc +123 -0
  624. package/deps/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  625. package/deps/abseil-cpp/absl/random/internal/uniform_helper_test.cc +279 -0
  626. package/deps/abseil-cpp/absl/random/internal/wide_multiply.h +95 -0
  627. package/deps/abseil-cpp/absl/random/internal/wide_multiply_test.cc +119 -0
  628. package/deps/abseil-cpp/absl/random/log_uniform_int_distribution.h +253 -0
  629. package/deps/abseil-cpp/absl/random/log_uniform_int_distribution_test.cc +277 -0
  630. package/deps/abseil-cpp/absl/random/mock_distributions.h +269 -0
  631. package/deps/abseil-cpp/absl/random/mock_distributions_test.cc +281 -0
  632. package/deps/abseil-cpp/absl/random/mocking_bit_gen.h +237 -0
  633. package/deps/abseil-cpp/absl/random/mocking_bit_gen_test.cc +403 -0
  634. package/deps/abseil-cpp/absl/random/poisson_distribution.h +262 -0
  635. package/deps/abseil-cpp/absl/random/poisson_distribution_test.cc +569 -0
  636. package/deps/abseil-cpp/absl/random/random.h +224 -0
  637. package/deps/abseil-cpp/absl/random/seed_gen_exception.cc +45 -0
  638. package/deps/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  639. package/deps/abseil-cpp/absl/random/seed_sequences.cc +33 -0
  640. package/deps/abseil-cpp/absl/random/seed_sequences.h +112 -0
  641. package/deps/abseil-cpp/absl/random/seed_sequences_test.cc +126 -0
  642. package/deps/abseil-cpp/absl/random/uniform_int_distribution.h +276 -0
  643. package/deps/abseil-cpp/absl/random/uniform_int_distribution_test.cc +259 -0
  644. package/deps/abseil-cpp/absl/random/uniform_real_distribution.h +204 -0
  645. package/deps/abseil-cpp/absl/random/uniform_real_distribution_test.cc +394 -0
  646. package/deps/abseil-cpp/absl/random/zipf_distribution.h +273 -0
  647. package/deps/abseil-cpp/absl/random/zipf_distribution_test.cc +423 -0
  648. package/deps/abseil-cpp/absl/status/BUILD.bazel +211 -0
  649. package/deps/abseil-cpp/absl/status/CMakeLists.txt +159 -0
  650. package/deps/abseil-cpp/absl/status/internal/status_internal.cc +251 -0
  651. package/deps/abseil-cpp/absl/status/internal/status_internal.h +133 -0
  652. package/deps/abseil-cpp/absl/status/internal/status_matchers.cc +69 -0
  653. package/deps/abseil-cpp/absl/status/internal/status_matchers.h +246 -0
  654. package/deps/abseil-cpp/absl/status/internal/statusor_internal.h +657 -0
  655. package/deps/abseil-cpp/absl/status/status.cc +421 -0
  656. package/deps/abseil-cpp/absl/status/status.h +948 -0
  657. package/deps/abseil-cpp/absl/status/status_benchmark.cc +37 -0
  658. package/deps/abseil-cpp/absl/status/status_matchers.h +166 -0
  659. package/deps/abseil-cpp/absl/status/status_matchers_test.cc +211 -0
  660. package/deps/abseil-cpp/absl/status/status_payload_printer.cc +36 -0
  661. package/deps/abseil-cpp/absl/status/status_payload_printer.h +52 -0
  662. package/deps/abseil-cpp/absl/status/status_test.cc +580 -0
  663. package/deps/abseil-cpp/absl/status/statusor.cc +106 -0
  664. package/deps/abseil-cpp/absl/status/statusor.h +743 -0
  665. package/deps/abseil-cpp/absl/status/statusor_benchmark.cc +480 -0
  666. package/deps/abseil-cpp/absl/status/statusor_test.cc +2124 -0
  667. package/deps/abseil-cpp/absl/strings/BUILD.bazel +1593 -0
  668. package/deps/abseil-cpp/absl/strings/CMakeLists.txt +1295 -0
  669. package/deps/abseil-cpp/absl/strings/ascii.cc +296 -0
  670. package/deps/abseil-cpp/absl/strings/ascii.h +289 -0
  671. package/deps/abseil-cpp/absl/strings/ascii_benchmark.cc +157 -0
  672. package/deps/abseil-cpp/absl/strings/ascii_test.cc +374 -0
  673. package/deps/abseil-cpp/absl/strings/atod_manual_test.cc +193 -0
  674. package/deps/abseil-cpp/absl/strings/char_formatting_test.cc +169 -0
  675. package/deps/abseil-cpp/absl/strings/charconv.cc +1442 -0
  676. package/deps/abseil-cpp/absl/strings/charconv.h +123 -0
  677. package/deps/abseil-cpp/absl/strings/charconv_benchmark.cc +203 -0
  678. package/deps/abseil-cpp/absl/strings/charconv_test.cc +787 -0
  679. package/deps/abseil-cpp/absl/strings/charset.h +163 -0
  680. package/deps/abseil-cpp/absl/strings/charset_benchmark.cc +57 -0
  681. package/deps/abseil-cpp/absl/strings/charset_test.cc +181 -0
  682. package/deps/abseil-cpp/absl/strings/cord.cc +1582 -0
  683. package/deps/abseil-cpp/absl/strings/cord.h +1763 -0
  684. package/deps/abseil-cpp/absl/strings/cord_analysis.cc +196 -0
  685. package/deps/abseil-cpp/absl/strings/cord_analysis.h +63 -0
  686. package/deps/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  687. package/deps/abseil-cpp/absl/strings/cord_buffer_test.cc +322 -0
  688. package/deps/abseil-cpp/absl/strings/cord_test.cc +3421 -0
  689. package/deps/abseil-cpp/absl/strings/cord_test_helpers.h +122 -0
  690. package/deps/abseil-cpp/absl/strings/cordz_test.cc +468 -0
  691. package/deps/abseil-cpp/absl/strings/cordz_test_helpers.h +152 -0
  692. package/deps/abseil-cpp/absl/strings/escaping.cc +1035 -0
  693. package/deps/abseil-cpp/absl/strings/escaping.h +185 -0
  694. package/deps/abseil-cpp/absl/strings/escaping_benchmark.cc +124 -0
  695. package/deps/abseil-cpp/absl/strings/escaping_test.cc +760 -0
  696. package/deps/abseil-cpp/absl/strings/has_absl_stringify.h +64 -0
  697. package/deps/abseil-cpp/absl/strings/has_absl_stringify_test.cc +40 -0
  698. package/deps/abseil-cpp/absl/strings/has_ostream_operator.h +42 -0
  699. package/deps/abseil-cpp/absl/strings/has_ostream_operator_test.cc +41 -0
  700. package/deps/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  701. package/deps/abseil-cpp/absl/strings/internal/append_and_overwrite_test.cc +95 -0
  702. package/deps/abseil-cpp/absl/strings/internal/charconv_bigint.cc +357 -0
  703. package/deps/abseil-cpp/absl/strings/internal/charconv_bigint.h +433 -0
  704. package/deps/abseil-cpp/absl/strings/internal/charconv_bigint_test.cc +260 -0
  705. package/deps/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
  706. package/deps/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
  707. package/deps/abseil-cpp/absl/strings/internal/charconv_parse_test.cc +357 -0
  708. package/deps/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  709. package/deps/abseil-cpp/absl/strings/internal/cord_data_edge_test.cc +130 -0
  710. package/deps/abseil-cpp/absl/strings/internal/cord_internal.cc +70 -0
  711. package/deps/abseil-cpp/absl/strings/internal/cord_internal.h +942 -0
  712. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1237 -0
  713. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree.h +944 -0
  714. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +187 -0
  715. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +267 -0
  716. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator_test.cc +346 -0
  717. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +69 -0
  718. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +212 -0
  719. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree_reader_test.cc +293 -0
  720. package/deps/abseil-cpp/absl/strings/internal/cord_rep_btree_test.cc +1568 -0
  721. package/deps/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +64 -0
  722. package/deps/abseil-cpp/absl/strings/internal/cord_rep_consume.h +47 -0
  723. package/deps/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +56 -0
  724. package/deps/abseil-cpp/absl/strings/internal/cord_rep_crc.h +103 -0
  725. package/deps/abseil-cpp/absl/strings/internal/cord_rep_crc_test.cc +130 -0
  726. package/deps/abseil-cpp/absl/strings/internal/cord_rep_flat.h +195 -0
  727. package/deps/abseil-cpp/absl/strings/internal/cord_rep_test_util.h +205 -0
  728. package/deps/abseil-cpp/absl/strings/internal/cordz_functions.cc +102 -0
  729. package/deps/abseil-cpp/absl/strings/internal/cordz_functions.h +87 -0
  730. package/deps/abseil-cpp/absl/strings/internal/cordz_functions_test.cc +147 -0
  731. package/deps/abseil-cpp/absl/strings/internal/cordz_handle.cc +165 -0
  732. package/deps/abseil-cpp/absl/strings/internal/cordz_handle.h +98 -0
  733. package/deps/abseil-cpp/absl/strings/internal/cordz_handle_test.cc +265 -0
  734. package/deps/abseil-cpp/absl/strings/internal/cordz_info.cc +424 -0
  735. package/deps/abseil-cpp/absl/strings/internal/cordz_info.h +295 -0
  736. package/deps/abseil-cpp/absl/strings/internal/cordz_info_statistics_test.cc +510 -0
  737. package/deps/abseil-cpp/absl/strings/internal/cordz_info_test.cc +342 -0
  738. package/deps/abseil-cpp/absl/strings/internal/cordz_sample_token.cc +64 -0
  739. package/deps/abseil-cpp/absl/strings/internal/cordz_sample_token.h +97 -0
  740. package/deps/abseil-cpp/absl/strings/internal/cordz_sample_token_test.cc +208 -0
  741. package/deps/abseil-cpp/absl/strings/internal/cordz_statistics.h +88 -0
  742. package/deps/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  743. package/deps/abseil-cpp/absl/strings/internal/cordz_update_scope_test.cc +49 -0
  744. package/deps/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +123 -0
  745. package/deps/abseil-cpp/absl/strings/internal/cordz_update_tracker_test.cc +147 -0
  746. package/deps/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +99 -0
  747. package/deps/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +35 -0
  748. package/deps/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_benchmark.cc +56 -0
  749. package/deps/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance_test.cc +99 -0
  750. package/deps/abseil-cpp/absl/strings/internal/escaping.cc +209 -0
  751. package/deps/abseil-cpp/absl/strings/internal/escaping.h +59 -0
  752. package/deps/abseil-cpp/absl/strings/internal/escaping_test_common.h +133 -0
  753. package/deps/abseil-cpp/absl/strings/internal/generic_printer.cc +107 -0
  754. package/deps/abseil-cpp/absl/strings/internal/generic_printer.h +115 -0
  755. package/deps/abseil-cpp/absl/strings/internal/generic_printer_internal.h +423 -0
  756. package/deps/abseil-cpp/absl/strings/internal/generic_printer_test.cc +685 -0
  757. package/deps/abseil-cpp/absl/strings/internal/memutil.cc +48 -0
  758. package/deps/abseil-cpp/absl/strings/internal/memutil.h +40 -0
  759. package/deps/abseil-cpp/absl/strings/internal/memutil_benchmark.cc +127 -0
  760. package/deps/abseil-cpp/absl/strings/internal/memutil_test.cc +41 -0
  761. package/deps/abseil-cpp/absl/strings/internal/numbers_test_common.h +184 -0
  762. package/deps/abseil-cpp/absl/strings/internal/ostringstream.cc +43 -0
  763. package/deps/abseil-cpp/absl/strings/internal/ostringstream.h +114 -0
  764. package/deps/abseil-cpp/absl/strings/internal/ostringstream_benchmark.cc +105 -0
  765. package/deps/abseil-cpp/absl/strings/internal/ostringstream_test.cc +131 -0
  766. package/deps/abseil-cpp/absl/strings/internal/pow10_helper.cc +122 -0
  767. package/deps/abseil-cpp/absl/strings/internal/pow10_helper.h +40 -0
  768. package/deps/abseil-cpp/absl/strings/internal/pow10_helper_test.cc +122 -0
  769. package/deps/abseil-cpp/absl/strings/internal/resize_uninitialized.h +119 -0
  770. package/deps/abseil-cpp/absl/strings/internal/resize_uninitialized_test.cc +108 -0
  771. package/deps/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
  772. package/deps/abseil-cpp/absl/strings/internal/str_format/arg.cc +615 -0
  773. package/deps/abseil-cpp/absl/strings/internal/str_format/arg.h +661 -0
  774. package/deps/abseil-cpp/absl/strings/internal/str_format/arg_test.cc +162 -0
  775. package/deps/abseil-cpp/absl/strings/internal/str_format/bind.cc +275 -0
  776. package/deps/abseil-cpp/absl/strings/internal/str_format/bind.h +237 -0
  777. package/deps/abseil-cpp/absl/strings/internal/str_format/bind_test.cc +157 -0
  778. package/deps/abseil-cpp/absl/strings/internal/str_format/checker.h +98 -0
  779. package/deps/abseil-cpp/absl/strings/internal/str_format/checker_test.cc +176 -0
  780. package/deps/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +357 -0
  781. package/deps/abseil-cpp/absl/strings/internal/str_format/convert_test.cc +1471 -0
  782. package/deps/abseil-cpp/absl/strings/internal/str_format/extension.cc +53 -0
  783. package/deps/abseil-cpp/absl/strings/internal/str_format/extension.h +456 -0
  784. package/deps/abseil-cpp/absl/strings/internal/str_format/extension_test.cc +110 -0
  785. package/deps/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +1945 -0
  786. package/deps/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +37 -0
  787. package/deps/abseil-cpp/absl/strings/internal/str_format/output.cc +74 -0
  788. package/deps/abseil-cpp/absl/strings/internal/str_format/output.h +97 -0
  789. package/deps/abseil-cpp/absl/strings/internal/str_format/output_test.cc +79 -0
  790. package/deps/abseil-cpp/absl/strings/internal/str_format/parser.cc +140 -0
  791. package/deps/abseil-cpp/absl/strings/internal/str_format/parser.h +271 -0
  792. package/deps/abseil-cpp/absl/strings/internal/str_format/parser_test.cc +446 -0
  793. package/deps/abseil-cpp/absl/strings/internal/str_join_internal.h +341 -0
  794. package/deps/abseil-cpp/absl/strings/internal/str_split_internal.h +525 -0
  795. package/deps/abseil-cpp/absl/strings/internal/string_constant.h +67 -0
  796. package/deps/abseil-cpp/absl/strings/internal/string_constant_test.cc +60 -0
  797. package/deps/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
  798. package/deps/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
  799. package/deps/abseil-cpp/absl/strings/internal/utf8.cc +148 -0
  800. package/deps/abseil-cpp/absl/strings/internal/utf8.h +64 -0
  801. package/deps/abseil-cpp/absl/strings/internal/utf8_test.cc +259 -0
  802. package/deps/abseil-cpp/absl/strings/match.cc +133 -0
  803. package/deps/abseil-cpp/absl/strings/match.h +129 -0
  804. package/deps/abseil-cpp/absl/strings/match_test.cc +291 -0
  805. package/deps/abseil-cpp/absl/strings/numbers.cc +1230 -0
  806. package/deps/abseil-cpp/absl/strings/numbers.h +359 -0
  807. package/deps/abseil-cpp/absl/strings/numbers_benchmark.cc +288 -0
  808. package/deps/abseil-cpp/absl/strings/numbers_test.cc +2324 -0
  809. package/deps/abseil-cpp/absl/strings/resize_and_overwrite.h +194 -0
  810. package/deps/abseil-cpp/absl/strings/resize_and_overwrite_test.cc +154 -0
  811. package/deps/abseil-cpp/absl/strings/str_cat.cc +247 -0
  812. package/deps/abseil-cpp/absl/strings/str_cat.h +633 -0
  813. package/deps/abseil-cpp/absl/strings/str_cat_benchmark.cc +288 -0
  814. package/deps/abseil-cpp/absl/strings/str_cat_test.cc +692 -0
  815. package/deps/abseil-cpp/absl/strings/str_format.h +887 -0
  816. package/deps/abseil-cpp/absl/strings/str_format_test.cc +1230 -0
  817. package/deps/abseil-cpp/absl/strings/str_join.h +301 -0
  818. package/deps/abseil-cpp/absl/strings/str_join_benchmark.cc +106 -0
  819. package/deps/abseil-cpp/absl/strings/str_join_test.cc +645 -0
  820. package/deps/abseil-cpp/absl/strings/str_replace.cc +91 -0
  821. package/deps/abseil-cpp/absl/strings/str_replace.h +222 -0
  822. package/deps/abseil-cpp/absl/strings/str_replace_benchmark.cc +121 -0
  823. package/deps/abseil-cpp/absl/strings/str_replace_test.cc +345 -0
  824. package/deps/abseil-cpp/absl/strings/str_split.cc +144 -0
  825. package/deps/abseil-cpp/absl/strings/str_split.h +582 -0
  826. package/deps/abseil-cpp/absl/strings/str_split_benchmark.cc +180 -0
  827. package/deps/abseil-cpp/absl/strings/str_split_test.cc +1069 -0
  828. package/deps/abseil-cpp/absl/strings/string_view.h +60 -0
  829. package/deps/abseil-cpp/absl/strings/string_view_test.cc +86 -0
  830. package/deps/abseil-cpp/absl/strings/strip.h +99 -0
  831. package/deps/abseil-cpp/absl/strings/strip_test.cc +198 -0
  832. package/deps/abseil-cpp/absl/strings/substitute.cc +187 -0
  833. package/deps/abseil-cpp/absl/strings/substitute.h +769 -0
  834. package/deps/abseil-cpp/absl/strings/substitute_benchmark.cc +158 -0
  835. package/deps/abseil-cpp/absl/strings/substitute_test.cc +288 -0
  836. package/deps/abseil-cpp/absl/synchronization/BUILD.bazel +410 -0
  837. package/deps/abseil-cpp/absl/synchronization/CMakeLists.txt +293 -0
  838. package/deps/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  839. package/deps/abseil-cpp/absl/synchronization/barrier.h +79 -0
  840. package/deps/abseil-cpp/absl/synchronization/barrier_test.cc +75 -0
  841. package/deps/abseil-cpp/absl/synchronization/blocking_counter.cc +73 -0
  842. package/deps/abseil-cpp/absl/synchronization/blocking_counter.h +107 -0
  843. package/deps/abseil-cpp/absl/synchronization/blocking_counter_benchmark.cc +84 -0
  844. package/deps/abseil-cpp/absl/synchronization/blocking_counter_test.cc +146 -0
  845. package/deps/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +152 -0
  846. package/deps/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +56 -0
  847. package/deps/abseil-cpp/absl/synchronization/internal/futex.h +177 -0
  848. package/deps/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +107 -0
  849. package/deps/abseil-cpp/absl/synchronization/internal/futex_waiter.h +63 -0
  850. package/deps/abseil-cpp/absl/synchronization/internal/graphcycles.cc +714 -0
  851. package/deps/abseil-cpp/absl/synchronization/internal/graphcycles.h +146 -0
  852. package/deps/abseil-cpp/absl/synchronization/internal/graphcycles_benchmark.cc +43 -0
  853. package/deps/abseil-cpp/absl/synchronization/internal/graphcycles_test.cc +483 -0
  854. package/deps/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +220 -0
  855. package/deps/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +178 -0
  856. package/deps/abseil-cpp/absl/synchronization/internal/kernel_timeout_test.cc +406 -0
  857. package/deps/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  858. package/deps/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +119 -0
  859. package/deps/abseil-cpp/absl/synchronization/internal/per_thread_sem_test.cc +194 -0
  860. package/deps/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +163 -0
  861. package/deps/abseil-cpp/absl/synchronization/internal/pthread_waiter.h +60 -0
  862. package/deps/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +118 -0
  863. package/deps/abseil-cpp/absl/synchronization/internal/sem_waiter.h +65 -0
  864. package/deps/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +87 -0
  865. package/deps/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.h +56 -0
  866. package/deps/abseil-cpp/absl/synchronization/internal/thread_pool.h +96 -0
  867. package/deps/abseil-cpp/absl/synchronization/internal/waiter.h +69 -0
  868. package/deps/abseil-cpp/absl/synchronization/internal/waiter_base.cc +38 -0
  869. package/deps/abseil-cpp/absl/synchronization/internal/waiter_base.h +90 -0
  870. package/deps/abseil-cpp/absl/synchronization/internal/waiter_test.cc +192 -0
  871. package/deps/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +147 -0
  872. package/deps/abseil-cpp/absl/synchronization/internal/win32_waiter.h +72 -0
  873. package/deps/abseil-cpp/absl/synchronization/lifetime_test.cc +180 -0
  874. package/deps/abseil-cpp/absl/synchronization/mutex.cc +2820 -0
  875. package/deps/abseil-cpp/absl/synchronization/mutex.h +1352 -0
  876. package/deps/abseil-cpp/absl/synchronization/mutex_benchmark.cc +321 -0
  877. package/deps/abseil-cpp/absl/synchronization/mutex_method_pointer_test.cc +138 -0
  878. package/deps/abseil-cpp/absl/synchronization/mutex_test.cc +2065 -0
  879. package/deps/abseil-cpp/absl/synchronization/notification.cc +85 -0
  880. package/deps/abseil-cpp/absl/synchronization/notification.h +133 -0
  881. package/deps/abseil-cpp/absl/synchronization/notification_test.cc +230 -0
  882. package/deps/abseil-cpp/absl/time/BUILD.bazel +244 -0
  883. package/deps/abseil-cpp/absl/time/CMakeLists.txt +218 -0
  884. package/deps/abseil-cpp/absl/time/civil_time.cc +200 -0
  885. package/deps/abseil-cpp/absl/time/civil_time.h +589 -0
  886. package/deps/abseil-cpp/absl/time/civil_time_benchmark.cc +129 -0
  887. package/deps/abseil-cpp/absl/time/civil_time_test.cc +1351 -0
  888. package/deps/abseil-cpp/absl/time/clock.cc +603 -0
  889. package/deps/abseil-cpp/absl/time/clock.h +78 -0
  890. package/deps/abseil-cpp/absl/time/clock_benchmark.cc +74 -0
  891. package/deps/abseil-cpp/absl/time/clock_interface.cc +71 -0
  892. package/deps/abseil-cpp/absl/time/clock_interface.h +91 -0
  893. package/deps/abseil-cpp/absl/time/clock_interface_test.cc +128 -0
  894. package/deps/abseil-cpp/absl/time/clock_test.cc +122 -0
  895. package/deps/abseil-cpp/absl/time/duration.cc +918 -0
  896. package/deps/abseil-cpp/absl/time/duration_benchmark.cc +608 -0
  897. package/deps/abseil-cpp/absl/time/duration_test.cc +1901 -0
  898. package/deps/abseil-cpp/absl/time/flag_test.cc +147 -0
  899. package/deps/abseil-cpp/absl/time/format.cc +162 -0
  900. package/deps/abseil-cpp/absl/time/format_benchmark.cc +64 -0
  901. package/deps/abseil-cpp/absl/time/format_test.cc +441 -0
  902. package/deps/abseil-cpp/absl/time/internal/cctz/BUILD.bazel +195 -0
  903. package/deps/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  904. package/deps/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +644 -0
  905. package/deps/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +460 -0
  906. package/deps/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  907. package/deps/abseil-cpp/absl/time/internal/cctz/src/cctz_benchmark.cc +436 -0
  908. package/deps/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  909. package/deps/abseil-cpp/absl/time/internal/cctz/src/civil_time_test.cc +1066 -0
  910. package/deps/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.cc +515 -0
  911. package/deps/abseil-cpp/absl/time/internal/cctz/src/test_time_zone_names.h +33 -0
  912. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  913. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  914. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1068 -0
  915. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_format_test.cc +1773 -0
  916. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +47 -0
  917. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +80 -0
  918. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +115 -0
  919. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +97 -0
  920. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +1070 -0
  921. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +128 -0
  922. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +333 -0
  923. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +60 -0
  924. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +217 -0
  925. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup_test.cc +918 -0
  926. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +186 -0
  927. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  928. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  929. package/deps/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  930. package/deps/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +120 -0
  931. package/deps/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +116 -0
  932. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/README.zoneinfo +38 -0
  933. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/version +1 -0
  934. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Abidjan +0 -0
  935. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Accra +0 -0
  936. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Addis_Ababa +0 -0
  937. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Algiers +0 -0
  938. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmara +0 -0
  939. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Asmera +0 -0
  940. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bamako +0 -0
  941. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bangui +0 -0
  942. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Banjul +0 -0
  943. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bissau +0 -0
  944. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Blantyre +0 -0
  945. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Brazzaville +0 -0
  946. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Bujumbura +0 -0
  947. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Cairo +0 -0
  948. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Casablanca +0 -0
  949. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ceuta +0 -0
  950. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Conakry +0 -0
  951. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dakar +0 -0
  952. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Dar_es_Salaam +0 -0
  953. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Djibouti +0 -0
  954. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Douala +0 -0
  955. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/El_Aaiun +0 -0
  956. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Freetown +0 -0
  957. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Gaborone +0 -0
  958. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Harare +0 -0
  959. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Johannesburg +0 -0
  960. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Juba +0 -0
  961. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kampala +0 -0
  962. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Khartoum +0 -0
  963. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kigali +0 -0
  964. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Kinshasa +0 -0
  965. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lagos +0 -0
  966. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Libreville +0 -0
  967. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lome +0 -0
  968. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Luanda +0 -0
  969. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lubumbashi +0 -0
  970. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Lusaka +0 -0
  971. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Malabo +0 -0
  972. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maputo +0 -0
  973. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Maseru +0 -0
  974. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Mbabane +0 -0
  975. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Mogadishu +0 -0
  976. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Monrovia +0 -0
  977. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nairobi +0 -0
  978. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ndjamena +0 -0
  979. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Niamey +0 -0
  980. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Nouakchott +0 -0
  981. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Ouagadougou +0 -0
  982. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Porto-Novo +0 -0
  983. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Sao_Tome +0 -0
  984. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Timbuktu +0 -0
  985. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tripoli +0 -0
  986. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Tunis +0 -0
  987. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Africa/Windhoek +0 -0
  988. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Adak +0 -0
  989. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Anchorage +0 -0
  990. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Anguilla +0 -0
  991. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Antigua +0 -0
  992. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Araguaina +0 -0
  993. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Buenos_Aires +0 -0
  994. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Catamarca +0 -0
  995. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/ComodRivadavia +0 -0
  996. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Cordoba +0 -0
  997. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Jujuy +0 -0
  998. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/La_Rioja +0 -0
  999. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Mendoza +0 -0
  1000. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Rio_Gallegos +0 -0
  1001. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Salta +0 -0
  1002. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Juan +0 -0
  1003. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/San_Luis +0 -0
  1004. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Tucuman +0 -0
  1005. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Argentina/Ushuaia +0 -0
  1006. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Aruba +0 -0
  1007. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Asuncion +0 -0
  1008. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Atikokan +0 -0
  1009. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Atka +0 -0
  1010. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia +0 -0
  1011. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas +0 -0
  1012. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Barbados +0 -0
  1013. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Belem +0 -0
  1014. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Belize +0 -0
  1015. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Blanc-Sablon +0 -0
  1016. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Boa_Vista +0 -0
  1017. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bogota +0 -0
  1018. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Boise +0 -0
  1019. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Buenos_Aires +0 -0
  1020. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cambridge_Bay +0 -0
  1021. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Campo_Grande +0 -0
  1022. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cancun +0 -0
  1023. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Caracas +0 -0
  1024. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Catamarca +0 -0
  1025. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cayenne +0 -0
  1026. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cayman +0 -0
  1027. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chicago +0 -0
  1028. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua +0 -0
  1029. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ciudad_Juarez +0 -0
  1030. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coral_Harbour +0 -0
  1031. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cordoba +0 -0
  1032. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Costa_Rica +0 -0
  1033. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Coyhaique +0 -0
  1034. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Creston +0 -0
  1035. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Cuiaba +0 -0
  1036. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Curacao +0 -0
  1037. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Danmarkshavn +0 -0
  1038. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson +0 -0
  1039. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dawson_Creek +0 -0
  1040. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Denver +0 -0
  1041. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Detroit +0 -0
  1042. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Dominica +0 -0
  1043. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Edmonton +0 -0
  1044. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Eirunepe +0 -0
  1045. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/El_Salvador +0 -0
  1046. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada +0 -0
  1047. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Nelson +0 -0
  1048. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fort_Wayne +0 -0
  1049. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Fortaleza +0 -0
  1050. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Glace_Bay +0 -0
  1051. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Godthab +0 -0
  1052. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Goose_Bay +0 -0
  1053. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Grand_Turk +0 -0
  1054. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Grenada +0 -0
  1055. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guadeloupe +0 -0
  1056. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guatemala +0 -0
  1057. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guayaquil +0 -0
  1058. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Guyana +0 -0
  1059. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Halifax +0 -0
  1060. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Havana +0 -0
  1061. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo +0 -0
  1062. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Indianapolis +0 -0
  1063. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Knox +0 -0
  1064. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Marengo +0 -0
  1065. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Petersburg +0 -0
  1066. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Tell_City +0 -0
  1067. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vevay +0 -0
  1068. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Vincennes +0 -0
  1069. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indiana/Winamac +0 -0
  1070. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Indianapolis +0 -0
  1071. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Inuvik +0 -0
  1072. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Iqaluit +0 -0
  1073. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Jamaica +0 -0
  1074. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Jujuy +0 -0
  1075. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Juneau +0 -0
  1076. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Louisville +0 -0
  1077. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Kentucky/Monticello +0 -0
  1078. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Knox_IN +0 -0
  1079. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Kralendijk +0 -0
  1080. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/La_Paz +0 -0
  1081. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Lima +0 -0
  1082. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Los_Angeles +0 -0
  1083. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Louisville +0 -0
  1084. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Lower_Princes +0 -0
  1085. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Maceio +0 -0
  1086. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Managua +0 -0
  1087. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Manaus +0 -0
  1088. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Marigot +0 -0
  1089. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Martinique +0 -0
  1090. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros +0 -0
  1091. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan +0 -0
  1092. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mendoza +0 -0
  1093. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Menominee +0 -0
  1094. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Merida +0 -0
  1095. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Metlakatla +0 -0
  1096. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City +0 -0
  1097. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Miquelon +0 -0
  1098. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Moncton +0 -0
  1099. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Monterrey +0 -0
  1100. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Montevideo +0 -0
  1101. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Montreal +0 -0
  1102. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Montserrat +0 -0
  1103. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nassau +0 -0
  1104. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/New_York +0 -0
  1105. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nipigon +0 -0
  1106. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nome +0 -0
  1107. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Noronha +0 -0
  1108. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Beulah +0 -0
  1109. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/Center +0 -0
  1110. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/North_Dakota/New_Salem +0 -0
  1111. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Nuuk +0 -0
  1112. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga +0 -0
  1113. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Panama +0 -0
  1114. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Pangnirtung +0 -0
  1115. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Paramaribo +0 -0
  1116. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Phoenix +0 -0
  1117. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Port-au-Prince +0 -0
  1118. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Port_of_Spain +0 -0
  1119. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Acre +0 -0
  1120. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Porto_Velho +0 -0
  1121. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Puerto_Rico +0 -0
  1122. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Punta_Arenas +0 -0
  1123. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rainy_River +0 -0
  1124. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rankin_Inlet +0 -0
  1125. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Recife +0 -0
  1126. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Regina +0 -0
  1127. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Resolute +0 -0
  1128. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rio_Branco +0 -0
  1129. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Rosario +0 -0
  1130. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel +0 -0
  1131. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santarem +0 -0
  1132. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santiago +0 -0
  1133. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santo_Domingo +0 -0
  1134. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Sao_Paulo +0 -0
  1135. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Scoresbysund +0 -0
  1136. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Shiprock +0 -0
  1137. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Sitka +0 -0
  1138. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Barthelemy +0 -0
  1139. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Johns +0 -0
  1140. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Kitts +0 -0
  1141. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Lucia +0 -0
  1142. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Thomas +0 -0
  1143. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/St_Vincent +0 -0
  1144. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Swift_Current +0 -0
  1145. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tegucigalpa +0 -0
  1146. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Thule +0 -0
  1147. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Thunder_Bay +0 -0
  1148. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana +0 -0
  1149. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Toronto +0 -0
  1150. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tortola +0 -0
  1151. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Vancouver +0 -0
  1152. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Virgin +0 -0
  1153. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Whitehorse +0 -0
  1154. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Winnipeg +0 -0
  1155. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Yakutat +0 -0
  1156. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Yellowknife +0 -0
  1157. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Casey +0 -0
  1158. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Davis +0 -0
  1159. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/DumontDUrville +0 -0
  1160. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Macquarie +0 -0
  1161. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Mawson +0 -0
  1162. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/McMurdo +0 -0
  1163. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Palmer +0 -0
  1164. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Rothera +0 -0
  1165. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/South_Pole +0 -0
  1166. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Syowa +0 -0
  1167. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Troll +0 -0
  1168. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Antarctica/Vostok +0 -0
  1169. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Arctic/Longyearbyen +0 -0
  1170. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aden +0 -0
  1171. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Almaty +0 -0
  1172. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman +0 -0
  1173. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Anadyr +0 -0
  1174. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtau +0 -0
  1175. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Aqtobe +0 -0
  1176. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashgabat +0 -0
  1177. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ashkhabad +0 -0
  1178. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Atyrau +0 -0
  1179. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Baghdad +0 -0
  1180. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bahrain +0 -0
  1181. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Baku +0 -0
  1182. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bangkok +0 -0
  1183. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Barnaul +0 -0
  1184. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Beirut +0 -0
  1185. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Bishkek +0 -0
  1186. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Brunei +0 -0
  1187. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Calcutta +0 -0
  1188. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chita +0 -0
  1189. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Choibalsan +0 -0
  1190. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chongqing +0 -0
  1191. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Chungking +0 -0
  1192. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Colombo +0 -0
  1193. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dacca +0 -0
  1194. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus +0 -0
  1195. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dhaka +0 -0
  1196. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dili +0 -0
  1197. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dubai +0 -0
  1198. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Dushanbe +0 -0
  1199. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Famagusta +0 -0
  1200. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Gaza +0 -0
  1201. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Harbin +0 -0
  1202. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hebron +0 -0
  1203. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ho_Chi_Minh +0 -0
  1204. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hong_Kong +0 -0
  1205. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Hovd +0 -0
  1206. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Irkutsk +0 -0
  1207. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Istanbul +0 -0
  1208. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jakarta +0 -0
  1209. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jayapura +0 -0
  1210. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Jerusalem +0 -0
  1211. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kabul +0 -0
  1212. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kamchatka +0 -0
  1213. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Karachi +0 -0
  1214. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kashgar +0 -0
  1215. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kathmandu +0 -0
  1216. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Katmandu +0 -0
  1217. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Khandyga +0 -0
  1218. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kolkata +0 -0
  1219. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Krasnoyarsk +0 -0
  1220. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuala_Lumpur +0 -0
  1221. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuching +0 -0
  1222. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Kuwait +0 -0
  1223. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macao +0 -0
  1224. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Macau +0 -0
  1225. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Magadan +0 -0
  1226. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Makassar +0 -0
  1227. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Manila +0 -0
  1228. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Muscat +0 -0
  1229. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Nicosia +0 -0
  1230. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novokuznetsk +0 -0
  1231. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Novosibirsk +0 -0
  1232. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Omsk +0 -0
  1233. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Oral +0 -0
  1234. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Phnom_Penh +0 -0
  1235. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pontianak +0 -0
  1236. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Pyongyang +0 -0
  1237. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qatar +0 -0
  1238. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qostanay +0 -0
  1239. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Qyzylorda +0 -0
  1240. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Rangoon +0 -0
  1241. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Riyadh +0 -0
  1242. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Saigon +0 -0
  1243. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Sakhalin +0 -0
  1244. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Samarkand +0 -0
  1245. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Seoul +0 -0
  1246. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Shanghai +0 -0
  1247. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Singapore +0 -0
  1248. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Srednekolymsk +0 -0
  1249. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Taipei +0 -0
  1250. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tashkent +0 -0
  1251. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tbilisi +0 -0
  1252. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tehran +0 -0
  1253. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tel_Aviv +0 -0
  1254. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimbu +0 -0
  1255. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Thimphu +0 -0
  1256. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tokyo +0 -0
  1257. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Tomsk +0 -0
  1258. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ujung_Pandang +0 -0
  1259. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulaanbaatar +0 -0
  1260. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ulan_Bator +0 -0
  1261. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Urumqi +0 -0
  1262. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Ust-Nera +0 -0
  1263. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vientiane +0 -0
  1264. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Vladivostok +0 -0
  1265. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yakutsk +0 -0
  1266. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yangon +0 -0
  1267. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yekaterinburg +0 -0
  1268. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Yerevan +0 -0
  1269. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Azores +0 -0
  1270. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Bermuda +0 -0
  1271. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Canary +0 -0
  1272. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Cape_Verde +0 -0
  1273. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faeroe +0 -0
  1274. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Faroe +0 -0
  1275. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Jan_Mayen +0 -0
  1276. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Madeira +0 -0
  1277. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Reykjavik +0 -0
  1278. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/South_Georgia +0 -0
  1279. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/St_Helena +0 -0
  1280. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Atlantic/Stanley +0 -0
  1281. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/ACT +0 -0
  1282. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Adelaide +0 -0
  1283. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Brisbane +0 -0
  1284. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Broken_Hill +0 -0
  1285. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Canberra +0 -0
  1286. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Currie +0 -0
  1287. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Darwin +0 -0
  1288. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Eucla +0 -0
  1289. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Hobart +0 -0
  1290. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/LHI +0 -0
  1291. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lindeman +0 -0
  1292. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Lord_Howe +0 -0
  1293. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Melbourne +0 -0
  1294. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/NSW +0 -0
  1295. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/North +0 -0
  1296. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Perth +0 -0
  1297. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Queensland +0 -0
  1298. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/South +0 -0
  1299. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Sydney +0 -0
  1300. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Tasmania +0 -0
  1301. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Victoria +0 -0
  1302. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/West +0 -0
  1303. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Australia/Yancowinna +0 -0
  1304. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/Acre +0 -0
  1305. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/DeNoronha +0 -0
  1306. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/East +0 -0
  1307. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Brazil/West +0 -0
  1308. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/CET +0 -0
  1309. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/CST6CDT +0 -0
  1310. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Atlantic +0 -0
  1311. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Central +0 -0
  1312. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Eastern +0 -0
  1313. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Mountain +0 -0
  1314. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Newfoundland +0 -0
  1315. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Pacific +0 -0
  1316. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Saskatchewan +0 -0
  1317. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Canada/Yukon +0 -0
  1318. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Chile/Continental +0 -0
  1319. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Chile/EasterIsland +0 -0
  1320. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Cuba +0 -0
  1321. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/EET +0 -0
  1322. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/EST +0 -0
  1323. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/EST5EDT +0 -0
  1324. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Egypt +0 -0
  1325. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Eire +0 -0
  1326. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT +0 -0
  1327. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+0 +0 -0
  1328. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+1 +0 -0
  1329. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+10 +0 -0
  1330. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+11 +0 -0
  1331. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+12 +0 -0
  1332. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+2 +0 -0
  1333. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+3 +0 -0
  1334. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+4 +0 -0
  1335. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+5 +0 -0
  1336. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+6 +0 -0
  1337. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+7 +0 -0
  1338. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+8 +0 -0
  1339. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT+9 +0 -0
  1340. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-0 +0 -0
  1341. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-1 +0 -0
  1342. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-10 +0 -0
  1343. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-11 +0 -0
  1344. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-12 +0 -0
  1345. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-13 +0 -0
  1346. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-14 +0 -0
  1347. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-2 +0 -0
  1348. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-3 +0 -0
  1349. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-4 +0 -0
  1350. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-5 +0 -0
  1351. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-6 +0 -0
  1352. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-7 +0 -0
  1353. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-8 +0 -0
  1354. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT-9 +0 -0
  1355. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/GMT0 +0 -0
  1356. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Greenwich +0 -0
  1357. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/UCT +0 -0
  1358. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/UTC +0 -0
  1359. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Universal +0 -0
  1360. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Etc/Zulu +0 -0
  1361. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Amsterdam +0 -0
  1362. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Andorra +0 -0
  1363. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Astrakhan +0 -0
  1364. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Athens +0 -0
  1365. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belfast +0 -0
  1366. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Belgrade +0 -0
  1367. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Berlin +0 -0
  1368. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bratislava +0 -0
  1369. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Brussels +0 -0
  1370. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Bucharest +0 -0
  1371. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Budapest +0 -0
  1372. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Busingen +0 -0
  1373. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Chisinau +0 -0
  1374. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Copenhagen +0 -0
  1375. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Dublin +0 -0
  1376. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Gibraltar +0 -0
  1377. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Guernsey +0 -0
  1378. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Helsinki +0 -0
  1379. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Isle_of_Man +0 -0
  1380. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Istanbul +0 -0
  1381. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Jersey +0 -0
  1382. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kaliningrad +0 -0
  1383. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kiev +0 -0
  1384. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kirov +0 -0
  1385. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Kyiv +0 -0
  1386. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Lisbon +0 -0
  1387. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ljubljana +0 -0
  1388. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/London +0 -0
  1389. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Luxembourg +0 -0
  1390. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Madrid +0 -0
  1391. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Malta +0 -0
  1392. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Mariehamn +0 -0
  1393. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Minsk +0 -0
  1394. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Monaco +0 -0
  1395. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Moscow +0 -0
  1396. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Nicosia +0 -0
  1397. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Oslo +0 -0
  1398. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Paris +0 -0
  1399. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Podgorica +0 -0
  1400. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Prague +0 -0
  1401. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Riga +0 -0
  1402. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Rome +0 -0
  1403. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Samara +0 -0
  1404. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/San_Marino +0 -0
  1405. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Sarajevo +0 -0
  1406. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Saratov +0 -0
  1407. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Simferopol +0 -0
  1408. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Skopje +0 -0
  1409. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Sofia +0 -0
  1410. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Stockholm +0 -0
  1411. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tallinn +0 -0
  1412. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tirane +0 -0
  1413. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Tiraspol +0 -0
  1414. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Ulyanovsk +0 -0
  1415. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Uzhgorod +0 -0
  1416. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vaduz +0 -0
  1417. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vatican +0 -0
  1418. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vienna +0 -0
  1419. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Vilnius +0 -0
  1420. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Volgograd +0 -0
  1421. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Warsaw +0 -0
  1422. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zagreb +0 -0
  1423. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zaporozhye +0 -0
  1424. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Europe/Zurich +0 -0
  1425. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Factory +0 -0
  1426. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/GB +0 -0
  1427. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/GB-Eire +0 -0
  1428. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT +0 -0
  1429. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT+0 +0 -0
  1430. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT-0 +0 -0
  1431. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/GMT0 +0 -0
  1432. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Greenwich +0 -0
  1433. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/HST +0 -0
  1434. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Hongkong +0 -0
  1435. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iceland +0 -0
  1436. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Antananarivo +0 -0
  1437. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Chagos +0 -0
  1438. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Christmas +0 -0
  1439. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Cocos +0 -0
  1440. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Comoro +0 -0
  1441. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Kerguelen +0 -0
  1442. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mahe +0 -0
  1443. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Maldives +0 -0
  1444. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mauritius +0 -0
  1445. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Mayotte +0 -0
  1446. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Indian/Reunion +0 -0
  1447. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Iran +0 -0
  1448. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Israel +0 -0
  1449. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Jamaica +0 -0
  1450. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Japan +0 -0
  1451. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Kwajalein +0 -0
  1452. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Libya +0 -0
  1453. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/MET +0 -0
  1454. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/MST +0 -0
  1455. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/MST7MDT +0 -0
  1456. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte +0 -0
  1457. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur +0 -0
  1458. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General +0 -0
  1459. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/NZ +0 -0
  1460. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/NZ-CHAT +0 -0
  1461. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Navajo +0 -0
  1462. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/PRC +0 -0
  1463. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/PST8PDT +0 -0
  1464. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Apia +0 -0
  1465. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Auckland +0 -0
  1466. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Bougainville +0 -0
  1467. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chatham +0 -0
  1468. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Chuuk +0 -0
  1469. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Easter +0 -0
  1470. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Efate +0 -0
  1471. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Enderbury +0 -0
  1472. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fakaofo +0 -0
  1473. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Fiji +0 -0
  1474. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Funafuti +0 -0
  1475. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Galapagos +0 -0
  1476. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Gambier +0 -0
  1477. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guadalcanal +0 -0
  1478. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Guam +0 -0
  1479. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Honolulu +0 -0
  1480. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Johnston +0 -0
  1481. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kanton +0 -0
  1482. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kiritimati +0 -0
  1483. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kosrae +0 -0
  1484. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Kwajalein +0 -0
  1485. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Majuro +0 -0
  1486. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Marquesas +0 -0
  1487. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Midway +0 -0
  1488. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Nauru +0 -0
  1489. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Niue +0 -0
  1490. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Norfolk +0 -0
  1491. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Noumea +0 -0
  1492. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pago_Pago +0 -0
  1493. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Palau +0 -0
  1494. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pitcairn +0 -0
  1495. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Pohnpei +0 -0
  1496. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Ponape +0 -0
  1497. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Port_Moresby +0 -0
  1498. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Rarotonga +0 -0
  1499. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Saipan +0 -0
  1500. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Samoa +0 -0
  1501. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tahiti +0 -0
  1502. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tarawa +0 -0
  1503. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Tongatapu +0 -0
  1504. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Truk +0 -0
  1505. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wake +0 -0
  1506. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Wallis +0 -0
  1507. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Pacific/Yap +0 -0
  1508. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Poland +0 -0
  1509. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Portugal +0 -0
  1510. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/ROC +0 -0
  1511. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/ROK +0 -0
  1512. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Singapore +0 -0
  1513. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Turkey +0 -0
  1514. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/UCT +0 -0
  1515. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Alaska +0 -0
  1516. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Aleutian +0 -0
  1517. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Arizona +0 -0
  1518. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Central +0 -0
  1519. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/East-Indiana +0 -0
  1520. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Eastern +0 -0
  1521. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Hawaii +0 -0
  1522. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Indiana-Starke +0 -0
  1523. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Michigan +0 -0
  1524. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Mountain +0 -0
  1525. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Pacific +0 -0
  1526. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/US/Samoa +0 -0
  1527. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/UTC +0 -0
  1528. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Universal +0 -0
  1529. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/W-SU +0 -0
  1530. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/WET +0 -0
  1531. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Zulu +0 -0
  1532. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/iso3166.tab +279 -0
  1533. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zone1970.tab +375 -0
  1534. package/deps/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/zonenow.tab +296 -0
  1535. package/deps/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  1536. package/deps/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  1537. package/deps/abseil-cpp/absl/time/internal/test_util.cc +32 -0
  1538. package/deps/abseil-cpp/absl/time/internal/test_util.h +33 -0
  1539. package/deps/abseil-cpp/absl/time/simulated_clock.cc +225 -0
  1540. package/deps/abseil-cpp/absl/time/simulated_clock.h +108 -0
  1541. package/deps/abseil-cpp/absl/time/simulated_clock_test.cc +614 -0
  1542. package/deps/abseil-cpp/absl/time/time.cc +507 -0
  1543. package/deps/abseil-cpp/absl/time/time.h +1926 -0
  1544. package/deps/abseil-cpp/absl/time/time_benchmark.cc +321 -0
  1545. package/deps/abseil-cpp/absl/time/time_test.cc +1365 -0
  1546. package/deps/abseil-cpp/absl/time/time_zone_test.cc +97 -0
  1547. package/deps/abseil-cpp/absl/types/BUILD.bazel +166 -0
  1548. package/deps/abseil-cpp/absl/types/CMakeLists.txt +179 -0
  1549. package/deps/abseil-cpp/absl/types/any.h +44 -0
  1550. package/deps/abseil-cpp/absl/types/compare.h +506 -0
  1551. package/deps/abseil-cpp/absl/types/compare_test.cc +300 -0
  1552. package/deps/abseil-cpp/absl/types/internal/span.h +141 -0
  1553. package/deps/abseil-cpp/absl/types/optional.h +41 -0
  1554. package/deps/abseil-cpp/absl/types/span.h +830 -0
  1555. package/deps/abseil-cpp/absl/types/span_test.cc +915 -0
  1556. package/deps/abseil-cpp/absl/types/variant.h +82 -0
  1557. package/deps/abseil-cpp/absl/types/variant_test.cc +164 -0
  1558. package/deps/abseil-cpp/absl/utility/BUILD.bazel +46 -0
  1559. package/deps/abseil-cpp/absl/utility/CMakeLists.txt +28 -0
  1560. package/deps/abseil-cpp/absl/utility/utility.h +68 -0
  1561. package/deps/abseil-cpp/ci/absl_alternate_options.h +28 -0
  1562. package/deps/abseil-cpp/ci/cmake_common.sh +19 -0
  1563. package/deps/abseil-cpp/ci/cmake_install_test.sh +64 -0
  1564. package/deps/abseil-cpp/ci/linux_arm_clang-latest_libcxx_bazel.sh +106 -0
  1565. package/deps/abseil-cpp/ci/linux_clang-latest_libcxx_asan_bazel.sh +114 -0
  1566. package/deps/abseil-cpp/ci/linux_clang-latest_libcxx_bazel.sh +107 -0
  1567. package/deps/abseil-cpp/ci/linux_clang-latest_libcxx_tsan_bazel.sh +106 -0
  1568. package/deps/abseil-cpp/ci/linux_clang-latest_libstdcxx_bazel.sh +104 -0
  1569. package/deps/abseil-cpp/ci/linux_docker_containers.sh +22 -0
  1570. package/deps/abseil-cpp/ci/linux_gcc-floor_libstdcxx_bazel.sh +100 -0
  1571. package/deps/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh +105 -0
  1572. package/deps/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh +85 -0
  1573. package/deps/abseil-cpp/ci/linux_gcc_alpine_cmake.sh +85 -0
  1574. package/deps/abseil-cpp/ci/macos_xcode_bazel.sh +70 -0
  1575. package/deps/abseil-cpp/ci/macos_xcode_cmake.sh +78 -0
  1576. package/deps/abseil-cpp/ci/windows_clangcl_bazel.bat +70 -0
  1577. package/deps/abseil-cpp/ci/windows_msvc_bazel.bat +61 -0
  1578. package/deps/abseil-cpp/ci/windows_msvc_cmake.bat +69 -0
  1579. package/deps/abseil-cpp/conanfile.py +51 -0
  1580. package/deps/abseil-cpp/create_lts.py +139 -0
  1581. package/deps/re2/.bazelrc +20 -0
  1582. package/deps/re2/.bcr/metadata.template.json +16 -0
  1583. package/deps/re2/.bcr/presubmit.yml +57 -0
  1584. package/deps/re2/.bcr/source.template.json +5 -0
  1585. package/deps/re2/BUILD.bazel +463 -0
  1586. package/deps/re2/CMakeLists.txt +283 -0
  1587. package/deps/re2/LICENSE +27 -0
  1588. package/deps/re2/MODULE.bazel +29 -0
  1589. package/deps/re2/Makefile +408 -0
  1590. package/deps/re2/WORKSPACE.bazel +7 -0
  1591. package/deps/re2/WORKSPACE.bzlmod +7 -0
  1592. package/deps/re2/app/BUILD.bazel +24 -0
  1593. package/deps/re2/app/_re2.cc +94 -0
  1594. package/deps/re2/app/_re2.d.ts +23 -0
  1595. package/deps/re2/app/app.ts +111 -0
  1596. package/deps/re2/app/build.sh +32 -0
  1597. package/deps/re2/app/index.html +5 -0
  1598. package/deps/re2/app/package.json +14 -0
  1599. package/deps/re2/app/rollup.config.js +28 -0
  1600. package/deps/re2/app/tsconfig.json +17 -0
  1601. package/deps/re2/benchlog/benchplot.py +98 -0
  1602. package/deps/re2/benchlog/mktable +155 -0
  1603. package/deps/re2/doc/mksyntaxgo +42 -0
  1604. package/deps/re2/doc/mksyntaxhtml +42 -0
  1605. package/deps/re2/doc/mksyntaxwiki +36 -0
  1606. package/deps/re2/doc/syntax.html +477 -0
  1607. package/deps/re2/doc/syntax.txt +463 -0
  1608. package/deps/re2/lib/git/commit-msg.hook +104 -0
  1609. package/deps/re2/libre2.symbols +16 -0
  1610. package/deps/re2/libre2.symbols.darwin +12 -0
  1611. package/deps/re2/python/BUILD.bazel +80 -0
  1612. package/deps/re2/python/_re2.cc +352 -0
  1613. package/deps/re2/python/re2.py +583 -0
  1614. package/deps/re2/python/re2_test.py +495 -0
  1615. package/deps/re2/python/setup.py +159 -0
  1616. package/deps/re2/python/toolchains/generate.py +100 -0
  1617. package/deps/re2/re2/bitmap256.cc +43 -0
  1618. package/deps/re2/re2/bitmap256.h +88 -0
  1619. package/deps/re2/re2/bitstate.cc +389 -0
  1620. package/deps/re2/re2/compile.cc +1265 -0
  1621. package/deps/re2/re2/dfa.cc +2135 -0
  1622. package/deps/re2/re2/filtered_re2.cc +138 -0
  1623. package/deps/re2/re2/filtered_re2.h +115 -0
  1624. package/deps/re2/re2/fuzzing/re2_fuzzer.cc +284 -0
  1625. package/deps/re2/re2/make_perl_groups.pl +116 -0
  1626. package/deps/re2/re2/make_unicode_casefold.py +151 -0
  1627. package/deps/re2/re2/make_unicode_groups.py +117 -0
  1628. package/deps/re2/re2/mimics_pcre.cc +196 -0
  1629. package/deps/re2/re2/nfa.cc +714 -0
  1630. package/deps/re2/re2/onepass.cc +623 -0
  1631. package/deps/re2/re2/parse.cc +2529 -0
  1632. package/deps/re2/re2/perl_groups.cc +119 -0
  1633. package/deps/re2/re2/pod_array.h +55 -0
  1634. package/deps/re2/re2/prefilter.cc +711 -0
  1635. package/deps/re2/re2/prefilter.h +168 -0
  1636. package/deps/re2/re2/prefilter_tree.cc +376 -0
  1637. package/deps/re2/re2/prefilter_tree.h +153 -0
  1638. package/deps/re2/re2/prog.cc +1181 -0
  1639. package/deps/re2/re2/prog.h +493 -0
  1640. package/deps/re2/re2/re2.cc +1355 -0
  1641. package/deps/re2/re2/re2.h +1074 -0
  1642. package/deps/re2/re2/regexp.cc +1004 -0
  1643. package/deps/re2/re2/regexp.h +693 -0
  1644. package/deps/re2/re2/set.cc +185 -0
  1645. package/deps/re2/re2/set.h +91 -0
  1646. package/deps/re2/re2/simplify.cc +689 -0
  1647. package/deps/re2/re2/sparse_array.h +394 -0
  1648. package/deps/re2/re2/sparse_set.h +266 -0
  1649. package/deps/re2/re2/stringpiece.h +18 -0
  1650. package/deps/re2/re2/testing/backtrack.cc +274 -0
  1651. package/deps/re2/re2/testing/charclass_test.cc +228 -0
  1652. package/deps/re2/re2/testing/compile_test.cc +431 -0
  1653. package/deps/re2/re2/testing/dfa_test.cc +376 -0
  1654. package/deps/re2/re2/testing/dump.cc +172 -0
  1655. package/deps/re2/re2/testing/exhaustive1_test.cc +40 -0
  1656. package/deps/re2/re2/testing/exhaustive2_test.cc +72 -0
  1657. package/deps/re2/re2/testing/exhaustive3_test.cc +100 -0
  1658. package/deps/re2/re2/testing/exhaustive_test.cc +35 -0
  1659. package/deps/re2/re2/testing/exhaustive_tester.cc +204 -0
  1660. package/deps/re2/re2/testing/exhaustive_tester.h +105 -0
  1661. package/deps/re2/re2/testing/filtered_re2_test.cc +343 -0
  1662. package/deps/re2/re2/testing/mimics_pcre_test.cc +79 -0
  1663. package/deps/re2/re2/testing/null_walker.cc +48 -0
  1664. package/deps/re2/re2/testing/parse_test.cc +586 -0
  1665. package/deps/re2/re2/testing/possible_match_test.cc +251 -0
  1666. package/deps/re2/re2/testing/random_test.cc +102 -0
  1667. package/deps/re2/re2/testing/re2_arg_test.cc +182 -0
  1668. package/deps/re2/re2/testing/re2_test.cc +1699 -0
  1669. package/deps/re2/re2/testing/regexp_benchmark.cc +1605 -0
  1670. package/deps/re2/re2/testing/regexp_generator.cc +284 -0
  1671. package/deps/re2/re2/testing/regexp_generator.h +77 -0
  1672. package/deps/re2/re2/testing/regexp_test.cc +87 -0
  1673. package/deps/re2/re2/testing/required_prefix_test.cc +201 -0
  1674. package/deps/re2/re2/testing/search_test.cc +338 -0
  1675. package/deps/re2/re2/testing/set_test.cc +235 -0
  1676. package/deps/re2/re2/testing/simplify_test.cc +289 -0
  1677. package/deps/re2/re2/testing/string_generator.cc +144 -0
  1678. package/deps/re2/re2/testing/string_generator.h +76 -0
  1679. package/deps/re2/re2/testing/string_generator_test.cc +114 -0
  1680. package/deps/re2/re2/testing/tester.cc +690 -0
  1681. package/deps/re2/re2/testing/tester.h +121 -0
  1682. package/deps/re2/re2/tostring.cc +351 -0
  1683. package/deps/re2/re2/unicode.py +284 -0
  1684. package/deps/re2/re2/unicode_casefold.cc +604 -0
  1685. package/deps/re2/re2/unicode_casefold.h +77 -0
  1686. package/deps/re2/re2/unicode_groups.cc +6517 -0
  1687. package/deps/re2/re2/unicode_groups.h +66 -0
  1688. package/deps/re2/re2/walker-inl.h +249 -0
  1689. package/deps/re2/re2.pc.in +9 -0
  1690. package/deps/re2/re2Config.cmake.in +26 -0
  1691. package/deps/re2/runtests +33 -0
  1692. package/deps/re2/testinstall.cc +27 -0
  1693. package/deps/re2/ucs2.diff +567 -0
  1694. package/deps/re2/util/malloc_counter.h +19 -0
  1695. package/deps/re2/util/pcre.cc +957 -0
  1696. package/deps/re2/util/pcre.h +671 -0
  1697. package/deps/re2/util/rune.cc +260 -0
  1698. package/deps/re2/util/strutil.cc +26 -0
  1699. package/deps/re2/util/strutil.h +16 -0
  1700. package/deps/re2/util/utf.h +44 -0
  1701. package/index.js +14 -5
  1702. package/package.json +1 -1
  1703. package/prebuilds/darwin-arm64/@nxtedition+rocksdb.node +0 -0
  1704. package/prebuilds/linux-x64/@nxtedition+rocksdb.node +0 -0
  1705. package/util.h +10 -16
@@ -0,0 +1,2820 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/synchronization/mutex.h"
16
+
17
+ #ifdef _WIN32
18
+ #include <windows.h>
19
+ #ifdef ERROR
20
+ #undef ERROR
21
+ #endif
22
+ #else
23
+ #include <fcntl.h>
24
+ #include <pthread.h>
25
+ #include <sched.h>
26
+ #include <sys/time.h>
27
+ #endif
28
+
29
+ #include <assert.h>
30
+ #include <errno.h>
31
+ #include <stdio.h>
32
+ #include <stdlib.h>
33
+ #include <string.h>
34
+ #include <time.h>
35
+
36
+ #include <algorithm>
37
+ #include <atomic>
38
+ #include <cstddef>
39
+ #include <cstdlib>
40
+ #include <cstring>
41
+ #include <thread> // NOLINT(build/c++11)
42
+
43
+ #include "absl/base/attributes.h"
44
+ #include "absl/base/call_once.h"
45
+ #include "absl/base/config.h"
46
+ #include "absl/base/dynamic_annotations.h"
47
+ #include "absl/base/internal/atomic_hook.h"
48
+ #include "absl/base/internal/cycleclock.h"
49
+ #include "absl/base/internal/hide_ptr.h"
50
+ #include "absl/base/internal/low_level_alloc.h"
51
+ #include "absl/base/internal/raw_logging.h"
52
+ #include "absl/base/internal/spinlock.h"
53
+ #include "absl/base/internal/sysinfo.h"
54
+ #include "absl/base/internal/thread_identity.h"
55
+ #include "absl/base/internal/tsan_mutex_interface.h"
56
+ #include "absl/base/optimization.h"
57
+ #include "absl/debugging/stacktrace.h"
58
+ #include "absl/debugging/symbolize.h"
59
+ #include "absl/synchronization/internal/graphcycles.h"
60
+ #include "absl/synchronization/internal/per_thread_sem.h"
61
+ #include "absl/time/time.h"
62
+
63
+ using absl::base_internal::CurrentThreadIdentityIfPresent;
64
+ using absl::base_internal::CycleClock;
65
+ using absl::base_internal::PerThreadSynch;
66
+ using absl::base_internal::SchedulingGuard;
67
+ using absl::base_internal::ThreadIdentity;
68
+ using absl::synchronization_internal::GetOrCreateCurrentThreadIdentity;
69
+ using absl::synchronization_internal::GraphCycles;
70
+ using absl::synchronization_internal::GraphId;
71
+ using absl::synchronization_internal::InvalidGraphId;
72
+ using absl::synchronization_internal::KernelTimeout;
73
+ using absl::synchronization_internal::PerThreadSem;
74
+
75
+ extern "C" {
76
+ ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(AbslInternalMutexYield)() {
77
+ std::this_thread::yield();
78
+ }
79
+ } // extern "C"
80
+
81
+ namespace absl {
82
+ ABSL_NAMESPACE_BEGIN
83
+
84
+ namespace {
85
+
86
+ #if defined(ABSL_HAVE_THREAD_SANITIZER)
87
+ constexpr OnDeadlockCycle kDeadlockDetectionDefault = OnDeadlockCycle::kIgnore;
88
+ #else
89
+ constexpr OnDeadlockCycle kDeadlockDetectionDefault = OnDeadlockCycle::kAbort;
90
+ #endif
91
+
92
+ ABSL_CONST_INIT std::atomic<OnDeadlockCycle> synch_deadlock_detection(
93
+ kDeadlockDetectionDefault);
94
+ ABSL_CONST_INIT std::atomic<bool> synch_check_invariants(false);
95
+
96
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
97
+ absl::base_internal::AtomicHook<void (*)(int64_t wait_cycles)>
98
+ submit_profile_data;
99
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES absl::base_internal::AtomicHook<void (*)(
100
+ const char* msg, const void* obj, int64_t wait_cycles)>
101
+ mutex_tracer;
102
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
103
+ absl::base_internal::AtomicHook<void (*)(const char* msg, const void* cv)>
104
+ cond_var_tracer;
105
+
106
+ } // namespace
107
+
108
+ static inline bool EvalConditionAnnotated(const Condition* cond, Mutex* mu,
109
+ bool locking, bool trylock,
110
+ bool read_lock);
111
+
112
+ void RegisterMutexProfiler(void (*fn)(int64_t wait_cycles)) {
113
+ submit_profile_data.Store(fn);
114
+ }
115
+
116
+ void RegisterMutexTracer(void (*fn)(const char* msg, const void* obj,
117
+ int64_t wait_cycles)) {
118
+ mutex_tracer.Store(fn);
119
+ }
120
+
121
+ void RegisterCondVarTracer(void (*fn)(const char* msg, const void* cv)) {
122
+ cond_var_tracer.Store(fn);
123
+ }
124
+
125
+ namespace {
126
+ // Represents the strategy for spin and yield.
127
+ // See the comment in GetMutexGlobals() for more information.
128
+ enum DelayMode { AGGRESSIVE, GENTLE };
129
+
130
+ struct ABSL_CACHELINE_ALIGNED MutexGlobals {
131
+ absl::once_flag once;
132
+ // Note: this variable is initialized separately in Mutex::LockSlow,
133
+ // so that Mutex::Lock does not have a stack frame in optimized build.
134
+ std::atomic<int> spinloop_iterations{0};
135
+ int32_t mutex_sleep_spins[2] = {};
136
+ absl::Duration mutex_sleep_time;
137
+ };
138
+
139
+ ABSL_CONST_INIT static MutexGlobals globals;
140
+
141
+ absl::Duration MeasureTimeToYield() {
142
+ absl::Time before = absl::Now();
143
+ ABSL_INTERNAL_C_SYMBOL(AbslInternalMutexYield)();
144
+ return absl::Now() - before;
145
+ }
146
+
147
+ const MutexGlobals& GetMutexGlobals() {
148
+ absl::base_internal::LowLevelCallOnce(&globals.once, [&]() {
149
+ if (absl::base_internal::NumCPUs() > 1) {
150
+ // If the mode is aggressive then spin many times before yielding.
151
+ // If the mode is gentle then spin only a few times before yielding.
152
+ // Aggressive spinning is used to ensure that an Unlock() call,
153
+ // which must get the spin lock for any thread to make progress gets it
154
+ // without undue delay.
155
+ globals.mutex_sleep_spins[AGGRESSIVE] = 5000;
156
+ globals.mutex_sleep_spins[GENTLE] = 250;
157
+ globals.mutex_sleep_time = absl::Microseconds(10);
158
+ } else {
159
+ // If this a uniprocessor, only yield/sleep. Real-time threads are often
160
+ // unable to yield, so the sleep time needs to be long enough to keep
161
+ // the calling thread asleep until scheduling happens.
162
+ globals.mutex_sleep_spins[AGGRESSIVE] = 0;
163
+ globals.mutex_sleep_spins[GENTLE] = 0;
164
+ globals.mutex_sleep_time = MeasureTimeToYield() * 5;
165
+ globals.mutex_sleep_time =
166
+ std::min(globals.mutex_sleep_time, absl::Milliseconds(1));
167
+ globals.mutex_sleep_time =
168
+ std::max(globals.mutex_sleep_time, absl::Microseconds(10));
169
+ }
170
+ });
171
+ return globals;
172
+ }
173
+ } // namespace
174
+
175
+ namespace synchronization_internal {
176
+ // Returns the Mutex delay on iteration `c` depending on the given `mode`.
177
+ // The returned value should be used as `c` for the next call to `MutexDelay`.
178
+ int MutexDelay(int32_t c, int mode) {
179
+ const int32_t limit = GetMutexGlobals().mutex_sleep_spins[mode];
180
+ const absl::Duration sleep_time = GetMutexGlobals().mutex_sleep_time;
181
+ if (c < limit) {
182
+ // Spin.
183
+ c++;
184
+ } else {
185
+ SchedulingGuard::ScopedEnable enable_rescheduling;
186
+ ABSL_TSAN_MUTEX_PRE_DIVERT(nullptr, 0);
187
+ if (c == limit) {
188
+ // Yield once.
189
+ ABSL_INTERNAL_C_SYMBOL(AbslInternalMutexYield)();
190
+ c++;
191
+ } else {
192
+ // Then wait.
193
+ absl::SleepFor(sleep_time);
194
+ c = 0;
195
+ }
196
+ ABSL_TSAN_MUTEX_POST_DIVERT(nullptr, 0);
197
+ }
198
+ return c;
199
+ }
200
+ } // namespace synchronization_internal
201
+
202
+ // --------------------------Generic atomic ops
203
+ // Ensure that "(*pv & bits) == bits" by doing an atomic update of "*pv" to
204
+ // "*pv | bits" if necessary. Wait until (*pv & wait_until_clear)==0
205
+ // before making any change.
206
+ // Returns true if bits were previously unset and set by the call.
207
+ // This is used to set flags in mutex and condition variable words.
208
+ static bool AtomicSetBits(std::atomic<intptr_t>* pv, intptr_t bits,
209
+ intptr_t wait_until_clear) {
210
+ for (;;) {
211
+ intptr_t v = pv->load(std::memory_order_relaxed);
212
+ if ((v & bits) == bits) {
213
+ return false;
214
+ }
215
+ if ((v & wait_until_clear) != 0) {
216
+ continue;
217
+ }
218
+ if (pv->compare_exchange_weak(v, v | bits, std::memory_order_release,
219
+ std::memory_order_relaxed)) {
220
+ return true;
221
+ }
222
+ }
223
+ }
224
+
225
+ //------------------------------------------------------------------
226
+
227
+ // Data for doing deadlock detection.
228
+ ABSL_CONST_INIT static absl::base_internal::SpinLock deadlock_graph_mu(
229
+ base_internal::SCHEDULE_KERNEL_ONLY);
230
+
231
+ // Graph used to detect deadlocks.
232
+ ABSL_CONST_INIT static GraphCycles* deadlock_graph
233
+ ABSL_GUARDED_BY(deadlock_graph_mu) ABSL_PT_GUARDED_BY(deadlock_graph_mu);
234
+
235
+ //------------------------------------------------------------------
236
+ // An event mechanism for debugging mutex use.
237
+ // It also allows mutexes to be given names for those who can't handle
238
+ // addresses, and instead like to give their data structures names like
239
+ // "Henry", "Fido", or "Rupert IV, King of Yondavia".
240
+
241
+ namespace { // to prevent name pollution
242
+ enum { // Mutex and CondVar events passed as "ev" to PostSynchEvent
243
+ // Mutex events
244
+ SYNCH_EV_TRYLOCK_SUCCESS,
245
+ SYNCH_EV_TRYLOCK_FAILED,
246
+ SYNCH_EV_READERTRYLOCK_SUCCESS,
247
+ SYNCH_EV_READERTRYLOCK_FAILED,
248
+ SYNCH_EV_LOCK,
249
+ SYNCH_EV_LOCK_RETURNING,
250
+ SYNCH_EV_READERLOCK,
251
+ SYNCH_EV_READERLOCK_RETURNING,
252
+ SYNCH_EV_UNLOCK,
253
+ SYNCH_EV_READERUNLOCK,
254
+
255
+ // CondVar events
256
+ SYNCH_EV_WAIT,
257
+ SYNCH_EV_WAIT_RETURNING,
258
+ SYNCH_EV_SIGNAL,
259
+ SYNCH_EV_SIGNALALL,
260
+ };
261
+
262
+ enum { // Event flags
263
+ SYNCH_F_R = 0x01, // reader event
264
+ SYNCH_F_LCK = 0x02, // PostSynchEvent called with mutex held
265
+ SYNCH_F_TRY = 0x04, // TryLock or ReaderTryLock
266
+ SYNCH_F_UNLOCK = 0x08, // Unlock or ReaderUnlock
267
+
268
+ SYNCH_F_LCK_W = SYNCH_F_LCK,
269
+ SYNCH_F_LCK_R = SYNCH_F_LCK | SYNCH_F_R,
270
+ };
271
+ } // anonymous namespace
272
+
273
+ // Properties of the events.
274
+ static const struct {
275
+ int flags;
276
+ const char* msg;
277
+ } event_properties[] = {
278
+ {SYNCH_F_LCK_W | SYNCH_F_TRY, "TryLock succeeded "},
279
+ {0, "TryLock failed "},
280
+ {SYNCH_F_LCK_R | SYNCH_F_TRY, "ReaderTryLock succeeded "},
281
+ {0, "ReaderTryLock failed "},
282
+ {0, "Lock blocking "},
283
+ {SYNCH_F_LCK_W, "Lock returning "},
284
+ {0, "ReaderLock blocking "},
285
+ {SYNCH_F_LCK_R, "ReaderLock returning "},
286
+ {SYNCH_F_LCK_W | SYNCH_F_UNLOCK, "Unlock "},
287
+ {SYNCH_F_LCK_R | SYNCH_F_UNLOCK, "ReaderUnlock "},
288
+ {0, "Wait on "},
289
+ {0, "Wait unblocked "},
290
+ {0, "Signal on "},
291
+ {0, "SignalAll on "},
292
+ };
293
+
294
+ ABSL_CONST_INIT static absl::base_internal::SpinLock synch_event_mu(
295
+ base_internal::SCHEDULE_KERNEL_ONLY);
296
+
297
+ // Hash table size; should be prime > 2.
298
+ // Can't be too small, as it's used for deadlock detection information.
299
+ static constexpr uint32_t kNSynchEvent = 1031;
300
+
301
+ static struct SynchEvent { // this is a trivial hash table for the events
302
+ // struct is freed when refcount reaches 0
303
+ int refcount ABSL_GUARDED_BY(synch_event_mu);
304
+
305
+ // buckets have linear, 0-terminated chains
306
+ SynchEvent* next ABSL_GUARDED_BY(synch_event_mu);
307
+
308
+ // Constant after initialization
309
+ uintptr_t masked_addr; // object at this address is called "name"
310
+
311
+ // No explicit synchronization used. Instead we assume that the
312
+ // client who enables/disables invariants/logging on a Mutex does so
313
+ // while the Mutex is not being concurrently accessed by others.
314
+ void (*invariant)(void* arg); // called on each event
315
+ void* arg; // first arg to (*invariant)()
316
+ bool log; // logging turned on
317
+
318
+ // Constant after initialization
319
+ char name[1]; // actually longer---NUL-terminated string
320
+ }* synch_event[kNSynchEvent] ABSL_GUARDED_BY(synch_event_mu);
321
+
322
+ // Ensure that the object at "addr" has a SynchEvent struct associated with it,
323
+ // set "bits" in the word there (waiting until lockbit is clear before doing
324
+ // so), and return a refcounted reference that will remain valid until
325
+ // UnrefSynchEvent() is called. If a new SynchEvent is allocated,
326
+ // the string name is copied into it.
327
+ // When used with a mutex, the caller should also ensure that kMuEvent
328
+ // is set in the mutex word, and similarly for condition variables and kCVEvent.
329
+ static SynchEvent* EnsureSynchEvent(std::atomic<intptr_t>* addr,
330
+ const char* name, intptr_t bits,
331
+ intptr_t lockbit) {
332
+ uint32_t h = reinterpret_cast<uintptr_t>(addr) % kNSynchEvent;
333
+ synch_event_mu.lock();
334
+ // When a Mutex/CondVar is destroyed, we don't remove the associated
335
+ // SynchEvent to keep destructors empty in release builds for performance
336
+ // reasons. If the current call is the first to set bits (kMuEvent/kCVEvent),
337
+ // we don't look up the existing even because (if it exists, it must be for
338
+ // the previous Mutex/CondVar that existed at the same address).
339
+ // The leaking events must not be a problem for tests, which should create
340
+ // bounded amount of events. And debug logging is not supposed to be enabled
341
+ // in production. However, if it's accidentally enabled, or briefly enabled
342
+ // for some debugging, we don't want to crash the program. Instead we drop
343
+ // all events, if we accumulated too many of them. Size of a single event
344
+ // is ~48 bytes, so 100K events is ~5 MB.
345
+ // Additionally we could delete the old event for the same address,
346
+ // but it would require a better hashmap (if we accumulate too many events,
347
+ // linked lists will grow and traversing them will be very slow).
348
+ constexpr size_t kMaxSynchEventCount = 100 << 10;
349
+ // Total number of live synch events.
350
+ static size_t synch_event_count ABSL_GUARDED_BY(synch_event_mu);
351
+ if (++synch_event_count > kMaxSynchEventCount) {
352
+ synch_event_count = 0;
353
+ ABSL_RAW_LOG(ERROR,
354
+ "Accumulated %zu Mutex debug objects. If you see this"
355
+ " in production, it may mean that the production code"
356
+ " accidentally calls "
357
+ "Mutex/CondVar::EnableDebugLog/EnableInvariantDebugging.",
358
+ kMaxSynchEventCount);
359
+ for (auto*& head : synch_event) {
360
+ for (auto* e = head; e != nullptr;) {
361
+ SynchEvent* next = e->next;
362
+ if (--(e->refcount) == 0) {
363
+ base_internal::LowLevelAlloc::Free(e);
364
+ }
365
+ e = next;
366
+ }
367
+ head = nullptr;
368
+ }
369
+ }
370
+ SynchEvent* e = nullptr;
371
+ if (!AtomicSetBits(addr, bits, lockbit)) {
372
+ for (e = synch_event[h];
373
+ e != nullptr && e->masked_addr != base_internal::HidePtr(addr);
374
+ e = e->next) {
375
+ }
376
+ }
377
+ if (e == nullptr) { // no SynchEvent struct found; make one.
378
+ if (name == nullptr) {
379
+ name = "";
380
+ }
381
+ size_t l = strlen(name);
382
+ e = reinterpret_cast<SynchEvent*>(
383
+ base_internal::LowLevelAlloc::Alloc(sizeof(*e) + l));
384
+ e->refcount = 2; // one for return value, one for linked list
385
+ e->masked_addr = base_internal::HidePtr(addr);
386
+ e->invariant = nullptr;
387
+ e->arg = nullptr;
388
+ e->log = false;
389
+ strcpy(e->name, name); // NOLINT(runtime/printf)
390
+ e->next = synch_event[h];
391
+ synch_event[h] = e;
392
+ } else {
393
+ e->refcount++; // for return value
394
+ }
395
+ synch_event_mu.unlock();
396
+ return e;
397
+ }
398
+
399
+ // Decrement the reference count of *e, or do nothing if e==null.
400
+ static void UnrefSynchEvent(SynchEvent* e) {
401
+ if (e != nullptr) {
402
+ synch_event_mu.lock();
403
+ bool del = (--(e->refcount) == 0);
404
+ synch_event_mu.unlock();
405
+ if (del) {
406
+ base_internal::LowLevelAlloc::Free(e);
407
+ }
408
+ }
409
+ }
410
+
411
+ // Return a refcounted reference to the SynchEvent of the object at address
412
+ // "addr", if any. The pointer returned is valid until the UnrefSynchEvent() is
413
+ // called.
414
+ static SynchEvent* GetSynchEvent(const void* addr) {
415
+ uint32_t h = reinterpret_cast<uintptr_t>(addr) % kNSynchEvent;
416
+ SynchEvent* e;
417
+ synch_event_mu.lock();
418
+ for (e = synch_event[h];
419
+ e != nullptr && e->masked_addr != base_internal::HidePtr(addr);
420
+ e = e->next) {
421
+ }
422
+ if (e != nullptr) {
423
+ e->refcount++;
424
+ }
425
+ synch_event_mu.unlock();
426
+ return e;
427
+ }
428
+
429
+ // Called when an event "ev" occurs on a Mutex of CondVar "obj"
430
+ // if event recording is on
431
+ static void PostSynchEvent(void* obj, int ev) {
432
+ SynchEvent* e = GetSynchEvent(obj);
433
+ // logging is on if event recording is on and either there's no event struct,
434
+ // or it explicitly says to log
435
+ if (e == nullptr || e->log) {
436
+ void* pcs[40];
437
+ int n = absl::GetStackTrace(pcs, ABSL_ARRAYSIZE(pcs), 1);
438
+ // A buffer with enough space for the ASCII for all the PCs, even on a
439
+ // 64-bit machine.
440
+ char buffer[ABSL_ARRAYSIZE(pcs) * 24];
441
+ int pos = snprintf(buffer, sizeof(buffer), " @");
442
+ for (int i = 0; i != n; i++) {
443
+ int b = snprintf(&buffer[pos], sizeof(buffer) - static_cast<size_t>(pos),
444
+ " %p", pcs[i]);
445
+ if (b < 0 ||
446
+ static_cast<size_t>(b) >= sizeof(buffer) - static_cast<size_t>(pos)) {
447
+ break;
448
+ }
449
+ pos += b;
450
+ }
451
+ ABSL_RAW_LOG(INFO, "%s%p %s %s", event_properties[ev].msg, obj,
452
+ (e == nullptr ? "" : e->name), buffer);
453
+ }
454
+ const int flags = event_properties[ev].flags;
455
+ if ((flags & SYNCH_F_LCK) != 0 && e != nullptr && e->invariant != nullptr) {
456
+ // Calling the invariant as is causes problems under ThreadSanitizer.
457
+ // We are currently inside of Mutex Lock/Unlock and are ignoring all
458
+ // memory accesses and synchronization. If the invariant transitively
459
+ // synchronizes something else and we ignore the synchronization, we will
460
+ // get false positive race reports later.
461
+ // Reuse EvalConditionAnnotated to properly call into user code.
462
+ struct local {
463
+ static bool pred(SynchEvent* ev) {
464
+ (*ev->invariant)(ev->arg);
465
+ return false;
466
+ }
467
+ };
468
+ Condition cond(&local::pred, e);
469
+ Mutex* mu = static_cast<Mutex*>(obj);
470
+ const bool locking = (flags & SYNCH_F_UNLOCK) == 0;
471
+ const bool trylock = (flags & SYNCH_F_TRY) != 0;
472
+ const bool read_lock = (flags & SYNCH_F_R) != 0;
473
+ EvalConditionAnnotated(&cond, mu, locking, trylock, read_lock);
474
+ }
475
+ UnrefSynchEvent(e);
476
+ }
477
+
478
+ //------------------------------------------------------------------
479
+
480
+ // The SynchWaitParams struct encapsulates the way in which a thread is waiting:
481
+ // whether it has a timeout, the condition, exclusive/shared, and whether a
482
+ // condition variable wait has an associated Mutex (as opposed to another
483
+ // type of lock). It also points to the PerThreadSynch struct of its thread.
484
+ // cv_word tells Enqueue() to enqueue on a CondVar using CondVarEnqueue().
485
+ //
486
+ // This structure is held on the stack rather than directly in
487
+ // PerThreadSynch because a thread can be waiting on multiple Mutexes if,
488
+ // while waiting on one Mutex, the implementation calls a client callback
489
+ // (such as a Condition function) that acquires another Mutex. We don't
490
+ // strictly need to allow this, but programmers become confused if we do not
491
+ // allow them to use functions such a LOG() within Condition functions. The
492
+ // PerThreadSynch struct points at the most recent SynchWaitParams struct when
493
+ // the thread is on a Mutex's waiter queue.
494
+ struct SynchWaitParams {
495
+ SynchWaitParams(Mutex::MuHow how_arg, const Condition* cond_arg,
496
+ KernelTimeout timeout_arg, Mutex* cvmu_arg,
497
+ PerThreadSynch* thread_arg,
498
+ std::atomic<intptr_t>* cv_word_arg)
499
+ : how(how_arg),
500
+ cond(cond_arg),
501
+ timeout(timeout_arg),
502
+ cvmu(cvmu_arg),
503
+ thread(thread_arg),
504
+ cv_word(cv_word_arg),
505
+ contention_start_cycles(CycleClock::Now()),
506
+ should_submit_contention_data(false) {}
507
+
508
+ const Mutex::MuHow how; // How this thread needs to wait.
509
+ const Condition* cond; // The condition that this thread is waiting for.
510
+ // In Mutex, this field is set to zero if a timeout
511
+ // expires.
512
+ KernelTimeout timeout; // timeout expiry---absolute time
513
+ // In Mutex, this field is set to zero if a timeout
514
+ // expires.
515
+ Mutex* const cvmu; // used for transfer from cond var to mutex
516
+ PerThreadSynch* const thread; // thread that is waiting
517
+
518
+ // If not null, thread should be enqueued on the CondVar whose state
519
+ // word is cv_word instead of queueing normally on the Mutex.
520
+ std::atomic<intptr_t>* cv_word;
521
+
522
+ int64_t contention_start_cycles; // Time (in cycles) when this thread started
523
+ // to contend for the mutex.
524
+ bool should_submit_contention_data;
525
+ };
526
+
527
+ struct SynchLocksHeld {
528
+ int n; // number of valid entries in locks[]
529
+ bool overflow; // true iff we overflowed the array at some point
530
+ struct {
531
+ Mutex* mu; // lock acquired
532
+ int32_t count; // times acquired
533
+ GraphId id; // deadlock_graph id of acquired lock
534
+ } locks[40];
535
+ // If a thread overfills the array during deadlock detection, we
536
+ // continue, discarding information as needed. If no overflow has
537
+ // taken place, we can provide more error checking, such as
538
+ // detecting when a thread releases a lock it does not hold.
539
+ };
540
+
541
+ // A sentinel value in lists that is not 0.
542
+ // A 0 value is used to mean "not on a list".
543
+ static PerThreadSynch* const kPerThreadSynchNull =
544
+ reinterpret_cast<PerThreadSynch*>(1);
545
+
546
+ static SynchLocksHeld* LocksHeldAlloc() {
547
+ SynchLocksHeld* ret = reinterpret_cast<SynchLocksHeld*>(
548
+ base_internal::LowLevelAlloc::Alloc(sizeof(SynchLocksHeld)));
549
+ ret->n = 0;
550
+ ret->overflow = false;
551
+ return ret;
552
+ }
553
+
554
+ // Return the PerThreadSynch-struct for this thread.
555
+ static PerThreadSynch* Synch_GetPerThread() {
556
+ ThreadIdentity* identity = GetOrCreateCurrentThreadIdentity();
557
+ return &identity->per_thread_synch;
558
+ }
559
+
560
+ static PerThreadSynch* Synch_GetPerThreadAnnotated(Mutex* mu) {
561
+ if (mu) {
562
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
563
+ }
564
+ PerThreadSynch* w = Synch_GetPerThread();
565
+ if (mu) {
566
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
567
+ }
568
+ return w;
569
+ }
570
+
571
+ static SynchLocksHeld* Synch_GetAllLocks() {
572
+ PerThreadSynch* s = Synch_GetPerThread();
573
+ if (s->all_locks == nullptr) {
574
+ s->all_locks = LocksHeldAlloc(); // Freed by ReclaimThreadIdentity.
575
+ }
576
+ return s->all_locks;
577
+ }
578
+
579
+ // Post on "w"'s associated PerThreadSem.
580
+ void Mutex::IncrementSynchSem(Mutex* mu, PerThreadSynch* w) {
581
+ static_cast<void>(mu); // Prevent unused param warning in non-TSAN builds.
582
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
583
+ // We miss synchronization around passing PerThreadSynch between threads
584
+ // since it happens inside of the Mutex code, so we need to ignore all
585
+ // accesses to the object.
586
+ ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
587
+ PerThreadSem::Post(w->thread_identity());
588
+ ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END();
589
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
590
+ }
591
+
592
+ // Wait on "w"'s associated PerThreadSem; returns false if timeout expired.
593
+ bool Mutex::DecrementSynchSem(Mutex* mu, PerThreadSynch* w, KernelTimeout t) {
594
+ static_cast<void>(mu); // Prevent unused param warning in non-TSAN builds.
595
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
596
+ assert(w == Synch_GetPerThread());
597
+ static_cast<void>(w);
598
+ bool res = PerThreadSem::Wait(t);
599
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
600
+ return res;
601
+ }
602
+
603
+ // We're in a fatal signal handler that hopes to use Mutex and to get
604
+ // lucky by not deadlocking. We try to improve its chances of success
605
+ // by effectively disabling some of the consistency checks. This will
606
+ // prevent certain ABSL_RAW_CHECK() statements from being triggered when
607
+ // re-rentry is detected. The ABSL_RAW_CHECK() statements are those in the
608
+ // Mutex code checking that the "waitp" field has not been reused.
609
+ void Mutex::InternalAttemptToUseMutexInFatalSignalHandler() {
610
+ // Fix the per-thread state only if it exists.
611
+ ThreadIdentity* identity = CurrentThreadIdentityIfPresent();
612
+ if (identity != nullptr) {
613
+ identity->per_thread_synch.suppress_fatal_errors = true;
614
+ }
615
+ // Don't do deadlock detection when we are already failing.
616
+ synch_deadlock_detection.store(OnDeadlockCycle::kIgnore,
617
+ std::memory_order_release);
618
+ }
619
+
620
+ // --------------------------Mutexes
621
+
622
+ // In the layout below, the msb of the bottom byte is currently unused. Also,
623
+ // the following constraints were considered in choosing the layout:
624
+ // o Both the debug allocator's "uninitialized" and "freed" patterns (0xab and
625
+ // 0xcd) are illegal: reader and writer lock both held.
626
+ // o kMuWriter and kMuEvent should exceed kMuDesig and kMuWait, to enable the
627
+ // bit-twiddling trick in Mutex::Unlock().
628
+ // o kMuWriter / kMuReader == kMuWrWait / kMuWait,
629
+ // to enable the bit-twiddling trick in CheckForMutexCorruption().
630
+ static const intptr_t kMuReader = 0x0001L; // a reader holds the lock
631
+ // There's a designated waker.
632
+ // INVARIANT1: there's a thread that was blocked on the mutex, is
633
+ // no longer, yet has not yet acquired the mutex. If there's a
634
+ // designated waker, all threads can avoid taking the slow path in
635
+ // unlock because the designated waker will subsequently acquire
636
+ // the lock and wake someone. To maintain INVARIANT1 the bit is
637
+ // set when a thread is unblocked(INV1a), and threads that were
638
+ // unblocked reset the bit when they either acquire or re-block (INV1b).
639
+ static const intptr_t kMuDesig = 0x0002L;
640
+ static const intptr_t kMuWait = 0x0004L; // threads are waiting
641
+ static const intptr_t kMuWriter = 0x0008L; // a writer holds the lock
642
+ static const intptr_t kMuEvent = 0x0010L; // record this mutex's events
643
+ // Runnable writer is waiting for a reader.
644
+ // If set, new readers will not lock the mutex to avoid writer starvation.
645
+ // Note: if a reader has higher priority than the writer, it will still lock
646
+ // the mutex ahead of the waiting writer, but in a very inefficient manner:
647
+ // the reader will first queue itself and block, but then the last unlocking
648
+ // reader will wake it.
649
+ static const intptr_t kMuWrWait = 0x0020L;
650
+ static const intptr_t kMuSpin = 0x0040L; // spinlock protects wait list
651
+ static const intptr_t kMuLow = 0x00ffL; // mask all mutex bits
652
+ static const intptr_t kMuHigh = ~kMuLow; // mask pointer/reader count
653
+
654
+ static_assert((0xab & (kMuWriter | kMuReader)) == (kMuWriter | kMuReader),
655
+ "The debug allocator's uninitialized pattern (0xab) must be an "
656
+ "invalid mutex state");
657
+ static_assert((0xcd & (kMuWriter | kMuReader)) == (kMuWriter | kMuReader),
658
+ "The debug allocator's freed pattern (0xcd) must be an invalid "
659
+ "mutex state");
660
+
661
+ // Hack to make constant values available to gdb pretty printer
662
+ enum {
663
+ kGdbMuSpin = kMuSpin,
664
+ kGdbMuEvent = kMuEvent,
665
+ kGdbMuWait = kMuWait,
666
+ kGdbMuWriter = kMuWriter,
667
+ kGdbMuDesig = kMuDesig,
668
+ kGdbMuWrWait = kMuWrWait,
669
+ kGdbMuReader = kMuReader,
670
+ kGdbMuLow = kMuLow,
671
+ };
672
+
673
+ // kMuWrWait implies kMuWait.
674
+ // kMuReader and kMuWriter are mutually exclusive.
675
+ // If kMuReader is zero, there are no readers.
676
+ // Otherwise, if kMuWait is zero, the high order bits contain a count of the
677
+ // number of readers. Otherwise, the reader count is held in
678
+ // PerThreadSynch::readers of the most recently queued waiter, again in the
679
+ // bits above kMuLow.
680
+ static const intptr_t kMuOne = 0x0100; // a count of one reader
681
+
682
+ // flags passed to Enqueue and LockSlow{,WithTimeout,Loop}
683
+ static const int kMuHasBlocked = 0x01; // already blocked (MUST == 1)
684
+ static const int kMuIsCond = 0x02; // conditional waiter (CV or Condition)
685
+ static const int kMuIsFer = 0x04; // wait morphing from a CondVar
686
+
687
+ static_assert(PerThreadSynch::kAlignment > kMuLow,
688
+ "PerThreadSynch::kAlignment must be greater than kMuLow");
689
+
690
+ // This struct contains various bitmasks to be used in
691
+ // acquiring and releasing a mutex in a particular mode.
692
+ struct MuHowS {
693
+ // if all the bits in fast_need_zero are zero, the lock can be acquired by
694
+ // adding fast_add and oring fast_or. The bit kMuDesig should be reset iff
695
+ // this is the designated waker.
696
+ intptr_t fast_need_zero;
697
+ intptr_t fast_or;
698
+ intptr_t fast_add;
699
+
700
+ intptr_t slow_need_zero; // fast_need_zero with events (e.g. logging)
701
+
702
+ intptr_t slow_inc_need_zero; // if all the bits in slow_inc_need_zero are
703
+ // zero a reader can acquire a read share by
704
+ // setting the reader bit and incrementing
705
+ // the reader count (in last waiter since
706
+ // we're now slow-path). kMuWrWait be may
707
+ // be ignored if we already waited once.
708
+ };
709
+
710
+ static const MuHowS kSharedS = {
711
+ // shared or read lock
712
+ kMuWriter | kMuWait | kMuEvent, // fast_need_zero
713
+ kMuReader, // fast_or
714
+ kMuOne, // fast_add
715
+ kMuWriter | kMuWait, // slow_need_zero
716
+ kMuSpin | kMuWriter | kMuWrWait, // slow_inc_need_zero
717
+ };
718
+ static const MuHowS kExclusiveS = {
719
+ // exclusive or write lock
720
+ kMuWriter | kMuReader | kMuEvent, // fast_need_zero
721
+ kMuWriter, // fast_or
722
+ 0, // fast_add
723
+ kMuWriter | kMuReader, // slow_need_zero
724
+ ~static_cast<intptr_t>(0), // slow_inc_need_zero
725
+ };
726
+ static const Mutex::MuHow kShared = &kSharedS; // shared lock
727
+ static const Mutex::MuHow kExclusive = &kExclusiveS; // exclusive lock
728
+
729
+ #ifdef NDEBUG
730
+ static constexpr bool kDebugMode = false;
731
+ #else
732
+ static constexpr bool kDebugMode = true;
733
+ #endif
734
+
735
+ #ifdef ABSL_INTERNAL_HAVE_TSAN_INTERFACE
736
+ static unsigned TsanFlags(Mutex::MuHow how) {
737
+ return how == kShared ? __tsan_mutex_read_lock : 0;
738
+ }
739
+ #endif
740
+
741
+ #if defined(__APPLE__) || defined(ABSL_BUILD_DLL)
742
+ // When building a dll symbol export lists may reference the destructor
743
+ // and want it to be an exported symbol rather than an inline function.
744
+ // Some apple builds also do dynamic library build but don't say it explicitly.
745
+ Mutex::~Mutex() { Dtor(); }
746
+ #endif
747
+
748
+ #if !defined(NDEBUG) || defined(ABSL_HAVE_THREAD_SANITIZER) || \
749
+ defined(ABSL_BUILD_DLL)
750
+ void Mutex::Dtor() {
751
+ if (kDebugMode) {
752
+ this->ForgetDeadlockInfo();
753
+ }
754
+ ABSL_TSAN_MUTEX_DESTROY(this, __tsan_mutex_not_static);
755
+ }
756
+ #endif
757
+
758
+ void Mutex::EnableDebugLog(const char* name) {
759
+ // Need to disable writes here and in EnableInvariantDebugging to prevent
760
+ // false race reports on SynchEvent objects. TSan ignores synchronization
761
+ // on synch_event_mu in Lock/Unlock/etc methods due to mutex annotations,
762
+ // but it sees few accesses to SynchEvent in EvalConditionAnnotated.
763
+ // If we don't ignore accesses here, it can result in false races
764
+ // between EvalConditionAnnotated and SynchEvent reuse in EnsureSynchEvent.
765
+ ABSL_ANNOTATE_IGNORE_WRITES_BEGIN();
766
+ SynchEvent* e = EnsureSynchEvent(&this->mu_, name, kMuEvent, kMuSpin);
767
+ e->log = true;
768
+ UnrefSynchEvent(e);
769
+ // This prevents "error: undefined symbol: absl::Mutex::~Mutex()"
770
+ // in a release build (NDEBUG defined) when a test does "#undef NDEBUG"
771
+ // to use assert macro. In such case, the test does not get the dtor
772
+ // definition because it's supposed to be outline when NDEBUG is not defined,
773
+ // and this source file does not define one either because NDEBUG is defined.
774
+ // Since it's not possible to take address of a destructor, we move the
775
+ // actual destructor code into the separate Dtor function and force the
776
+ // compiler to emit this function even if it's inline by taking its address.
777
+ ABSL_ATTRIBUTE_UNUSED volatile auto dtor = &Mutex::Dtor;
778
+ ABSL_ANNOTATE_IGNORE_WRITES_END();
779
+ }
780
+
781
+ void EnableMutexInvariantDebugging(bool enabled) {
782
+ synch_check_invariants.store(enabled, std::memory_order_release);
783
+ }
784
+
785
+ void Mutex::EnableInvariantDebugging(void (*invariant)(void*), void* arg) {
786
+ ABSL_ANNOTATE_IGNORE_WRITES_BEGIN();
787
+ if (synch_check_invariants.load(std::memory_order_acquire) &&
788
+ invariant != nullptr) {
789
+ SynchEvent* e = EnsureSynchEvent(&this->mu_, nullptr, kMuEvent, kMuSpin);
790
+ e->invariant = invariant;
791
+ e->arg = arg;
792
+ UnrefSynchEvent(e);
793
+ }
794
+ ABSL_ANNOTATE_IGNORE_WRITES_END();
795
+ }
796
+
797
+ void SetMutexDeadlockDetectionMode(OnDeadlockCycle mode) {
798
+ synch_deadlock_detection.store(mode, std::memory_order_release);
799
+ }
800
+
801
+ // Return true iff threads x and y are part of the same equivalence
802
+ // class of waiters. An equivalence class is defined as the set of
803
+ // waiters with the same condition, type of lock, and thread priority.
804
+ //
805
+ // Requires that x and y be waiting on the same Mutex queue.
806
+ static bool MuEquivalentWaiter(PerThreadSynch* x, PerThreadSynch* y) {
807
+ return x->waitp->how == y->waitp->how && x->priority == y->priority &&
808
+ Condition::GuaranteedEqual(x->waitp->cond, y->waitp->cond);
809
+ }
810
+
811
+ // Given the contents of a mutex word containing a PerThreadSynch pointer,
812
+ // return the pointer.
813
+ static inline PerThreadSynch* GetPerThreadSynch(intptr_t v) {
814
+ return reinterpret_cast<PerThreadSynch*>(v & kMuHigh);
815
+ }
816
+
817
+ // The next several routines maintain the per-thread next and skip fields
818
+ // used in the Mutex waiter queue.
819
+ // The queue is a circular singly-linked list, of which the "head" is the
820
+ // last element, and head->next if the first element.
821
+ // The skip field has the invariant:
822
+ // For thread x, x->skip is one of:
823
+ // - invalid (iff x is not in a Mutex wait queue),
824
+ // - null, or
825
+ // - a pointer to a distinct thread waiting later in the same Mutex queue
826
+ // such that all threads in [x, x->skip] have the same condition, priority
827
+ // and lock type (MuEquivalentWaiter() is true for all pairs in [x,
828
+ // x->skip]).
829
+ // In addition, if x->skip is valid, (x->may_skip || x->skip == null)
830
+ //
831
+ // By the spec of MuEquivalentWaiter(), it is not necessary when removing the
832
+ // first runnable thread y from the front a Mutex queue to adjust the skip
833
+ // field of another thread x because if x->skip==y, x->skip must (have) become
834
+ // invalid before y is removed. The function TryRemove can remove a specified
835
+ // thread from an arbitrary position in the queue whether runnable or not, so
836
+ // it fixes up skip fields that would otherwise be left dangling.
837
+ // The statement
838
+ // if (x->may_skip && MuEquivalentWaiter(x, x->next)) { x->skip = x->next; }
839
+ // maintains the invariant provided x is not the last waiter in a Mutex queue
840
+ // The statement
841
+ // if (x->skip != null) { x->skip = x->skip->skip; }
842
+ // maintains the invariant.
843
+
844
+ // Returns the last thread y in a mutex waiter queue such that all threads in
845
+ // [x, y] inclusive share the same condition. Sets skip fields of some threads
846
+ // in that range to optimize future evaluation of Skip() on x values in
847
+ // the range. Requires thread x is in a mutex waiter queue.
848
+ // The locking is unusual. Skip() is called under these conditions:
849
+ // - spinlock is held in call from Enqueue(), with maybe_unlocking == false
850
+ // - Mutex is held in call from UnlockSlow() by last unlocker, with
851
+ // maybe_unlocking == true
852
+ // - both Mutex and spinlock are held in call from DequeueAllWakeable() (from
853
+ // UnlockSlow()) and TryRemove()
854
+ // These cases are mutually exclusive, so Skip() never runs concurrently
855
+ // with itself on the same Mutex. The skip chain is used in these other places
856
+ // that cannot occur concurrently:
857
+ // - FixSkip() (from TryRemove()) - spinlock and Mutex are held)
858
+ // - Dequeue() (with spinlock and Mutex held)
859
+ // - UnlockSlow() (with spinlock and Mutex held)
860
+ // A more complex case is Enqueue()
861
+ // - Enqueue() (with spinlock held and maybe_unlocking == false)
862
+ // This is the first case in which Skip is called, above.
863
+ // - Enqueue() (without spinlock held; but queue is empty and being freshly
864
+ // formed)
865
+ // - Enqueue() (with spinlock held and maybe_unlocking == true)
866
+ // The first case has mutual exclusion, and the second isolation through
867
+ // working on an otherwise unreachable data structure.
868
+ // In the last case, Enqueue() is required to change no skip/next pointers
869
+ // except those in the added node and the former "head" node. This implies
870
+ // that the new node is added after head, and so must be the new head or the
871
+ // new front of the queue.
872
+ static PerThreadSynch* Skip(PerThreadSynch* x) {
873
+ PerThreadSynch* x0 = nullptr;
874
+ PerThreadSynch* x1 = x;
875
+ PerThreadSynch* x2 = x->skip;
876
+ if (x2 != nullptr) {
877
+ // Each iteration attempts to advance sequence (x0,x1,x2) to next sequence
878
+ // such that x1 == x0->skip && x2 == x1->skip
879
+ while ((x0 = x1, x1 = x2, x2 = x2->skip) != nullptr) {
880
+ x0->skip = x2; // short-circuit skip from x0 to x2
881
+ }
882
+ x->skip = x1; // short-circuit skip from x to result
883
+ }
884
+ return x1;
885
+ }
886
+
887
+ // "ancestor" appears before "to_be_removed" in the same Mutex waiter queue.
888
+ // The latter is going to be removed out of order, because of a timeout.
889
+ // Check whether "ancestor" has a skip field pointing to "to_be_removed",
890
+ // and fix it if it does.
891
+ static void FixSkip(PerThreadSynch* ancestor, PerThreadSynch* to_be_removed) {
892
+ if (ancestor->skip == to_be_removed) { // ancestor->skip left dangling
893
+ if (to_be_removed->skip != nullptr) {
894
+ ancestor->skip = to_be_removed->skip; // can skip past to_be_removed
895
+ } else if (ancestor->next != to_be_removed) { // they are not adjacent
896
+ ancestor->skip = ancestor->next; // can skip one past ancestor
897
+ } else {
898
+ ancestor->skip = nullptr; // can't skip at all
899
+ }
900
+ }
901
+ }
902
+
903
+ static void CondVarEnqueue(SynchWaitParams* waitp);
904
+
905
+ // Enqueue thread "waitp->thread" on a waiter queue.
906
+ // Called with mutex spinlock held if head != nullptr
907
+ // If head==nullptr and waitp->cv_word==nullptr, then Enqueue() is
908
+ // idempotent; it alters no state associated with the existing (empty)
909
+ // queue.
910
+ //
911
+ // If waitp->cv_word == nullptr, queue the thread at either the front or
912
+ // the end (according to its priority) of the circular mutex waiter queue whose
913
+ // head is "head", and return the new head. mu is the previous mutex state,
914
+ // which contains the reader count (perhaps adjusted for the operation in
915
+ // progress) if the list was empty and a read lock held, and the holder hint if
916
+ // the list was empty and a write lock held. (flags & kMuIsCond) indicates
917
+ // whether this thread was transferred from a CondVar or is waiting for a
918
+ // non-trivial condition. In this case, Enqueue() never returns nullptr
919
+ //
920
+ // If waitp->cv_word != nullptr, CondVarEnqueue() is called, and "head" is
921
+ // returned. This mechanism is used by CondVar to queue a thread on the
922
+ // condition variable queue instead of the mutex queue in implementing Wait().
923
+ // In this case, Enqueue() can return nullptr (if head==nullptr).
924
+ static PerThreadSynch* Enqueue(PerThreadSynch* head, SynchWaitParams* waitp,
925
+ intptr_t mu, int flags) {
926
+ // If we have been given a cv_word, call CondVarEnqueue() and return
927
+ // the previous head of the Mutex waiter queue.
928
+ if (waitp->cv_word != nullptr) {
929
+ CondVarEnqueue(waitp);
930
+ return head;
931
+ }
932
+
933
+ PerThreadSynch* s = waitp->thread;
934
+ ABSL_RAW_CHECK(
935
+ s->waitp == nullptr || // normal case
936
+ s->waitp == waitp || // Fer()---transfer from condition variable
937
+ s->suppress_fatal_errors,
938
+ "detected illegal recursion into Mutex code");
939
+ s->waitp = waitp;
940
+ s->skip = nullptr; // maintain skip invariant (see above)
941
+ s->may_skip = true; // always true on entering queue
942
+ s->wake = false; // not being woken
943
+ s->cond_waiter = ((flags & kMuIsCond) != 0);
944
+ #ifdef ABSL_HAVE_PTHREAD_GETSCHEDPARAM
945
+ if ((flags & kMuIsFer) == 0) {
946
+ assert(s == Synch_GetPerThread());
947
+ int64_t now_cycles = CycleClock::Now();
948
+ if (s->next_priority_read_cycles < now_cycles) {
949
+ // Every so often, update our idea of the thread's priority.
950
+ // pthread_getschedparam() is 5% of the block/wakeup time;
951
+ // CycleClock::Now() is 0.5%.
952
+ int policy;
953
+ struct sched_param param;
954
+ const int err = pthread_getschedparam(pthread_self(), &policy, &param);
955
+ if (err != 0) {
956
+ ABSL_RAW_LOG(ERROR, "pthread_getschedparam failed: %d", err);
957
+ } else {
958
+ s->priority = param.sched_priority;
959
+ s->next_priority_read_cycles =
960
+ now_cycles + static_cast<int64_t>(CycleClock::Frequency());
961
+ }
962
+ }
963
+ }
964
+ #endif
965
+ if (head == nullptr) { // s is the only waiter
966
+ s->next = s; // it's the only entry in the cycle
967
+ s->readers = mu; // reader count is from mu word
968
+ s->maybe_unlocking = false; // no one is searching an empty list
969
+ head = s; // s is new head
970
+ } else {
971
+ PerThreadSynch* enqueue_after = nullptr; // we'll put s after this element
972
+ #ifdef ABSL_HAVE_PTHREAD_GETSCHEDPARAM
973
+ if (s->priority > head->priority) { // s's priority is above head's
974
+ // try to put s in priority-fifo order, or failing that at the front.
975
+ if (!head->maybe_unlocking) {
976
+ // No unlocker can be scanning the queue, so we can insert into the
977
+ // middle of the queue.
978
+ //
979
+ // Within a skip chain, all waiters have the same priority, so we can
980
+ // skip forward through the chains until we find one with a lower
981
+ // priority than the waiter to be enqueued.
982
+ PerThreadSynch* advance_to = head; // next value of enqueue_after
983
+ do {
984
+ enqueue_after = advance_to;
985
+ // (side-effect: optimizes skip chain)
986
+ advance_to = Skip(enqueue_after->next);
987
+ } while (s->priority <= advance_to->priority);
988
+ // termination guaranteed because s->priority > head->priority
989
+ // and head is the end of a skip chain
990
+ } else if (waitp->how == kExclusive && waitp->cond == nullptr) {
991
+ // An unlocker could be scanning the queue, but we know it will recheck
992
+ // the queue front for writers that have no condition, which is what s
993
+ // is, so an insert at front is safe.
994
+ enqueue_after = head; // add after head, at front
995
+ }
996
+ }
997
+ #endif
998
+ if (enqueue_after != nullptr) {
999
+ s->next = enqueue_after->next;
1000
+ enqueue_after->next = s;
1001
+
1002
+ // enqueue_after can be: head, Skip(...), or cur.
1003
+ // The first two imply enqueue_after->skip == nullptr, and
1004
+ // the last is used only if MuEquivalentWaiter(s, cur).
1005
+ // We require this because clearing enqueue_after->skip
1006
+ // is impossible; enqueue_after's predecessors might also
1007
+ // incorrectly skip over s if we were to allow other
1008
+ // insertion points.
1009
+ ABSL_RAW_CHECK(enqueue_after->skip == nullptr ||
1010
+ MuEquivalentWaiter(enqueue_after, s),
1011
+ "Mutex Enqueue failure");
1012
+
1013
+ if (enqueue_after != head && enqueue_after->may_skip &&
1014
+ MuEquivalentWaiter(enqueue_after, enqueue_after->next)) {
1015
+ // enqueue_after can skip to its new successor, s
1016
+ enqueue_after->skip = enqueue_after->next;
1017
+ }
1018
+ if (MuEquivalentWaiter(s, s->next)) { // s->may_skip is known to be true
1019
+ s->skip = s->next; // s may skip to its successor
1020
+ }
1021
+ } else if ((flags & kMuHasBlocked) &&
1022
+ (s->priority >= head->next->priority) &&
1023
+ (!head->maybe_unlocking ||
1024
+ (waitp->how == kExclusive &&
1025
+ Condition::GuaranteedEqual(waitp->cond, nullptr)))) {
1026
+ // This thread has already waited, then was woken, then failed to acquire
1027
+ // the mutex and now tries to requeue. Try to requeue it at head,
1028
+ // otherwise it can suffer bad latency (wait whole queue several times).
1029
+ // However, we need to be conservative. First, we need to ensure that we
1030
+ // respect priorities. Then, we need to be careful to not break wait
1031
+ // queue invariants: we require either that unlocker is not scanning
1032
+ // the queue or that the current thread is a writer with no condition
1033
+ // (unlocker will recheck the queue for such waiters).
1034
+ s->next = head->next;
1035
+ head->next = s;
1036
+ if (MuEquivalentWaiter(s, s->next)) { // s->may_skip is known to be true
1037
+ s->skip = s->next; // s may skip to its successor
1038
+ }
1039
+ } else { // enqueue not done any other way, so
1040
+ // we're inserting s at the back
1041
+ // s will become new head; copy data from head into it
1042
+ s->next = head->next; // add s after head
1043
+ head->next = s;
1044
+ s->readers = head->readers; // reader count is from previous head
1045
+ s->maybe_unlocking = head->maybe_unlocking; // same for unlock hint
1046
+ if (head->may_skip && MuEquivalentWaiter(head, s)) {
1047
+ // head now has successor; may skip
1048
+ head->skip = s;
1049
+ }
1050
+ head = s; // s is new head
1051
+ }
1052
+ }
1053
+ s->state.store(PerThreadSynch::kQueued, std::memory_order_relaxed);
1054
+ return head;
1055
+ }
1056
+
1057
+ // Dequeue the successor pw->next of thread pw from the Mutex waiter queue
1058
+ // whose last element is head. The new head element is returned, or null
1059
+ // if the list is made empty.
1060
+ // Dequeue is called with both spinlock and Mutex held.
1061
+ static PerThreadSynch* Dequeue(PerThreadSynch* head, PerThreadSynch* pw) {
1062
+ PerThreadSynch* w = pw->next;
1063
+ pw->next = w->next; // snip w out of list
1064
+ if (head == w) { // we removed the head
1065
+ head = (pw == w) ? nullptr : pw; // either emptied list, or pw is new head
1066
+ } else if (pw != head && MuEquivalentWaiter(pw, pw->next)) {
1067
+ // pw can skip to its new successor
1068
+ if (pw->next->skip !=
1069
+ nullptr) { // either skip to its successors skip target
1070
+ pw->skip = pw->next->skip;
1071
+ } else { // or to pw's successor
1072
+ pw->skip = pw->next;
1073
+ }
1074
+ }
1075
+ return head;
1076
+ }
1077
+
1078
+ // Traverse the elements [ pw->next, h] of the circular list whose last element
1079
+ // is head.
1080
+ // Remove all elements with wake==true and place them in the
1081
+ // singly-linked list wake_list in the order found. Assumes that
1082
+ // there is only one such element if the element has how == kExclusive.
1083
+ // Return the new head.
1084
+ static PerThreadSynch* DequeueAllWakeable(PerThreadSynch* head,
1085
+ PerThreadSynch* pw,
1086
+ PerThreadSynch** wake_tail) {
1087
+ PerThreadSynch* orig_h = head;
1088
+ PerThreadSynch* w = pw->next;
1089
+ bool skipped = false;
1090
+ do {
1091
+ if (w->wake) { // remove this element
1092
+ ABSL_RAW_CHECK(pw->skip == nullptr, "bad skip in DequeueAllWakeable");
1093
+ // we're removing pw's successor so either pw->skip is zero or we should
1094
+ // already have removed pw since if pw->skip!=null, pw has the same
1095
+ // condition as w.
1096
+ head = Dequeue(head, pw);
1097
+ w->next = *wake_tail; // keep list terminated
1098
+ *wake_tail = w; // add w to wake_list;
1099
+ wake_tail = &w->next; // next addition to end
1100
+ if (w->waitp->how == kExclusive) { // wake at most 1 writer
1101
+ break;
1102
+ }
1103
+ } else { // not waking this one; skip
1104
+ pw = Skip(w); // skip as much as possible
1105
+ skipped = true;
1106
+ }
1107
+ w = pw->next;
1108
+ // We want to stop processing after we've considered the original head,
1109
+ // orig_h. We can't test for w==orig_h in the loop because w may skip over
1110
+ // it; we are guaranteed only that w's predecessor will not skip over
1111
+ // orig_h. When we've considered orig_h, either we've processed it and
1112
+ // removed it (so orig_h != head), or we considered it and skipped it (so
1113
+ // skipped==true && pw == head because skipping from head always skips by
1114
+ // just one, leaving pw pointing at head). So we want to
1115
+ // continue the loop with the negation of that expression.
1116
+ } while (orig_h == head && (pw != head || !skipped));
1117
+ return head;
1118
+ }
1119
+
1120
+ // Try to remove thread s from the list of waiters on this mutex.
1121
+ // Does nothing if s is not on the waiter list.
1122
+ void Mutex::TryRemove(PerThreadSynch* s) {
1123
+ SchedulingGuard::ScopedDisable disable_rescheduling;
1124
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1125
+ // acquire spinlock & lock
1126
+ if ((v & (kMuWait | kMuSpin | kMuWriter | kMuReader)) == kMuWait &&
1127
+ mu_.compare_exchange_strong(v, v | kMuSpin | kMuWriter,
1128
+ std::memory_order_acquire,
1129
+ std::memory_order_relaxed)) {
1130
+ PerThreadSynch* h = GetPerThreadSynch(v);
1131
+ if (h != nullptr) {
1132
+ PerThreadSynch* pw = h; // pw is w's predecessor
1133
+ PerThreadSynch* w;
1134
+ if ((w = pw->next) != s) { // search for thread,
1135
+ do { // processing at least one element
1136
+ // If the current element isn't equivalent to the waiter to be
1137
+ // removed, we can skip the entire chain.
1138
+ if (!MuEquivalentWaiter(s, w)) {
1139
+ pw = Skip(w); // so skip all that won't match
1140
+ // we don't have to worry about dangling skip fields
1141
+ // in the threads we skipped; none can point to s
1142
+ // because they are in a different equivalence class.
1143
+ } else { // seeking same condition
1144
+ FixSkip(w, s); // fix up any skip pointer from w to s
1145
+ pw = w;
1146
+ }
1147
+ // don't search further if we found the thread, or we're about to
1148
+ // process the first thread again.
1149
+ } while ((w = pw->next) != s && pw != h);
1150
+ }
1151
+ if (w == s) { // found thread; remove it
1152
+ // pw->skip may be non-zero here; the loop above ensured that
1153
+ // no ancestor of s can skip to s, so removal is safe anyway.
1154
+ h = Dequeue(h, pw);
1155
+ s->next = nullptr;
1156
+ s->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
1157
+ }
1158
+ }
1159
+ intptr_t nv;
1160
+ do { // release spinlock and lock
1161
+ v = mu_.load(std::memory_order_relaxed);
1162
+ nv = v & (kMuDesig | kMuEvent);
1163
+ if (h != nullptr) {
1164
+ nv |= kMuWait | reinterpret_cast<intptr_t>(h);
1165
+ h->readers = 0; // we hold writer lock
1166
+ h->maybe_unlocking = false; // finished unlocking
1167
+ }
1168
+ } while (!mu_.compare_exchange_weak(v, nv, std::memory_order_release,
1169
+ std::memory_order_relaxed));
1170
+ }
1171
+ }
1172
+
1173
+ // Wait until thread "s", which must be the current thread, is removed from the
1174
+ // this mutex's waiter queue. If "s->waitp->timeout" has a timeout, wake up
1175
+ // if the wait extends past the absolute time specified, even if "s" is still
1176
+ // on the mutex queue. In this case, remove "s" from the queue and return
1177
+ // true, otherwise return false.
1178
+ void Mutex::Block(PerThreadSynch* s) {
1179
+ while (s->state.load(std::memory_order_acquire) == PerThreadSynch::kQueued) {
1180
+ if (!DecrementSynchSem(this, s, s->waitp->timeout)) {
1181
+ // After a timeout, we go into a spin loop until we remove ourselves
1182
+ // from the queue, or someone else removes us. We can't be sure to be
1183
+ // able to remove ourselves in a single lock acquisition because this
1184
+ // mutex may be held, and the holder has the right to read the centre
1185
+ // of the waiter queue without holding the spinlock.
1186
+ this->TryRemove(s);
1187
+ int c = 0;
1188
+ while (s->next != nullptr) {
1189
+ c = synchronization_internal::MutexDelay(c, GENTLE);
1190
+ this->TryRemove(s);
1191
+ }
1192
+ if (kDebugMode) {
1193
+ // This ensures that we test the case that TryRemove() is called when s
1194
+ // is not on the queue.
1195
+ this->TryRemove(s);
1196
+ }
1197
+ s->waitp->timeout = KernelTimeout::Never(); // timeout is satisfied
1198
+ s->waitp->cond = nullptr; // condition no longer relevant for wakeups
1199
+ }
1200
+ }
1201
+ ABSL_RAW_CHECK(s->waitp != nullptr || s->suppress_fatal_errors,
1202
+ "detected illegal recursion in Mutex code");
1203
+ s->waitp = nullptr;
1204
+ }
1205
+
1206
+ // Wake thread w, and return the next thread in the list.
1207
+ PerThreadSynch* Mutex::Wakeup(PerThreadSynch* w) {
1208
+ PerThreadSynch* next = w->next;
1209
+ w->next = nullptr;
1210
+ w->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
1211
+ IncrementSynchSem(this, w);
1212
+
1213
+ return next;
1214
+ }
1215
+
1216
+ static GraphId GetGraphIdLocked(Mutex* mu)
1217
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(deadlock_graph_mu) {
1218
+ if (!deadlock_graph) { // (re)create the deadlock graph.
1219
+ deadlock_graph =
1220
+ new (base_internal::LowLevelAlloc::Alloc(sizeof(*deadlock_graph)))
1221
+ GraphCycles;
1222
+ }
1223
+ return deadlock_graph->GetId(mu);
1224
+ }
1225
+
1226
+ static GraphId GetGraphId(Mutex* mu) ABSL_LOCKS_EXCLUDED(deadlock_graph_mu) {
1227
+ base_internal::SpinLockHolder l(deadlock_graph_mu);
1228
+ GraphId id = GetGraphIdLocked(mu);
1229
+ return id;
1230
+ }
1231
+
1232
+ // Record a lock acquisition. This is used in debug mode for deadlock
1233
+ // detection. The held_locks pointer points to the relevant data
1234
+ // structure for each case.
1235
+ static void LockEnter(Mutex* mu, GraphId id, SynchLocksHeld* held_locks) {
1236
+ int n = held_locks->n;
1237
+ int i = 0;
1238
+ while (i != n && held_locks->locks[i].id != id) {
1239
+ i++;
1240
+ }
1241
+ if (i == n) {
1242
+ if (n == ABSL_ARRAYSIZE(held_locks->locks)) {
1243
+ held_locks->overflow = true; // lost some data
1244
+ } else { // we have room for lock
1245
+ held_locks->locks[i].mu = mu;
1246
+ held_locks->locks[i].count = 1;
1247
+ held_locks->locks[i].id = id;
1248
+ held_locks->n = n + 1;
1249
+ }
1250
+ } else {
1251
+ held_locks->locks[i].count++;
1252
+ }
1253
+ }
1254
+
1255
+ // Record a lock release. Each call to LockEnter(mu, id, x) should be
1256
+ // eventually followed by a call to LockLeave(mu, id, x) by the same thread.
1257
+ // It does not process the event if is not needed when deadlock detection is
1258
+ // disabled.
1259
+ static void LockLeave(Mutex* mu, GraphId id, SynchLocksHeld* held_locks) {
1260
+ int n = held_locks->n;
1261
+ int i = 0;
1262
+ while (i != n && held_locks->locks[i].id != id) {
1263
+ i++;
1264
+ }
1265
+ if (i == n) {
1266
+ if (!held_locks->overflow) {
1267
+ // The deadlock id may have been reassigned after ForgetDeadlockInfo,
1268
+ // but in that case mu should still be present.
1269
+ i = 0;
1270
+ while (i != n && held_locks->locks[i].mu != mu) {
1271
+ i++;
1272
+ }
1273
+ if (i == n) { // mu missing means releasing unheld lock
1274
+ SynchEvent* mu_events = GetSynchEvent(mu);
1275
+ ABSL_RAW_LOG(FATAL,
1276
+ "thread releasing lock it does not hold: %p %s; "
1277
+ ,
1278
+ static_cast<void*>(mu),
1279
+ mu_events == nullptr ? "" : mu_events->name);
1280
+ }
1281
+ }
1282
+ } else if (held_locks->locks[i].count == 1) {
1283
+ held_locks->n = n - 1;
1284
+ held_locks->locks[i] = held_locks->locks[n - 1];
1285
+ held_locks->locks[n - 1].id = InvalidGraphId();
1286
+ held_locks->locks[n - 1].mu =
1287
+ nullptr; // clear mu to please the leak detector.
1288
+ } else {
1289
+ assert(held_locks->locks[i].count > 0);
1290
+ held_locks->locks[i].count--;
1291
+ }
1292
+ }
1293
+
1294
+ // Call LockEnter() if in debug mode and deadlock detection is enabled.
1295
+ static inline void DebugOnlyLockEnter(Mutex* mu) {
1296
+ if (kDebugMode) {
1297
+ if (synch_deadlock_detection.load(std::memory_order_acquire) !=
1298
+ OnDeadlockCycle::kIgnore) {
1299
+ LockEnter(mu, GetGraphId(mu), Synch_GetAllLocks());
1300
+ }
1301
+ }
1302
+ }
1303
+
1304
+ // Call LockEnter() if in debug mode and deadlock detection is enabled.
1305
+ static inline void DebugOnlyLockEnter(Mutex* mu, GraphId id) {
1306
+ if (kDebugMode) {
1307
+ if (synch_deadlock_detection.load(std::memory_order_acquire) !=
1308
+ OnDeadlockCycle::kIgnore) {
1309
+ LockEnter(mu, id, Synch_GetAllLocks());
1310
+ }
1311
+ }
1312
+ }
1313
+
1314
+ // Call LockLeave() if in debug mode and deadlock detection is enabled.
1315
+ static inline void DebugOnlyLockLeave(Mutex* mu) {
1316
+ if (kDebugMode) {
1317
+ if (synch_deadlock_detection.load(std::memory_order_acquire) !=
1318
+ OnDeadlockCycle::kIgnore) {
1319
+ LockLeave(mu, GetGraphId(mu), Synch_GetAllLocks());
1320
+ }
1321
+ }
1322
+ }
1323
+
1324
+ static char* StackString(void** pcs, int n, char* buf, int maxlen,
1325
+ bool symbolize) {
1326
+ static constexpr int kSymLen = 200;
1327
+ char sym[kSymLen];
1328
+ int len = 0;
1329
+ for (int i = 0; i != n; i++) {
1330
+ if (len >= maxlen) return buf;
1331
+ size_t count = static_cast<size_t>(maxlen - len);
1332
+ if (symbolize) {
1333
+ if (!absl::Symbolize(pcs[i], sym, kSymLen)) {
1334
+ sym[0] = '\0';
1335
+ }
1336
+ snprintf(buf + len, count, "%s\t@ %p %s\n", (i == 0 ? "\n" : ""), pcs[i],
1337
+ sym);
1338
+ } else {
1339
+ snprintf(buf + len, count, " %p", pcs[i]);
1340
+ }
1341
+ len += static_cast<int>(strlen(&buf[len]));
1342
+ }
1343
+ return buf;
1344
+ }
1345
+
1346
+ static char* CurrentStackString(char* buf, int maxlen, bool symbolize) {
1347
+ void* pcs[40];
1348
+ return StackString(pcs, absl::GetStackTrace(pcs, ABSL_ARRAYSIZE(pcs), 2), buf,
1349
+ maxlen, symbolize);
1350
+ }
1351
+
1352
+ namespace {
1353
+ enum {
1354
+ kMaxDeadlockPathLen = 10
1355
+ }; // maximum length of a deadlock cycle;
1356
+ // a path this long would be remarkable
1357
+ // Buffers required to report a deadlock.
1358
+ // We do not allocate them on stack to avoid large stack frame.
1359
+ struct DeadlockReportBuffers {
1360
+ char buf[6100];
1361
+ GraphId path[kMaxDeadlockPathLen];
1362
+ };
1363
+
1364
+ struct ScopedDeadlockReportBuffers {
1365
+ ScopedDeadlockReportBuffers() {
1366
+ b = reinterpret_cast<DeadlockReportBuffers*>(
1367
+ base_internal::LowLevelAlloc::Alloc(sizeof(*b)));
1368
+ }
1369
+ ~ScopedDeadlockReportBuffers() { base_internal::LowLevelAlloc::Free(b); }
1370
+ DeadlockReportBuffers* b;
1371
+ };
1372
+
1373
+ // Helper to pass to GraphCycles::UpdateStackTrace.
1374
+ int GetStack(void** stack, int max_depth) {
1375
+ return absl::GetStackTrace(stack, max_depth, 3);
1376
+ }
1377
+ } // anonymous namespace
1378
+
1379
+ // Called in debug mode when a thread is about to acquire a lock in a way that
1380
+ // may block.
1381
+ static GraphId DeadlockCheck(Mutex* mu) {
1382
+ if (synch_deadlock_detection.load(std::memory_order_acquire) ==
1383
+ OnDeadlockCycle::kIgnore) {
1384
+ return InvalidGraphId();
1385
+ }
1386
+
1387
+ SynchLocksHeld* all_locks = Synch_GetAllLocks();
1388
+
1389
+ absl::base_internal::SpinLockHolder lock(deadlock_graph_mu);
1390
+ const GraphId mu_id = GetGraphIdLocked(mu);
1391
+
1392
+ if (all_locks->n == 0) {
1393
+ // There are no other locks held. Return now so that we don't need to
1394
+ // call GetSynchEvent(). This way we do not record the stack trace
1395
+ // for this Mutex. It's ok, since if this Mutex is involved in a deadlock,
1396
+ // it can't always be the first lock acquired by a thread.
1397
+ return mu_id;
1398
+ }
1399
+
1400
+ // We prefer to keep stack traces that show a thread holding and acquiring
1401
+ // as many locks as possible. This increases the chances that a given edge
1402
+ // in the acquires-before graph will be represented in the stack traces
1403
+ // recorded for the locks.
1404
+ deadlock_graph->UpdateStackTrace(mu_id, all_locks->n + 1, GetStack);
1405
+
1406
+ // For each other mutex already held by this thread:
1407
+ for (int i = 0; i != all_locks->n; i++) {
1408
+ const GraphId other_node_id = all_locks->locks[i].id;
1409
+ const Mutex* other =
1410
+ static_cast<const Mutex*>(deadlock_graph->Ptr(other_node_id));
1411
+ if (other == nullptr) {
1412
+ // Ignore stale lock
1413
+ continue;
1414
+ }
1415
+
1416
+ // Add the acquired-before edge to the graph.
1417
+ if (!deadlock_graph->InsertEdge(other_node_id, mu_id)) {
1418
+ ScopedDeadlockReportBuffers scoped_buffers;
1419
+ DeadlockReportBuffers* b = scoped_buffers.b;
1420
+ static int number_of_reported_deadlocks = 0;
1421
+ number_of_reported_deadlocks++;
1422
+ // Symbolize only 2 first deadlock report to avoid huge slowdowns.
1423
+ bool symbolize = number_of_reported_deadlocks <= 2;
1424
+ ABSL_RAW_LOG(ERROR, "Potential Mutex deadlock: %s",
1425
+ CurrentStackString(b->buf, sizeof (b->buf), symbolize));
1426
+ size_t len = 0;
1427
+ for (int j = 0; j != all_locks->n; j++) {
1428
+ void* pr = deadlock_graph->Ptr(all_locks->locks[j].id);
1429
+ if (pr != nullptr) {
1430
+ snprintf(b->buf + len, sizeof(b->buf) - len, " %p", pr);
1431
+ len += strlen(&b->buf[len]);
1432
+ }
1433
+ }
1434
+ ABSL_RAW_LOG(ERROR,
1435
+ "Acquiring absl::Mutex %p while holding %s; a cycle in the "
1436
+ "historical lock ordering graph has been observed",
1437
+ static_cast<void*>(mu), b->buf);
1438
+ ABSL_RAW_LOG(ERROR, "Cycle: ");
1439
+ int path_len = deadlock_graph->FindPath(mu_id, other_node_id,
1440
+ ABSL_ARRAYSIZE(b->path), b->path);
1441
+ for (int j = 0; j != path_len && j != ABSL_ARRAYSIZE(b->path); j++) {
1442
+ GraphId id = b->path[j];
1443
+ Mutex* path_mu = static_cast<Mutex*>(deadlock_graph->Ptr(id));
1444
+ if (path_mu == nullptr) continue;
1445
+ void** stack;
1446
+ int depth = deadlock_graph->GetStackTrace(id, &stack);
1447
+ snprintf(b->buf, sizeof(b->buf),
1448
+ "mutex@%p stack: ", static_cast<void*>(path_mu));
1449
+ StackString(stack, depth, b->buf + strlen(b->buf),
1450
+ static_cast<int>(sizeof(b->buf) - strlen(b->buf)),
1451
+ symbolize);
1452
+ ABSL_RAW_LOG(ERROR, "%s", b->buf);
1453
+ }
1454
+ if (path_len > static_cast<int>(ABSL_ARRAYSIZE(b->path))) {
1455
+ ABSL_RAW_LOG(ERROR, "(long cycle; list truncated)");
1456
+ }
1457
+ if (synch_deadlock_detection.load(std::memory_order_acquire) ==
1458
+ OnDeadlockCycle::kAbort) {
1459
+ deadlock_graph_mu.unlock(); // avoid deadlock in fatal sighandler
1460
+ ABSL_RAW_LOG(FATAL, "dying due to potential deadlock");
1461
+ return mu_id;
1462
+ }
1463
+ break; // report at most one potential deadlock per acquisition
1464
+ }
1465
+ }
1466
+
1467
+ return mu_id;
1468
+ }
1469
+
1470
+ // Invoke DeadlockCheck() iff we're in debug mode and
1471
+ // deadlock checking has been enabled.
1472
+ static inline GraphId DebugOnlyDeadlockCheck(Mutex* mu) {
1473
+ if (kDebugMode && synch_deadlock_detection.load(std::memory_order_acquire) !=
1474
+ OnDeadlockCycle::kIgnore) {
1475
+ return DeadlockCheck(mu);
1476
+ } else {
1477
+ return InvalidGraphId();
1478
+ }
1479
+ }
1480
+
1481
+ void Mutex::ForgetDeadlockInfo() {
1482
+ if (kDebugMode && synch_deadlock_detection.load(std::memory_order_acquire) !=
1483
+ OnDeadlockCycle::kIgnore) {
1484
+ deadlock_graph_mu.lock();
1485
+ if (deadlock_graph != nullptr) {
1486
+ deadlock_graph->RemoveNode(this);
1487
+ }
1488
+ deadlock_graph_mu.unlock();
1489
+ }
1490
+ }
1491
+
1492
+ void Mutex::AssertNotHeld() const {
1493
+ // We have the data to allow this check only if in debug mode and deadlock
1494
+ // detection is enabled.
1495
+ if (kDebugMode &&
1496
+ (mu_.load(std::memory_order_relaxed) & (kMuWriter | kMuReader)) != 0 &&
1497
+ synch_deadlock_detection.load(std::memory_order_acquire) !=
1498
+ OnDeadlockCycle::kIgnore) {
1499
+ GraphId id = GetGraphId(const_cast<Mutex*>(this));
1500
+ SynchLocksHeld* locks = Synch_GetAllLocks();
1501
+ for (int i = 0; i != locks->n; i++) {
1502
+ if (locks->locks[i].id == id) {
1503
+ SynchEvent* mu_events = GetSynchEvent(this);
1504
+ ABSL_RAW_LOG(FATAL, "thread should not hold mutex %p %s",
1505
+ static_cast<const void*>(this),
1506
+ (mu_events == nullptr ? "" : mu_events->name));
1507
+ }
1508
+ }
1509
+ }
1510
+ }
1511
+
1512
+ // Attempt to acquire *mu, and return whether successful. The implementation
1513
+ // may spin for a short while if the lock cannot be acquired immediately.
1514
+ static bool TryAcquireWithSpinning(std::atomic<intptr_t>* mu) {
1515
+ int c = globals.spinloop_iterations.load(std::memory_order_relaxed);
1516
+ do { // do/while somewhat faster on AMD
1517
+ intptr_t v = mu->load(std::memory_order_relaxed);
1518
+ if ((v & (kMuReader | kMuEvent)) != 0) {
1519
+ return false; // a reader or tracing -> give up
1520
+ } else if (((v & kMuWriter) == 0) && // no holder -> try to acquire
1521
+ mu->compare_exchange_strong(v, kMuWriter | v,
1522
+ std::memory_order_acquire,
1523
+ std::memory_order_relaxed)) {
1524
+ return true;
1525
+ }
1526
+ } while (--c > 0);
1527
+ return false;
1528
+ }
1529
+
1530
+ void Mutex::lock() {
1531
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, 0);
1532
+ GraphId id = DebugOnlyDeadlockCheck(this);
1533
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1534
+ // try fast acquire, then spin loop
1535
+ if (ABSL_PREDICT_FALSE((v & (kMuWriter | kMuReader | kMuEvent)) != 0) ||
1536
+ ABSL_PREDICT_FALSE(!mu_.compare_exchange_strong(
1537
+ v, kMuWriter | v, std::memory_order_acquire,
1538
+ std::memory_order_relaxed))) {
1539
+ // try spin acquire, then slow loop
1540
+ if (ABSL_PREDICT_FALSE(!TryAcquireWithSpinning(&this->mu_))) {
1541
+ this->LockSlow(kExclusive, nullptr, 0);
1542
+ }
1543
+ }
1544
+ DebugOnlyLockEnter(this, id);
1545
+ ABSL_TSAN_MUTEX_POST_LOCK(this, 0, 0);
1546
+ }
1547
+
1548
+ void Mutex::lock_shared() {
1549
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_read_lock);
1550
+ GraphId id = DebugOnlyDeadlockCheck(this);
1551
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1552
+ for (;;) {
1553
+ // If there are non-readers holding the lock, use the slow loop.
1554
+ if (ABSL_PREDICT_FALSE(v & (kMuWriter | kMuWait | kMuEvent)) != 0) {
1555
+ this->LockSlow(kShared, nullptr, 0);
1556
+ break;
1557
+ }
1558
+ // We can avoid the loop and only use the CAS when the lock is free or
1559
+ // only held by readers.
1560
+ if (ABSL_PREDICT_TRUE(mu_.compare_exchange_weak(
1561
+ v, (kMuReader | v) + kMuOne, std::memory_order_acquire,
1562
+ std::memory_order_relaxed))) {
1563
+ break;
1564
+ }
1565
+ }
1566
+ DebugOnlyLockEnter(this, id);
1567
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_read_lock, 0);
1568
+ }
1569
+
1570
+ bool Mutex::LockWhenCommon(const Condition& cond,
1571
+ synchronization_internal::KernelTimeout t,
1572
+ bool write) {
1573
+ MuHow how = write ? kExclusive : kShared;
1574
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, TsanFlags(how));
1575
+ GraphId id = DebugOnlyDeadlockCheck(this);
1576
+ bool res = LockSlowWithDeadline(how, &cond, t, 0);
1577
+ DebugOnlyLockEnter(this, id);
1578
+ ABSL_TSAN_MUTEX_POST_LOCK(this, TsanFlags(how), 0);
1579
+ return res;
1580
+ }
1581
+
1582
+ bool Mutex::AwaitCommon(const Condition& cond, KernelTimeout t) {
1583
+ if (kDebugMode) {
1584
+ this->AssertReaderHeld();
1585
+ }
1586
+ if (cond.Eval()) { // condition already true; nothing to do
1587
+ return true;
1588
+ }
1589
+ MuHow how =
1590
+ (mu_.load(std::memory_order_relaxed) & kMuWriter) ? kExclusive : kShared;
1591
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(this, TsanFlags(how));
1592
+ SynchWaitParams waitp(how, &cond, t, nullptr /*no cvmu*/,
1593
+ Synch_GetPerThreadAnnotated(this),
1594
+ nullptr /*no cv_word*/);
1595
+ this->UnlockSlow(&waitp);
1596
+ this->Block(waitp.thread);
1597
+ ABSL_TSAN_MUTEX_POST_UNLOCK(this, TsanFlags(how));
1598
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, TsanFlags(how));
1599
+ this->LockSlowLoop(&waitp, kMuHasBlocked | kMuIsCond);
1600
+ bool res = waitp.cond != nullptr || // => cond known true from LockSlowLoop
1601
+ EvalConditionAnnotated(&cond, this, true, false, how == kShared);
1602
+ ABSL_TSAN_MUTEX_POST_LOCK(this, TsanFlags(how), 0);
1603
+ ABSL_RAW_CHECK(res || t.has_timeout(),
1604
+ "condition untrue on return from Await");
1605
+ return res;
1606
+ }
1607
+
1608
+ bool Mutex::try_lock() {
1609
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_try_lock);
1610
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1611
+ // Try fast acquire.
1612
+ if (ABSL_PREDICT_TRUE((v & (kMuWriter | kMuReader | kMuEvent)) == 0)) {
1613
+ if (ABSL_PREDICT_TRUE(mu_.compare_exchange_strong(
1614
+ v, kMuWriter | v, std::memory_order_acquire,
1615
+ std::memory_order_relaxed))) {
1616
+ DebugOnlyLockEnter(this);
1617
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_try_lock, 0);
1618
+ return true;
1619
+ }
1620
+ } else if (ABSL_PREDICT_FALSE((v & kMuEvent) != 0)) {
1621
+ // We're recording events.
1622
+ return TryLockSlow();
1623
+ }
1624
+ ABSL_TSAN_MUTEX_POST_LOCK(
1625
+ this, __tsan_mutex_try_lock | __tsan_mutex_try_lock_failed, 0);
1626
+ return false;
1627
+ }
1628
+
1629
+ ABSL_ATTRIBUTE_NOINLINE bool Mutex::TryLockSlow() {
1630
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1631
+ if ((v & kExclusive->slow_need_zero) == 0 && // try fast acquire
1632
+ mu_.compare_exchange_strong(
1633
+ v, (kExclusive->fast_or | v) + kExclusive->fast_add,
1634
+ std::memory_order_acquire, std::memory_order_relaxed)) {
1635
+ DebugOnlyLockEnter(this);
1636
+ PostSynchEvent(this, SYNCH_EV_TRYLOCK_SUCCESS);
1637
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_try_lock, 0);
1638
+ return true;
1639
+ }
1640
+ PostSynchEvent(this, SYNCH_EV_TRYLOCK_FAILED);
1641
+ ABSL_TSAN_MUTEX_POST_LOCK(
1642
+ this, __tsan_mutex_try_lock | __tsan_mutex_try_lock_failed, 0);
1643
+ return false;
1644
+ }
1645
+
1646
+ bool Mutex::try_lock_shared() {
1647
+ ABSL_TSAN_MUTEX_PRE_LOCK(this,
1648
+ __tsan_mutex_read_lock | __tsan_mutex_try_lock);
1649
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1650
+ // Clang tends to unroll the loop when compiling with optimization.
1651
+ // But in this case it just unnecessary increases code size.
1652
+ // If CAS is failing due to contention, the jump cost is negligible.
1653
+ #if defined(__clang__)
1654
+ #pragma nounroll
1655
+ #endif
1656
+ // The while-loops (here and below) iterate only if the mutex word keeps
1657
+ // changing (typically because the reader count changes) under the CAS.
1658
+ // We limit the number of attempts to avoid having to think about livelock.
1659
+ for (int loop_limit = 5; loop_limit != 0; loop_limit--) {
1660
+ if (ABSL_PREDICT_FALSE((v & (kMuWriter | kMuWait | kMuEvent)) != 0)) {
1661
+ break;
1662
+ }
1663
+ if (ABSL_PREDICT_TRUE(mu_.compare_exchange_strong(
1664
+ v, (kMuReader | v) + kMuOne, std::memory_order_acquire,
1665
+ std::memory_order_relaxed))) {
1666
+ DebugOnlyLockEnter(this);
1667
+ ABSL_TSAN_MUTEX_POST_LOCK(
1668
+ this, __tsan_mutex_read_lock | __tsan_mutex_try_lock, 0);
1669
+ return true;
1670
+ }
1671
+ }
1672
+ if (ABSL_PREDICT_TRUE((v & kMuEvent) == 0)) {
1673
+ ABSL_TSAN_MUTEX_POST_LOCK(this,
1674
+ __tsan_mutex_read_lock | __tsan_mutex_try_lock |
1675
+ __tsan_mutex_try_lock_failed,
1676
+ 0);
1677
+ return false;
1678
+ }
1679
+ // we're recording events
1680
+ return ReaderTryLockSlow();
1681
+ }
1682
+
1683
+ ABSL_ATTRIBUTE_NOINLINE bool Mutex::ReaderTryLockSlow() {
1684
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1685
+ #if defined(__clang__)
1686
+ #pragma nounroll
1687
+ #endif
1688
+ for (int loop_limit = 5; loop_limit != 0; loop_limit--) {
1689
+ if ((v & kShared->slow_need_zero) == 0 &&
1690
+ mu_.compare_exchange_strong(v, (kMuReader | v) + kMuOne,
1691
+ std::memory_order_acquire,
1692
+ std::memory_order_relaxed)) {
1693
+ DebugOnlyLockEnter(this);
1694
+ PostSynchEvent(this, SYNCH_EV_READERTRYLOCK_SUCCESS);
1695
+ ABSL_TSAN_MUTEX_POST_LOCK(
1696
+ this, __tsan_mutex_read_lock | __tsan_mutex_try_lock, 0);
1697
+ return true;
1698
+ }
1699
+ }
1700
+ PostSynchEvent(this, SYNCH_EV_READERTRYLOCK_FAILED);
1701
+ ABSL_TSAN_MUTEX_POST_LOCK(this,
1702
+ __tsan_mutex_read_lock | __tsan_mutex_try_lock |
1703
+ __tsan_mutex_try_lock_failed,
1704
+ 0);
1705
+ return false;
1706
+ }
1707
+
1708
+ void Mutex::unlock() {
1709
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(this, 0);
1710
+ DebugOnlyLockLeave(this);
1711
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1712
+
1713
+ if (kDebugMode && ((v & (kMuWriter | kMuReader)) != kMuWriter)) {
1714
+ ABSL_RAW_LOG(FATAL, "Mutex unlocked when destroyed or not locked: v=0x%x",
1715
+ static_cast<unsigned>(v));
1716
+ }
1717
+
1718
+ // should_try_cas is whether we'll try a compare-and-swap immediately.
1719
+ // NOTE: optimized out when kDebugMode is false.
1720
+ bool should_try_cas = ((v & (kMuEvent | kMuWriter)) == kMuWriter &&
1721
+ (v & (kMuWait | kMuDesig)) != kMuWait);
1722
+
1723
+ // But, we can use an alternate computation of it, that compilers
1724
+ // currently don't find on their own. When that changes, this function
1725
+ // can be simplified.
1726
+ //
1727
+ // should_try_cas is true iff the bits satisfy the following conditions:
1728
+ //
1729
+ // Ev Wr Wa De
1730
+ // equal to 0 1
1731
+ // and not equal to 1 0
1732
+ //
1733
+ // after xoring by 0 1 0 1, this is equivalent to:
1734
+ //
1735
+ // equal to 0 0
1736
+ // and not equal to 1 1, which is the same as:
1737
+ //
1738
+ // smaller than 0 0 1 1
1739
+ static_assert(kMuEvent > kMuWait, "Needed for should_try_cas_fast");
1740
+ static_assert(kMuEvent > kMuDesig, "Needed for should_try_cas_fast");
1741
+ static_assert(kMuWriter > kMuWait, "Needed for should_try_cas_fast");
1742
+ static_assert(kMuWriter > kMuDesig, "Needed for should_try_cas_fast");
1743
+
1744
+ bool should_try_cas_fast =
1745
+ ((v ^ (kMuWriter | kMuDesig)) &
1746
+ (kMuEvent | kMuWriter | kMuWait | kMuDesig)) < (kMuWait | kMuDesig);
1747
+
1748
+ if (kDebugMode && should_try_cas != should_try_cas_fast) {
1749
+ // We would usually use PRIdPTR here, but is not correctly implemented
1750
+ // within the android toolchain.
1751
+ ABSL_RAW_LOG(FATAL, "internal logic error %llx %llx %llx\n",
1752
+ static_cast<long long>(v),
1753
+ static_cast<long long>(should_try_cas),
1754
+ static_cast<long long>(should_try_cas_fast));
1755
+ }
1756
+ if (should_try_cas_fast &&
1757
+ mu_.compare_exchange_strong(v, v & ~(kMuWrWait | kMuWriter),
1758
+ std::memory_order_release,
1759
+ std::memory_order_relaxed)) {
1760
+ // fast writer release (writer with no waiters or with designated waker)
1761
+ } else {
1762
+ this->UnlockSlow(nullptr /*no waitp*/); // take slow path
1763
+ }
1764
+ ABSL_TSAN_MUTEX_POST_UNLOCK(this, 0);
1765
+ }
1766
+
1767
+ // Requires v to represent a reader-locked state.
1768
+ static bool ExactlyOneReader(intptr_t v) {
1769
+ assert((v & (kMuWriter | kMuReader)) == kMuReader);
1770
+ assert((v & kMuHigh) != 0);
1771
+ // The more straightforward "(v & kMuHigh) == kMuOne" also works, but
1772
+ // on some architectures the following generates slightly smaller code.
1773
+ // It may be faster too.
1774
+ constexpr intptr_t kMuMultipleWaitersMask = kMuHigh ^ kMuOne;
1775
+ return (v & kMuMultipleWaitersMask) == 0;
1776
+ }
1777
+
1778
+ void Mutex::unlock_shared() {
1779
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(this, __tsan_mutex_read_lock);
1780
+ DebugOnlyLockLeave(this);
1781
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1782
+ assert((v & (kMuWriter | kMuReader)) == kMuReader);
1783
+ for (;;) {
1784
+ if (ABSL_PREDICT_FALSE((v & (kMuReader | kMuWait | kMuEvent)) !=
1785
+ kMuReader)) {
1786
+ this->UnlockSlow(nullptr /*no waitp*/); // take slow path
1787
+ break;
1788
+ }
1789
+ // fast reader release (reader with no waiters)
1790
+ intptr_t clear = ExactlyOneReader(v) ? kMuReader | kMuOne : kMuOne;
1791
+ if (ABSL_PREDICT_TRUE(
1792
+ mu_.compare_exchange_strong(v, v - clear, std::memory_order_release,
1793
+ std::memory_order_relaxed))) {
1794
+ break;
1795
+ }
1796
+ }
1797
+ ABSL_TSAN_MUTEX_POST_UNLOCK(this, __tsan_mutex_read_lock);
1798
+ }
1799
+
1800
+ // Clears the designated waker flag in the mutex if this thread has blocked, and
1801
+ // therefore may be the designated waker.
1802
+ static intptr_t ClearDesignatedWakerMask(int flag) {
1803
+ assert(flag >= 0);
1804
+ assert(flag <= 1);
1805
+ switch (flag) {
1806
+ case 0: // not blocked
1807
+ return ~static_cast<intptr_t>(0);
1808
+ case 1: // blocked; turn off the designated waker bit
1809
+ return ~static_cast<intptr_t>(kMuDesig);
1810
+ }
1811
+ ABSL_UNREACHABLE();
1812
+ }
1813
+
1814
+ // Conditionally ignores the existence of waiting writers if a reader that has
1815
+ // already blocked once wakes up.
1816
+ static intptr_t IgnoreWaitingWritersMask(int flag) {
1817
+ assert(flag >= 0);
1818
+ assert(flag <= 1);
1819
+ switch (flag) {
1820
+ case 0: // not blocked
1821
+ return ~static_cast<intptr_t>(0);
1822
+ case 1: // blocked; pretend there are no waiting writers
1823
+ return ~static_cast<intptr_t>(kMuWrWait);
1824
+ }
1825
+ ABSL_UNREACHABLE();
1826
+ }
1827
+
1828
+ // Internal version of LockWhen(). See LockSlowWithDeadline()
1829
+ ABSL_ATTRIBUTE_NOINLINE void Mutex::LockSlow(MuHow how, const Condition* cond,
1830
+ int flags) {
1831
+ // Note: we specifically initialize spinloop_iterations after the first use
1832
+ // in TryAcquireWithSpinning so that Lock function does not have any non-tail
1833
+ // calls and consequently a stack frame. It's fine to have spinloop_iterations
1834
+ // uninitialized (meaning no spinning) in all initial uncontended Lock calls
1835
+ // and in the first contended call. After that we will have
1836
+ // spinloop_iterations properly initialized.
1837
+ if (ABSL_PREDICT_FALSE(
1838
+ globals.spinloop_iterations.load(std::memory_order_relaxed) == 0)) {
1839
+ if (absl::base_internal::NumCPUs() > 1) {
1840
+ // If this is multiprocessor, allow spinning.
1841
+ globals.spinloop_iterations.store(1500, std::memory_order_relaxed);
1842
+ } else {
1843
+ // If this a uniprocessor, only yield/sleep.
1844
+ globals.spinloop_iterations.store(-1, std::memory_order_relaxed);
1845
+ }
1846
+ }
1847
+ ABSL_RAW_CHECK(
1848
+ this->LockSlowWithDeadline(how, cond, KernelTimeout::Never(), flags),
1849
+ "condition untrue on return from LockSlow");
1850
+ }
1851
+
1852
+ // Compute cond->Eval() and tell race detectors that we do it under mutex mu.
1853
+ static inline bool EvalConditionAnnotated(const Condition* cond, Mutex* mu,
1854
+ bool locking, bool trylock,
1855
+ bool read_lock) {
1856
+ // Delicate annotation dance.
1857
+ // We are currently inside of read/write lock/unlock operation.
1858
+ // All memory accesses are ignored inside of mutex operations + for unlock
1859
+ // operation tsan considers that we've already released the mutex.
1860
+ bool res = false;
1861
+ #ifdef ABSL_INTERNAL_HAVE_TSAN_INTERFACE
1862
+ const uint32_t flags = read_lock ? __tsan_mutex_read_lock : 0;
1863
+ const uint32_t tryflags = flags | (trylock ? __tsan_mutex_try_lock : 0);
1864
+ #endif
1865
+ if (locking) {
1866
+ // For lock we pretend that we have finished the operation,
1867
+ // evaluate the predicate, then unlock the mutex and start locking it again
1868
+ // to match the annotation at the end of outer lock operation.
1869
+ // Note: we can't simply do POST_LOCK, Eval, PRE_LOCK, because then tsan
1870
+ // will think the lock acquisition is recursive which will trigger
1871
+ // deadlock detector.
1872
+ ABSL_TSAN_MUTEX_POST_LOCK(mu, tryflags, 0);
1873
+ res = cond->Eval();
1874
+ // There is no "try" version of Unlock, so use flags instead of tryflags.
1875
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(mu, flags);
1876
+ ABSL_TSAN_MUTEX_POST_UNLOCK(mu, flags);
1877
+ ABSL_TSAN_MUTEX_PRE_LOCK(mu, tryflags);
1878
+ } else {
1879
+ // Similarly, for unlock we pretend that we have unlocked the mutex,
1880
+ // lock the mutex, evaluate the predicate, and start unlocking it again
1881
+ // to match the annotation at the end of outer unlock operation.
1882
+ ABSL_TSAN_MUTEX_POST_UNLOCK(mu, flags);
1883
+ ABSL_TSAN_MUTEX_PRE_LOCK(mu, flags);
1884
+ ABSL_TSAN_MUTEX_POST_LOCK(mu, flags, 0);
1885
+ res = cond->Eval();
1886
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(mu, flags);
1887
+ }
1888
+ // Prevent unused param warnings in non-TSAN builds.
1889
+ static_cast<void>(mu);
1890
+ static_cast<void>(trylock);
1891
+ static_cast<void>(read_lock);
1892
+ return res;
1893
+ }
1894
+
1895
+ // Compute cond->Eval() hiding it from race detectors.
1896
+ // We are hiding it because inside of UnlockSlow we can evaluate a predicate
1897
+ // that was just added by a concurrent Lock operation; Lock adds the predicate
1898
+ // to the internal Mutex list without actually acquiring the Mutex
1899
+ // (it only acquires the internal spinlock, which is rightfully invisible for
1900
+ // tsan). As the result there is no tsan-visible synchronization between the
1901
+ // addition and this thread. So if we would enable race detection here,
1902
+ // it would race with the predicate initialization.
1903
+ static inline bool EvalConditionIgnored(Mutex* mu, const Condition* cond) {
1904
+ // Memory accesses are already ignored inside of lock/unlock operations,
1905
+ // but synchronization operations are also ignored. When we evaluate the
1906
+ // predicate we must ignore only memory accesses but not synchronization,
1907
+ // because missed synchronization can lead to false reports later.
1908
+ // So we "divert" (which un-ignores both memory accesses and synchronization)
1909
+ // and then separately turn on ignores of memory accesses.
1910
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
1911
+ ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
1912
+ bool res = cond->Eval();
1913
+ ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END();
1914
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
1915
+ static_cast<void>(mu); // Prevent unused param warning in non-TSAN builds.
1916
+ return res;
1917
+ }
1918
+
1919
+ // Internal equivalent of *LockWhenWithDeadline(), where
1920
+ // "t" represents the absolute timeout; !t.has_timeout() means "forever".
1921
+ // "how" is "kShared" (for ReaderLockWhen) or "kExclusive" (for LockWhen)
1922
+ // In flags, bits are ored together:
1923
+ // - kMuHasBlocked indicates that the client has already blocked on the call so
1924
+ // the designated waker bit must be cleared and waiting writers should not
1925
+ // obstruct this call
1926
+ // - kMuIsCond indicates that this is a conditional acquire (condition variable,
1927
+ // Await, LockWhen) so contention profiling should be suppressed.
1928
+ bool Mutex::LockSlowWithDeadline(MuHow how, const Condition* cond,
1929
+ KernelTimeout t, int flags) {
1930
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1931
+ bool unlock = false;
1932
+ if ((v & how->fast_need_zero) == 0 && // try fast acquire
1933
+ mu_.compare_exchange_strong(
1934
+ v,
1935
+ (how->fast_or |
1936
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked))) +
1937
+ how->fast_add,
1938
+ std::memory_order_acquire, std::memory_order_relaxed)) {
1939
+ if (cond == nullptr ||
1940
+ EvalConditionAnnotated(cond, this, true, false, how == kShared)) {
1941
+ return true;
1942
+ }
1943
+ unlock = true;
1944
+ }
1945
+ SynchWaitParams waitp(how, cond, t, nullptr /*no cvmu*/,
1946
+ Synch_GetPerThreadAnnotated(this),
1947
+ nullptr /*no cv_word*/);
1948
+ if (cond != nullptr) {
1949
+ flags |= kMuIsCond;
1950
+ }
1951
+ if (unlock) {
1952
+ this->UnlockSlow(&waitp);
1953
+ this->Block(waitp.thread);
1954
+ flags |= kMuHasBlocked;
1955
+ }
1956
+ this->LockSlowLoop(&waitp, flags);
1957
+ return waitp.cond != nullptr || // => cond known true from LockSlowLoop
1958
+ cond == nullptr ||
1959
+ EvalConditionAnnotated(cond, this, true, false, how == kShared);
1960
+ }
1961
+
1962
+ // RAW_CHECK_FMT() takes a condition, a printf-style format string, and
1963
+ // the printf-style argument list. The format string must be a literal.
1964
+ // Arguments after the first are not evaluated unless the condition is true.
1965
+ #define RAW_CHECK_FMT(cond, ...) \
1966
+ do { \
1967
+ if (ABSL_PREDICT_FALSE(!(cond))) { \
1968
+ ABSL_RAW_LOG(FATAL, "Check " #cond " failed: " __VA_ARGS__); \
1969
+ } \
1970
+ } while (0)
1971
+
1972
+ static void CheckForMutexCorruption(intptr_t v, const char* label) {
1973
+ // Test for either of two situations that should not occur in v:
1974
+ // kMuWriter and kMuReader
1975
+ // kMuWrWait and !kMuWait
1976
+ const uintptr_t w = static_cast<uintptr_t>(v ^ kMuWait);
1977
+ // By flipping that bit, we can now test for:
1978
+ // kMuWriter and kMuReader in w
1979
+ // kMuWrWait and kMuWait in w
1980
+ // We've chosen these two pairs of values to be so that they will overlap,
1981
+ // respectively, when the word is left shifted by three. This allows us to
1982
+ // save a branch in the common (correct) case of them not being coincident.
1983
+ static_assert(kMuReader << 3 == kMuWriter, "must match");
1984
+ static_assert(kMuWait << 3 == kMuWrWait, "must match");
1985
+ if (ABSL_PREDICT_TRUE((w & (w << 3) & (kMuWriter | kMuWrWait)) == 0)) return;
1986
+ RAW_CHECK_FMT((v & (kMuWriter | kMuReader)) != (kMuWriter | kMuReader),
1987
+ "%s: Mutex corrupt: both reader and writer lock held: %p",
1988
+ label, reinterpret_cast<void*>(v));
1989
+ RAW_CHECK_FMT((v & (kMuWait | kMuWrWait)) != kMuWrWait,
1990
+ "%s: Mutex corrupt: waiting writer with no waiters: %p", label,
1991
+ reinterpret_cast<void*>(v));
1992
+ assert(false);
1993
+ }
1994
+
1995
+ void Mutex::LockSlowLoop(SynchWaitParams* waitp, int flags) {
1996
+ SchedulingGuard::ScopedDisable disable_rescheduling;
1997
+ int c = 0;
1998
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1999
+ if ((v & kMuEvent) != 0) {
2000
+ PostSynchEvent(
2001
+ this, waitp->how == kExclusive ? SYNCH_EV_LOCK : SYNCH_EV_READERLOCK);
2002
+ }
2003
+ ABSL_RAW_CHECK(
2004
+ waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors,
2005
+ "detected illegal recursion into Mutex code");
2006
+ for (;;) {
2007
+ v = mu_.load(std::memory_order_relaxed);
2008
+ CheckForMutexCorruption(v, "Lock");
2009
+ if ((v & waitp->how->slow_need_zero) == 0) {
2010
+ if (mu_.compare_exchange_strong(
2011
+ v,
2012
+ (waitp->how->fast_or |
2013
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked))) +
2014
+ waitp->how->fast_add,
2015
+ std::memory_order_acquire, std::memory_order_relaxed)) {
2016
+ if (waitp->cond == nullptr ||
2017
+ EvalConditionAnnotated(waitp->cond, this, true, false,
2018
+ waitp->how == kShared)) {
2019
+ break; // we timed out, or condition true, so return
2020
+ }
2021
+ this->UnlockSlow(waitp); // got lock but condition false
2022
+ this->Block(waitp->thread);
2023
+ flags |= kMuHasBlocked;
2024
+ c = 0;
2025
+ }
2026
+ } else { // need to access waiter list
2027
+ bool dowait = false;
2028
+ if ((v & (kMuSpin | kMuWait)) == 0) { // no waiters
2029
+ // This thread tries to become the one and only waiter.
2030
+ PerThreadSynch* new_h = Enqueue(nullptr, waitp, v, flags);
2031
+ intptr_t nv =
2032
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked) & kMuLow) |
2033
+ kMuWait;
2034
+ ABSL_RAW_CHECK(new_h != nullptr, "Enqueue to empty list failed");
2035
+ if (waitp->how == kExclusive && (v & kMuReader) != 0) {
2036
+ nv |= kMuWrWait;
2037
+ }
2038
+ if (mu_.compare_exchange_strong(
2039
+ v, reinterpret_cast<intptr_t>(new_h) | nv,
2040
+ std::memory_order_release, std::memory_order_relaxed)) {
2041
+ dowait = true;
2042
+ } else { // attempted Enqueue() failed
2043
+ // zero out the waitp field set by Enqueue()
2044
+ waitp->thread->waitp = nullptr;
2045
+ }
2046
+ } else if ((v & waitp->how->slow_inc_need_zero &
2047
+ IgnoreWaitingWritersMask(flags & kMuHasBlocked)) == 0) {
2048
+ // This is a reader that needs to increment the reader count,
2049
+ // but the count is currently held in the last waiter.
2050
+ if (mu_.compare_exchange_strong(
2051
+ v,
2052
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked)) |
2053
+ kMuSpin | kMuReader,
2054
+ std::memory_order_acquire, std::memory_order_relaxed)) {
2055
+ PerThreadSynch* h = GetPerThreadSynch(v);
2056
+ h->readers += kMuOne; // inc reader count in waiter
2057
+ do { // release spinlock
2058
+ v = mu_.load(std::memory_order_relaxed);
2059
+ } while (!mu_.compare_exchange_weak(v, (v & ~kMuSpin) | kMuReader,
2060
+ std::memory_order_release,
2061
+ std::memory_order_relaxed));
2062
+ if (waitp->cond == nullptr ||
2063
+ EvalConditionAnnotated(waitp->cond, this, true, false,
2064
+ waitp->how == kShared)) {
2065
+ break; // we timed out, or condition true, so return
2066
+ }
2067
+ this->UnlockSlow(waitp); // got lock but condition false
2068
+ this->Block(waitp->thread);
2069
+ flags |= kMuHasBlocked;
2070
+ c = 0;
2071
+ }
2072
+ } else if ((v & kMuSpin) == 0 && // attempt to queue ourselves
2073
+ mu_.compare_exchange_strong(
2074
+ v,
2075
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked)) |
2076
+ kMuSpin | kMuWait,
2077
+ std::memory_order_acquire, std::memory_order_relaxed)) {
2078
+ PerThreadSynch* h = GetPerThreadSynch(v);
2079
+ PerThreadSynch* new_h = Enqueue(h, waitp, v, flags);
2080
+ intptr_t wr_wait = 0;
2081
+ ABSL_RAW_CHECK(new_h != nullptr, "Enqueue to list failed");
2082
+ if (waitp->how == kExclusive && (v & kMuReader) != 0) {
2083
+ wr_wait = kMuWrWait; // give priority to a waiting writer
2084
+ }
2085
+ do { // release spinlock
2086
+ v = mu_.load(std::memory_order_relaxed);
2087
+ } while (!mu_.compare_exchange_weak(
2088
+ v,
2089
+ (v & (kMuLow & ~kMuSpin)) | kMuWait | wr_wait |
2090
+ reinterpret_cast<intptr_t>(new_h),
2091
+ std::memory_order_release, std::memory_order_relaxed));
2092
+ dowait = true;
2093
+ }
2094
+ if (dowait) {
2095
+ this->Block(waitp->thread); // wait until removed from list or timeout
2096
+ flags |= kMuHasBlocked;
2097
+ c = 0;
2098
+ }
2099
+ }
2100
+ ABSL_RAW_CHECK(
2101
+ waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors,
2102
+ "detected illegal recursion into Mutex code");
2103
+ // delay, then try again
2104
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2105
+ }
2106
+ ABSL_RAW_CHECK(
2107
+ waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors,
2108
+ "detected illegal recursion into Mutex code");
2109
+ if ((v & kMuEvent) != 0) {
2110
+ PostSynchEvent(this, waitp->how == kExclusive
2111
+ ? SYNCH_EV_LOCK_RETURNING
2112
+ : SYNCH_EV_READERLOCK_RETURNING);
2113
+ }
2114
+ }
2115
+
2116
+ // Unlock this mutex, which is held by the current thread.
2117
+ // If waitp is non-zero, it must be the wait parameters for the current thread
2118
+ // which holds the lock but is not runnable because its condition is false
2119
+ // or it is in the process of blocking on a condition variable; it must requeue
2120
+ // itself on the mutex/condvar to wait for its condition to become true.
2121
+ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams* waitp) {
2122
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2123
+ intptr_t v = mu_.load(std::memory_order_relaxed);
2124
+ this->AssertReaderHeld();
2125
+ CheckForMutexCorruption(v, "Unlock");
2126
+ if ((v & kMuEvent) != 0) {
2127
+ PostSynchEvent(
2128
+ this, (v & kMuWriter) != 0 ? SYNCH_EV_UNLOCK : SYNCH_EV_READERUNLOCK);
2129
+ }
2130
+ int c = 0;
2131
+ // the waiter under consideration to wake, or zero
2132
+ PerThreadSynch* w = nullptr;
2133
+ // the predecessor to w or zero
2134
+ PerThreadSynch* pw = nullptr;
2135
+ // head of the list searched previously, or zero
2136
+ PerThreadSynch* old_h = nullptr;
2137
+ // a condition that's known to be false.
2138
+ PerThreadSynch* wake_list = kPerThreadSynchNull; // list of threads to wake
2139
+ intptr_t wr_wait = 0; // set to kMuWrWait if we wake a reader and a
2140
+ // later writer could have acquired the lock
2141
+ // (starvation avoidance)
2142
+ ABSL_RAW_CHECK(waitp == nullptr || waitp->thread->waitp == nullptr ||
2143
+ waitp->thread->suppress_fatal_errors,
2144
+ "detected illegal recursion into Mutex code");
2145
+ // This loop finds threads wake_list to wakeup if any, and removes them from
2146
+ // the list of waiters. In addition, it places waitp.thread on the queue of
2147
+ // waiters if waitp is non-zero.
2148
+ for (;;) {
2149
+ v = mu_.load(std::memory_order_relaxed);
2150
+ if ((v & kMuWriter) != 0 && (v & (kMuWait | kMuDesig)) != kMuWait &&
2151
+ waitp == nullptr) {
2152
+ // fast writer release (writer with no waiters or with designated waker)
2153
+ if (mu_.compare_exchange_strong(v, v & ~(kMuWrWait | kMuWriter),
2154
+ std::memory_order_release,
2155
+ std::memory_order_relaxed)) {
2156
+ return;
2157
+ }
2158
+ } else if ((v & (kMuReader | kMuWait)) == kMuReader && waitp == nullptr) {
2159
+ // fast reader release (reader with no waiters)
2160
+ intptr_t clear = ExactlyOneReader(v) ? kMuReader | kMuOne : kMuOne;
2161
+ if (mu_.compare_exchange_strong(v, v - clear, std::memory_order_release,
2162
+ std::memory_order_relaxed)) {
2163
+ return;
2164
+ }
2165
+ } else if ((v & kMuSpin) == 0 && // attempt to get spinlock
2166
+ mu_.compare_exchange_strong(v, v | kMuSpin,
2167
+ std::memory_order_acquire,
2168
+ std::memory_order_relaxed)) {
2169
+ if ((v & kMuWait) == 0) { // no one to wake
2170
+ intptr_t nv;
2171
+ bool do_enqueue = true; // always Enqueue() the first time
2172
+ ABSL_RAW_CHECK(waitp != nullptr,
2173
+ "UnlockSlow is confused"); // about to sleep
2174
+ do { // must loop to release spinlock as reader count may change
2175
+ v = mu_.load(std::memory_order_relaxed);
2176
+ // decrement reader count if there are readers
2177
+ intptr_t new_readers = (v >= kMuOne) ? v - kMuOne : v;
2178
+ PerThreadSynch* new_h = nullptr;
2179
+ if (do_enqueue) {
2180
+ // If we are enqueuing on a CondVar (waitp->cv_word != nullptr) then
2181
+ // we must not retry here. The initial attempt will always have
2182
+ // succeeded, further attempts would enqueue us against *this due to
2183
+ // Fer() handling.
2184
+ do_enqueue = (waitp->cv_word == nullptr);
2185
+ new_h = Enqueue(nullptr, waitp, new_readers, kMuIsCond);
2186
+ }
2187
+ intptr_t clear = kMuWrWait | kMuWriter; // by default clear write bit
2188
+ if ((v & kMuWriter) == 0 && ExactlyOneReader(v)) { // last reader
2189
+ clear = kMuWrWait | kMuReader; // clear read bit
2190
+ }
2191
+ nv = (v & kMuLow & ~clear & ~kMuSpin);
2192
+ if (new_h != nullptr) {
2193
+ nv |= kMuWait | reinterpret_cast<intptr_t>(new_h);
2194
+ } else { // new_h could be nullptr if we queued ourselves on a
2195
+ // CondVar
2196
+ // In that case, we must place the reader count back in the mutex
2197
+ // word, as Enqueue() did not store it in the new waiter.
2198
+ nv |= new_readers & kMuHigh;
2199
+ }
2200
+ // release spinlock & our lock; retry if reader-count changed
2201
+ // (writer count cannot change since we hold lock)
2202
+ } while (!mu_.compare_exchange_weak(v, nv, std::memory_order_release,
2203
+ std::memory_order_relaxed));
2204
+ break;
2205
+ }
2206
+
2207
+ // There are waiters.
2208
+ // Set h to the head of the circular waiter list.
2209
+ PerThreadSynch* h = GetPerThreadSynch(v);
2210
+ if ((v & kMuReader) != 0 && (h->readers & kMuHigh) > kMuOne) {
2211
+ // a reader but not the last
2212
+ h->readers -= kMuOne; // release our lock
2213
+ intptr_t nv = v; // normally just release spinlock
2214
+ if (waitp != nullptr) { // but waitp!=nullptr => must queue ourselves
2215
+ PerThreadSynch* new_h = Enqueue(h, waitp, v, kMuIsCond);
2216
+ ABSL_RAW_CHECK(new_h != nullptr,
2217
+ "waiters disappeared during Enqueue()!");
2218
+ nv &= kMuLow;
2219
+ nv |= kMuWait | reinterpret_cast<intptr_t>(new_h);
2220
+ }
2221
+ mu_.store(nv, std::memory_order_release); // release spinlock
2222
+ // can release with a store because there were waiters
2223
+ break;
2224
+ }
2225
+
2226
+ // Either we didn't search before, or we marked the queue
2227
+ // as "maybe_unlocking" and no one else should have changed it.
2228
+ ABSL_RAW_CHECK(old_h == nullptr || h->maybe_unlocking,
2229
+ "Mutex queue changed beneath us");
2230
+
2231
+ // The lock is becoming free, and there's a waiter
2232
+ if (old_h != nullptr &&
2233
+ !old_h->may_skip) { // we used old_h as a terminator
2234
+ old_h->may_skip = true; // allow old_h to skip once more
2235
+ ABSL_RAW_CHECK(old_h->skip == nullptr, "illegal skip from head");
2236
+ if (h != old_h && MuEquivalentWaiter(old_h, old_h->next)) {
2237
+ old_h->skip = old_h->next; // old_h not head & can skip to successor
2238
+ }
2239
+ }
2240
+ if (h->next->waitp->how == kExclusive &&
2241
+ h->next->waitp->cond == nullptr) {
2242
+ // easy case: writer with no condition; no need to search
2243
+ pw = h; // wake w, the successor of h (=pw)
2244
+ w = h->next;
2245
+ w->wake = true;
2246
+ // We are waking up a writer. This writer may be racing against
2247
+ // an already awake reader for the lock. We want the
2248
+ // writer to usually win this race,
2249
+ // because if it doesn't, we can potentially keep taking a reader
2250
+ // perpetually and writers will starve. Worse than
2251
+ // that, this can also starve other readers if kMuWrWait gets set
2252
+ // later.
2253
+ wr_wait = kMuWrWait;
2254
+ } else if (w != nullptr && (w->waitp->how == kExclusive || h == old_h)) {
2255
+ // we found a waiter w to wake on a previous iteration and either it's
2256
+ // a writer, or we've searched the entire list so we have all the
2257
+ // readers.
2258
+ if (pw == nullptr) { // if w's predecessor is unknown, it must be h
2259
+ pw = h;
2260
+ }
2261
+ } else {
2262
+ // At this point we don't know all the waiters to wake, and the first
2263
+ // waiter has a condition or is a reader. We avoid searching over
2264
+ // waiters we've searched on previous iterations by starting at
2265
+ // old_h if it's set. If old_h==h, there's no one to wakeup at all.
2266
+ if (old_h == h) { // we've searched before, and nothing's new
2267
+ // so there's no one to wake.
2268
+ intptr_t nv = (v & ~(kMuReader | kMuWriter | kMuWrWait));
2269
+ h->readers = 0;
2270
+ h->maybe_unlocking = false; // finished unlocking
2271
+ if (waitp != nullptr) { // we must queue ourselves and sleep
2272
+ PerThreadSynch* new_h = Enqueue(h, waitp, v, kMuIsCond);
2273
+ nv &= kMuLow;
2274
+ if (new_h != nullptr) {
2275
+ nv |= kMuWait | reinterpret_cast<intptr_t>(new_h);
2276
+ } // else new_h could be nullptr if we queued ourselves on a
2277
+ // CondVar
2278
+ }
2279
+ // release spinlock & lock
2280
+ // can release with a store because there were waiters
2281
+ mu_.store(nv, std::memory_order_release);
2282
+ break;
2283
+ }
2284
+
2285
+ // set up to walk the list
2286
+ PerThreadSynch* w_walk; // current waiter during list walk
2287
+ PerThreadSynch* pw_walk; // previous waiter during list walk
2288
+ if (old_h != nullptr) { // we've searched up to old_h before
2289
+ pw_walk = old_h;
2290
+ w_walk = old_h->next;
2291
+ } else { // no prior search, start at beginning
2292
+ pw_walk =
2293
+ nullptr; // h->next's predecessor may change; don't record it
2294
+ w_walk = h->next;
2295
+ }
2296
+
2297
+ h->may_skip = false; // ensure we never skip past h in future searches
2298
+ // even if other waiters are queued after it.
2299
+ ABSL_RAW_CHECK(h->skip == nullptr, "illegal skip from head");
2300
+
2301
+ h->maybe_unlocking = true; // we're about to scan the waiter list
2302
+ // without the spinlock held.
2303
+ // Enqueue must be conservative about
2304
+ // priority queuing.
2305
+
2306
+ // We must release the spinlock to evaluate the conditions.
2307
+ mu_.store(v, std::memory_order_release); // release just spinlock
2308
+ // can release with a store because there were waiters
2309
+
2310
+ // h is the last waiter queued, and w_walk the first unsearched waiter.
2311
+ // Without the spinlock, the locations mu_ and h->next may now change
2312
+ // underneath us, but since we hold the lock itself, the only legal
2313
+ // change is to add waiters between h and w_walk. Therefore, it's safe
2314
+ // to walk the path from w_walk to h inclusive. (TryRemove() can remove
2315
+ // a waiter anywhere, but it acquires both the spinlock and the Mutex)
2316
+
2317
+ old_h = h; // remember we searched to here
2318
+
2319
+ // Walk the path upto and including h looking for waiters we can wake.
2320
+ while (pw_walk != h) {
2321
+ w_walk->wake = false;
2322
+ if (w_walk->waitp->cond ==
2323
+ nullptr || // no condition => vacuously true OR
2324
+ // this thread's condition is true
2325
+ EvalConditionIgnored(this, w_walk->waitp->cond)) {
2326
+ if (w == nullptr) {
2327
+ w_walk->wake = true; // can wake this waiter
2328
+ w = w_walk;
2329
+ pw = pw_walk;
2330
+ if (w_walk->waitp->how == kExclusive) {
2331
+ wr_wait = kMuWrWait;
2332
+ break; // bail if waking this writer
2333
+ }
2334
+ } else if (w_walk->waitp->how == kShared) { // wake if a reader
2335
+ w_walk->wake = true;
2336
+ } else { // writer with true condition
2337
+ wr_wait = kMuWrWait;
2338
+ }
2339
+ }
2340
+ if (w_walk->wake) { // we're waking reader w_walk
2341
+ pw_walk = w_walk; // don't skip similar waiters
2342
+ } else { // not waking; skip as much as possible
2343
+ pw_walk = Skip(w_walk);
2344
+ }
2345
+ // If pw_walk == h, then load of pw_walk->next can race with
2346
+ // concurrent write in Enqueue(). However, at the same time
2347
+ // we do not need to do the load, because we will bail out
2348
+ // from the loop anyway.
2349
+ if (pw_walk != h) {
2350
+ w_walk = pw_walk->next;
2351
+ }
2352
+ }
2353
+
2354
+ continue; // restart for(;;)-loop to wakeup w or to find more waiters
2355
+ }
2356
+ ABSL_RAW_CHECK(pw->next == w, "pw not w's predecessor");
2357
+ // The first (and perhaps only) waiter we've chosen to wake is w, whose
2358
+ // predecessor is pw. If w is a reader, we must wake all the other
2359
+ // waiters with wake==true as well. We may also need to queue
2360
+ // ourselves if waitp != null. The spinlock and the lock are still
2361
+ // held.
2362
+
2363
+ // This traverses the list in [ pw->next, h ], where h is the head,
2364
+ // removing all elements with wake==true and placing them in the
2365
+ // singly-linked list wake_list. Returns the new head.
2366
+ h = DequeueAllWakeable(h, pw, &wake_list);
2367
+
2368
+ intptr_t nv = (v & kMuEvent) | kMuDesig;
2369
+ // assume no waiters left,
2370
+ // set kMuDesig for INV1a
2371
+
2372
+ if (waitp != nullptr) { // we must queue ourselves and sleep
2373
+ h = Enqueue(h, waitp, v, kMuIsCond);
2374
+ // h is new last waiter; could be null if we queued ourselves on a
2375
+ // CondVar
2376
+ }
2377
+
2378
+ ABSL_RAW_CHECK(wake_list != kPerThreadSynchNull,
2379
+ "unexpected empty wake list");
2380
+
2381
+ if (h != nullptr) { // there are waiters left
2382
+ h->readers = 0;
2383
+ h->maybe_unlocking = false; // finished unlocking
2384
+ nv |= wr_wait | kMuWait | reinterpret_cast<intptr_t>(h);
2385
+ }
2386
+
2387
+ // release both spinlock & lock
2388
+ // can release with a store because there were waiters
2389
+ mu_.store(nv, std::memory_order_release);
2390
+ break; // out of for(;;)-loop
2391
+ }
2392
+ // aggressive here; no one can proceed till we do
2393
+ c = synchronization_internal::MutexDelay(c, AGGRESSIVE);
2394
+ } // end of for(;;)-loop
2395
+
2396
+ if (wake_list != kPerThreadSynchNull) {
2397
+ int64_t total_wait_cycles = 0;
2398
+ int64_t max_wait_cycles = 0;
2399
+ int64_t now = CycleClock::Now();
2400
+ do {
2401
+ // Profile lock contention events only if the waiter was trying to acquire
2402
+ // the lock, not waiting on a condition variable or Condition.
2403
+ if (!wake_list->cond_waiter) {
2404
+ int64_t cycles_waited =
2405
+ (now - wake_list->waitp->contention_start_cycles);
2406
+ total_wait_cycles += cycles_waited;
2407
+ if (max_wait_cycles == 0) max_wait_cycles = cycles_waited;
2408
+ wake_list->waitp->contention_start_cycles = now;
2409
+ wake_list->waitp->should_submit_contention_data = true;
2410
+ }
2411
+ wake_list = Wakeup(wake_list); // wake waiters
2412
+ } while (wake_list != kPerThreadSynchNull);
2413
+ if (total_wait_cycles > 0) {
2414
+ mutex_tracer("slow release", this, total_wait_cycles);
2415
+ ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
2416
+ submit_profile_data(total_wait_cycles);
2417
+ ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
2418
+ }
2419
+ }
2420
+ }
2421
+
2422
+ // Used by CondVar implementation to reacquire mutex after waking from
2423
+ // condition variable. This routine is used instead of Lock() because the
2424
+ // waiting thread may have been moved from the condition variable queue to the
2425
+ // mutex queue without a wakeup, by Trans(). In that case, when the thread is
2426
+ // finally woken, the woken thread will believe it has been woken from the
2427
+ // condition variable (i.e. its PC will be in when in the CondVar code), when
2428
+ // in fact it has just been woken from the mutex. Thus, it must enter the slow
2429
+ // path of the mutex in the same state as if it had just woken from the mutex.
2430
+ // That is, it must ensure to clear kMuDesig (INV1b).
2431
+ void Mutex::Trans(MuHow how) {
2432
+ this->LockSlow(how, nullptr, kMuHasBlocked | kMuIsCond);
2433
+ }
2434
+
2435
+ // Used by CondVar implementation to effectively wake thread w from the
2436
+ // condition variable. If this mutex is free, we simply wake the thread.
2437
+ // It will later acquire the mutex with high probability. Otherwise, we
2438
+ // enqueue thread w on this mutex.
2439
+ void Mutex::Fer(PerThreadSynch* w) {
2440
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2441
+ int c = 0;
2442
+ ABSL_RAW_CHECK(w->waitp->cond == nullptr,
2443
+ "Mutex::Fer while waiting on Condition");
2444
+ ABSL_RAW_CHECK(w->waitp->cv_word == nullptr,
2445
+ "Mutex::Fer with pending CondVar queueing");
2446
+ // The CondVar timeout is not relevant for the Mutex wait.
2447
+ w->waitp->timeout = {};
2448
+ for (;;) {
2449
+ intptr_t v = mu_.load(std::memory_order_relaxed);
2450
+ // Note: must not queue if the mutex is unlocked (nobody will wake it).
2451
+ // For example, we can have only kMuWait (conditional) or maybe
2452
+ // kMuWait|kMuWrWait.
2453
+ // conflicting != 0 implies that the waking thread cannot currently take
2454
+ // the mutex, which in turn implies that someone else has it and can wake
2455
+ // us if we queue.
2456
+ const intptr_t conflicting =
2457
+ kMuWriter | (w->waitp->how == kShared ? 0 : kMuReader);
2458
+ if ((v & conflicting) == 0) {
2459
+ w->next = nullptr;
2460
+ w->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
2461
+ IncrementSynchSem(this, w);
2462
+ return;
2463
+ } else {
2464
+ if ((v & (kMuSpin | kMuWait)) == 0) { // no waiters
2465
+ // This thread tries to become the one and only waiter.
2466
+ PerThreadSynch* new_h =
2467
+ Enqueue(nullptr, w->waitp, v, kMuIsCond | kMuIsFer);
2468
+ ABSL_RAW_CHECK(new_h != nullptr,
2469
+ "Enqueue failed"); // we must queue ourselves
2470
+ if (mu_.compare_exchange_strong(
2471
+ v, reinterpret_cast<intptr_t>(new_h) | (v & kMuLow) | kMuWait,
2472
+ std::memory_order_release, std::memory_order_relaxed)) {
2473
+ return;
2474
+ }
2475
+ } else if ((v & kMuSpin) == 0 &&
2476
+ mu_.compare_exchange_strong(v, v | kMuSpin | kMuWait)) {
2477
+ PerThreadSynch* h = GetPerThreadSynch(v);
2478
+ PerThreadSynch* new_h = Enqueue(h, w->waitp, v, kMuIsCond | kMuIsFer);
2479
+ ABSL_RAW_CHECK(new_h != nullptr,
2480
+ "Enqueue failed"); // we must queue ourselves
2481
+ do {
2482
+ v = mu_.load(std::memory_order_relaxed);
2483
+ } while (!mu_.compare_exchange_weak(
2484
+ v,
2485
+ (v & kMuLow & ~kMuSpin) | kMuWait |
2486
+ reinterpret_cast<intptr_t>(new_h),
2487
+ std::memory_order_release, std::memory_order_relaxed));
2488
+ return;
2489
+ }
2490
+ }
2491
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2492
+ }
2493
+ }
2494
+
2495
+ void Mutex::AssertHeld() const {
2496
+ if ((mu_.load(std::memory_order_relaxed) & kMuWriter) == 0) {
2497
+ SynchEvent* e = GetSynchEvent(this);
2498
+ ABSL_RAW_LOG(FATAL, "thread should hold write lock on Mutex %p %s",
2499
+ static_cast<const void*>(this), (e == nullptr ? "" : e->name));
2500
+ }
2501
+ }
2502
+
2503
+ void Mutex::AssertReaderHeld() const {
2504
+ if ((mu_.load(std::memory_order_relaxed) & (kMuReader | kMuWriter)) == 0) {
2505
+ SynchEvent* e = GetSynchEvent(this);
2506
+ ABSL_RAW_LOG(FATAL,
2507
+ "thread should hold at least a read lock on Mutex %p %s",
2508
+ static_cast<const void*>(this), (e == nullptr ? "" : e->name));
2509
+ }
2510
+ }
2511
+
2512
+ // -------------------------------- condition variables
2513
+ static const intptr_t kCvSpin = 0x0001L; // spinlock protects waiter list
2514
+ static const intptr_t kCvEvent = 0x0002L; // record events
2515
+
2516
+ static const intptr_t kCvLow = 0x0003L; // low order bits of CV
2517
+
2518
+ // Hack to make constant values available to gdb pretty printer
2519
+ enum {
2520
+ kGdbCvSpin = kCvSpin,
2521
+ kGdbCvEvent = kCvEvent,
2522
+ kGdbCvLow = kCvLow,
2523
+ };
2524
+
2525
+ static_assert(PerThreadSynch::kAlignment > kCvLow,
2526
+ "PerThreadSynch::kAlignment must be greater than kCvLow");
2527
+
2528
+ void CondVar::EnableDebugLog(const char* name) {
2529
+ SynchEvent* e = EnsureSynchEvent(&this->cv_, name, kCvEvent, kCvSpin);
2530
+ e->log = true;
2531
+ UnrefSynchEvent(e);
2532
+ }
2533
+
2534
+ // Remove thread s from the list of waiters on this condition variable.
2535
+ void CondVar::Remove(PerThreadSynch* s) {
2536
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2537
+ intptr_t v;
2538
+ int c = 0;
2539
+ for (v = cv_.load(std::memory_order_relaxed);;
2540
+ v = cv_.load(std::memory_order_relaxed)) {
2541
+ if ((v & kCvSpin) == 0 && // attempt to acquire spinlock
2542
+ cv_.compare_exchange_strong(v, v | kCvSpin, std::memory_order_acquire,
2543
+ std::memory_order_relaxed)) {
2544
+ PerThreadSynch* h = reinterpret_cast<PerThreadSynch*>(v & ~kCvLow);
2545
+ if (h != nullptr) {
2546
+ PerThreadSynch* w = h;
2547
+ while (w->next != s && w->next != h) { // search for thread
2548
+ w = w->next;
2549
+ }
2550
+ if (w->next == s) { // found thread; remove it
2551
+ w->next = s->next;
2552
+ if (h == s) {
2553
+ h = (w == s) ? nullptr : w;
2554
+ }
2555
+ s->next = nullptr;
2556
+ s->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
2557
+ }
2558
+ }
2559
+ // release spinlock
2560
+ cv_.store((v & kCvEvent) | reinterpret_cast<intptr_t>(h),
2561
+ std::memory_order_release);
2562
+ return;
2563
+ } else {
2564
+ // try again after a delay
2565
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2566
+ }
2567
+ }
2568
+ }
2569
+
2570
+ // Queue thread waitp->thread on condition variable word cv_word using
2571
+ // wait parameters waitp.
2572
+ // We split this into a separate routine, rather than simply doing it as part
2573
+ // of WaitCommon(). If we were to queue ourselves on the condition variable
2574
+ // before calling Mutex::UnlockSlow(), the Mutex code might be re-entered (via
2575
+ // the logging code, or via a Condition function) and might potentially attempt
2576
+ // to block this thread. That would be a problem if the thread were already on
2577
+ // a condition variable waiter queue. Thus, we use the waitp->cv_word to tell
2578
+ // the unlock code to call CondVarEnqueue() to queue the thread on the condition
2579
+ // variable queue just before the mutex is to be unlocked, and (most
2580
+ // importantly) after any call to an external routine that might re-enter the
2581
+ // mutex code.
2582
+ static void CondVarEnqueue(SynchWaitParams* waitp) {
2583
+ // This thread might be transferred to the Mutex queue by Fer() when
2584
+ // we are woken. To make sure that is what happens, Enqueue() doesn't
2585
+ // call CondVarEnqueue() again but instead uses its normal code. We
2586
+ // must do this before we queue ourselves so that cv_word will be null
2587
+ // when seen by the dequeuer, who may wish immediately to requeue
2588
+ // this thread on another queue.
2589
+ std::atomic<intptr_t>* cv_word = waitp->cv_word;
2590
+ waitp->cv_word = nullptr;
2591
+
2592
+ intptr_t v = cv_word->load(std::memory_order_relaxed);
2593
+ int c = 0;
2594
+ while ((v & kCvSpin) != 0 || // acquire spinlock
2595
+ !cv_word->compare_exchange_weak(v, v | kCvSpin,
2596
+ std::memory_order_acquire,
2597
+ std::memory_order_relaxed)) {
2598
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2599
+ v = cv_word->load(std::memory_order_relaxed);
2600
+ }
2601
+ ABSL_RAW_CHECK(waitp->thread->waitp == nullptr, "waiting when shouldn't be");
2602
+ waitp->thread->waitp = waitp; // prepare ourselves for waiting
2603
+ PerThreadSynch* h = reinterpret_cast<PerThreadSynch*>(v & ~kCvLow);
2604
+ if (h == nullptr) { // add this thread to waiter list
2605
+ waitp->thread->next = waitp->thread;
2606
+ } else {
2607
+ waitp->thread->next = h->next;
2608
+ h->next = waitp->thread;
2609
+ }
2610
+ waitp->thread->state.store(PerThreadSynch::kQueued,
2611
+ std::memory_order_relaxed);
2612
+ cv_word->store((v & kCvEvent) | reinterpret_cast<intptr_t>(waitp->thread),
2613
+ std::memory_order_release);
2614
+ }
2615
+
2616
+ bool CondVar::WaitCommon(Mutex* mutex, KernelTimeout t) {
2617
+ bool rc = false; // return value; true iff we timed-out
2618
+
2619
+ intptr_t mutex_v = mutex->mu_.load(std::memory_order_relaxed);
2620
+ Mutex::MuHow mutex_how = ((mutex_v & kMuWriter) != 0) ? kExclusive : kShared;
2621
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(mutex, TsanFlags(mutex_how));
2622
+
2623
+ // maybe trace this call
2624
+ intptr_t v = cv_.load(std::memory_order_relaxed);
2625
+ cond_var_tracer("Wait", this);
2626
+ if ((v & kCvEvent) != 0) {
2627
+ PostSynchEvent(this, SYNCH_EV_WAIT);
2628
+ }
2629
+
2630
+ // Release mu and wait on condition variable.
2631
+ SynchWaitParams waitp(mutex_how, nullptr, t, mutex,
2632
+ Synch_GetPerThreadAnnotated(mutex), &cv_);
2633
+ // UnlockSlow() will call CondVarEnqueue() just before releasing the
2634
+ // Mutex, thus queuing this thread on the condition variable. See
2635
+ // CondVarEnqueue() for the reasons.
2636
+ mutex->UnlockSlow(&waitp);
2637
+
2638
+ // wait for signal
2639
+ while (waitp.thread->state.load(std::memory_order_acquire) ==
2640
+ PerThreadSynch::kQueued) {
2641
+ if (!Mutex::DecrementSynchSem(mutex, waitp.thread, t)) {
2642
+ // DecrementSynchSem returned due to timeout.
2643
+ // Now we will either (1) remove ourselves from the wait list in Remove
2644
+ // below, in which case Remove will set thread.state = kAvailable and
2645
+ // we will not call DecrementSynchSem again; or (2) Signal/SignalAll
2646
+ // has removed us concurrently and is calling Wakeup, which will set
2647
+ // thread.state = kAvailable and post to the semaphore.
2648
+ // It's important to reset the timeout for the case (2) because otherwise
2649
+ // we can live-lock in this loop since DecrementSynchSem will always
2650
+ // return immediately due to timeout, but Signal/SignalAll is not
2651
+ // necessary set thread.state = kAvailable yet (and is not scheduled
2652
+ // due to thread priorities or other scheduler artifacts).
2653
+ // Note this could also be resolved if Signal/SignalAll would set
2654
+ // thread.state = kAvailable while holding the wait list spin lock.
2655
+ // But this can't be easily done for SignalAll since it grabs the whole
2656
+ // wait list with a single compare-exchange and does not really grab
2657
+ // the spin lock.
2658
+ t = KernelTimeout::Never();
2659
+ this->Remove(waitp.thread);
2660
+ rc = true;
2661
+ }
2662
+ }
2663
+
2664
+ ABSL_RAW_CHECK(waitp.thread->waitp != nullptr, "not waiting when should be");
2665
+ waitp.thread->waitp = nullptr; // cleanup
2666
+
2667
+ // maybe trace this call
2668
+ cond_var_tracer("Unwait", this);
2669
+ if ((v & kCvEvent) != 0) {
2670
+ PostSynchEvent(this, SYNCH_EV_WAIT_RETURNING);
2671
+ }
2672
+
2673
+ // From synchronization point of view Wait is unlock of the mutex followed
2674
+ // by lock of the mutex. We've annotated start of unlock in the beginning
2675
+ // of the function. Now, finish unlock and annotate lock of the mutex.
2676
+ // (Trans is effectively lock).
2677
+ ABSL_TSAN_MUTEX_POST_UNLOCK(mutex, TsanFlags(mutex_how));
2678
+ ABSL_TSAN_MUTEX_PRE_LOCK(mutex, TsanFlags(mutex_how));
2679
+ mutex->Trans(mutex_how); // Reacquire mutex
2680
+ ABSL_TSAN_MUTEX_POST_LOCK(mutex, TsanFlags(mutex_how), 0);
2681
+ return rc;
2682
+ }
2683
+
2684
+ void CondVar::Signal() {
2685
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2686
+ ABSL_TSAN_MUTEX_PRE_SIGNAL(nullptr, 0);
2687
+ intptr_t v;
2688
+ int c = 0;
2689
+ for (v = cv_.load(std::memory_order_relaxed); v != 0;
2690
+ v = cv_.load(std::memory_order_relaxed)) {
2691
+ if ((v & kCvSpin) == 0 && // attempt to acquire spinlock
2692
+ cv_.compare_exchange_strong(v, v | kCvSpin, std::memory_order_acquire,
2693
+ std::memory_order_relaxed)) {
2694
+ PerThreadSynch* h = reinterpret_cast<PerThreadSynch*>(v & ~kCvLow);
2695
+ PerThreadSynch* w = nullptr;
2696
+ if (h != nullptr) { // remove first waiter
2697
+ w = h->next;
2698
+ if (w == h) {
2699
+ h = nullptr;
2700
+ } else {
2701
+ h->next = w->next;
2702
+ }
2703
+ }
2704
+ // release spinlock
2705
+ cv_.store((v & kCvEvent) | reinterpret_cast<intptr_t>(h),
2706
+ std::memory_order_release);
2707
+ if (w != nullptr) {
2708
+ w->waitp->cvmu->Fer(w); // wake waiter, if there was one
2709
+ cond_var_tracer("Signal wakeup", this);
2710
+ }
2711
+ if ((v & kCvEvent) != 0) {
2712
+ PostSynchEvent(this, SYNCH_EV_SIGNAL);
2713
+ }
2714
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2715
+ return;
2716
+ } else {
2717
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2718
+ }
2719
+ }
2720
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2721
+ }
2722
+
2723
+ void CondVar::SignalAll() {
2724
+ ABSL_TSAN_MUTEX_PRE_SIGNAL(nullptr, 0);
2725
+ intptr_t v;
2726
+ int c = 0;
2727
+ for (v = cv_.load(std::memory_order_relaxed); v != 0;
2728
+ v = cv_.load(std::memory_order_relaxed)) {
2729
+ // empty the list if spinlock free
2730
+ // We do this by simply setting the list to empty using
2731
+ // compare and swap. We then have the entire list in our hands,
2732
+ // which cannot be changing since we grabbed it while no one
2733
+ // held the lock.
2734
+ if ((v & kCvSpin) == 0 &&
2735
+ cv_.compare_exchange_strong(v, v & kCvEvent, std::memory_order_acquire,
2736
+ std::memory_order_relaxed)) {
2737
+ PerThreadSynch* h = reinterpret_cast<PerThreadSynch*>(v & ~kCvLow);
2738
+ if (h != nullptr) {
2739
+ PerThreadSynch* w;
2740
+ PerThreadSynch* n = h->next;
2741
+ do { // for every thread, wake it up
2742
+ w = n;
2743
+ n = n->next;
2744
+ w->waitp->cvmu->Fer(w);
2745
+ } while (w != h);
2746
+ cond_var_tracer("SignalAll wakeup", this);
2747
+ }
2748
+ if ((v & kCvEvent) != 0) {
2749
+ PostSynchEvent(this, SYNCH_EV_SIGNALALL);
2750
+ }
2751
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2752
+ return;
2753
+ } else {
2754
+ // try again after a delay
2755
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2756
+ }
2757
+ }
2758
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2759
+ }
2760
+
2761
+ void ReleasableMutexLock::Release() {
2762
+ ABSL_RAW_CHECK(this->mu_ != nullptr,
2763
+ "ReleasableMutexLock::Release may only be called once");
2764
+ this->mu_->unlock();
2765
+ this->mu_ = nullptr;
2766
+ }
2767
+
2768
+ #ifdef ABSL_HAVE_THREAD_SANITIZER
2769
+ extern "C" void __tsan_read1(void* addr);
2770
+ #else
2771
+ #define __tsan_read1(addr) // do nothing if TSan not enabled
2772
+ #endif
2773
+
2774
+ // A function that just returns its argument, dereferenced
2775
+ static bool Dereference(void* arg) {
2776
+ // ThreadSanitizer does not instrument this file for memory accesses.
2777
+ // This function dereferences a user variable that can participate
2778
+ // in a data race, so we need to manually tell TSan about this memory access.
2779
+ __tsan_read1(arg);
2780
+ return *(static_cast<bool*>(arg));
2781
+ }
2782
+
2783
+ ABSL_CONST_INIT const Condition Condition::kTrue;
2784
+
2785
+ Condition::Condition(bool (*func)(void*), void* arg)
2786
+ : eval_(&CallVoidPtrFunction), arg_(arg) {
2787
+ static_assert(sizeof(&func) <= sizeof(callback_),
2788
+ "An overlarge function pointer passed to Condition.");
2789
+ StoreCallback(func);
2790
+ }
2791
+
2792
+ bool Condition::CallVoidPtrFunction(const Condition* c) {
2793
+ using FunctionPointer = bool (*)(void*);
2794
+ FunctionPointer function_pointer;
2795
+ std::memcpy(&function_pointer, c->callback_, sizeof(function_pointer));
2796
+ return (*function_pointer)(c->arg_);
2797
+ }
2798
+
2799
+ Condition::Condition(const bool* cond)
2800
+ : eval_(CallVoidPtrFunction),
2801
+ // const_cast is safe since Dereference does not modify arg
2802
+ arg_(const_cast<bool*>(cond)) {
2803
+ using FunctionPointer = bool (*)(void*);
2804
+ const FunctionPointer dereference = Dereference;
2805
+ StoreCallback(dereference);
2806
+ }
2807
+
2808
+ bool Condition::Eval() const { return (*this->eval_)(this); }
2809
+
2810
+ bool Condition::GuaranteedEqual(const Condition* a, const Condition* b) {
2811
+ if (a == nullptr || b == nullptr) {
2812
+ return a == b;
2813
+ }
2814
+ // Check equality of the representative fields.
2815
+ return a->eval_ == b->eval_ && a->arg_ == b->arg_ &&
2816
+ !memcmp(a->callback_, b->callback_, sizeof(a->callback_));
2817
+ }
2818
+
2819
+ ABSL_NAMESPACE_END
2820
+ } // namespace absl