grpc 1.84.0 → 1.85.0.pre1

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 (1004) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +40 -27
  3. data/include/grpc/event_engine/memory_allocator.h +1 -0
  4. data/include/grpc/grpc.h +3 -0
  5. data/include/grpc/grpc_security_constants.h +2 -0
  6. data/include/grpc/impl/channel_arg_names.h +4 -0
  7. data/src/core/call/call_filters.h +10 -10
  8. data/src/core/{lib/security/authorization → call}/evaluate_args.cc +22 -1
  9. data/src/core/{lib/security/authorization → call}/evaluate_args.h +19 -5
  10. data/src/core/call/filter_fusion.h +15 -15
  11. data/src/core/call/interception_chain.h +3 -3
  12. data/src/core/call/metadata_batch.cc +1 -0
  13. data/src/core/call/metadata_batch.h +45 -33
  14. data/src/core/call/parsed_metadata.h +3 -3
  15. data/src/core/call/request_buffer.cc +6 -6
  16. data/src/core/call/request_buffer.h +1 -1
  17. data/src/core/channelz/channel_trace.cc +5 -5
  18. data/src/core/channelz/channel_trace.h +1 -1
  19. data/src/core/channelz/channelz.cc +9 -9
  20. data/src/core/channelz/channelz.h +12 -12
  21. data/src/core/channelz/channelz_registry.cc +10 -10
  22. data/src/core/channelz/ztrace_collector.h +5 -5
  23. data/src/core/client_channel/client_channel.cc +4 -4
  24. data/src/core/client_channel/client_channel_filter.cc +14 -14
  25. data/src/core/client_channel/global_subchannel_pool.cc +4 -4
  26. data/src/core/client_channel/subchannel.cc +24 -23
  27. data/src/core/client_channel/subchannel_stream_client.cc +5 -5
  28. data/src/core/credentials/call/external/aws_external_account_credentials.cc +7 -7
  29. data/src/core/credentials/call/external/aws_request_signer.cc +16 -0
  30. data/src/core/credentials/call/external/external_account_credentials.cc +4 -4
  31. data/src/core/credentials/call/regional_access_boundary_fetcher.cc +9 -9
  32. data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +4 -4
  33. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -3
  34. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +1 -1
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +9 -9
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +1 -1
  37. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +6 -6
  38. data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
  39. data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +4 -4
  40. data/src/core/credentials/transport/tls/ssl_utils.cc +10 -0
  41. data/src/core/credentials/transport/tls/tls_security_connector.cc +10 -10
  42. data/src/core/credentials/transport/tls/tls_security_connector.h +6 -6
  43. data/src/core/credentials/transport/tls/tls_utils.h +9 -0
  44. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +1 -1
  45. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  46. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
  47. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +1 -1
  48. data/src/core/ext/filters/http/message_compress/compression_filter.cc +15 -0
  49. data/src/core/ext/filters/rbac/rbac_filter.h +1 -1
  50. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +5 -5
  51. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +30 -21
  52. data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -11
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +14 -11
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  55. data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -4
  56. data/src/core/ext/transport/chttp2/transport/frame.h +9 -0
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -9
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -2
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +16 -18
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +2 -1
  61. data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +277 -189
  62. data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +40 -17
  63. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +12 -24
  64. data/src/core/ext/transport/chttp2/transport/http2_transport.h +3 -29
  65. data/src/core/ext/transport/chttp2/transport/internal.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
  67. data/src/core/ext/transport/chttp2/transport/read_context.h +96 -3
  68. data/src/core/ext/transport/chttp2/transport/reclaimer.cc +32 -0
  69. data/src/core/ext/transport/chttp2/transport/reclaimer.h +64 -0
  70. data/src/core/ext/transport/chttp2/transport/security_frame.h +8 -8
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +17 -9
  72. data/src/core/ext/transport/chttp2/transport/write_cycle.h +23 -3
  73. data/src/core/ext/transport/inproc/inproc_transport.cc +5 -5
  74. data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb.h +137 -73
  75. data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb_minitable.c +45 -25
  76. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb.h +6 -6
  77. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.c +4 -4
  78. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.h +5 -5
  79. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb.h +46 -26
  80. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.c +17 -14
  81. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.h +5 -5
  82. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb.h +5 -5
  83. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.c +3 -3
  84. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.h +5 -5
  85. data/src/core/ext/upb-gen/grpc/health/v1/health.upb.h +329 -0
  86. data/src/core/ext/upb-gen/grpc/health/v1/health.upb_minitable.c +128 -0
  87. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/health/v1/health.upb_minitable.h +8 -5
  88. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb.h +5 -5
  89. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.c +3 -3
  90. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.h +5 -5
  91. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb.h +185 -23
  92. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.c +20 -12
  93. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.h +5 -5
  94. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb.h +58 -42
  95. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.c +17 -12
  96. data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.h +5 -5
  97. data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +567 -549
  98. data/src/core/ext/upbdefs-gen/grpc/lookup/v1/rls_config.upbdefs.c +182 -0
  99. data/src/core/ext/upbdefs-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upbdefs.h +14 -14
  100. data/src/core/filter/ext_proc/ext_proc_filter.cc +1603 -46
  101. data/src/core/filter/ext_proc/ext_proc_filter.h +55 -22
  102. data/src/core/filter/ext_proc/ext_proc_messages.cc +106 -51
  103. data/src/core/filter/ext_proc/ext_proc_messages.h +36 -9
  104. data/src/core/handshaker/handshaker.cc +4 -4
  105. data/src/core/handshaker/http_connect/http_connect_client_handshaker.cc +3 -3
  106. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +10 -10
  107. data/src/core/handshaker/security/secure_endpoint.cc +13 -13
  108. data/src/core/handshaker/security/security_handshaker.cc +6 -6
  109. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
  110. data/src/core/lib/channel/channel_args.cc +20 -0
  111. data/src/core/lib/channel/channel_args.h +17 -17
  112. data/src/core/lib/channel/promise_based_filter.cc +2 -2
  113. data/src/core/lib/channel/promise_based_filter.h +66 -27
  114. data/src/core/lib/debug/trace_flags.cc +2 -0
  115. data/src/core/lib/debug/trace_flags.h +1 -0
  116. data/src/core/lib/event_engine/ares_resolver.cc +14 -14
  117. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +7 -7
  118. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +4 -4
  119. data/src/core/lib/event_engine/default_event_engine.cc +5 -5
  120. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +9 -9
  121. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +16 -14
  122. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +6 -6
  123. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +3 -3
  124. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1 -1
  125. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +7 -7
  126. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +17 -17
  127. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +3 -3
  128. data/src/core/lib/event_engine/posix_engine/timer.cc +5 -5
  129. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +5 -5
  130. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +3 -3
  131. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +1 -1
  132. data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
  133. data/src/core/lib/event_engine/thread_pool/thread_count.h +3 -3
  134. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +50 -21
  135. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +3 -3
  136. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +3 -3
  137. data/src/core/lib/event_engine/windows/windows_engine.cc +15 -15
  138. data/src/core/lib/event_engine/windows/windows_listener.cc +6 -6
  139. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +6 -6
  140. data/src/core/lib/experiments/experiments.cc +48 -0
  141. data/src/core/lib/experiments/experiments.h +24 -0
  142. data/src/core/lib/iomgr/buffer_list.cc +3 -3
  143. data/src/core/lib/iomgr/buffer_list.h +1 -1
  144. data/src/core/lib/iomgr/combiner.cc +0 -1
  145. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  146. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  147. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  148. data/src/core/lib/iomgr/tcp_posix.cc +7 -7
  149. data/src/core/lib/promise/activity.cc +1 -1
  150. data/src/core/lib/promise/activity.h +1 -1
  151. data/src/core/lib/promise/arena_promise.h +7 -7
  152. data/src/core/lib/promise/detail/promise_factory.h +8 -8
  153. data/src/core/lib/promise/detail/promise_like.h +4 -4
  154. data/src/core/lib/promise/inter_activity_latch.h +6 -6
  155. data/src/core/lib/promise/inter_activity_pipe.h +1 -1
  156. data/src/core/lib/promise/observable.h +3 -3
  157. data/src/core/lib/promise/party.cc +1 -1
  158. data/src/core/lib/promise/try_seq.h +2 -2
  159. data/src/core/lib/resource_quota/arena.h +3 -3
  160. data/src/core/lib/resource_quota/memory_quota.cc +16 -16
  161. data/src/core/lib/resource_quota/memory_quota.h +1 -1
  162. data/src/core/lib/resource_quota/thread_quota.cc +3 -3
  163. data/src/core/lib/security/authorization/audit_logging.cc +5 -5
  164. data/src/core/lib/security/authorization/authorization_engine.h +1 -1
  165. data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
  166. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -1
  167. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
  168. data/src/core/lib/security/authorization/matchers.h +1 -1
  169. data/src/core/lib/surface/call.cc +8 -7
  170. data/src/core/lib/surface/call.h +3 -3
  171. data/src/core/lib/surface/call_utils.h +4 -0
  172. data/src/core/lib/surface/channel.cc +1 -1
  173. data/src/core/lib/surface/channel.h +1 -1
  174. data/src/core/lib/surface/channel_init.cc +1 -1
  175. data/src/core/lib/surface/init.cc +7 -7
  176. data/src/core/lib/surface/lame_client.cc +1 -1
  177. data/src/core/lib/surface/legacy_channel.cc +2 -2
  178. data/src/core/lib/surface/version.cc +1 -1
  179. data/src/core/lib/transport/transport_framing_endpoint_extension.h +3 -3
  180. data/src/core/load_balancing/autosharding/autosharding.cc +931 -0
  181. data/src/core/load_balancing/autosharding/autosharding.h +78 -0
  182. data/src/core/load_balancing/grpclb/grpclb_client_stats.cc +2 -2
  183. data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
  184. data/src/core/load_balancing/grpclb/load_balancer_api.h +3 -1
  185. data/src/core/load_balancing/health_check_client.cc +7 -7
  186. data/src/core/load_balancing/lb_policy.cc +1 -1
  187. data/src/core/load_balancing/oob_backend_metric.cc +5 -5
  188. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
  189. data/src/core/load_balancing/ring_hash/ring_hash.cc +109 -37
  190. data/src/core/load_balancing/rls/rls.cc +23 -17
  191. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +10 -10
  192. data/src/core/load_balancing/xds/cds.cc +6 -5
  193. data/src/core/load_balancing/xds/xds_cluster_impl.cc +2 -2
  194. data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
  195. data/src/core/mitigation_engine/mitigation_engine.h +28 -4
  196. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -0
  197. data/src/core/resolver/dns/dns_resolver.cc +7 -7
  198. data/src/core/resolver/fake/fake_resolver.cc +5 -5
  199. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +38 -30
  200. data/src/core/server/server.cc +30 -30
  201. data/src/core/server/server.h +4 -3
  202. data/src/core/server/server_config_selector_filter.cc +3 -3
  203. data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -15
  204. data/src/core/telemetry/default_tcp_tracer.cc +1 -1
  205. data/src/core/telemetry/instrument.cc +30 -16
  206. data/src/core/telemetry/instrument.h +3 -3
  207. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  208. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +4 -4
  209. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
  210. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  211. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  212. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
  213. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +3 -3
  214. data/src/core/tsi/ssl_transport_security.cc +46 -13
  215. data/src/core/tsi/ssl_transport_security.h +7 -0
  216. data/src/core/tsi/ssl_transport_security_utils.cc +16 -6
  217. data/src/core/util/event_log.cc +3 -3
  218. data/src/core/util/http_client/httpcli.cc +5 -5
  219. data/src/core/util/http_client/httpcli.h +1 -1
  220. data/src/core/util/json/json_object_loader.cc +7 -0
  221. data/src/core/util/json/json_object_loader.h +17 -2
  222. data/src/core/util/latent_see.cc +123 -36
  223. data/src/core/util/latent_see.h +14 -1
  224. data/src/core/util/mpscq.cc +1 -1
  225. data/src/core/util/notification.h +4 -4
  226. data/src/core/util/sync.h +20 -6
  227. data/src/core/util/table.h +20 -22
  228. data/src/core/util/work_serializer.cc +2 -2
  229. data/src/core/xds/grpc/blackboard.cc +4 -3
  230. data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
  231. data/src/core/xds/grpc/streaming_call_promise_wrapper.cc +181 -0
  232. data/src/core/xds/grpc/streaming_call_promise_wrapper.h +213 -0
  233. data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +2 -2
  234. data/src/core/xds/grpc/xds_client_grpc.cc +8 -8
  235. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  236. data/src/core/xds/grpc/xds_endpoint.cc +1 -1
  237. data/src/core/xds/grpc/xds_endpoint_parser.cc +11 -0
  238. data/src/core/xds/grpc/xds_grpc_service_parser.cc +12 -10
  239. data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +17 -14
  240. data/src/core/xds/grpc/xds_matcher.h +2 -2
  241. data/src/core/xds/grpc/xds_transport_grpc.cc +125 -85
  242. data/src/core/xds/grpc/xds_transport_grpc.h +19 -4
  243. data/src/core/xds/xds_client/lrs_client.cc +22 -19
  244. data/src/core/xds/xds_client/xds_client.cc +19 -16
  245. data/src/core/xds/xds_client/xds_transport.h +49 -3
  246. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  247. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  248. data/src/ruby/lib/grpc/version.rb +1 -1
  249. data/src/ruby/pb/README.md +1 -1
  250. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  251. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +34 -2
  252. data/third_party/abseil-cpp/absl/algorithm/container.h +345 -147
  253. data/third_party/abseil-cpp/absl/base/attributes.h +67 -44
  254. data/third_party/abseil-cpp/absl/base/call_once.h +1 -0
  255. data/third_party/abseil-cpp/absl/base/casts.cc +61 -0
  256. data/third_party/abseil-cpp/absl/base/casts.h +135 -2
  257. data/third_party/abseil-cpp/absl/base/config.h +63 -41
  258. data/third_party/abseil-cpp/absl/base/fast_type_id.h +30 -2
  259. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
  260. data/third_party/abseil-cpp/absl/base/internal/hardening.h +136 -0
  261. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +6 -2
  262. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -4
  263. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
  264. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
  265. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
  266. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +26 -24
  267. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +74 -29
  268. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -11
  269. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
  270. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +5 -1
  271. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
  272. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
  273. data/third_party/abseil-cpp/absl/base/macros.h +76 -37
  274. data/third_party/abseil-cpp/absl/base/nullability.h +5 -5
  275. data/third_party/abseil-cpp/absl/base/optimization.h +4 -5
  276. data/third_party/abseil-cpp/absl/base/options.h +46 -18
  277. data/third_party/abseil-cpp/absl/base/policy_checks.h +5 -5
  278. data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
  279. data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
  280. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +7 -2
  281. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
  282. data/third_party/abseil-cpp/absl/container/btree_map.h +60 -10
  283. data/third_party/abseil-cpp/absl/container/btree_set.h +61 -15
  284. data/third_party/abseil-cpp/absl/container/fixed_array.h +19 -21
  285. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +49 -27
  286. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +50 -26
  287. data/third_party/abseil-cpp/absl/container/inlined_vector.h +42 -36
  288. data/third_party/abseil-cpp/absl/container/internal/btree.h +32 -24
  289. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +30 -22
  290. data/third_party/abseil-cpp/absl/container/internal/common.h +57 -5
  291. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
  292. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +40 -36
  293. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +119 -39
  294. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +14 -2
  295. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +14 -22
  296. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +52 -52
  297. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +7 -7
  298. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +7 -7
  299. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +32 -40
  300. data/third_party/abseil-cpp/absl/container/internal/layout.h +13 -13
  301. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +95 -72
  302. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +633 -365
  303. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1016 -749
  304. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +0 -1
  305. data/third_party/abseil-cpp/absl/container/node_hash_map.h +58 -35
  306. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +23 -6
  307. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
  308. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -6
  309. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
  310. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
  311. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
  312. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +304 -188
  313. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
  314. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
  315. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
  316. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
  317. data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +15 -1
  318. data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -1
  319. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +12 -1
  320. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
  321. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -11
  322. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
  323. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
  324. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +6 -1
  325. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +14 -8
  326. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +48 -38
  327. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
  328. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +63 -118
  329. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +7 -47
  330. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +20 -2
  331. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +83 -149
  332. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
  333. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
  334. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
  335. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +8 -6
  336. data/third_party/abseil-cpp/absl/flags/declare.h +9 -0
  337. data/third_party/abseil-cpp/absl/flags/flag.h +2 -1
  338. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
  339. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +19 -18
  340. data/third_party/abseil-cpp/absl/flags/internal/flag.h +33 -34
  341. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
  342. data/third_party/abseil-cpp/absl/flags/marshalling.cc +1 -16
  343. data/third_party/abseil-cpp/absl/flags/marshalling.h +2 -28
  344. data/third_party/abseil-cpp/absl/flags/reflection.cc +11 -7
  345. data/third_party/abseil-cpp/absl/flags/usage_config.cc +2 -2
  346. data/third_party/abseil-cpp/absl/functional/any_invocable.h +22 -19
  347. data/third_party/abseil-cpp/absl/functional/bind_front.h +7 -1
  348. data/third_party/abseil-cpp/absl/functional/function_ref.h +125 -20
  349. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +43 -31
  350. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
  351. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +44 -6
  352. data/third_party/abseil-cpp/absl/hash/hash.h +1 -1
  353. data/third_party/abseil-cpp/absl/hash/internal/city.cc +39 -51
  354. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +379 -14
  355. data/third_party/abseil-cpp/absl/hash/internal/hash.h +457 -353
  356. data/third_party/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
  357. data/third_party/abseil-cpp/absl/log/internal/check_impl.h +2 -1
  358. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +4 -0
  359. data/third_party/abseil-cpp/absl/log/internal/check_op.h +128 -50
  360. data/third_party/abseil-cpp/absl/log/internal/conditions.h +38 -35
  361. data/third_party/abseil-cpp/absl/log/internal/log_impl.h +108 -110
  362. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +10 -6
  363. data/third_party/abseil-cpp/absl/log/internal/log_message.h +19 -1
  364. data/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
  365. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -1
  366. data/third_party/abseil-cpp/absl/log/internal/proto.cc +13 -0
  367. data/third_party/abseil-cpp/absl/log/internal/strip.h +30 -31
  368. data/third_party/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
  369. data/third_party/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
  370. data/third_party/abseil-cpp/absl/log/internal/vlog_config.cc +30 -30
  371. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
  372. data/third_party/abseil-cpp/absl/log/log.h +2 -2
  373. data/third_party/abseil-cpp/absl/log/log_entry.cc +263 -0
  374. data/third_party/abseil-cpp/absl/log/log_entry.h +2 -0
  375. data/third_party/abseil-cpp/absl/log/vlog_is_on.h +0 -2
  376. data/third_party/abseil-cpp/absl/memory/memory.h +55 -5
  377. data/third_party/abseil-cpp/absl/meta/type_traits.h +161 -56
  378. data/third_party/abseil-cpp/absl/numeric/int128.h +41 -21
  379. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
  380. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
  381. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +32 -4
  382. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
  383. data/third_party/abseil-cpp/absl/random/beta_distribution.h +2 -2
  384. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
  385. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +1 -1
  386. data/third_party/abseil-cpp/absl/random/distributions.h +17 -17
  387. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +1 -1
  388. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
  389. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc +2 -2
  390. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
  391. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
  392. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
  393. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
  394. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
  395. data/third_party/abseil-cpp/absl/random/internal/platform.h +0 -13
  396. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
  397. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
  398. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
  399. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +5 -31
  400. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +2 -1
  401. data/third_party/abseil-cpp/absl/random/internal/traits.h +21 -0
  402. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
  403. data/third_party/abseil-cpp/absl/random/mocking_access.h +74 -0
  404. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  405. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
  406. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +30 -4
  407. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +225 -63
  408. data/third_party/abseil-cpp/absl/status/status.cc +66 -70
  409. data/third_party/abseil-cpp/absl/status/status.h +254 -23
  410. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +3 -2
  411. data/third_party/abseil-cpp/absl/status/statusor.h +117 -137
  412. data/third_party/abseil-cpp/absl/strings/ascii.h +10 -6
  413. data/third_party/abseil-cpp/absl/strings/cord.cc +41 -17
  414. data/third_party/abseil-cpp/absl/strings/cord.h +26 -17
  415. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +4 -2
  416. data/third_party/abseil-cpp/absl/strings/escaping.cc +305 -125
  417. data/third_party/abseil-cpp/absl/strings/escaping.h +12 -2
  418. data/third_party/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +2 -2
  420. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
  421. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +27 -21
  422. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +11 -19
  423. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
  424. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
  425. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
  426. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +2 -24
  427. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -36
  428. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
  429. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
  430. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
  431. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
  432. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +921 -231
  433. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -16
  434. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +16 -12
  435. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
  436. data/third_party/abseil-cpp/absl/strings/numbers.cc +477 -8
  437. data/third_party/abseil-cpp/absl/strings/numbers.h +29 -12
  438. data/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h +198 -0
  439. data/third_party/abseil-cpp/absl/strings/str_cat.cc +96 -91
  440. data/third_party/abseil-cpp/absl/strings/str_cat.h +53 -13
  441. data/third_party/abseil-cpp/absl/strings/str_split.h +14 -9
  442. data/third_party/abseil-cpp/absl/strings/string_view.h +10 -716
  443. data/third_party/abseil-cpp/absl/strings/substitute.cc +24 -24
  444. data/third_party/abseil-cpp/absl/strings/substitute.h +2 -2
  445. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +1 -1
  446. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
  447. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +24 -3
  448. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
  449. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
  450. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
  451. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +41 -29
  452. data/third_party/abseil-cpp/absl/synchronization/mutex.h +199 -94
  453. data/third_party/abseil-cpp/absl/synchronization/notification.cc +5 -5
  454. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  455. data/third_party/abseil-cpp/absl/time/clock.cc +29 -30
  456. data/third_party/abseil-cpp/absl/time/clock.h +3 -0
  457. data/third_party/abseil-cpp/absl/time/duration.cc +2 -2
  458. data/third_party/abseil-cpp/absl/time/format.cc +3 -10
  459. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
  460. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +131 -91
  461. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
  462. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +185 -0
  463. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
  464. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
  465. data/third_party/abseil-cpp/absl/time/time.cc +4 -4
  466. data/third_party/abseil-cpp/absl/time/time.h +14 -13
  467. data/third_party/abseil-cpp/absl/types/compare.h +64 -63
  468. data/third_party/abseil-cpp/absl/types/internal/span.h +6 -6
  469. data/third_party/abseil-cpp/absl/types/optional.h +31 -4
  470. data/third_party/abseil-cpp/absl/types/optional_ref.h +295 -0
  471. data/third_party/{boringssl-with-bazel/crypto/x509/x_val.cc → abseil-cpp/absl/types/source_location.cc} +4 -14
  472. data/third_party/abseil-cpp/absl/types/source_location.h +172 -0
  473. data/third_party/abseil-cpp/absl/types/span.h +67 -38
  474. data/third_party/abseil-cpp/absl/types/variant.h +75 -18
  475. data/third_party/abseil-cpp/absl/utility/utility.h +112 -16
  476. data/third_party/boringssl-with-bazel/crypto/aes/aes.cc +3 -0
  477. data/third_party/boringssl-with-bazel/crypto/armv8_feature_parsing.h +67 -0
  478. data/third_party/boringssl-with-bazel/crypto/asn1/a_bitstr.cc +143 -105
  479. data/third_party/boringssl-with-bazel/crypto/asn1/a_bool.cc +5 -8
  480. data/third_party/boringssl-with-bazel/crypto/asn1/a_d2i_fp.cc +3 -3
  481. data/third_party/boringssl-with-bazel/crypto/asn1/a_dup.cc +6 -6
  482. data/third_party/boringssl-with-bazel/crypto/asn1/a_gentm.cc +33 -12
  483. data/third_party/boringssl-with-bazel/crypto/asn1/a_i2d_fp.cc +7 -6
  484. data/third_party/boringssl-with-bazel/crypto/asn1/a_int.cc +80 -52
  485. data/third_party/boringssl-with-bazel/crypto/asn1/a_mbstr.cc +7 -4
  486. data/third_party/boringssl-with-bazel/crypto/asn1/a_object.cc +70 -72
  487. data/third_party/boringssl-with-bazel/crypto/asn1/a_strex.cc +38 -42
  488. data/third_party/boringssl-with-bazel/crypto/asn1/a_strnid.cc +41 -39
  489. data/third_party/boringssl-with-bazel/crypto/asn1/a_time.cc +59 -35
  490. data/third_party/boringssl-with-bazel/crypto/asn1/a_type.cc +275 -15
  491. data/third_party/boringssl-with-bazel/crypto/asn1/a_utctm.cc +32 -13
  492. data/third_party/boringssl-with-bazel/crypto/asn1/asn1_lib.cc +128 -30
  493. data/third_party/boringssl-with-bazel/crypto/asn1/asn_pack.cc +10 -10
  494. data/third_party/boringssl-with-bazel/crypto/asn1/f_int.cc +1 -1
  495. data/third_party/boringssl-with-bazel/crypto/asn1/f_string.cc +1 -1
  496. data/third_party/boringssl-with-bazel/crypto/asn1/internal.h +261 -115
  497. data/third_party/boringssl-with-bazel/crypto/asn1/posix_time.cc +8 -5
  498. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_dec.cc +373 -725
  499. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_enc.cc +211 -526
  500. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_fre.cc +22 -19
  501. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_new.cc +26 -24
  502. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_typ.cc +19 -5
  503. data/third_party/boringssl-with-bazel/crypto/asn1/tasn_utl.cc +47 -51
  504. data/third_party/boringssl-with-bazel/crypto/base64/base64.cc +14 -15
  505. data/third_party/boringssl-with-bazel/crypto/bcm_support.h +7 -29
  506. data/third_party/boringssl-with-bazel/crypto/bio/bio.cc +234 -176
  507. data/third_party/boringssl-with-bazel/crypto/bio/bio_mem.cc +72 -86
  508. data/third_party/boringssl-with-bazel/crypto/bio/connect.cc +153 -199
  509. data/third_party/boringssl-with-bazel/crypto/bio/errno.cc +3 -1
  510. data/third_party/boringssl-with-bazel/crypto/bio/fd.cc +56 -55
  511. data/third_party/boringssl-with-bazel/crypto/bio/file.cc +70 -78
  512. data/third_party/boringssl-with-bazel/crypto/bio/hexdump.cc +6 -4
  513. data/third_party/boringssl-with-bazel/crypto/bio/internal.h +69 -17
  514. data/third_party/boringssl-with-bazel/crypto/bio/pair.cc +117 -136
  515. data/third_party/boringssl-with-bazel/crypto/bio/printf.cc +1 -1
  516. data/third_party/boringssl-with-bazel/crypto/bio/socket.cc +116 -50
  517. data/third_party/boringssl-with-bazel/crypto/bio/socket_helper.cc +53 -5
  518. data/third_party/boringssl-with-bazel/crypto/blake2/blake2.cc +9 -5
  519. data/third_party/boringssl-with-bazel/crypto/bn/bn_asn1.cc +2 -2
  520. data/third_party/boringssl-with-bazel/crypto/bn/convert.cc +56 -70
  521. data/third_party/boringssl-with-bazel/crypto/bn/div.cc +102 -0
  522. data/third_party/boringssl-with-bazel/crypto/bn/exponentiation.cc +26 -42
  523. data/third_party/boringssl-with-bazel/crypto/bn/sqrt.cc +93 -0
  524. data/third_party/boringssl-with-bazel/crypto/buf/buf.cc +6 -5
  525. data/third_party/boringssl-with-bazel/crypto/bytestring/asn1_compat.cc +6 -5
  526. data/third_party/boringssl-with-bazel/crypto/bytestring/ber.cc +22 -20
  527. data/third_party/boringssl-with-bazel/crypto/bytestring/cbb.cc +119 -59
  528. data/third_party/boringssl-with-bazel/crypto/bytestring/cbs.cc +115 -31
  529. data/third_party/boringssl-with-bazel/crypto/bytestring/internal.h +79 -24
  530. data/third_party/boringssl-with-bazel/crypto/bytestring/unicode.cc +2 -2
  531. data/third_party/boringssl-with-bazel/crypto/chacha/chacha.cc +5 -3
  532. data/third_party/boringssl-with-bazel/crypto/chacha/internal.h +23 -22
  533. data/third_party/boringssl-with-bazel/crypto/cipher/derive_key.cc +14 -18
  534. data/third_party/boringssl-with-bazel/crypto/cipher/e_aesctrhmac.cc +73 -58
  535. data/third_party/boringssl-with-bazel/crypto/cipher/e_aeseax.cc +132 -70
  536. data/third_party/boringssl-with-bazel/crypto/cipher/e_aesgcmsiv.cc +390 -249
  537. data/third_party/boringssl-with-bazel/crypto/cipher/e_chacha20poly1305.cc +200 -137
  538. data/third_party/boringssl-with-bazel/crypto/cipher/e_des.cc +45 -29
  539. data/third_party/boringssl-with-bazel/crypto/cipher/e_null.cc +9 -5
  540. data/third_party/boringssl-with-bazel/crypto/cipher/e_rc2.cc +43 -28
  541. data/third_party/boringssl-with-bazel/crypto/cipher/e_rc4.cc +7 -5
  542. data/third_party/boringssl-with-bazel/crypto/cipher/e_tls.cc +250 -237
  543. data/third_party/boringssl-with-bazel/crypto/cipher/get_cipher.cc +12 -12
  544. data/third_party/boringssl-with-bazel/crypto/cipher/internal.h +59 -59
  545. data/third_party/boringssl-with-bazel/crypto/cipher/tls_cbc.cc +111 -111
  546. data/third_party/boringssl-with-bazel/crypto/cms/cms.cc +48 -42
  547. data/third_party/boringssl-with-bazel/crypto/conf/conf.cc +69 -63
  548. data/third_party/boringssl-with-bazel/crypto/conf/internal.h +11 -12
  549. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_apple.cc +8 -5
  550. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_fuchsia.cc +6 -1
  551. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_linux.cc +7 -1
  552. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_openbsd.cc +7 -21
  553. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_sysreg.cc +15 -41
  554. data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_win.cc +16 -3
  555. data/third_party/boringssl-with-bazel/crypto/cpu_arm_freebsd.cc +4 -2
  556. data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.cc +54 -31
  557. data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.h +79 -101
  558. data/third_party/boringssl-with-bazel/crypto/cpu_intel.cc +51 -45
  559. data/third_party/boringssl-with-bazel/crypto/crypto.cc +26 -55
  560. data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519.cc +28 -25
  561. data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519_tables.h +6 -6
  562. data/third_party/boringssl-with-bazel/crypto/curve25519/internal.h +14 -15
  563. data/third_party/boringssl-with-bazel/crypto/curve25519/spake25519.cc +23 -20
  564. data/third_party/boringssl-with-bazel/crypto/des/des.cc +27 -19
  565. data/third_party/boringssl-with-bazel/crypto/des/internal.h +4 -9
  566. data/third_party/boringssl-with-bazel/crypto/dh/dh_asn1.cc +34 -49
  567. data/third_party/boringssl-with-bazel/crypto/dh/params.cc +44 -41
  568. data/third_party/boringssl-with-bazel/crypto/digest/digest_extra.cc +87 -40
  569. data/third_party/boringssl-with-bazel/crypto/dsa/dsa.cc +237 -260
  570. data/third_party/boringssl-with-bazel/crypto/dsa/dsa_asn1.cc +100 -173
  571. data/third_party/boringssl-with-bazel/crypto/dsa/internal.h +23 -21
  572. data/third_party/boringssl-with-bazel/crypto/ec/ec_asn1.cc +181 -209
  573. data/third_party/boringssl-with-bazel/crypto/ec/ec_derive.cc +26 -28
  574. data/third_party/boringssl-with-bazel/crypto/ec/hash_to_curve.cc +265 -174
  575. data/third_party/boringssl-with-bazel/crypto/ec/internal.h +54 -18
  576. data/third_party/boringssl-with-bazel/crypto/ecdh/ecdh.cc +7 -5
  577. data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_asn1.cc +50 -70
  578. data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_p1363.cc +54 -0
  579. data/third_party/boringssl-with-bazel/crypto/engine/engine.cc +7 -7
  580. data/third_party/boringssl-with-bazel/crypto/err/err.cc +116 -105
  581. data/third_party/boringssl-with-bazel/crypto/err/internal.h +8 -21
  582. data/third_party/boringssl-with-bazel/crypto/evp/evp.cc +238 -166
  583. data/third_party/boringssl-with-bazel/crypto/evp/evp_asn1.cc +202 -234
  584. data/third_party/boringssl-with-bazel/crypto/evp/evp_ctx.cc +260 -159
  585. data/third_party/boringssl-with-bazel/crypto/evp/evp_kem.cc +82 -0
  586. data/third_party/boringssl-with-bazel/crypto/evp/internal.h +292 -137
  587. data/third_party/boringssl-with-bazel/crypto/evp/p_dh.cc +198 -25
  588. data/third_party/boringssl-with-bazel/crypto/evp/p_dsa.cc +333 -0
  589. data/third_party/boringssl-with-bazel/crypto/evp/p_ec.cc +427 -42
  590. data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519.cc +270 -14
  591. data/third_party/boringssl-with-bazel/crypto/evp/p_hkdf.cc +70 -102
  592. data/third_party/boringssl-with-bazel/crypto/evp/p_mldsa.cc +549 -0
  593. data/third_party/boringssl-with-bazel/crypto/evp/p_mlkem.cc +485 -0
  594. data/third_party/boringssl-with-bazel/crypto/evp/p_rsa.cc +666 -158
  595. data/third_party/boringssl-with-bazel/crypto/evp/p_x25519.cc +290 -28
  596. data/third_party/boringssl-with-bazel/crypto/evp/p_xwing.cc +273 -0
  597. data/third_party/boringssl-with-bazel/crypto/evp/pbkdf.cc +14 -7
  598. data/third_party/boringssl-with-bazel/crypto/evp/print.cc +34 -89
  599. data/third_party/boringssl-with-bazel/crypto/evp/scrypt.cc +23 -21
  600. data/third_party/boringssl-with-bazel/crypto/evp/sign.cc +23 -42
  601. data/third_party/boringssl-with-bazel/crypto/ex_data.cc +40 -41
  602. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes.cc.inc +34 -28
  603. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes_nohw.cc.inc +119 -121
  604. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cbc.cc.inc +16 -14
  605. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cfb.cc.inc +12 -10
  606. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ctr.cc.inc +7 -5
  607. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm.cc.inc +39 -29
  608. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm_nohw.cc.inc +15 -13
  609. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/internal.h +193 -177
  610. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/key_wrap.cc.inc +5 -3
  611. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/mode_wrappers.cc.inc +7 -3
  612. data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ofb.cc.inc +7 -5
  613. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm.cc +24 -19
  614. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm_interface.h +512 -384
  615. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/add.cc.inc +7 -5
  616. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/asm/x86_64-gcc.cc.inc +63 -44
  617. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bn.cc.inc +40 -37
  618. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bytes.cc.inc +27 -22
  619. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/cmp.cc.inc +9 -7
  620. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/ctx.cc.inc +62 -126
  621. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div.cc.inc +92 -167
  622. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div_extra.cc.inc +15 -12
  623. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/exponentiation.cc.inc +96 -93
  624. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd.cc.inc +73 -92
  625. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd_extra.cc.inc +59 -71
  626. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/generic.cc.inc +54 -57
  627. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/internal.h +333 -255
  628. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/jacobi.cc.inc +12 -19
  629. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery.cc.inc +80 -95
  630. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery_inv.cc.inc +53 -96
  631. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/mul.cc.inc +58 -419
  632. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/prime.cc.inc +164 -213
  633. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/random.cc.inc +27 -26
  634. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.cc.inc +12 -10
  635. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.h +47 -49
  636. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/shift.cc.inc +14 -17
  637. data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/sqrt.cc.inc +19 -108
  638. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/aead.cc.inc +427 -105
  639. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/cipher.cc.inc +412 -212
  640. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aes.cc.inc +230 -225
  641. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aesccm.cc.inc +115 -84
  642. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/internal.h +374 -27
  643. data/third_party/boringssl-with-bazel/crypto/fipsmodule/cmac/cmac.cc.inc +28 -23
  644. data/third_party/boringssl-with-bazel/crypto/fipsmodule/delocate.h +36 -40
  645. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/check.cc.inc +68 -78
  646. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/dh.cc.inc +154 -196
  647. data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/internal.h +24 -24
  648. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digest.cc.inc +40 -69
  649. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digests.cc.inc +13 -7
  650. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/internal.h +13 -11
  651. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/md32_common.h +86 -81
  652. data/third_party/boringssl-with-bazel/crypto/fipsmodule/digestsign/digestsign.cc.inc +38 -34
  653. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec.cc.inc +187 -196
  654. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_key.cc.inc +196 -154
  655. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_montgomery.cc.inc +65 -125
  656. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/felem.cc.inc +85 -22
  657. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/internal.h +281 -287
  658. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/oct.cc.inc +23 -22
  659. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256.cc.inc +514 -573
  660. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256_internal.h +193 -0
  661. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/scalar.cc.inc +44 -39
  662. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple.cc.inc +58 -90
  663. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple_mul.cc.inc +39 -34
  664. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/util.cc.inc +6 -3
  665. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/wnaf.cc.inc +23 -20
  666. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdh/ecdh.cc.inc +6 -3
  667. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/ecdsa.cc.inc +47 -37
  668. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/internal.h +5 -10
  669. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/internal.h +38 -0
  670. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/jitter.cc.inc +463 -0
  671. data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/sha512.cc.inc +329 -0
  672. data/third_party/boringssl-with-bazel/crypto/fipsmodule/hkdf/hkdf.cc.inc +8 -6
  673. data/third_party/boringssl-with-bazel/crypto/fipsmodule/hmac/hmac.cc.inc +19 -16
  674. data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/internal.h +41 -15
  675. data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/keccak.cc.inc +172 -44
  676. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/fips_known_values.inc +5 -5
  677. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/mldsa.cc.inc +1632 -766
  678. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/fips_known_values.inc +5 -5
  679. data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/mlkem.cc.inc +740 -436
  680. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/android_entropy_client.cc.inc +82 -0
  681. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/ctrdrbg.cc.inc +240 -53
  682. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/internal.h +41 -26
  683. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/rand.cc.inc +221 -218
  684. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/internal.h +64 -67
  685. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/padding.cc.inc +49 -57
  686. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa.cc.inc +247 -234
  687. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa_impl.cc.inc +392 -692
  688. data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/fips.cc.inc +10 -10
  689. data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/self_check.cc.inc +479 -449
  690. data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/internal.h +34 -11
  691. data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/service_indicator.cc.inc +46 -43
  692. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/internal.h +61 -70
  693. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha1.cc.inc +27 -13
  694. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha256.cc.inc +46 -30
  695. data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha512.cc.inc +47 -47
  696. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/address.h +98 -73
  697. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.cc.inc +108 -98
  698. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.h +14 -24
  699. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.cc.inc +94 -91
  700. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.h +19 -31
  701. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/params.h +156 -56
  702. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/slhdsa.cc.inc +318 -132
  703. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.cc.inc +234 -81
  704. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.h +20 -34
  705. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.cc.inc +97 -96
  706. data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.h +10 -20
  707. data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/internal.h +2 -16
  708. data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/kdf.cc.inc +26 -26
  709. data/third_party/boringssl-with-bazel/crypto/fuzzer_mode.cc +5 -5
  710. data/third_party/boringssl-with-bazel/crypto/hpke/hpke.cc +461 -97
  711. data/third_party/boringssl-with-bazel/crypto/hrss/hrss.cc +153 -149
  712. data/third_party/boringssl-with-bazel/crypto/hrss/internal.h +9 -13
  713. data/third_party/boringssl-with-bazel/crypto/internal.h +531 -394
  714. data/third_party/boringssl-with-bazel/crypto/kyber/internal.h +117 -12
  715. data/third_party/boringssl-with-bazel/crypto/kyber/kyber.cc +59 -58
  716. data/third_party/boringssl-with-bazel/crypto/lhash/internal.h +38 -37
  717. data/third_party/boringssl-with-bazel/crypto/lhash/lhash.cc +68 -65
  718. data/third_party/boringssl-with-bazel/crypto/md4/md4.cc +19 -6
  719. data/third_party/boringssl-with-bazel/crypto/md5/internal.h +6 -9
  720. data/third_party/boringssl-with-bazel/crypto/md5/md5.cc +18 -6
  721. data/third_party/boringssl-with-bazel/crypto/mem.cc +61 -65
  722. data/third_party/boringssl-with-bazel/crypto/mem_internal.h +671 -0
  723. data/third_party/boringssl-with-bazel/crypto/mldsa/mldsa.cc +238 -32
  724. data/third_party/boringssl-with-bazel/crypto/mlkem/mlkem.cc +21 -65
  725. data/third_party/boringssl-with-bazel/crypto/obj/obj.cc +132 -157
  726. data/third_party/boringssl-with-bazel/crypto/obj/obj_dat.h +79 -1
  727. data/third_party/boringssl-with-bazel/crypto/obj/obj_xref.cc +14 -11
  728. data/third_party/boringssl-with-bazel/crypto/params_internal.h +30 -0
  729. data/third_party/boringssl-with-bazel/crypto/pem/internal.h +20 -15
  730. data/third_party/boringssl-with-bazel/crypto/pem/pem_all.cc +20 -19
  731. data/third_party/boringssl-with-bazel/crypto/pem/pem_info.cc +72 -76
  732. data/third_party/boringssl-with-bazel/crypto/pem/pem_lib.cc +215 -217
  733. data/third_party/boringssl-with-bazel/crypto/pem/pem_oth.cc +6 -6
  734. data/third_party/boringssl-with-bazel/crypto/pem/pem_pk8.cc +13 -13
  735. data/third_party/boringssl-with-bazel/crypto/pem/pem_pkey.cc +11 -11
  736. data/third_party/boringssl-with-bazel/crypto/pkcs7/internal.h +12 -17
  737. data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7.cc +29 -27
  738. data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7_x509.cc +55 -49
  739. data/third_party/boringssl-with-bazel/crypto/pkcs8/internal.h +21 -26
  740. data/third_party/boringssl-with-bazel/crypto/pkcs8/p5_pbev2.cc +33 -31
  741. data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8.cc +73 -81
  742. data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8_x509.cc +139 -138
  743. data/third_party/boringssl-with-bazel/crypto/poly1305/internal.h +3 -7
  744. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305.cc +5 -4
  745. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_arm.cc +43 -47
  746. data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_vec.cc +29 -26
  747. data/third_party/boringssl-with-bazel/crypto/pool/internal.h +64 -20
  748. data/third_party/boringssl-with-bazel/crypto/pool/pool.cc +177 -157
  749. data/third_party/boringssl-with-bazel/crypto/rand/deterministic.cc +9 -16
  750. data/third_party/boringssl-with-bazel/crypto/rand/fork_detect.cc +70 -42
  751. data/third_party/boringssl-with-bazel/crypto/rand/forkunsafe.cc +7 -7
  752. data/third_party/boringssl-with-bazel/crypto/rand/getentropy.cc +6 -13
  753. data/third_party/boringssl-with-bazel/crypto/rand/internal.h +16 -4
  754. data/third_party/boringssl-with-bazel/crypto/rand/ios.cc +4 -11
  755. data/third_party/boringssl-with-bazel/crypto/rand/rand.cc +11 -9
  756. data/third_party/boringssl-with-bazel/crypto/rand/trusty.cc +4 -11
  757. data/third_party/boringssl-with-bazel/crypto/rand/urandom.cc +16 -195
  758. data/third_party/boringssl-with-bazel/crypto/rand/windows.cc +12 -19
  759. data/third_party/boringssl-with-bazel/crypto/refcount.cc +7 -17
  760. data/third_party/boringssl-with-bazel/crypto/rsa/internal.h +22 -7
  761. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_asn1.cc +199 -78
  762. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_crypt.cc +49 -50
  763. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_extra.cc +11 -0
  764. data/third_party/boringssl-with-bazel/crypto/rsa/rsa_print.cc +4 -6
  765. data/third_party/boringssl-with-bazel/crypto/sha/sha1.cc +3 -0
  766. data/third_party/boringssl-with-bazel/crypto/sha/sha256.cc +3 -1
  767. data/third_party/boringssl-with-bazel/crypto/sha/sha512.cc +6 -4
  768. data/third_party/boringssl-with-bazel/crypto/siphash/siphash.cc +2 -0
  769. data/third_party/boringssl-with-bazel/crypto/slhdsa/slhdsa.cc +43 -6
  770. data/third_party/boringssl-with-bazel/crypto/spake2plus/internal.h +31 -31
  771. data/third_party/boringssl-with-bazel/crypto/spake2plus/spake2plus.cc +1 -1
  772. data/third_party/boringssl-with-bazel/crypto/stack/stack.cc +89 -130
  773. data/third_party/boringssl-with-bazel/crypto/thread.cc +14 -14
  774. data/third_party/boringssl-with-bazel/crypto/thread_none.cc +10 -13
  775. data/third_party/boringssl-with-bazel/crypto/thread_pthread.cc +22 -35
  776. data/third_party/boringssl-with-bazel/crypto/thread_win.cc +29 -40
  777. data/third_party/boringssl-with-bazel/crypto/trust_token/internal.h +81 -88
  778. data/third_party/boringssl-with-bazel/crypto/trust_token/pmbtoken.cc +160 -144
  779. data/third_party/boringssl-with-bazel/crypto/trust_token/trust_token.cc +96 -80
  780. data/third_party/boringssl-with-bazel/crypto/trust_token/voprf.cc +90 -87
  781. data/third_party/boringssl-with-bazel/crypto/x509/a_digest.cc +5 -5
  782. data/third_party/boringssl-with-bazel/crypto/x509/a_sign.cc +51 -48
  783. data/third_party/boringssl-with-bazel/crypto/x509/a_verify.cc +30 -34
  784. data/third_party/boringssl-with-bazel/crypto/x509/algorithm.cc +47 -16
  785. data/third_party/boringssl-with-bazel/crypto/x509/asn1_gen.cc +41 -43
  786. data/third_party/boringssl-with-bazel/crypto/x509/by_dir.cc +183 -237
  787. data/third_party/boringssl-with-bazel/crypto/x509/by_file.cc +29 -30
  788. data/third_party/boringssl-with-bazel/crypto/x509/internal.h +276 -180
  789. data/third_party/boringssl-with-bazel/crypto/x509/name_print.cc +15 -13
  790. data/third_party/boringssl-with-bazel/crypto/x509/policy.cc +415 -525
  791. data/third_party/boringssl-with-bazel/crypto/x509/rsa_pss.cc +94 -271
  792. data/third_party/boringssl-with-bazel/crypto/x509/t_crl.cc +11 -8
  793. data/third_party/boringssl-with-bazel/crypto/x509/t_req.cc +26 -23
  794. data/third_party/boringssl-with-bazel/crypto/x509/t_x509.cc +26 -22
  795. data/third_party/boringssl-with-bazel/crypto/x509/t_x509a.cc +3 -1
  796. data/third_party/boringssl-with-bazel/crypto/x509/v3_akey.cc +69 -76
  797. data/third_party/boringssl-with-bazel/crypto/x509/v3_akeya.cc +2 -2
  798. data/third_party/boringssl-with-bazel/crypto/x509/v3_alt.cc +112 -69
  799. data/third_party/boringssl-with-bazel/crypto/x509/v3_bcons.cc +15 -14
  800. data/third_party/boringssl-with-bazel/crypto/x509/v3_bitst.cc +16 -18
  801. data/third_party/boringssl-with-bazel/crypto/x509/v3_conf.cc +62 -67
  802. data/third_party/boringssl-with-bazel/crypto/x509/v3_cpols.cc +143 -170
  803. data/third_party/boringssl-with-bazel/crypto/x509/v3_crld.cc +121 -165
  804. data/third_party/boringssl-with-bazel/crypto/x509/v3_enum.cc +13 -12
  805. data/third_party/boringssl-with-bazel/crypto/x509/v3_extku.cc +17 -34
  806. data/third_party/boringssl-with-bazel/crypto/x509/v3_genn.cc +20 -10
  807. data/third_party/boringssl-with-bazel/crypto/x509/v3_ia5.cc +22 -18
  808. data/third_party/boringssl-with-bazel/crypto/x509/v3_info.cc +45 -47
  809. data/third_party/boringssl-with-bazel/crypto/x509/v3_int.cc +35 -33
  810. data/third_party/boringssl-with-bazel/crypto/x509/v3_lib.cc +106 -61
  811. data/third_party/boringssl-with-bazel/crypto/x509/v3_ncons.cc +642 -358
  812. data/third_party/boringssl-with-bazel/crypto/x509/v3_ocsp.cc +25 -22
  813. data/third_party/boringssl-with-bazel/crypto/x509/v3_pcons.cc +15 -14
  814. data/third_party/boringssl-with-bazel/crypto/x509/v3_pmaps.cc +16 -15
  815. data/third_party/boringssl-with-bazel/crypto/x509/v3_prn.cc +6 -6
  816. data/third_party/boringssl-with-bazel/crypto/x509/v3_purp.cc +150 -137
  817. data/third_party/boringssl-with-bazel/crypto/x509/v3_skey.cc +23 -26
  818. data/third_party/boringssl-with-bazel/crypto/x509/v3_utl.cc +151 -178
  819. data/third_party/boringssl-with-bazel/crypto/x509/x509.cc +1 -1
  820. data/third_party/boringssl-with-bazel/crypto/x509/x509_att.cc +32 -30
  821. data/third_party/boringssl-with-bazel/crypto/x509/x509_cmp.cc +95 -88
  822. data/third_party/boringssl-with-bazel/crypto/x509/x509_d2.cc +9 -9
  823. data/third_party/boringssl-with-bazel/crypto/x509/x509_def.cc +6 -8
  824. data/third_party/boringssl-with-bazel/crypto/x509/x509_ext.cc +46 -24
  825. data/third_party/boringssl-with-bazel/crypto/x509/x509_lu.cc +211 -195
  826. data/third_party/boringssl-with-bazel/crypto/x509/x509_obj.cc +20 -16
  827. data/third_party/boringssl-with-bazel/crypto/x509/x509_req.cc +37 -46
  828. data/third_party/boringssl-with-bazel/crypto/x509/x509_set.cc +62 -90
  829. data/third_party/boringssl-with-bazel/crypto/x509/x509_trs.cc +18 -13
  830. data/third_party/boringssl-with-bazel/crypto/x509/x509_v3.cc +33 -33
  831. data/third_party/boringssl-with-bazel/crypto/x509/x509_vfy.cc +109 -110
  832. data/third_party/boringssl-with-bazel/crypto/x509/x509_vpm.cc +56 -47
  833. data/third_party/boringssl-with-bazel/crypto/x509/x509cset.cc +27 -40
  834. data/third_party/boringssl-with-bazel/crypto/x509/x509name.cc +77 -67
  835. data/third_party/boringssl-with-bazel/crypto/x509/x509rset.cc +5 -17
  836. data/third_party/boringssl-with-bazel/crypto/x509/x509spki.cc +13 -13
  837. data/third_party/boringssl-with-bazel/crypto/x509/x_algor.cc +131 -24
  838. data/third_party/boringssl-with-bazel/crypto/x509/x_all.cc +72 -39
  839. data/third_party/boringssl-with-bazel/crypto/x509/x_attrib.cc +10 -4
  840. data/third_party/boringssl-with-bazel/crypto/x509/x_crl.cc +77 -44
  841. data/third_party/boringssl-with-bazel/crypto/x509/x_exten.cc +6 -0
  842. data/third_party/boringssl-with-bazel/crypto/x509/x_name.cc +311 -383
  843. data/third_party/boringssl-with-bazel/crypto/x509/x_pubkey.cc +129 -82
  844. data/third_party/boringssl-with-bazel/crypto/x509/x_req.cc +11 -6
  845. data/third_party/boringssl-with-bazel/crypto/x509/x_sig.cc +4 -4
  846. data/third_party/boringssl-with-bazel/crypto/x509/x_spki.cc +11 -1
  847. data/third_party/boringssl-with-bazel/crypto/x509/x_x509.cc +285 -280
  848. data/third_party/boringssl-with-bazel/crypto/x509/x_x509a.cc +60 -60
  849. data/third_party/boringssl-with-bazel/crypto/xwing/xwing.cc +257 -0
  850. data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_64_win_asm.inc +301 -0
  851. data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_win_asm.inc +301 -0
  852. data/third_party/boringssl-with-bazel/gen/crypto/err_data.cc +526 -500
  853. data/third_party/boringssl-with-bazel/include/openssl/aead.h +286 -114
  854. data/third_party/boringssl-with-bazel/include/openssl/aes.h +43 -43
  855. data/third_party/boringssl-with-bazel/include/openssl/asm_base.h +29 -16
  856. data/third_party/boringssl-with-bazel/include/openssl/asn1.h +641 -631
  857. data/third_party/boringssl-with-bazel/include/openssl/asn1t.h +7 -9
  858. data/third_party/boringssl-with-bazel/include/openssl/base.h +34 -54
  859. data/third_party/boringssl-with-bazel/include/openssl/base64.h +30 -30
  860. data/third_party/boringssl-with-bazel/include/openssl/bio.h +373 -316
  861. data/third_party/boringssl-with-bazel/include/openssl/blake2.h +15 -11
  862. data/third_party/boringssl-with-bazel/include/openssl/blowfish.h +10 -3
  863. data/third_party/boringssl-with-bazel/include/openssl/bn.h +298 -306
  864. data/third_party/boringssl-with-bazel/include/openssl/buf.h +14 -14
  865. data/third_party/boringssl-with-bazel/include/openssl/bytestring.h +272 -207
  866. data/third_party/boringssl-with-bazel/include/openssl/cast.h +45 -8
  867. data/third_party/boringssl-with-bazel/include/openssl/chacha.h +3 -3
  868. data/third_party/boringssl-with-bazel/include/openssl/cipher.h +334 -152
  869. data/third_party/boringssl-with-bazel/include/openssl/cmac.h +13 -13
  870. data/third_party/boringssl-with-bazel/include/openssl/cms.h +35 -34
  871. data/third_party/boringssl-with-bazel/include/openssl/conf.h +15 -14
  872. data/third_party/boringssl-with-bazel/include/openssl/crypto.h +15 -13
  873. data/third_party/boringssl-with-bazel/include/openssl/ctrdrbg.h +49 -15
  874. data/third_party/boringssl-with-bazel/include/openssl/curve25519.h +24 -24
  875. data/third_party/boringssl-with-bazel/include/openssl/des.h +22 -16
  876. data/third_party/boringssl-with-bazel/include/openssl/dh.h +95 -95
  877. data/third_party/boringssl-with-bazel/include/openssl/digest.h +140 -71
  878. data/third_party/boringssl-with-bazel/include/openssl/dsa.h +101 -101
  879. data/third_party/boringssl-with-bazel/include/openssl/ec.h +143 -119
  880. data/third_party/boringssl-with-bazel/include/openssl/ec_key.h +97 -97
  881. data/third_party/boringssl-with-bazel/include/openssl/ecdh.h +9 -9
  882. data/third_party/boringssl-with-bazel/include/openssl/ecdsa.h +89 -46
  883. data/third_party/boringssl-with-bazel/include/openssl/engine.h +5 -5
  884. data/third_party/boringssl-with-bazel/include/openssl/err.h +73 -71
  885. data/third_party/boringssl-with-bazel/include/openssl/evp.h +824 -344
  886. data/third_party/boringssl-with-bazel/include/openssl/evp_errors.h +9 -2
  887. data/third_party/boringssl-with-bazel/include/openssl/ex_data.h +27 -32
  888. data/third_party/boringssl-with-bazel/include/openssl/hkdf.h +6 -6
  889. data/third_party/boringssl-with-bazel/include/openssl/hmac.h +31 -31
  890. data/third_party/boringssl-with-bazel/include/openssl/hpke.h +133 -117
  891. data/third_party/boringssl-with-bazel/include/openssl/hrss.h +14 -8
  892. data/third_party/boringssl-with-bazel/include/openssl/kdf.h +20 -19
  893. data/third_party/boringssl-with-bazel/include/openssl/lhash.h +4 -25
  894. data/third_party/boringssl-with-bazel/include/openssl/md4.h +14 -7
  895. data/third_party/boringssl-with-bazel/include/openssl/md5.h +7 -7
  896. data/third_party/boringssl-with-bazel/include/openssl/mem.h +38 -38
  897. data/third_party/boringssl-with-bazel/include/openssl/mldsa.h +380 -24
  898. data/third_party/boringssl-with-bazel/include/openssl/mlkem.h +43 -43
  899. data/third_party/boringssl-with-bazel/include/openssl/nid.h +1297 -2
  900. data/third_party/boringssl-with-bazel/include/openssl/obj.h +49 -49
  901. data/third_party/boringssl-with-bazel/include/openssl/opensslconf.h +30 -0
  902. data/third_party/boringssl-with-bazel/include/openssl/params.h +42 -0
  903. data/third_party/boringssl-with-bazel/include/openssl/pem.h +39 -30
  904. data/third_party/boringssl-with-bazel/include/openssl/pkcs7.h +40 -40
  905. data/third_party/boringssl-with-bazel/include/openssl/pkcs8.h +69 -63
  906. data/third_party/boringssl-with-bazel/include/openssl/poly1305.h +8 -5
  907. data/third_party/boringssl-with-bazel/include/openssl/pool.h +54 -25
  908. data/third_party/boringssl-with-bazel/include/openssl/posix_time.h +6 -6
  909. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols.h +7866 -0
  910. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_S.h +585 -0
  911. data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_c.h +305 -0
  912. data/third_party/boringssl-with-bazel/include/openssl/rand.h +18 -18
  913. data/third_party/boringssl-with-bazel/include/openssl/rc4.h +4 -4
  914. data/third_party/boringssl-with-bazel/include/openssl/ripemd.h +15 -10
  915. data/third_party/boringssl-with-bazel/include/openssl/rsa.h +272 -235
  916. data/third_party/boringssl-with-bazel/include/openssl/service_indicator.h +4 -81
  917. data/third_party/boringssl-with-bazel/include/openssl/sha.h +43 -166
  918. data/third_party/boringssl-with-bazel/include/openssl/sha2.h +201 -0
  919. data/third_party/boringssl-with-bazel/include/openssl/slhdsa.h +100 -48
  920. data/third_party/boringssl-with-bazel/include/openssl/span.h +190 -75
  921. data/third_party/boringssl-with-bazel/include/openssl/ssl.h +2168 -1567
  922. data/third_party/boringssl-with-bazel/include/openssl/ssl3.h +11 -69
  923. data/third_party/boringssl-with-bazel/include/openssl/stack.h +135 -80
  924. data/third_party/boringssl-with-bazel/include/openssl/target.h +13 -1
  925. data/third_party/boringssl-with-bazel/include/openssl/thread.h +0 -10
  926. data/third_party/boringssl-with-bazel/include/openssl/tls1.h +31 -310
  927. data/third_party/boringssl-with-bazel/include/openssl/tls_prf.h +47 -0
  928. data/third_party/boringssl-with-bazel/include/openssl/trust_token.h +97 -92
  929. data/third_party/boringssl-with-bazel/include/openssl/type_check.h +1 -1
  930. data/third_party/boringssl-with-bazel/include/openssl/x509.h +1805 -1857
  931. data/third_party/boringssl-with-bazel/include/openssl/x509v3.h +1 -1
  932. data/third_party/boringssl-with-bazel/include/openssl/xwing.h +115 -0
  933. data/third_party/boringssl-with-bazel/ssl/bio_ssl.cc +24 -19
  934. data/third_party/boringssl-with-bazel/ssl/d1_both.cc +59 -57
  935. data/third_party/boringssl-with-bazel/ssl/d1_lib.cc +53 -42
  936. data/third_party/boringssl-with-bazel/ssl/d1_pkt.cc +4 -4
  937. data/third_party/boringssl-with-bazel/ssl/d1_srtp.cc +2 -2
  938. data/third_party/boringssl-with-bazel/ssl/dtls_method.cc +10 -10
  939. data/third_party/boringssl-with-bazel/ssl/dtls_record.cc +6 -6
  940. data/third_party/boringssl-with-bazel/ssl/encrypted_client_hello.cc +61 -71
  941. data/third_party/boringssl-with-bazel/ssl/extensions.cc +967 -366
  942. data/third_party/boringssl-with-bazel/ssl/handoff.cc +77 -38
  943. data/third_party/boringssl-with-bazel/ssl/handshake.cc +63 -30
  944. data/third_party/boringssl-with-bazel/ssl/handshake_client.cc +129 -85
  945. data/third_party/boringssl-with-bazel/ssl/handshake_server.cc +116 -68
  946. data/third_party/boringssl-with-bazel/ssl/internal.h +983 -1207
  947. data/third_party/boringssl-with-bazel/ssl/s3_both.cc +34 -29
  948. data/third_party/boringssl-with-bazel/ssl/s3_lib.cc +4 -3
  949. data/third_party/boringssl-with-bazel/ssl/s3_pkt.cc +12 -12
  950. data/third_party/boringssl-with-bazel/ssl/ssl_aead_ctx.cc +5 -5
  951. data/third_party/boringssl-with-bazel/ssl/ssl_asn1.cc +114 -59
  952. data/third_party/boringssl-with-bazel/ssl/ssl_buffer.cc +17 -18
  953. data/third_party/boringssl-with-bazel/ssl/ssl_cert.cc +99 -61
  954. data/third_party/boringssl-with-bazel/ssl/ssl_cipher.cc +143 -134
  955. data/third_party/boringssl-with-bazel/ssl/ssl_credential.cc +188 -90
  956. data/third_party/boringssl-with-bazel/ssl/ssl_file.cc +132 -225
  957. data/third_party/boringssl-with-bazel/ssl/ssl_key_share.cc +79 -7
  958. data/third_party/boringssl-with-bazel/ssl/ssl_lib.cc +698 -302
  959. data/third_party/boringssl-with-bazel/ssl/ssl_privkey.cc +102 -45
  960. data/third_party/boringssl-with-bazel/ssl/ssl_session.cc +117 -102
  961. data/third_party/boringssl-with-bazel/ssl/ssl_transcript.cc +3 -3
  962. data/third_party/boringssl-with-bazel/ssl/ssl_versions.cc +24 -24
  963. data/third_party/boringssl-with-bazel/ssl/ssl_x509.cc +184 -170
  964. data/third_party/boringssl-with-bazel/ssl/t1_enc.cc +12 -10
  965. data/third_party/boringssl-with-bazel/ssl/tls13_both.cc +86 -54
  966. data/third_party/boringssl-with-bazel/ssl/tls13_client.cc +176 -90
  967. data/third_party/boringssl-with-bazel/ssl/tls13_enc.cc +166 -112
  968. data/third_party/boringssl-with-bazel/ssl/tls13_server.cc +188 -97
  969. data/third_party/boringssl-with-bazel/ssl/tls_method.cc +23 -23
  970. data/third_party/boringssl-with-bazel/ssl/tls_record.cc +17 -14
  971. data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_bareminimum.c.inc +47 -0
  972. data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_platform.c.inc +137 -0
  973. data/third_party/boringssl-with-bazel/third_party/fiat/curve25519_64_adx.h +37 -33
  974. data/third_party/boringssl-with-bazel/third_party/fiat/p256_64.h +4 -93
  975. data/third_party/boringssl-with-bazel/third_party/fiat/p256_64_msvc.h +4 -69
  976. data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_32.br.c.inc +71 -0
  977. data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_64.br.c.inc +84 -0
  978. data/third_party/boringssl-with-bazel/third_party/fiat/p256_point.br.c.inc +166 -0
  979. metadata +77 -52
  980. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +0 -240
  981. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +0 -56
  982. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb.h +0 -157
  983. data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c +0 -72
  984. data/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +0 -181
  985. data/third_party/abseil-cpp/absl/base/internal/identity.h +0 -39
  986. data/third_party/abseil-cpp/absl/base/internal/nullability_deprecated.h +0 -106
  987. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -105
  988. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -50
  989. data/third_party/abseil-cpp/absl/strings/string_view.cc +0 -257
  990. data/third_party/boringssl-with-bazel/crypto/evp/p_dh_asn1.cc +0 -142
  991. data/third_party/boringssl-with-bazel/crypto/evp/p_dsa_asn1.cc +0 -279
  992. data/third_party/boringssl-with-bazel/crypto/evp/p_ec_asn1.cc +0 -286
  993. data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519_asn1.cc +0 -225
  994. data/third_party/boringssl-with-bazel/crypto/evp/p_rsa_asn1.cc +0 -198
  995. data/third_party/boringssl-with-bazel/crypto/evp/p_x25519_asn1.cc +0 -237
  996. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p224-64.cc.inc +0 -1163
  997. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.cc.inc +0 -741
  998. data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.h +0 -207
  999. data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/blinding.cc.inc +0 -147
  1000. data/third_party/boringssl-with-bazel/crypto/rand/getrandom_fillin.h +0 -64
  1001. data/third_party/boringssl-with-bazel/crypto/rand/passive.cc +0 -178
  1002. data/third_party/boringssl-with-bazel/crypto/x509/ext_dat.h +0 -92
  1003. data/third_party/boringssl-with-bazel/include/openssl/bcm_public.h +0 -82
  1004. data/third_party/boringssl-with-bazel/include/openssl/experimental/kyber.h +0 -146
@@ -19,6 +19,9 @@
19
19
  #include <cstddef>
20
20
  #include <cstdint>
21
21
  #include <cstring>
22
+ #include <memory>
23
+ #include <tuple>
24
+ #include <utility>
22
25
 
23
26
  #include "absl/base/attributes.h"
24
27
  #include "absl/base/config.h"
@@ -40,32 +43,13 @@ namespace container_internal {
40
43
  // Represents a control byte corresponding to a full slot with arbitrary hash.
41
44
  constexpr ctrl_t ZeroCtrlT() { return static_cast<ctrl_t>(0); }
42
45
 
43
- // We have space for `growth_info` before a single block of control bytes. A
44
- // single block of empty control bytes for tables without any slots allocated.
45
- // This enables removing a branch in the hot path of find(). In order to ensure
46
- // that the control bytes are aligned to 16, we have 16 bytes before the control
47
- // bytes even though growth_info only needs 8.
48
- alignas(16) ABSL_CONST_INIT ABSL_DLL const ctrl_t kEmptyGroup[32] = {
49
- ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(),
50
- ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(),
51
- ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(),
52
- ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(),
53
- ctrl_t::kSentinel, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
54
- ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
55
- ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
56
- ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty};
57
-
58
- // We need one full byte followed by a sentinel byte for iterator::operator++ to
59
- // work. We have a full group after kSentinel to be safe (in case operator++ is
60
- // changed to read a full group).
61
- ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[17] = {
62
- ZeroCtrlT(), ctrl_t::kSentinel, ZeroCtrlT(), ctrl_t::kEmpty,
63
- ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
64
- ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
65
- ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
66
- ctrl_t::kEmpty};
67
- static_assert(NumControlBytes(SooCapacity()) <= 17,
68
- "kSooControl capacity too small");
46
+ // A single control byte for default-constructed iterators. We leave it
47
+ // uninitialized because reading this memory is a bug.
48
+ ABSL_DLL ctrl_t kDefaultIterControl;
49
+
50
+ // We need one full byte followed by a sentinel byte for iterator::operator++.
51
+ ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[2] = {ZeroCtrlT(),
52
+ ctrl_t::kSentinel};
69
53
 
70
54
  namespace {
71
55
 
@@ -78,14 +62,15 @@ namespace {
78
62
  assert((CONDITION) && "Try enabling sanitizers.")
79
63
  #endif
80
64
 
81
- [[noreturn]] ABSL_ATTRIBUTE_NOINLINE void HashTableSizeOverflow() {
82
- ABSL_RAW_LOG(FATAL, "Hash table size overflow");
65
+ void ValidateMaxSize([[maybe_unused]] size_t size,
66
+ [[maybe_unused]] size_t key_size,
67
+ [[maybe_unused]] size_t slot_size) {
68
+ ABSL_SWISSTABLE_ASSERT(size <= MaxValidSize(key_size, slot_size));
83
69
  }
84
-
85
- void ValidateMaxSize(size_t size, size_t slot_size) {
86
- if (IsAboveValidSize(size, slot_size)) {
87
- HashTableSizeOverflow();
88
- }
70
+ void ValidateMaxCapacity(size_t capacity, size_t key_size, size_t slot_size) {
71
+ if (capacity <= 1) return;
72
+ ValidateMaxSize(CapacityToGrowth(PreviousCapacity(capacity)), key_size,
73
+ slot_size);
89
74
  }
90
75
 
91
76
  // Returns "random" seed.
@@ -100,14 +85,14 @@ inline size_t RandomSeed() {
100
85
  return value ^ static_cast<size_t>(reinterpret_cast<uintptr_t>(&counter));
101
86
  }
102
87
 
103
- bool ShouldRehashForBugDetection(PerTableSeed seed, size_t capacity) {
88
+ bool ShouldRehashForBugDetection(size_t capacity) {
104
89
  // Note: we can't use the abseil-random library because abseil-random
105
90
  // depends on swisstable. We want to return true with probability
106
91
  // `min(1, RehashProbabilityConstant() / capacity())`. In order to do this,
107
92
  // we probe based on a random hash and see if the offset is less than
108
93
  // RehashProbabilityConstant().
109
- return probe(seed, capacity, absl::HashOf(RandomSeed())).offset() <
110
- RehashProbabilityConstant();
94
+ return probe(HashtableCapacity(capacity), absl::HashOf(RandomSeed()))
95
+ .offset() < RehashProbabilityConstant();
111
96
  }
112
97
 
113
98
  // Find a non-deterministic hash for single group table.
@@ -118,6 +103,21 @@ size_t SingleGroupTableH1(size_t hash, PerTableSeed seed) {
118
103
  return hash ^ seed.seed();
119
104
  }
120
105
 
106
+ // Returns the offset of the new element after resize from capacity 1 to 3.
107
+ size_t Resize1To3NewOffset(size_t hash, PerTableSeed seed) {
108
+ // After resize from capacity 1 to 3, we always have exactly the slot with
109
+ // index 1 occupied, so we need to insert either at index 0 or index 2.
110
+ static_assert(SooSlotIndex() == 1);
111
+ return SingleGroupTableH1(hash, seed) & 2;
112
+ }
113
+
114
+ // Returns the address of the ith slot in slots where each slot occupies
115
+ // slot_size.
116
+ inline void* SlotAddress(void* slot_array, size_t slot, size_t slot_size) {
117
+ return static_cast<void*>(static_cast<char*>(slot_array) +
118
+ (slot * slot_size));
119
+ }
120
+
121
121
  // Returns the address of the slot `i` iterations after `slot` assuming each
122
122
  // slot has the specified size.
123
123
  inline void* NextSlot(void* slot, size_t slot_size, size_t i = 1) {
@@ -133,6 +133,16 @@ inline void* PrevSlot(void* slot, size_t slot_size) {
133
133
 
134
134
  } // namespace
135
135
 
136
+ // Must be defined out-of-line to avoid MSVC error C2482 on some platforms,
137
+ // which is caused by non-constexpr initialization.
138
+ uint16_t NextHashTableSeed() {
139
+ static_assert(PerTableSeed::kBitCount <= 16);
140
+ thread_local uint16_t seed =
141
+ static_cast<uint16_t>(reinterpret_cast<uintptr_t>(&seed));
142
+ seed += uint16_t{0xad53};
143
+ return seed;
144
+ }
145
+
136
146
  GenerationType* EmptyGeneration() {
137
147
  if (SwisstableGenerationsEnabled()) {
138
148
  constexpr size_t kNumEmptyGenerations = 1024;
@@ -144,66 +154,98 @@ GenerationType* EmptyGeneration() {
144
154
  }
145
155
 
146
156
  bool CommonFieldsGenerationInfoEnabled::
147
- should_rehash_for_bug_detection_on_insert(PerTableSeed seed,
148
- size_t capacity) const {
157
+ should_rehash_for_bug_detection_on_insert(size_t capacity) const {
149
158
  if (reserved_growth_ == kReservedGrowthJustRanOut) return true;
150
159
  if (reserved_growth_ > 0) return false;
151
- return ShouldRehashForBugDetection(seed, capacity);
160
+ return ShouldRehashForBugDetection(capacity);
152
161
  }
153
162
 
154
163
  bool CommonFieldsGenerationInfoEnabled::should_rehash_for_bug_detection_on_move(
155
- PerTableSeed seed, size_t capacity) const {
156
- return ShouldRehashForBugDetection(seed, capacity);
164
+ size_t capacity) const {
165
+ return ShouldRehashForBugDetection(capacity);
157
166
  }
158
167
 
159
168
  namespace {
160
169
 
161
- FindInfo find_first_non_full_from_h1(const ctrl_t* ctrl, size_t h1,
162
- size_t capacity) {
163
- auto seq = probe(h1, capacity);
164
- if (IsEmptyOrDeleted(ctrl[seq.offset()])) {
165
- return {seq.offset(), /*probe_length=*/0};
166
- }
170
+ // Probes an array of control bits using a probe sequence,
171
+ // and returns the mask corresponding to the first group with a deleted or empty
172
+ // slot.
173
+ inline Group::NonIterableBitMaskType probe_till_first_non_full_group(
174
+ const ctrl_t* ctrl, probe_seq<Group::kWidth>& seq,
175
+ [[maybe_unused]] size_t capacity) {
167
176
  while (true) {
168
177
  GroupFullEmptyOrDeleted g{ctrl + seq.offset()};
169
178
  auto mask = g.MaskEmptyOrDeleted();
170
179
  if (mask) {
171
- return {seq.offset(mask.LowestBitSet()), seq.index()};
180
+ return mask;
172
181
  }
173
182
  seq.next();
174
183
  ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity && "full table!");
175
184
  }
176
185
  }
177
186
 
178
- // Whether a table is "small". A small table fits entirely into a probing
179
- // group, i.e., has a capacity < `Group::kWidth`.
187
+ FindInfo find_first_non_full_from_h1(const ctrl_t* ctrl, size_t h1,
188
+ HashtableCapacity capacity) {
189
+ auto seq = probe_h1(capacity, h1);
190
+ if (IsEmptyOrDeleted(ctrl[seq.offset()])) {
191
+ return {seq.offset(), /*probe_length=*/0};
192
+ }
193
+ auto mask = probe_till_first_non_full_group(ctrl, seq, capacity.capacity());
194
+ return {seq.offset(mask.LowestBitSet()), seq.index()};
195
+ }
196
+
197
+ // Probes an array of control bits using a probe sequence derived from `hash`,
198
+ // and returns the offset corresponding to the first deleted or empty slot.
199
+ //
200
+ // Behavior when the entire table is full is undefined.
201
+ //
202
+ // NOTE: this function must work with tables having both empty and deleted
203
+ // slots in the same group. Such tables appear during `erase()`.
204
+ FindInfo find_first_non_full(const CommonFields& common, size_t hash) {
205
+ return find_first_non_full_from_h1(common.control(), H1(hash),
206
+ common.capacity_impl());
207
+ }
208
+
209
+ // Same as `find_first_non_full`, but returns the mask corresponding to the
210
+ // first group with a deleted or empty slot.
211
+ std::pair<FindInfo, Group::NonIterableBitMaskType> find_first_non_full_group(
212
+ const CommonFields& common, size_t hash) {
213
+ auto seq = probe(common, hash);
214
+ auto mask =
215
+ probe_till_first_non_full_group(common.control(), seq, common.capacity());
216
+ return {{seq.offset(), seq.index()}, mask};
217
+ }
218
+
219
+ // Whether a table fits in half a group. A half-group table fits entirely into a
220
+ // probing group, i.e., has a capacity < `Group::kWidth`.
180
221
  //
181
- // In small mode we are able to use the whole capacity. The extra control
222
+ // In half-group mode we are able to use the whole capacity. The extra control
182
223
  // bytes give us at least one "empty" control byte to stop the iteration.
183
224
  // This is important to make 1 a valid capacity.
184
225
  //
185
- // In small mode only the first `capacity` control bytes after the sentinel
226
+ // In half-group mode only the first `capacity` control bytes after the sentinel
186
227
  // are valid. The rest contain dummy ctrl_t::kEmpty values that do not
187
228
  // represent a real slot.
188
- constexpr bool is_small(size_t capacity) {
229
+ constexpr bool is_half_group(size_t capacity) {
189
230
  return capacity < Group::kWidth - 1;
190
231
  }
191
232
 
192
233
  template <class Fn>
193
234
  void IterateOverFullSlotsImpl(const CommonFields& c, size_t slot_size, Fn cb) {
194
235
  const size_t cap = c.capacity();
236
+ ABSL_SWISSTABLE_ASSERT(!IsSmallCapacity(cap));
195
237
  const ctrl_t* ctrl = c.control();
196
238
  void* slot = c.slot_array();
197
- if (is_small(cap)) {
198
- // Mirrored/cloned control bytes in small table are also located in the
239
+ if (is_half_group(cap)) {
240
+ // Mirrored/cloned control bytes in half-group table are also located in the
199
241
  // first group (starting from position 0). We are taking group from position
200
242
  // `capacity` in order to avoid duplicates.
201
243
 
202
- // Small tables capacity fits into portable group, where
244
+ // Half-group tables capacity fits into portable group, where
203
245
  // GroupPortableImpl::MaskFull is more efficient for the
204
246
  // capacity <= GroupPortableImpl::kWidth.
205
247
  ABSL_SWISSTABLE_ASSERT(cap <= GroupPortableImpl::kWidth &&
206
- "unexpectedly large small capacity");
248
+ "unexpectedly large half-group capacity");
207
249
  static_assert(Group::kWidth >= GroupPortableImpl::kWidth,
208
250
  "unexpected group width");
209
251
  // Group starts from kSentinel slot, so indices in the mask will
@@ -250,11 +292,6 @@ void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity) {
250
292
  ctrl[capacity] = ctrl_t::kSentinel;
251
293
  }
252
294
 
253
- FindInfo find_first_non_full(const CommonFields& common, size_t hash) {
254
- return find_first_non_full_from_h1(common.control(), H1(hash, common.seed()),
255
- common.capacity());
256
- }
257
-
258
295
  void IterateOverFullSlots(const CommonFields& c, size_t slot_size,
259
296
  absl::FunctionRef<void(const ctrl_t*, void*)> cb) {
260
297
  IterateOverFullSlotsImpl(c, slot_size, cb);
@@ -300,6 +337,69 @@ void PrepareInsertCommon(CommonFields& common) {
300
337
  common.maybe_increment_generation_on_insert();
301
338
  }
302
339
 
340
+ // Sets sanitizer poisoning for slot corresponding to control byte being set.
341
+ inline void DoSanitizeOnSetCtrl(const CommonFields& c, size_t i, ctrl_t h,
342
+ size_t slot_size) {
343
+ ABSL_SWISSTABLE_ASSERT(i < c.capacity());
344
+ auto* slot_i = static_cast<const char*>(c.slot_array()) + i * slot_size;
345
+ if (IsFull(h)) {
346
+ SanitizerUnpoisonMemoryRegion(slot_i, slot_size);
347
+ } else {
348
+ SanitizerPoisonMemoryRegion(slot_i, slot_size);
349
+ }
350
+ }
351
+
352
+ // Sets `ctrl[i]` to `h`.
353
+ //
354
+ // Unlike setting it directly, this function will perform bounds checks and
355
+ // mirror the value to the cloned tail if necessary.
356
+ inline void SetCtrl(const CommonFields& c, size_t i, ctrl_t h,
357
+ size_t slot_size) {
358
+ ABSL_SWISSTABLE_ASSERT(!c.is_small());
359
+ DoSanitizeOnSetCtrl(c, i, h, slot_size);
360
+ ctrl_t* ctrl = c.control();
361
+ ctrl[i] = h;
362
+ ctrl[((i - NumClonedBytes()) & c.capacity()) +
363
+ (NumClonedBytes() & c.capacity())] = h;
364
+ }
365
+ // Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`.
366
+ inline void SetCtrl(const CommonFields& c, size_t i, h2_t h, size_t slot_size) {
367
+ SetCtrl(c, i, static_cast<ctrl_t>(h), slot_size);
368
+ }
369
+
370
+ // Like SetCtrl, but in a single group table, we can save some operations when
371
+ // setting the cloned control byte.
372
+ inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, ctrl_t h,
373
+ size_t slot_size) {
374
+ ABSL_SWISSTABLE_ASSERT(!c.is_small());
375
+ ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity()));
376
+ DoSanitizeOnSetCtrl(c, i, h, slot_size);
377
+ ctrl_t* ctrl = c.control();
378
+ ctrl[i] = h;
379
+ ctrl[i + c.capacity() + 1] = h;
380
+ }
381
+ // Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`.
382
+ inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, h2_t h,
383
+ size_t slot_size) {
384
+ SetCtrlInSingleGroupTable(c, i, static_cast<ctrl_t>(h), slot_size);
385
+ }
386
+
387
+ // Like SetCtrl, but in a table with capacity >= Group::kWidth - 1,
388
+ // we can save some operations when setting the cloned control byte.
389
+ inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, ctrl_t h,
390
+ size_t slot_size) {
391
+ ABSL_SWISSTABLE_ASSERT(c.capacity() >= Group::kWidth - 1);
392
+ DoSanitizeOnSetCtrl(c, i, h, slot_size);
393
+ ctrl_t* ctrl = c.control();
394
+ ctrl[i] = h;
395
+ ctrl[((i - NumClonedBytes()) & c.capacity()) + NumClonedBytes()] = h;
396
+ }
397
+ // Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`.
398
+ inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, h2_t h,
399
+ size_t slot_size) {
400
+ SetCtrlInLargeTable(c, i, static_cast<ctrl_t>(h), slot_size);
401
+ }
402
+
303
403
  size_t DropDeletesWithoutResizeAndPrepareInsert(
304
404
  CommonFields& common, const PolicyFunctions& __restrict policy,
305
405
  size_t new_hash) {
@@ -347,7 +447,7 @@ size_t DropDeletesWithoutResizeAndPrepareInsert(
347
447
  continue;
348
448
  }
349
449
  if (!IsDeleted(ctrl[i])) continue;
350
- const size_t hash = (*hasher)(hash_fn, slot_ptr);
450
+ const size_t hash = (*hasher)(hash_fn, slot_ptr, common.seed().seed());
351
451
  const FindInfo target = find_first_non_full(common, hash);
352
452
  const size_t new_i = target.offset;
353
453
  total_probe_length += target.probe_length;
@@ -405,12 +505,12 @@ size_t DropDeletesWithoutResizeAndPrepareInsert(
405
505
  ResetGrowthLeft(common);
406
506
  FindInfo find_info = find_first_non_full(common, new_hash);
407
507
  SetCtrlInLargeTable(common, find_info.offset, H2(new_hash), slot_size);
408
- common.infoz().RecordInsert(new_hash, find_info.probe_length);
508
+ common.infoz().RecordInsertMiss(new_hash, find_info.probe_length);
409
509
  common.infoz().RecordRehash(total_probe_length);
410
510
  return find_info.offset;
411
511
  }
412
512
 
413
- static bool WasNeverFull(CommonFields& c, size_t index) {
513
+ bool WasNeverFull(CommonFields& c, size_t index) {
414
514
  if (is_single_group(c.capacity())) {
415
515
  return true;
416
516
  }
@@ -434,6 +534,7 @@ void ResetCtrl(CommonFields& common, size_t slot_size) {
434
534
  ctrl_t* ctrl = common.control();
435
535
  static constexpr size_t kTwoGroupCapacity = 2 * Group::kWidth - 1;
436
536
  if (ABSL_PREDICT_TRUE(capacity <= kTwoGroupCapacity)) {
537
+ if (IsSmallCapacity(capacity)) return;
437
538
  std::memset(ctrl, static_cast<int8_t>(ctrl_t::kEmpty), Group::kWidth);
438
539
  std::memset(ctrl + capacity, static_cast<int8_t>(ctrl_t::kEmpty),
439
540
  Group::kWidth);
@@ -449,38 +550,11 @@ void ResetCtrl(CommonFields& common, size_t slot_size) {
449
550
  SanitizerPoisonMemoryRegion(common.slot_array(), slot_size * capacity);
450
551
  }
451
552
 
452
- // Initializes control bytes for single element table.
453
- // Capacity of the table must be 1.
454
- ABSL_ATTRIBUTE_ALWAYS_INLINE inline void InitializeSingleElementControlBytes(
455
- uint64_t h2, ctrl_t* new_ctrl) {
456
- static constexpr uint64_t kEmptyXorSentinel =
457
- static_cast<uint8_t>(ctrl_t::kEmpty) ^
458
- static_cast<uint8_t>(ctrl_t::kSentinel);
459
- static constexpr uint64_t kEmpty64 = static_cast<uint8_t>(ctrl_t::kEmpty);
460
- // The first 8 bytes, where present slot positions are replaced with 0.
461
- static constexpr uint64_t kFirstCtrlBytesWithZeroes =
462
- k8EmptyBytes ^ kEmpty64 ^ (kEmptyXorSentinel << 8) ^ (kEmpty64 << 16);
463
-
464
- // Fill the original 0th and mirrored 2nd bytes with the hash.
465
- // Result will look like:
466
- // HSHEEEEE
467
- // Where H = h2, E = kEmpty, S = kSentinel.
468
- const uint64_t first_ctrl_bytes =
469
- (h2 | kFirstCtrlBytesWithZeroes) | (h2 << 16);
470
- // Fill last bytes with kEmpty.
471
- std::memset(new_ctrl + 1, static_cast<int8_t>(ctrl_t::kEmpty), Group::kWidth);
472
- // Overwrite the first 3 bytes with HSH. Other bytes will not be changed.
473
- absl::little_endian::Store64(new_ctrl, first_ctrl_bytes);
474
- }
475
-
476
- // Initializes control bytes for growing after SOO to the next capacity.
477
- // `soo_ctrl` is placed in the position `SooSlotIndex()`.
478
- // `new_hash` is placed in the position `new_offset`.
479
- // The table must be non-empty SOO.
480
- ABSL_ATTRIBUTE_ALWAYS_INLINE inline void
481
- InitializeThreeElementsControlBytesAfterSoo(ctrl_t soo_ctrl, size_t new_hash,
482
- size_t new_offset,
483
- ctrl_t* new_ctrl) {
553
+ // Initializes control bytes for growing from capacity 1 to 3.
554
+ // `orig_h2` is placed in the position `SooSlotIndex()`.
555
+ // `new_h2` is placed in the position `new_offset`.
556
+ ABSL_ATTRIBUTE_ALWAYS_INLINE inline void InitializeThreeElementsControlBytes(
557
+ h2_t orig_h2, h2_t new_h2, size_t new_offset, ctrl_t* new_ctrl) {
484
558
  static constexpr size_t kNewCapacity = NextCapacity(SooCapacity());
485
559
  static_assert(kNewCapacity == 3);
486
560
  static_assert(is_single_group(kNewCapacity));
@@ -501,9 +575,9 @@ InitializeThreeElementsControlBytesAfterSoo(ctrl_t soo_ctrl, size_t new_hash,
501
575
  (kEmptyXorSentinel << (8 * kNewCapacity)) ^
502
576
  (kEmpty64 << (8 * kMirroredSooSlotIndex));
503
577
 
504
- const uint64_t soo_h2 = static_cast<uint64_t>(soo_ctrl);
505
- const uint64_t new_h2_xor_empty = static_cast<uint64_t>(
506
- H2(new_hash) ^ static_cast<uint8_t>(ctrl_t::kEmpty));
578
+ const uint64_t soo_h2 = static_cast<uint64_t>(orig_h2);
579
+ const uint64_t new_h2_xor_empty =
580
+ static_cast<uint64_t>(new_h2 ^ static_cast<uint8_t>(ctrl_t::kEmpty));
507
581
  // Fill the original and mirrored bytes for SOO slot.
508
582
  // Result will look like:
509
583
  // EHESEHEE
@@ -542,13 +616,44 @@ InitializeThreeElementsControlBytesAfterSoo(ctrl_t soo_ctrl, size_t new_hash,
542
616
  // new_ctrl after 2nd store = EHNSEHNEEEE
543
617
  }
544
618
 
619
+ // ClearBackingArrayNoReuse clears the backing array and sets the common
620
+ // fields to the default values for empty non-allocated tables.
621
+ // REQUIRES: c.capacity > policy.soo_capacity.
622
+ void ClearBackingArrayNoReuse(CommonFields& c,
623
+ const PolicyFunctions& __restrict policy,
624
+ void* alloc) {
625
+ ABSL_SWISSTABLE_ASSERT(c.capacity() > policy.soo_capacity());
626
+ // We need to record infoz before calling dealloc, which will unregister
627
+ // infoz.
628
+ c.infoz().RecordClearedReservation();
629
+ c.infoz().RecordStorageChanged(0, policy.soo_capacity());
630
+ c.infoz().Unregister();
631
+ (*policy.dealloc)(alloc, c.capacity(), c.control(), policy.slot_size,
632
+ policy.slot_align, c.has_infoz());
633
+ c = policy.soo_enabled ? CommonFields{soo_tag_t{}}
634
+ : CommonFields{non_soo_tag_t{}};
635
+ }
636
+
545
637
  } // namespace
546
638
 
547
- void EraseMetaOnly(CommonFields& c, size_t index, size_t slot_size) {
548
- ABSL_SWISSTABLE_ASSERT(IsFull(c.control()[index]) &&
549
- "erasing a dangling iterator");
639
+ void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size) {
640
+ ABSL_SWISSTABLE_ASSERT(c.is_small());
641
+ if (soo_enabled) {
642
+ c.set_empty_soo();
643
+ return;
644
+ }
550
645
  c.decrement_size();
551
646
  c.infoz().RecordErase();
647
+ SanitizerPoisonMemoryRegion(c.slot_array(), slot_size);
648
+ }
649
+
650
+ void EraseMetaOnlyLarge(CommonFields& c, const ctrl_t* ctrl, size_t slot_size) {
651
+ ABSL_SWISSTABLE_ASSERT(!c.is_small());
652
+ ABSL_SWISSTABLE_ASSERT(IsFull(*ctrl) && "erasing a dangling iterator");
653
+ c.decrement_size();
654
+ c.infoz().RecordErase();
655
+
656
+ size_t index = static_cast<size_t>(ctrl - c.control());
552
657
 
553
658
  if (WasNeverFull(c, index)) {
554
659
  SetCtrl(c, index, ctrl_t::kEmpty, slot_size);
@@ -562,22 +667,15 @@ void EraseMetaOnly(CommonFields& c, size_t index, size_t slot_size) {
562
667
 
563
668
  void ClearBackingArray(CommonFields& c,
564
669
  const PolicyFunctions& __restrict policy, void* alloc,
565
- bool reuse, bool soo_enabled) {
670
+ bool reuse) {
671
+ ABSL_SWISSTABLE_ASSERT(c.capacity() > MaxSmallCapacity());
566
672
  if (reuse) {
567
673
  c.set_size_to_zero();
568
- ABSL_SWISSTABLE_ASSERT(!soo_enabled || c.capacity() > SooCapacity());
569
674
  ResetCtrl(c, policy.slot_size);
570
675
  ResetGrowthLeft(c);
571
676
  c.infoz().RecordStorageChanged(0, c.capacity());
572
677
  } else {
573
- // We need to record infoz before calling dealloc, which will unregister
574
- // infoz.
575
- c.infoz().RecordClearedReservation();
576
- c.infoz().RecordStorageChanged(0, soo_enabled ? SooCapacity() : 0);
577
- c.infoz().Unregister();
578
- (*policy.dealloc)(alloc, c.capacity(), c.control(), policy.slot_size,
579
- policy.slot_align, c.has_infoz());
580
- c = soo_enabled ? CommonFields{soo_tag_t{}} : CommonFields{non_soo_tag_t{}};
678
+ ClearBackingArrayNoReuse(c, policy, alloc);
581
679
  }
582
680
  }
583
681
 
@@ -599,15 +697,25 @@ size_t FindNewPositionsAndTransferSlots(
599
697
  void* new_slots = common.slot_array();
600
698
  const void* hash_fn = policy.hash_fn(common);
601
699
  const size_t slot_size = policy.slot_size;
700
+ const size_t seed = common.seed().seed();
602
701
 
603
702
  const auto insert_slot = [&](void* slot) {
604
- size_t hash = policy.hash_slot(hash_fn, slot);
605
- auto target = find_first_non_full(common, hash);
606
- SetCtrl(common, target.offset, H2(hash), slot_size);
703
+ size_t hash = policy.hash_slot(hash_fn, slot, seed);
704
+ FindInfo target;
705
+ if (common.is_small()) {
706
+ target = FindInfo{0, 0};
707
+ } else {
708
+ target = find_first_non_full(common, hash);
709
+ SetCtrl(common, target.offset, H2(hash), slot_size);
710
+ }
607
711
  policy.transfer_n(&common, SlotAddress(new_slots, target.offset, slot_size),
608
712
  slot, 1);
609
713
  return target.probe_length;
610
714
  };
715
+ if (IsSmallCapacity(old_capacity)) {
716
+ if (common.size() == 1) insert_slot(old_slots);
717
+ return 0;
718
+ }
611
719
  size_t total_probe_length = 0;
612
720
  for (size_t i = 0; i < old_capacity; ++i) {
613
721
  if (IsFull(old_ctrl[i])) {
@@ -618,6 +726,75 @@ size_t FindNewPositionsAndTransferSlots(
618
726
  return total_probe_length;
619
727
  }
620
728
 
729
+ void ReportGrowthToInfozImpl(CommonFields& common, HashtablezInfoHandle infoz,
730
+ size_t hash, size_t total_probe_length,
731
+ size_t distance_from_desired) {
732
+ ABSL_SWISSTABLE_ASSERT(infoz.IsSampled());
733
+ infoz.RecordStorageChanged(common.size() - 1, common.capacity());
734
+ infoz.RecordRehash(total_probe_length);
735
+ infoz.RecordInsertMiss(hash, distance_from_desired);
736
+ common.set_has_infoz();
737
+ // TODO(b/413062340): we could potentially store infoz in place of the
738
+ // control pointer for the capacity 1 case.
739
+ common.set_infoz(infoz);
740
+ }
741
+
742
+ // Specialization to avoid passing two 0s from hot function.
743
+ ABSL_ATTRIBUTE_NOINLINE void ReportSingleGroupTableGrowthToInfoz(
744
+ CommonFields& common, HashtablezInfoHandle infoz, size_t hash) {
745
+ ReportGrowthToInfozImpl(common, infoz, hash, /*total_probe_length=*/0,
746
+ /*distance_from_desired=*/0);
747
+ }
748
+
749
+ ABSL_ATTRIBUTE_NOINLINE void ReportGrowthToInfoz(CommonFields& common,
750
+ HashtablezInfoHandle infoz,
751
+ size_t hash,
752
+ size_t total_probe_length,
753
+ size_t distance_from_desired) {
754
+ ReportGrowthToInfozImpl(common, infoz, hash, total_probe_length,
755
+ distance_from_desired);
756
+ }
757
+
758
+ ABSL_ATTRIBUTE_NOINLINE void ReportResizeToInfoz(CommonFields& common,
759
+ HashtablezInfoHandle infoz,
760
+ size_t total_probe_length) {
761
+ ABSL_SWISSTABLE_ASSERT(infoz.IsSampled());
762
+ infoz.RecordStorageChanged(common.size(), common.capacity());
763
+ infoz.RecordRehash(total_probe_length);
764
+ common.set_has_infoz();
765
+ common.set_infoz(infoz);
766
+ }
767
+
768
+ struct BackingArrayPtrs {
769
+ ctrl_t* ctrl;
770
+ void* slots;
771
+ };
772
+
773
+ BackingArrayPtrs AllocBackingArray(CommonFields& common,
774
+ const PolicyFunctions& __restrict policy,
775
+ size_t new_capacity, bool has_infoz,
776
+ void* alloc) {
777
+ RawHashSetLayout layout(new_capacity, policy.slot_size, policy.slot_align,
778
+ has_infoz);
779
+ // Perform a direct call in the common case to allow for profile-guided
780
+ // heap optimization (PGHO) to understand which allocation function is used.
781
+ constexpr size_t kDefaultAlignment = BackingArrayAlignment(alignof(size_t));
782
+ char* mem = static_cast<char*>(
783
+ ABSL_PREDICT_TRUE(
784
+ policy.alloc ==
785
+ (&AllocateBackingArray<kDefaultAlignment, std::allocator<char>>))
786
+ ? AllocateBackingArray<kDefaultAlignment, std::allocator<char>>(
787
+ alloc, layout.alloc_size())
788
+ : policy.alloc(alloc, layout.alloc_size()));
789
+ const GenerationType old_generation = common.generation();
790
+ common.set_generation_ptr(
791
+ reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
792
+ common.set_generation(NextGeneration(old_generation));
793
+
794
+ return {reinterpret_cast<ctrl_t*>(mem + layout.control_offset()),
795
+ mem + layout.slot_offset()};
796
+ }
797
+
621
798
  template <ResizeNonSooMode kMode>
622
799
  void ResizeNonSooImpl(CommonFields& common,
623
800
  const PolicyFunctions& __restrict policy,
@@ -625,26 +802,25 @@ void ResizeNonSooImpl(CommonFields& common,
625
802
  ABSL_SWISSTABLE_ASSERT(IsValidCapacity(new_capacity));
626
803
  ABSL_SWISSTABLE_ASSERT(new_capacity > policy.soo_capacity());
627
804
 
628
- const size_t old_capacity = common.capacity();
629
- [[maybe_unused]] ctrl_t* old_ctrl = common.control();
630
- [[maybe_unused]] void* old_slots = common.slot_array();
805
+ [[maybe_unused]] const size_t old_capacity = common.capacity();
806
+ [[maybe_unused]] ctrl_t* old_ctrl;
807
+ [[maybe_unused]] void* old_slots;
808
+ if constexpr (kMode == ResizeNonSooMode::kGuaranteedAllocated) {
809
+ old_ctrl = common.control();
810
+ old_slots = common.slot_array();
811
+ }
631
812
 
632
813
  const size_t slot_size = policy.slot_size;
633
- const size_t slot_align = policy.slot_align;
814
+ [[maybe_unused]] const size_t slot_align = policy.slot_align;
634
815
  const bool has_infoz = infoz.IsSampled();
635
-
636
- common.set_capacity(new_capacity);
637
- RawHashSetLayout layout(new_capacity, slot_size, slot_align, has_infoz);
638
816
  void* alloc = policy.get_char_alloc(common);
639
- char* mem = static_cast<char*>(policy.alloc(alloc, layout.alloc_size()));
640
- const GenerationType old_generation = common.generation();
641
- common.set_generation_ptr(
642
- reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
643
- common.set_generation(NextGeneration(old_generation));
644
817
 
645
- ctrl_t* new_ctrl = reinterpret_cast<ctrl_t*>(mem + layout.control_offset());
646
- common.set_control</*kGenerateSeed=*/true>(new_ctrl);
647
- common.set_slots(mem + layout.slot_offset());
818
+ common.set_capacity(new_capacity);
819
+ const auto [new_ctrl, new_slots] =
820
+ AllocBackingArray(common, policy, new_capacity, has_infoz, alloc);
821
+ common.set_control(new_ctrl);
822
+ common.set_slots(new_slots);
823
+ common.generate_new_seed(has_infoz);
648
824
 
649
825
  size_t total_probe_length = 0;
650
826
  ResetCtrl(common, slot_size);
@@ -657,18 +833,19 @@ void ResizeNonSooImpl(CommonFields& common,
657
833
  common, policy, old_ctrl, old_slots, old_capacity);
658
834
  (*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align,
659
835
  has_infoz);
660
- ResetGrowthLeft(GetGrowthInfoFromControl(new_ctrl), new_capacity,
661
- common.size());
836
+ if (HasGrowthInfoForCapacity(new_capacity)) {
837
+ ResetGrowthLeft(GetGrowthInfoFromControl(new_ctrl), new_capacity,
838
+ common.size());
839
+ }
662
840
  } else {
663
- GetGrowthInfoFromControl(new_ctrl).InitGrowthLeftNoDeleted(
664
- CapacityToGrowth(new_capacity));
841
+ if (HasGrowthInfoForCapacity(new_capacity)) {
842
+ GetGrowthInfoFromControl(new_ctrl).InitGrowthLeftNoDeleted(
843
+ CapacityToGrowth(new_capacity));
844
+ }
665
845
  }
666
846
 
667
- if (has_infoz) {
668
- common.set_has_infoz();
669
- infoz.RecordStorageChanged(common.size(), new_capacity);
670
- infoz.RecordRehash(total_probe_length);
671
- common.set_infoz(infoz);
847
+ if (ABSL_PREDICT_FALSE(has_infoz)) {
848
+ ReportResizeToInfoz(common, infoz, total_probe_length);
672
849
  }
673
850
  }
674
851
 
@@ -697,23 +874,26 @@ void ResizeEmptyNonAllocatedTableImpl(CommonFields& common,
697
874
  // It is rare to resize an SOO table with one element to a large size.
698
875
  // Requires: `c` contains SOO data.
699
876
  void InsertOldSooSlotAndInitializeControlBytes(
700
- CommonFields& c, const PolicyFunctions& __restrict policy, size_t hash,
701
- ctrl_t* new_ctrl, void* new_slots) {
877
+ CommonFields& c, const PolicyFunctions& __restrict policy, ctrl_t* new_ctrl,
878
+ void* new_slots, bool has_infoz) {
702
879
  ABSL_SWISSTABLE_ASSERT(c.size() == policy.soo_capacity());
703
880
  ABSL_SWISSTABLE_ASSERT(policy.soo_enabled);
704
881
  size_t new_capacity = c.capacity();
705
882
 
706
- c.generate_new_seed();
707
- size_t offset = probe(c.seed(), new_capacity, hash).offset();
883
+ c.generate_new_seed(has_infoz);
884
+
885
+ const size_t soo_slot_hash =
886
+ policy.hash_slot(policy.hash_fn(c), c.soo_data(), c.seed().seed());
887
+ size_t offset = probe(c.capacity_impl(), soo_slot_hash).offset();
708
888
  offset = offset == new_capacity ? 0 : offset;
709
889
  SanitizerPoisonMemoryRegion(new_slots, policy.slot_size * new_capacity);
710
890
  void* target_slot = SlotAddress(new_slots, offset, policy.slot_size);
711
891
  SanitizerUnpoisonMemoryRegion(target_slot, policy.slot_size);
712
892
  policy.transfer_n(&c, target_slot, c.soo_data(), 1);
713
- c.set_control</*kGenerateSeed=*/false>(new_ctrl);
893
+ c.set_control(new_ctrl);
714
894
  c.set_slots(new_slots);
715
895
  ResetCtrl(c, policy.slot_size);
716
- SetCtrl(c, offset, H2(hash), policy.slot_size);
896
+ SetCtrl(c, offset, H2(soo_slot_hash), policy.slot_size);
717
897
  }
718
898
 
719
899
  enum class ResizeFullSooTableSamplingMode {
@@ -739,9 +919,10 @@ void ResizeFullSooTable(CommonFields& common,
739
919
  ResizeFullSooTableSamplingMode sampling_mode) {
740
920
  AssertFullSoo(common, policy);
741
921
  const size_t slot_size = policy.slot_size;
742
- const size_t slot_align = policy.slot_align;
922
+ void* alloc = policy.get_char_alloc(common);
743
923
 
744
924
  HashtablezInfoHandle infoz;
925
+ bool has_infoz = false;
745
926
  if (sampling_mode ==
746
927
  ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled) {
747
928
  if (ABSL_PREDICT_FALSE(policy.is_hashtablez_eligible)) {
@@ -749,33 +930,19 @@ void ResizeFullSooTable(CommonFields& common,
749
930
  policy.soo_capacity());
750
931
  }
751
932
 
752
- if (!infoz.IsSampled()) {
753
- return;
754
- }
933
+ if (!infoz.IsSampled()) return;
934
+ has_infoz = true;
755
935
  }
756
936
 
757
- const bool has_infoz = infoz.IsSampled();
758
-
759
937
  common.set_capacity(new_capacity);
760
938
 
761
- RawHashSetLayout layout(new_capacity, slot_size, slot_align, has_infoz);
762
- void* alloc = policy.get_char_alloc(common);
763
- char* mem = static_cast<char*>(policy.alloc(alloc, layout.alloc_size()));
764
- const GenerationType old_generation = common.generation();
765
- common.set_generation_ptr(
766
- reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
767
- common.set_generation(NextGeneration(old_generation));
768
-
769
939
  // We do not set control and slots in CommonFields yet to avoid overriding
770
940
  // SOO data.
771
- ctrl_t* new_ctrl = reinterpret_cast<ctrl_t*>(mem + layout.control_offset());
772
- void* new_slots = mem + layout.slot_offset();
773
-
774
- const size_t soo_slot_hash =
775
- policy.hash_slot(policy.hash_fn(common), common.soo_data());
941
+ const auto [new_ctrl, new_slots] =
942
+ AllocBackingArray(common, policy, new_capacity, has_infoz, alloc);
776
943
 
777
- InsertOldSooSlotAndInitializeControlBytes(common, policy, soo_slot_hash,
778
- new_ctrl, new_slots);
944
+ InsertOldSooSlotAndInitializeControlBytes(common, policy, new_ctrl, new_slots,
945
+ has_infoz);
779
946
  ResetGrowthLeft(common);
780
947
  if (has_infoz) {
781
948
  common.set_has_infoz();
@@ -853,7 +1020,7 @@ void GrowIntoSingleGroupShuffleControlBytes(ctrl_t* __restrict old_ctrl,
853
1020
  return;
854
1021
  }
855
1022
 
856
- ABSL_SWISSTABLE_ASSERT(Group::kWidth == 16);
1023
+ ABSL_SWISSTABLE_ASSERT(Group::kWidth == 16); // NOLINT(misc-static-assert)
857
1024
 
858
1025
  // Fill the second half of the main control bytes with kEmpty.
859
1026
  // For small capacity that may write into mirrored control bytes.
@@ -920,7 +1087,7 @@ template <typename ProbedItem>
920
1087
  ABSL_ATTRIBUTE_NOINLINE size_t DecodeAndInsertImpl(
921
1088
  CommonFields& c, const PolicyFunctions& __restrict policy,
922
1089
  const ProbedItem* start, const ProbedItem* end, void* old_slots) {
923
- const size_t new_capacity = c.capacity();
1090
+ const HashtableCapacity new_capacity = c.capacity_impl();
924
1091
 
925
1092
  void* new_slots = c.slot_array();
926
1093
  ctrl_t* new_ctrl = c.control();
@@ -935,8 +1102,8 @@ ABSL_ATTRIBUTE_NOINLINE size_t DecodeAndInsertImpl(
935
1102
  total_probe_length += target.probe_length;
936
1103
  const size_t old_index = static_cast<size_t>(start->source_offset);
937
1104
  const size_t new_i = target.offset;
938
- ABSL_SWISSTABLE_ASSERT(old_index < new_capacity / 2);
939
- ABSL_SWISSTABLE_ASSERT(new_i < new_capacity);
1105
+ ABSL_SWISSTABLE_ASSERT(old_index < new_capacity.capacity() / 2);
1106
+ ABSL_SWISSTABLE_ASSERT(new_i < new_capacity.capacity());
940
1107
  ABSL_SWISSTABLE_ASSERT(IsEmpty(new_ctrl[new_i]));
941
1108
  void* src_slot = SlotAddress(old_slots, old_index, slot_size);
942
1109
  void* dst_slot = SlotAddress(new_slots, new_i, slot_size);
@@ -965,12 +1132,13 @@ ABSL_ATTRIBUTE_NOINLINE size_t ProcessProbedMarkedElements(
965
1132
  const void* hash_fn = policy.hash_fn(c);
966
1133
  auto hash_slot = policy.hash_slot;
967
1134
  auto transfer_n = policy.transfer_n;
1135
+ const size_t seed = c.seed().seed();
968
1136
  for (size_t old_index = start; old_index < old_capacity; ++old_index) {
969
1137
  if (old_ctrl[old_index] != ctrl_t::kSentinel) {
970
1138
  continue;
971
1139
  }
972
1140
  void* src_slot = SlotAddress(old_slots, old_index, slot_size);
973
- const size_t hash = hash_slot(hash_fn, src_slot);
1141
+ const size_t hash = hash_slot(hash_fn, src_slot, seed);
974
1142
  const FindInfo target = find_first_non_full(c, hash);
975
1143
  total_probe_length += target.probe_length;
976
1144
  const size_t new_i = target.offset;
@@ -1062,7 +1230,8 @@ class ProbedItemEncoder {
1062
1230
 
1063
1231
  ProbedItem* OverflowBufferStart() const {
1064
1232
  // We reuse GrowthInfo memory as well.
1065
- return AlignToNextItem(control_ - ControlOffset(/*has_infoz=*/false));
1233
+ return AlignToNextItem(control_ - ControlOffset(/*has_infoz=*/false,
1234
+ /*has_growth_info=*/true));
1066
1235
  }
1067
1236
 
1068
1237
  // Encodes item when previously allocated buffer is full.
@@ -1224,6 +1393,79 @@ size_t GrowToNextCapacityDispatch(CommonFields& common,
1224
1393
  }
1225
1394
  }
1226
1395
 
1396
+ void IncrementSmallSizeNonSoo(CommonFields& common,
1397
+ const PolicyFunctions& __restrict policy) {
1398
+ ABSL_SWISSTABLE_ASSERT(common.is_small());
1399
+ common.increment_size();
1400
+ SanitizerUnpoisonMemoryRegion(common.slot_array(), policy.slot_size);
1401
+ }
1402
+
1403
+ void IncrementSmallSize(CommonFields& common,
1404
+ const PolicyFunctions& __restrict policy) {
1405
+ ABSL_SWISSTABLE_ASSERT(common.is_small());
1406
+ if (policy.soo_enabled) {
1407
+ common.set_full_soo();
1408
+ } else {
1409
+ IncrementSmallSizeNonSoo(common, policy);
1410
+ }
1411
+ }
1412
+
1413
+ std::pair<ctrl_t*, void*> Grow1To3AndPrepareInsert(
1414
+ CommonFields& common, const PolicyFunctions& __restrict policy,
1415
+ absl::FunctionRef<size_t(size_t)> get_hash) {
1416
+ // TODO(b/413062340): Refactor to reuse more code with
1417
+ // GrowSooTableToNextCapacityAndPrepareInsert.
1418
+ ABSL_SWISSTABLE_ASSERT(common.capacity() == 1);
1419
+ ABSL_SWISSTABLE_ASSERT(!common.empty());
1420
+ ABSL_SWISSTABLE_ASSERT(!policy.soo_enabled);
1421
+ constexpr size_t kOldCapacity = 1;
1422
+ constexpr size_t kNewCapacity = NextCapacity(kOldCapacity);
1423
+ ctrl_t* old_ctrl = common.control();
1424
+ void* old_slots = common.slot_array();
1425
+
1426
+ const size_t slot_size = policy.slot_size;
1427
+ const size_t slot_align = policy.slot_align;
1428
+ void* alloc = policy.get_char_alloc(common);
1429
+ HashtablezInfoHandle infoz = common.infoz();
1430
+ const bool has_infoz = infoz.IsSampled();
1431
+ common.set_capacity(kNewCapacity);
1432
+
1433
+ const auto [new_ctrl, new_slots] =
1434
+ AllocBackingArray(common, policy, kNewCapacity, has_infoz, alloc);
1435
+ common.set_control(new_ctrl);
1436
+ common.set_slots(new_slots);
1437
+ SanitizerPoisonMemoryRegion(new_slots, kNewCapacity * slot_size);
1438
+
1439
+ if (ABSL_PREDICT_TRUE(!has_infoz)) {
1440
+ // When we're sampled, we already have a seed.
1441
+ common.generate_new_seed(/*has_infoz=*/false);
1442
+ }
1443
+ const size_t new_hash = get_hash(common.seed().seed());
1444
+ h2_t new_h2 = H2(new_hash);
1445
+ size_t orig_hash =
1446
+ policy.hash_slot(policy.hash_fn(common), old_slots, common.seed().seed());
1447
+ size_t offset = Resize1To3NewOffset(new_hash, common.seed());
1448
+ InitializeThreeElementsControlBytes(H2(orig_hash), new_h2, offset, new_ctrl);
1449
+
1450
+ void* old_element_target = NextSlot(new_slots, slot_size);
1451
+ SanitizerUnpoisonMemoryRegion(old_element_target, slot_size);
1452
+ policy.transfer_n(&common, old_element_target, old_slots, 1);
1453
+
1454
+ void* new_element_target_slot = SlotAddress(new_slots, offset, slot_size);
1455
+ SanitizerUnpoisonMemoryRegion(new_element_target_slot, slot_size);
1456
+
1457
+ policy.dealloc(alloc, kOldCapacity, old_ctrl, slot_size, slot_align,
1458
+ has_infoz);
1459
+ PrepareInsertCommon(common);
1460
+ ABSL_SWISSTABLE_ASSERT(common.size() == 2);
1461
+ GetGrowthInfoFromControl(new_ctrl).InitGrowthLeftNoDeleted(kNewCapacity - 2);
1462
+
1463
+ if (ABSL_PREDICT_FALSE(has_infoz)) {
1464
+ ReportSingleGroupTableGrowthToInfoz(common, infoz, new_hash);
1465
+ }
1466
+ return {new_ctrl + offset, new_element_target_slot};
1467
+ }
1468
+
1227
1469
  // Grows to next capacity and prepares insert for the given new_hash.
1228
1470
  // Returns the offset of the new element.
1229
1471
  size_t GrowToNextCapacityAndPrepareInsert(
@@ -1231,98 +1473,120 @@ size_t GrowToNextCapacityAndPrepareInsert(
1231
1473
  size_t new_hash) {
1232
1474
  ABSL_SWISSTABLE_ASSERT(common.growth_left() == 0);
1233
1475
  const size_t old_capacity = common.capacity();
1234
- ABSL_SWISSTABLE_ASSERT(old_capacity == 0 ||
1235
- old_capacity > policy.soo_capacity());
1476
+ ABSL_SWISSTABLE_ASSERT(old_capacity > policy.soo_capacity());
1477
+ ABSL_SWISSTABLE_ASSERT(!IsSmallCapacity(old_capacity));
1236
1478
 
1237
1479
  const size_t new_capacity = NextCapacity(old_capacity);
1238
- ABSL_SWISSTABLE_ASSERT(IsValidCapacity(new_capacity));
1239
- ABSL_SWISSTABLE_ASSERT(new_capacity > policy.soo_capacity());
1240
-
1241
1480
  ctrl_t* old_ctrl = common.control();
1242
1481
  void* old_slots = common.slot_array();
1243
1482
 
1244
1483
  common.set_capacity(new_capacity);
1245
1484
  const size_t slot_size = policy.slot_size;
1246
1485
  const size_t slot_align = policy.slot_align;
1247
- HashtablezInfoHandle infoz;
1248
- if (old_capacity > 0) {
1249
- infoz = common.infoz();
1250
- } else {
1251
- const bool should_sample =
1252
- policy.is_hashtablez_eligible && ShouldSampleNextTable();
1253
- if (ABSL_PREDICT_FALSE(should_sample)) {
1254
- infoz = ForcedTrySample(slot_size, policy.key_size, policy.value_size,
1255
- policy.soo_capacity());
1256
- }
1257
- }
1258
- const bool has_infoz = infoz.IsSampled();
1259
-
1260
- RawHashSetLayout layout(new_capacity, slot_size, slot_align, has_infoz);
1261
1486
  void* alloc = policy.get_char_alloc(common);
1262
- char* mem = static_cast<char*>(policy.alloc(alloc, layout.alloc_size()));
1263
- const GenerationType old_generation = common.generation();
1264
- common.set_generation_ptr(
1265
- reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
1266
- common.set_generation(NextGeneration(old_generation));
1487
+ HashtablezInfoHandle infoz = common.infoz();
1488
+ const bool has_infoz = infoz.IsSampled();
1267
1489
 
1268
- ctrl_t* new_ctrl = reinterpret_cast<ctrl_t*>(mem + layout.control_offset());
1269
- void* new_slots = mem + layout.slot_offset();
1270
- common.set_control</*kGenerateSeed=*/false>(new_ctrl);
1490
+ const auto [new_ctrl, new_slots] =
1491
+ AllocBackingArray(common, policy, new_capacity, has_infoz, alloc);
1492
+ common.set_control(new_ctrl);
1271
1493
  common.set_slots(new_slots);
1272
1494
  SanitizerPoisonMemoryRegion(new_slots, new_capacity * slot_size);
1273
1495
 
1274
1496
  h2_t new_h2 = H2(new_hash);
1275
1497
  size_t total_probe_length = 0;
1276
1498
  FindInfo find_info;
1277
- if (old_capacity == 0) {
1278
- static_assert(NextCapacity(0) == 1);
1279
- InitializeSingleElementControlBytes(new_h2, new_ctrl);
1280
- common.generate_new_seed();
1281
- find_info = FindInfo{0, 0};
1282
- SanitizerUnpoisonMemoryRegion(new_slots, slot_size);
1499
+ if (ABSL_PREDICT_TRUE(is_single_group(new_capacity))) {
1500
+ size_t offset;
1501
+ GrowIntoSingleGroupShuffleControlBytes(old_ctrl, old_capacity, new_ctrl,
1502
+ new_capacity);
1503
+ // We put the new element either at the beginning or at the end of the
1504
+ // table with approximately equal probability.
1505
+ offset =
1506
+ SingleGroupTableH1(new_hash, common.seed()) & 1 ? 0 : new_capacity - 1;
1507
+
1508
+ ABSL_SWISSTABLE_ASSERT(IsEmpty(new_ctrl[offset]));
1509
+ SetCtrlInSingleGroupTable(common, offset, new_h2, policy.slot_size);
1510
+ find_info = FindInfo{offset, 0};
1511
+ // Single group tables have all slots full on resize. So we can transfer
1512
+ // all slots without checking the control bytes.
1513
+ ABSL_SWISSTABLE_ASSERT(common.size() == old_capacity);
1514
+ void* target = NextSlot(new_slots, slot_size);
1515
+ SanitizerUnpoisonMemoryRegion(target, old_capacity * slot_size);
1516
+ policy.transfer_n(&common, target, old_slots, old_capacity);
1283
1517
  } else {
1284
- if (ABSL_PREDICT_TRUE(is_single_group(new_capacity))) {
1285
- GrowIntoSingleGroupShuffleControlBytes(old_ctrl, old_capacity, new_ctrl,
1286
- new_capacity);
1287
- // Single group tables have all slots full on resize. So we can transfer
1288
- // all slots without checking the control bytes.
1289
- ABSL_SWISSTABLE_ASSERT(common.size() == old_capacity);
1290
- auto* target = NextSlot(new_slots, slot_size);
1291
- SanitizerUnpoisonMemoryRegion(target, old_capacity * slot_size);
1292
- policy.transfer_n(&common, target, old_slots, old_capacity);
1293
- // We put the new element either at the beginning or at the end of the
1294
- // table with approximately equal probability.
1295
- size_t offset = SingleGroupTableH1(new_hash, common.seed()) & 1
1296
- ? 0
1297
- : new_capacity - 1;
1298
-
1299
- ABSL_SWISSTABLE_ASSERT(IsEmpty(new_ctrl[offset]));
1300
- SetCtrlInSingleGroupTable(common, offset, new_h2, policy.slot_size);
1301
- find_info = FindInfo{offset, 0};
1302
- } else {
1303
- total_probe_length =
1304
- GrowToNextCapacityDispatch(common, policy, old_ctrl, old_slots);
1305
- find_info = find_first_non_full(common, new_hash);
1306
- SetCtrlInLargeTable(common, find_info.offset, new_h2, policy.slot_size);
1307
- }
1308
- ABSL_SWISSTABLE_ASSERT(old_capacity > policy.soo_capacity());
1309
- (*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align,
1310
- has_infoz);
1518
+ total_probe_length =
1519
+ GrowToNextCapacityDispatch(common, policy, old_ctrl, old_slots);
1520
+ find_info = find_first_non_full(common, new_hash);
1521
+ SetCtrlInLargeTable(common, find_info.offset, new_h2, policy.slot_size);
1311
1522
  }
1523
+ ABSL_SWISSTABLE_ASSERT(old_capacity > policy.soo_capacity());
1524
+ (*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align,
1525
+ has_infoz);
1312
1526
  PrepareInsertCommon(common);
1313
1527
  ResetGrowthLeft(GetGrowthInfoFromControl(new_ctrl), new_capacity,
1314
1528
  common.size());
1315
1529
 
1316
1530
  if (ABSL_PREDICT_FALSE(has_infoz)) {
1317
- common.set_has_infoz();
1318
- infoz.RecordStorageChanged(common.size() - 1, new_capacity);
1319
- infoz.RecordRehash(total_probe_length);
1320
- infoz.RecordInsert(new_hash, find_info.probe_length);
1321
- common.set_infoz(infoz);
1531
+ ReportGrowthToInfoz(common, infoz, new_hash, total_probe_length,
1532
+ find_info.probe_length);
1322
1533
  }
1323
1534
  return find_info.offset;
1324
1535
  }
1325
1536
 
1537
+ } // namespace
1538
+
1539
+ std::pair<ctrl_t*, void*> PrepareInsertSmallNonSoo(
1540
+ CommonFields& common, const PolicyFunctions& __restrict policy,
1541
+ absl::FunctionRef<size_t(size_t)> get_hash) {
1542
+ ABSL_SWISSTABLE_ASSERT(common.is_small());
1543
+ ABSL_SWISSTABLE_ASSERT(!policy.soo_enabled);
1544
+ if (common.capacity() == 1) {
1545
+ if (common.empty()) {
1546
+ IncrementSmallSizeNonSoo(common, policy);
1547
+ if (common.has_infoz()) {
1548
+ common.infoz().RecordInsertMiss(get_hash(common.seed().seed()),
1549
+ /*distance_from_desired=*/0);
1550
+ }
1551
+ return {SooControl(), common.slot_array()};
1552
+ } else {
1553
+ return Grow1To3AndPrepareInsert(common, policy, get_hash);
1554
+ }
1555
+ }
1556
+
1557
+ // Growing from 0 to 1 capacity.
1558
+ ABSL_SWISSTABLE_ASSERT(common.capacity() == 0);
1559
+ constexpr size_t kNewCapacity = 1;
1560
+
1561
+ common.set_capacity(kNewCapacity);
1562
+ HashtablezInfoHandle infoz;
1563
+ const bool should_sample =
1564
+ policy.is_hashtablez_eligible && ShouldSampleNextTable();
1565
+ if (ABSL_PREDICT_FALSE(should_sample)) {
1566
+ infoz = ForcedTrySample(policy.slot_size, policy.key_size,
1567
+ policy.value_size, policy.soo_capacity());
1568
+ }
1569
+ const bool has_infoz = infoz.IsSampled();
1570
+ void* alloc = policy.get_char_alloc(common);
1571
+
1572
+ const auto [new_ctrl, new_slots] =
1573
+ AllocBackingArray(common, policy, kNewCapacity, has_infoz, alloc);
1574
+ common.set_control(new_ctrl);
1575
+ common.set_slots(new_slots);
1576
+
1577
+ static_assert(NextCapacity(0) == 1);
1578
+ PrepareInsertCommon(common);
1579
+
1580
+ if (ABSL_PREDICT_FALSE(has_infoz)) {
1581
+ common.generate_new_seed(/*has_infoz=*/true);
1582
+ ReportSingleGroupTableGrowthToInfoz(common, infoz,
1583
+ get_hash(common.seed().seed()));
1584
+ }
1585
+ return {SooControl(), new_slots};
1586
+ }
1587
+
1588
+ namespace {
1589
+
1326
1590
  // Called whenever the table needs to vacate empty slots either by removing
1327
1591
  // tombstones via rehash or growth to next capacity.
1328
1592
  ABSL_ATTRIBUTE_NOINLINE
@@ -1382,11 +1646,11 @@ size_t RehashOrGrowToNextCapacityAndPrepareInsert(
1382
1646
  }
1383
1647
  }
1384
1648
 
1385
- // Slow path for PrepareInsertNonSoo that is called when the table has deleted
1649
+ // Slow path for PrepareInsertLarge that is called when the table has deleted
1386
1650
  // slots or need to be resized or rehashed.
1387
- size_t PrepareInsertNonSooSlow(CommonFields& common,
1388
- const PolicyFunctions& __restrict policy,
1389
- size_t hash) {
1651
+ size_t PrepareInsertLargeSlow(CommonFields& common,
1652
+ const PolicyFunctions& __restrict policy,
1653
+ size_t hash) {
1390
1654
  const GrowthInfo growth_info = common.growth_info();
1391
1655
  ABSL_SWISSTABLE_ASSERT(!growth_info.HasNoDeletedAndGrowthLeft());
1392
1656
  if (ABSL_PREDICT_TRUE(growth_info.HasNoGrowthLeftAndNoDeleted())) {
@@ -1404,7 +1668,7 @@ size_t PrepareInsertNonSooSlow(CommonFields& common,
1404
1668
  PrepareInsertCommon(common);
1405
1669
  common.growth_info().OverwriteControlAsFull(common.control()[target.offset]);
1406
1670
  SetCtrlInLargeTable(common, target.offset, H2(hash), policy.slot_size);
1407
- common.infoz().RecordInsert(hash, target.probe_length);
1671
+ common.infoz().RecordInsertMiss(hash, target.probe_length);
1408
1672
  return target.offset;
1409
1673
  }
1410
1674
 
@@ -1417,14 +1681,15 @@ size_t PrepareInsertNonSooSlow(CommonFields& common,
1417
1681
  ABSL_ATTRIBUTE_NOINLINE size_t
1418
1682
  GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert(
1419
1683
  CommonFields& common, const PolicyFunctions& __restrict policy,
1420
- size_t new_hash) {
1684
+ absl::FunctionRef<size_t(size_t)> get_hash) {
1421
1685
  ResizeEmptyNonAllocatedTableImpl(common, policy, NextCapacity(SooCapacity()),
1422
1686
  /*force_infoz=*/true);
1423
1687
  PrepareInsertCommon(common);
1424
1688
  common.growth_info().OverwriteEmptyAsFull();
1689
+ const size_t new_hash = get_hash(common.seed().seed());
1425
1690
  SetCtrlInSingleGroupTable(common, SooSlotIndex(), H2(new_hash),
1426
1691
  policy.slot_size);
1427
- common.infoz().RecordInsert(new_hash, /*distance_from_desired=*/0);
1692
+ common.infoz().RecordInsertMiss(new_hash, /*distance_from_desired=*/0);
1428
1693
  return SooSlotIndex();
1429
1694
  }
1430
1695
 
@@ -1437,7 +1702,7 @@ GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert(
1437
1702
  void ReserveEmptyNonAllocatedTableToFitNewSize(
1438
1703
  CommonFields& common, const PolicyFunctions& __restrict policy,
1439
1704
  size_t new_size) {
1440
- ValidateMaxSize(new_size, policy.slot_size);
1705
+ ValidateMaxSize(new_size, policy.key_size, policy.slot_size);
1441
1706
  ABSL_ASSUME(new_size > 0);
1442
1707
  ResizeEmptyNonAllocatedTableImpl(common, policy, SizeToCapacity(new_size),
1443
1708
  /*force_infoz=*/false);
@@ -1456,7 +1721,7 @@ ABSL_ATTRIBUTE_NOINLINE void ReserveAllocatedTable(
1456
1721
  CommonFields& common, const PolicyFunctions& __restrict policy,
1457
1722
  size_t new_size) {
1458
1723
  const size_t cap = common.capacity();
1459
- ValidateMaxSize(new_size, policy.slot_size);
1724
+ ValidateMaxSize(new_size, policy.key_size, policy.slot_size);
1460
1725
  ABSL_ASSUME(new_size > 0);
1461
1726
  const size_t new_capacity = SizeToCapacity(new_size);
1462
1727
  if (cap == policy.soo_capacity()) {
@@ -1471,6 +1736,17 @@ ABSL_ATTRIBUTE_NOINLINE void ReserveAllocatedTable(
1471
1736
  common.infoz().RecordReservation(new_size);
1472
1737
  }
1473
1738
 
1739
+ // As `ResizeFullSooTableToNextCapacity`, except that we also force the SOO
1740
+ // table to be sampled. SOO tables need to switch from SOO to heap in order to
1741
+ // store the infoz. No-op if sampling is disabled or not possible.
1742
+ void GrowFullSooTableToNextCapacityForceSampling(
1743
+ CommonFields& common, const PolicyFunctions& __restrict policy) {
1744
+ AssertFullSoo(common, policy);
1745
+ ResizeFullSooTable(
1746
+ common, policy, NextCapacity(SooCapacity()),
1747
+ ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled);
1748
+ }
1749
+
1474
1750
  } // namespace
1475
1751
 
1476
1752
  void* GetRefForEmptyClass(CommonFields& common) {
@@ -1492,7 +1768,7 @@ void ReserveEmptyNonAllocatedTableToFitBucketCount(
1492
1768
  CommonFields& common, const PolicyFunctions& __restrict policy,
1493
1769
  size_t bucket_count) {
1494
1770
  size_t new_capacity = NormalizeCapacity(bucket_count);
1495
- ValidateMaxSize(CapacityToGrowth(new_capacity), policy.slot_size);
1771
+ ValidateMaxCapacity(new_capacity, policy.key_size, policy.slot_size);
1496
1772
  ResizeEmptyNonAllocatedTableImpl(common, policy, new_capacity,
1497
1773
  /*force_infoz=*/false);
1498
1774
  }
@@ -1501,46 +1777,38 @@ void ReserveEmptyNonAllocatedTableToFitBucketCount(
1501
1777
  template <size_t SooSlotMemcpySize, bool TransferUsesMemcpy>
1502
1778
  size_t GrowSooTableToNextCapacityAndPrepareInsert(
1503
1779
  CommonFields& common, const PolicyFunctions& __restrict policy,
1504
- size_t new_hash, ctrl_t soo_slot_ctrl) {
1780
+ absl::FunctionRef<size_t(size_t)> get_hash, bool force_sampling) {
1505
1781
  AssertSoo(common, policy);
1506
- if (ABSL_PREDICT_FALSE(soo_slot_ctrl == ctrl_t::kEmpty)) {
1782
+ if (ABSL_PREDICT_FALSE(force_sampling)) {
1507
1783
  // The table is empty, it is only used for forced sampling of SOO tables.
1508
1784
  return GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert(
1509
- common, policy, new_hash);
1785
+ common, policy, get_hash);
1510
1786
  }
1511
1787
  ABSL_SWISSTABLE_ASSERT(common.size() == policy.soo_capacity());
1512
1788
  static constexpr size_t kNewCapacity = NextCapacity(SooCapacity());
1513
1789
  const size_t slot_size = policy.slot_size;
1514
- const size_t slot_align = policy.slot_align;
1790
+ void* alloc = policy.get_char_alloc(common);
1515
1791
  common.set_capacity(kNewCapacity);
1516
1792
 
1517
1793
  // Since the table is not empty, it will not be sampled.
1518
1794
  // The decision to sample was already made during the first insertion.
1519
- RawHashSetLayout layout(kNewCapacity, slot_size, slot_align,
1520
- /*has_infoz=*/false);
1521
- void* alloc = policy.get_char_alloc(common);
1522
- char* mem = static_cast<char*>(policy.alloc(alloc, layout.alloc_size()));
1523
- const GenerationType old_generation = common.generation();
1524
- common.set_generation_ptr(
1525
- reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
1526
- common.set_generation(NextGeneration(old_generation));
1527
-
1795
+ //
1528
1796
  // We do not set control and slots in CommonFields yet to avoid overriding
1529
1797
  // SOO data.
1530
- ctrl_t* new_ctrl = reinterpret_cast<ctrl_t*>(mem + layout.control_offset());
1531
- void* new_slots = mem + layout.slot_offset();
1798
+ const auto [new_ctrl, new_slots] = AllocBackingArray(
1799
+ common, policy, kNewCapacity, /*has_infoz=*/false, alloc);
1532
1800
 
1533
1801
  PrepareInsertCommon(common);
1534
1802
  ABSL_SWISSTABLE_ASSERT(common.size() == 2);
1535
1803
  GetGrowthInfoFromControl(new_ctrl).InitGrowthLeftNoDeleted(kNewCapacity - 2);
1536
- common.generate_new_seed();
1804
+ common.generate_new_seed(/*has_infoz=*/false);
1805
+ const h2_t soo_slot_h2 = H2(policy.hash_slot(
1806
+ policy.hash_fn(common), common.soo_data(), common.seed().seed()));
1807
+ const size_t new_hash = get_hash(common.seed().seed());
1537
1808
 
1538
- // After resize from capacity 1 to 3, we always have exactly the slot with
1539
- // index 1 occupied, so we need to insert either at index 0 or index 2.
1540
- static_assert(SooSlotIndex() == 1);
1541
- const size_t offset = SingleGroupTableH1(new_hash, common.seed()) & 2;
1542
- InitializeThreeElementsControlBytesAfterSoo(soo_slot_ctrl, new_hash, offset,
1543
- new_ctrl);
1809
+ const size_t offset = Resize1To3NewOffset(new_hash, common.seed());
1810
+ InitializeThreeElementsControlBytes(soo_slot_h2, H2(new_hash), offset,
1811
+ new_ctrl);
1544
1812
 
1545
1813
  SanitizerPoisonMemoryRegion(new_slots, slot_size * kNewCapacity);
1546
1814
  void* target_slot = SlotAddress(new_slots, SooSlotIndex(), slot_size);
@@ -1562,31 +1830,23 @@ size_t GrowSooTableToNextCapacityAndPrepareInsert(
1562
1830
  static_assert(SooSlotMemcpySize == 0);
1563
1831
  policy.transfer_n(&common, target_slot, common.soo_data(), 1);
1564
1832
  }
1565
- // Seed was already generated above.
1566
- common.set_control</*kGenerateSeed=*/false>(new_ctrl);
1833
+ common.set_control(new_ctrl);
1567
1834
  common.set_slots(new_slots);
1568
1835
 
1569
- common.infoz().RecordInsert(new_hash, /*distance_from_desired=*/0);
1836
+ // Full SOO table couldn't be sampled. If SOO table is sampled, it would
1837
+ // have been resized to the next capacity.
1838
+ ABSL_SWISSTABLE_ASSERT(!common.infoz().IsSampled());
1570
1839
  SanitizerUnpoisonMemoryRegion(SlotAddress(new_slots, offset, slot_size),
1571
1840
  slot_size);
1572
1841
  return offset;
1573
1842
  }
1574
1843
 
1575
- void GrowFullSooTableToNextCapacityForceSampling(
1576
- CommonFields& common, const PolicyFunctions& __restrict policy) {
1577
- AssertFullSoo(common, policy);
1578
- ResizeFullSooTable(
1579
- common, policy, NextCapacity(SooCapacity()),
1580
- ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled);
1581
- }
1582
-
1583
1844
  void Rehash(CommonFields& common, const PolicyFunctions& __restrict policy,
1584
1845
  size_t n) {
1585
1846
  const size_t cap = common.capacity();
1586
1847
 
1587
1848
  auto clear_backing_array = [&]() {
1588
- ClearBackingArray(common, policy, policy.get_char_alloc(common),
1589
- /*reuse=*/false, policy.soo_enabled);
1849
+ ClearBackingArrayNoReuse(common, policy, policy.get_char_alloc(common));
1590
1850
  };
1591
1851
 
1592
1852
  const size_t slot_size = policy.slot_size;
@@ -1612,7 +1872,7 @@ void Rehash(CommonFields& common, const PolicyFunctions& __restrict policy,
1612
1872
  }
1613
1873
  ABSL_SWISSTABLE_ASSERT(slot_size <= sizeof(HeapOrSoo));
1614
1874
  ABSL_SWISSTABLE_ASSERT(policy.slot_align <= alignof(HeapOrSoo));
1615
- HeapOrSoo tmp_slot(uninitialized_tag_t{});
1875
+ HeapOrSoo tmp_slot;
1616
1876
  size_t begin_offset = FindFirstFullSlot(0, cap, common.control());
1617
1877
  policy.transfer_n(
1618
1878
  &common, &tmp_slot,
@@ -1624,11 +1884,11 @@ void Rehash(CommonFields& common, const PolicyFunctions& __restrict policy,
1624
1884
  }
1625
1885
  }
1626
1886
 
1627
- ValidateMaxSize(n, policy.slot_size);
1628
1887
  // bitor is a faster way of doing `max` here. We will round up to the next
1629
1888
  // power-of-2-minus-1, so bitor is good enough.
1630
1889
  const size_t new_capacity =
1631
1890
  NormalizeCapacity(n | SizeToCapacity(common.size()));
1891
+ ValidateMaxCapacity(new_capacity, policy.key_size, policy.slot_size);
1632
1892
  // n == 0 unconditionally rehashes as per the standard.
1633
1893
  if (n == 0 || new_capacity > cap) {
1634
1894
  if (cap == policy.soo_capacity()) {
@@ -1655,19 +1915,22 @@ void Copy(CommonFields& common, const PolicyFunctions& __restrict policy,
1655
1915
  ABSL_SWISSTABLE_ASSERT(size > 0);
1656
1916
  const size_t soo_capacity = policy.soo_capacity();
1657
1917
  const size_t slot_size = policy.slot_size;
1658
- if (size <= soo_capacity) {
1659
- ABSL_SWISSTABLE_ASSERT(size == 1);
1660
- common.set_full_soo();
1918
+ const bool soo_enabled = policy.soo_enabled;
1919
+ if (size == 1) {
1920
+ if (!soo_enabled) ReserveTableToFitNewSize(common, policy, 1);
1921
+ IncrementSmallSize(common, policy);
1922
+ const size_t other_capacity = other.capacity();
1661
1923
  const void* other_slot =
1662
- other.capacity() <= soo_capacity
1663
- ? other.soo_data()
1664
- : SlotAddress(
1665
- other.slot_array(),
1666
- FindFirstFullSlot(0, other.capacity(), other.control()),
1667
- slot_size);
1668
- copy_fn(common.soo_data(), other_slot);
1669
-
1670
- if (policy.is_hashtablez_eligible && ShouldSampleNextTable()) {
1924
+ other_capacity <= soo_capacity ? other.soo_data()
1925
+ : other.is_small()
1926
+ ? other.slot_array()
1927
+ : SlotAddress(other.slot_array(),
1928
+ FindFirstFullSlot(0, other_capacity, other.control()),
1929
+ slot_size);
1930
+ copy_fn(soo_enabled ? common.soo_data() : common.slot_array(), other_slot);
1931
+
1932
+ if (soo_enabled && policy.is_hashtablez_eligible &&
1933
+ ShouldSampleNextTable()) {
1671
1934
  GrowFullSooTableToNextCapacityForceSampling(common, policy);
1672
1935
  }
1673
1936
  return;
@@ -1678,47 +1941,22 @@ void Copy(CommonFields& common, const PolicyFunctions& __restrict policy,
1678
1941
  ABSL_SWISSTABLE_ASSERT(other.capacity() > soo_capacity);
1679
1942
  const size_t cap = common.capacity();
1680
1943
  ABSL_SWISSTABLE_ASSERT(cap > soo_capacity);
1681
- // Note about single group tables:
1682
- // 1. It is correct to have any order of elements.
1683
- // 2. Order has to be non deterministic.
1684
- // 3. We are assigning elements with arbitrary `shift` starting from
1685
- // `capacity + shift` position.
1686
- // 4. `shift` must be coprime with `capacity + 1` in order to be able to use
1687
- // modular arithmetic to traverse all positions, instead of cycling
1688
- // through a subset of positions. Odd numbers are coprime with any
1689
- // `capacity + 1` (2^N).
1690
1944
  size_t offset = cap;
1691
- const size_t shift = is_single_group(cap) ? (common.seed().seed() | 1) : 0;
1692
1945
  const void* hash_fn = policy.hash_fn(common);
1693
1946
  auto hasher = policy.hash_slot;
1947
+ const size_t seed = common.seed().seed();
1694
1948
  IterateOverFullSlotsImpl(
1695
- other, slot_size, [&](const ctrl_t* that_ctrl, void* that_slot) {
1696
- if (shift == 0) {
1697
- // Big tables case. Position must be searched via probing.
1698
- // The table is guaranteed to be empty, so we can do faster than
1699
- // a full `insert`.
1700
- const size_t hash = (*hasher)(hash_fn, that_slot);
1701
- FindInfo target = find_first_non_full(common, hash);
1702
- infoz.RecordInsert(hash, target.probe_length);
1703
- offset = target.offset;
1704
- } else {
1705
- // Small tables case. Next position is computed via shift.
1706
- offset = (offset + shift) & cap;
1707
- }
1708
- const h2_t h2 = static_cast<h2_t>(*that_ctrl);
1709
- // We rely on the hash not changing for small tables.
1710
- ABSL_SWISSTABLE_ASSERT(
1711
- H2((*hasher)(hash_fn, that_slot)) == h2 &&
1712
- "hash function value changed unexpectedly during the copy");
1713
- SetCtrl(common, offset, h2, slot_size);
1949
+ other, slot_size, [&](const ctrl_t*, void* that_slot) {
1950
+ // The table is guaranteed to be empty, so we can do faster than
1951
+ // a full `insert`.
1952
+ const size_t hash = (*hasher)(hash_fn, that_slot, seed);
1953
+ FindInfo target = find_first_non_full(common, hash);
1954
+ infoz.RecordInsertMiss(hash, target.probe_length);
1955
+ offset = target.offset;
1956
+ SetCtrl(common, offset, H2(hash), slot_size);
1714
1957
  copy_fn(SlotAddress(common.slot_array(), offset, slot_size), that_slot);
1715
1958
  common.maybe_increment_generation_on_insert();
1716
1959
  });
1717
- if (shift != 0) {
1718
- // On small table copy we do not record individual inserts.
1719
- // RecordInsert requires hash, but it is unknown for small tables.
1720
- infoz.RecordStorageChanged(size, cap);
1721
- }
1722
1960
  common.increment_size(size);
1723
1961
  common.growth_info().OverwriteManyEmptyAsFull(size);
1724
1962
  }
@@ -1737,41 +1975,62 @@ void ReserveTableToFitNewSize(CommonFields& common,
1737
1975
  ABSL_SWISSTABLE_ASSERT(!common.empty() || cap > policy.soo_capacity());
1738
1976
  ABSL_SWISSTABLE_ASSERT(cap > 0);
1739
1977
  const size_t max_size_before_growth =
1740
- cap <= policy.soo_capacity() ? policy.soo_capacity()
1741
- : common.size() + common.growth_left();
1978
+ IsSmallCapacity(cap) ? cap : common.size() + common.growth_left();
1742
1979
  if (new_size <= max_size_before_growth) {
1743
1980
  return;
1744
1981
  }
1745
1982
  ReserveAllocatedTable(common, policy, new_size);
1746
1983
  }
1747
1984
 
1748
- size_t PrepareInsertNonSoo(CommonFields& common,
1749
- const PolicyFunctions& __restrict policy,
1750
- size_t hash, FindInfo target) {
1751
- const bool rehash_for_bug_detection =
1752
- common.should_rehash_for_bug_detection_on_insert() &&
1753
- // Required to allow use of ResizeAllocatedTable.
1754
- common.capacity() > 0;
1755
- if (rehash_for_bug_detection) {
1756
- // Move to a different heap allocation in order to detect bugs.
1757
- const size_t cap = common.capacity();
1758
- ResizeAllocatedTableWithSeedChange(
1759
- common, policy, common.growth_left() > 0 ? cap : NextCapacity(cap));
1760
- target = find_first_non_full(common, hash);
1761
- }
1762
-
1985
+ namespace {
1986
+ size_t PrepareInsertLargeImpl(CommonFields& common,
1987
+ const PolicyFunctions& __restrict policy,
1988
+ size_t hash,
1989
+ Group::NonIterableBitMaskType mask_empty,
1990
+ FindInfo target_group) {
1991
+ ABSL_SWISSTABLE_ASSERT(!common.is_small());
1763
1992
  const GrowthInfo growth_info = common.growth_info();
1764
1993
  // When there are no deleted slots in the table
1765
1994
  // and growth_left is positive, we can insert at the first
1766
1995
  // empty slot in the probe sequence (target).
1767
1996
  if (ABSL_PREDICT_FALSE(!growth_info.HasNoDeletedAndGrowthLeft())) {
1768
- return PrepareInsertNonSooSlow(common, policy, hash);
1997
+ return PrepareInsertLargeSlow(common, policy, hash);
1769
1998
  }
1770
1999
  PrepareInsertCommon(common);
1771
2000
  common.growth_info().OverwriteEmptyAsFull();
1772
- SetCtrl(common, target.offset, H2(hash), policy.slot_size);
1773
- common.infoz().RecordInsert(hash, target.probe_length);
1774
- return target.offset;
2001
+ target_group.offset += mask_empty.LowestBitSet();
2002
+ target_group.offset &= common.capacity();
2003
+ SetCtrl(common, target_group.offset, H2(hash), policy.slot_size);
2004
+ common.infoz().RecordInsertMiss(hash, target_group.probe_length);
2005
+ return target_group.offset;
2006
+ }
2007
+ } // namespace
2008
+
2009
+ size_t PrepareInsertLarge(CommonFields& common,
2010
+ const PolicyFunctions& __restrict policy, size_t hash,
2011
+ Group::NonIterableBitMaskType mask_empty,
2012
+ FindInfo target_group) {
2013
+ // NOLINTNEXTLINE(misc-static-assert)
2014
+ ABSL_SWISSTABLE_ASSERT(!SwisstableGenerationsEnabled());
2015
+ return PrepareInsertLargeImpl(common, policy, hash, mask_empty, target_group);
2016
+ }
2017
+
2018
+ size_t PrepareInsertLargeGenerationsEnabled(
2019
+ CommonFields& common, const PolicyFunctions& policy, size_t hash,
2020
+ Group::NonIterableBitMaskType mask_empty, FindInfo target_group,
2021
+ absl::FunctionRef<size_t(size_t)> recompute_hash) {
2022
+ // NOLINTNEXTLINE(misc-static-assert)
2023
+ ABSL_SWISSTABLE_ASSERT(SwisstableGenerationsEnabled());
2024
+ if (common.should_rehash_for_bug_detection_on_insert()) {
2025
+ // Move to a different heap allocation in order to detect bugs.
2026
+ const size_t cap = common.capacity();
2027
+ ResizeAllocatedTableWithSeedChange(
2028
+ common, policy, common.growth_left() > 0 ? cap : NextCapacity(cap));
2029
+ hash = recompute_hash(common.seed().seed());
2030
+ std::tie(target_group, mask_empty) =
2031
+ find_first_non_full_group(common, hash);
2032
+ }
2033
+ return PrepareInsertLargeImpl(common, policy, hash, mask_empty, target_group);
1775
2034
  }
1776
2035
 
1777
2036
  namespace {
@@ -1808,35 +2067,44 @@ template size_t TryFindNewIndexWithoutProbing(size_t h1, size_t old_index,
1808
2067
  // We need to instantiate ALL possible template combinations because we define
1809
2068
  // the function in the cc file.
1810
2069
  template size_t GrowSooTableToNextCapacityAndPrepareInsert<0, false>(
1811
- CommonFields&, const PolicyFunctions&, size_t, ctrl_t);
2070
+ CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
2071
+ bool);
1812
2072
  template size_t GrowSooTableToNextCapacityAndPrepareInsert<
1813
- OptimalMemcpySizeForSooSlotTransfer(1), true>(CommonFields&,
1814
- const PolicyFunctions&,
1815
- size_t, ctrl_t);
2073
+ OptimalMemcpySizeForSooSlotTransfer(1), true>(
2074
+ CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
2075
+ bool);
1816
2076
 
1817
2077
  static_assert(VerifyOptimalMemcpySizeForSooSlotTransferRange(2, 3));
1818
2078
  template size_t GrowSooTableToNextCapacityAndPrepareInsert<
1819
- OptimalMemcpySizeForSooSlotTransfer(3), true>(CommonFields&,
1820
- const PolicyFunctions&,
1821
- size_t, ctrl_t);
2079
+ OptimalMemcpySizeForSooSlotTransfer(3), true>(
2080
+ CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
2081
+ bool);
1822
2082
 
1823
2083
  static_assert(VerifyOptimalMemcpySizeForSooSlotTransferRange(4, 8));
1824
2084
  template size_t GrowSooTableToNextCapacityAndPrepareInsert<
1825
- OptimalMemcpySizeForSooSlotTransfer(8), true>(CommonFields&,
1826
- const PolicyFunctions&,
1827
- size_t, ctrl_t);
2085
+ OptimalMemcpySizeForSooSlotTransfer(8), true>(
2086
+ CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
2087
+ bool);
1828
2088
 
1829
2089
  #if UINTPTR_MAX == UINT32_MAX
1830
2090
  static_assert(MaxSooSlotSize() == 8);
1831
2091
  #else
1832
2092
  static_assert(VerifyOptimalMemcpySizeForSooSlotTransferRange(9, 16));
1833
2093
  template size_t GrowSooTableToNextCapacityAndPrepareInsert<
1834
- OptimalMemcpySizeForSooSlotTransfer(16), true>(CommonFields&,
1835
- const PolicyFunctions&,
1836
- size_t, ctrl_t);
2094
+ OptimalMemcpySizeForSooSlotTransfer(16), true>(
2095
+ CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
2096
+ bool);
1837
2097
  static_assert(MaxSooSlotSize() == 16);
1838
2098
  #endif
1839
2099
 
2100
+ template void* AllocateBackingArray<BackingArrayAlignment(alignof(size_t)),
2101
+ std::allocator<char>>(void* alloc,
2102
+ size_t n);
2103
+ template void DeallocateBackingArray<BackingArrayAlignment(alignof(size_t)),
2104
+ std::allocator<char>>(
2105
+ void* alloc, size_t capacity, ctrl_t* ctrl, size_t slot_size,
2106
+ size_t slot_align, bool had_infoz);
2107
+
1840
2108
  } // namespace container_internal
1841
2109
  ABSL_NAMESPACE_END
1842
2110
  } // namespace absl