grpc 1.72.0 → 1.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1034) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +23 -6
  3. data/include/grpc/event_engine/event_engine.h +125 -8
  4. data/include/grpc/event_engine/internal/write_event.h +34 -0
  5. data/include/grpc/impl/channel_arg_names.h +17 -9
  6. data/include/grpc/impl/compression_types.h +3 -2
  7. data/include/grpc/impl/slice_type.h +1 -1
  8. data/include/grpc/support/json.h +3 -21
  9. data/include/grpc/support/port_platform.h +8 -5
  10. data/src/core/call/call_filters.h +28 -19
  11. data/src/core/call/call_spine.h +2 -0
  12. data/src/core/call/metadata.h +17 -0
  13. data/src/core/channelz/channel_trace.cc +50 -42
  14. data/src/core/channelz/channel_trace.h +35 -4
  15. data/src/core/channelz/channelz.cc +338 -125
  16. data/src/core/channelz/channelz.h +276 -34
  17. data/src/core/channelz/channelz_registry.cc +322 -117
  18. data/src/core/channelz/channelz_registry.h +179 -21
  19. data/src/core/channelz/ztrace_collector.h +315 -0
  20. data/src/core/client_channel/client_channel.cc +30 -29
  21. data/src/core/client_channel/client_channel_filter.cc +21 -20
  22. data/src/core/client_channel/client_channel_filter.h +0 -2
  23. data/src/core/client_channel/connector.h +0 -3
  24. data/src/core/client_channel/global_subchannel_pool.cc +68 -7
  25. data/src/core/client_channel/global_subchannel_pool.h +37 -4
  26. data/src/core/client_channel/subchannel.cc +7 -9
  27. data/src/core/client_channel/subchannel.h +2 -8
  28. data/src/core/client_channel/subchannel_pool_interface.cc +5 -6
  29. data/src/core/client_channel/subchannel_pool_interface.h +11 -1
  30. data/src/core/config/config_vars.cc +11 -1
  31. data/src/core/config/config_vars.h +8 -0
  32. data/src/core/config/core_configuration.cc +50 -11
  33. data/src/core/config/core_configuration.h +89 -7
  34. data/src/core/credentials/call/external/aws_request_signer.cc +3 -2
  35. data/src/core/credentials/call/external/url_external_account_credentials.cc +2 -2
  36. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +1 -1
  37. data/src/core/credentials/call/jwt/jwt_verifier.cc +4 -4
  38. data/src/core/credentials/call/oauth2/oauth2_credentials.cc +4 -2
  39. data/src/core/credentials/transport/alts/alts_security_connector.cc +9 -8
  40. data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -3
  41. data/src/core/credentials/transport/ssl/ssl_credentials.cc +2 -2
  42. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +41 -11
  43. data/src/core/credentials/transport/ssl/ssl_security_connector.h +2 -1
  44. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -0
  45. data/src/core/credentials/transport/tls/ssl_utils.h +5 -0
  46. data/src/core/credentials/transport/tls/tls_security_connector.cc +2 -1
  47. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +6 -3
  48. data/src/core/ext/filters/http/message_compress/compression_filter.h +34 -4
  49. data/src/core/ext/filters/http/server/http_server_filter.cc +1 -1
  50. data/src/core/ext/filters/http/server/http_server_filter.h +14 -3
  51. data/src/core/ext/transport/chttp2/chttp2_plugin.cc +40 -0
  52. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +11 -112
  53. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +3 -0
  54. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +33 -962
  55. data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -1
  56. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -47
  57. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  58. data/src/core/ext/transport/chttp2/transport/flow_control.h +18 -0
  59. data/src/core/ext/transport/chttp2/transport/frame.cc +213 -105
  60. data/src/core/ext/transport/chttp2/transport/frame.h +78 -6
  61. data/src/core/ext/transport/chttp2/transport/frame_data.cc +10 -0
  62. data/src/core/ext/transport/chttp2/transport/frame_data.h +2 -0
  63. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +15 -3
  64. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +5 -3
  65. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -0
  66. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +11 -4
  67. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -1
  68. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +19 -1
  69. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +7 -0
  71. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -0
  72. data/src/core/ext/transport/chttp2/transport/http2_settings.h +26 -0
  73. data/src/core/ext/transport/chttp2/transport/http2_status.h +358 -1
  74. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +252 -0
  75. data/src/core/ext/transport/chttp2/transport/internal.h +29 -5
  76. data/src/core/ext/transport/chttp2/transport/internal_channel_arg_names.h +24 -0
  77. data/src/core/ext/transport/chttp2/transport/parsing.cc +36 -21
  78. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +10 -9
  79. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +6 -0
  80. data/src/core/ext/transport/chttp2/transport/writing.cc +60 -49
  81. data/src/core/ext/transport/inproc/inproc_transport.cc +7 -2
  82. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +6 -2
  83. data/src/core/ext/upb-gen/envoy/admin/v3/certs.upb.h +4 -0
  84. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +12 -0
  85. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +12 -22
  86. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +12 -22
  87. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +28 -22
  88. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +12 -0
  89. data/src/core/ext/upb-gen/envoy/config/core/v3/base.upb.h +24 -67
  90. data/src/core/ext/upb-gen/envoy/config/core/v3/config_source.upb.h +4 -0
  91. data/src/core/ext/upb-gen/envoy/config/core/v3/event_service_config.upb.h +4 -0
  92. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +29 -31
  93. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +2 -2
  94. data/src/core/ext/upb-gen/envoy/config/core/v3/health_check.upb.h +12 -0
  95. data/src/core/ext/upb-gen/envoy/config/core/v3/http_uri.upb.h +4 -0
  96. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +8 -0
  97. data/src/core/ext/upb-gen/envoy/config/core/v3/socket_option.upb.h +4 -0
  98. data/src/core/ext/upb-gen/envoy/config/core/v3/substitution_format_string.upb.h +4 -0
  99. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint.upb.h +0 -23
  100. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +8 -0
  101. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +8 -0
  102. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener_components.upb.h +12 -0
  103. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +20 -0
  104. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +12 -0
  105. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +8 -22
  106. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +0 -23
  107. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +64 -66
  108. data/src/core/ext/upb-gen/envoy/config/route/v3/scoped_route.upb.h +4 -0
  109. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +12 -0
  110. data/src/core/ext/upb-gen/envoy/config/trace/v3/http_tracer.upb.h +4 -0
  111. data/src/core/ext/upb-gen/envoy/config/trace/v3/skywalking.upb.h +4 -0
  112. data/src/core/ext/upb-gen/envoy/data/accesslog/v3/accesslog.upb.h +4 -95
  113. data/src/core/ext/upb-gen/envoy/extensions/filters/common/fault/v3/fault.upb.h +8 -0
  114. data/src/core/ext/upb-gen/envoy/extensions/filters/http/fault/v3/fault.upb.h +4 -0
  115. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +4 -0
  116. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +28 -0
  117. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +4 -0
  118. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +4 -0
  119. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +4 -0
  120. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +12 -0
  121. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +8 -0
  122. data/src/core/ext/upb-gen/envoy/service/discovery/v3/discovery.upb.h +8 -36
  123. data/src/core/ext/upb-gen/envoy/service/status/v3/csds.upb.h +4 -0
  124. data/src/core/ext/upb-gen/envoy/type/http/v3/path_transformation.upb.h +4 -0
  125. data/src/core/ext/upb-gen/envoy/type/matcher/v3/filter_state.upb.h +4 -0
  126. data/src/core/ext/upb-gen/envoy/type/matcher/v3/metadata.upb.h +4 -0
  127. data/src/core/ext/upb-gen/envoy/type/matcher/v3/number.upb.h +4 -0
  128. data/src/core/ext/upb-gen/envoy/type/matcher/v3/path.upb.h +4 -0
  129. data/src/core/ext/upb-gen/envoy/type/matcher/v3/regex.upb.h +4 -0
  130. data/src/core/ext/upb-gen/envoy/type/matcher/v3/string.upb.h +4 -0
  131. data/src/core/ext/upb-gen/envoy/type/matcher/v3/struct.upb.h +4 -0
  132. data/src/core/ext/upb-gen/envoy/type/matcher/v3/value.upb.h +8 -0
  133. data/src/core/ext/upb-gen/envoy/type/metadata/v3/metadata.upb.h +8 -0
  134. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +4 -0
  135. data/src/core/ext/upb-gen/envoy/type/v3/hash_policy.upb.h +4 -0
  136. data/src/core/ext/upb-gen/envoy/type/v3/ratelimit_strategy.upb.h +4 -0
  137. data/src/core/ext/upb-gen/google/api/expr/v1alpha1/checked.upb.h +8 -44
  138. data/src/core/ext/upb-gen/google/api/expr/v1alpha1/syntax.upb.h +12 -40
  139. data/src/core/ext/upb-gen/google/api/http.upb.h +4 -0
  140. data/src/core/ext/upb-gen/google/protobuf/descriptor.upb.h +193 -20
  141. data/src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.c +59 -21
  142. data/src/core/ext/upb-gen/google/protobuf/descriptor.upb_minitable.h +4 -0
  143. data/src/core/ext/upb-gen/google/protobuf/struct.upb.h +4 -22
  144. data/src/core/ext/upb-gen/src/proto/grpc/gcp/altscontext.upb.h +0 -18
  145. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb.h +113 -53
  146. data/src/core/ext/upb-gen/src/proto/grpc/gcp/handshaker.upb_minitable.c +20 -14
  147. data/src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb.h +154 -0
  148. data/src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.c +40 -2
  149. data/src/core/ext/upb-gen/src/proto/grpc/gcp/transport_security_common.upb_minitable.h +4 -0
  150. data/src/core/ext/upb-gen/src/proto/grpc/lb/v1/load_balancer.upb.h +8 -0
  151. data/src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls.upb.h +0 -18
  152. data/src/core/ext/upb-gen/src/proto/grpc/lookup/v1/rls_config.upb.h +0 -36
  153. data/src/core/ext/upb-gen/validate/validate.upb.h +12 -0
  154. data/src/core/ext/upb-gen/xds/core/v3/collection_entry.upb.h +4 -0
  155. data/src/core/ext/upb-gen/xds/core/v3/context_params.upb.h +0 -18
  156. data/src/core/ext/upb-gen/xds/core/v3/resource_locator.upb.h +8 -0
  157. data/src/core/ext/upb-gen/xds/data/orca/v3/orca_load_report.upb.h +0 -54
  158. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +20 -22
  159. data/src/core/ext/upb-gen/xds/type/matcher/v3/regex.upb.h +4 -0
  160. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +4 -0
  161. data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +4 -0
  162. data/src/core/ext/upbdefs-gen/envoy/admin/v3/certs.upbdefs.c +123 -62
  163. data/src/core/ext/upbdefs-gen/envoy/admin/v3/certs.upbdefs.h +5 -1
  164. data/src/core/ext/upbdefs-gen/envoy/admin/v3/clusters.upbdefs.c +200 -101
  165. data/src/core/ext/upbdefs-gen/envoy/admin/v3/clusters.upbdefs.h +5 -1
  166. data/src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump.upbdefs.c +152 -77
  167. data/src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump.upbdefs.h +5 -1
  168. data/src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump_shared.upbdefs.c +524 -255
  169. data/src/core/ext/upbdefs-gen/envoy/admin/v3/config_dump_shared.upbdefs.h +5 -1
  170. data/src/core/ext/upbdefs-gen/envoy/admin/v3/init_dump.upbdefs.c +44 -23
  171. data/src/core/ext/upbdefs-gen/envoy/admin/v3/init_dump.upbdefs.h +5 -1
  172. data/src/core/ext/upbdefs-gen/envoy/admin/v3/listeners.upbdefs.c +66 -34
  173. data/src/core/ext/upbdefs-gen/envoy/admin/v3/listeners.upbdefs.h +5 -1
  174. data/src/core/ext/upbdefs-gen/envoy/admin/v3/memory.upbdefs.c +54 -28
  175. data/src/core/ext/upbdefs-gen/envoy/admin/v3/memory.upbdefs.h +5 -1
  176. data/src/core/ext/upbdefs-gen/envoy/admin/v3/metrics.upbdefs.c +46 -25
  177. data/src/core/ext/upbdefs-gen/envoy/admin/v3/metrics.upbdefs.h +5 -1
  178. data/src/core/ext/upbdefs-gen/envoy/admin/v3/mutex_stats.upbdefs.c +47 -25
  179. data/src/core/ext/upbdefs-gen/envoy/admin/v3/mutex_stats.upbdefs.h +5 -1
  180. data/src/core/ext/upbdefs-gen/envoy/admin/v3/server_info.upbdefs.c +256 -126
  181. data/src/core/ext/upbdefs-gen/envoy/admin/v3/server_info.upbdefs.h +5 -1
  182. data/src/core/ext/upbdefs-gen/envoy/admin/v3/tap.upbdefs.c +50 -28
  183. data/src/core/ext/upbdefs-gen/envoy/admin/v3/tap.upbdefs.h +5 -1
  184. data/src/core/ext/upbdefs-gen/envoy/annotations/deprecation.upbdefs.c +55 -28
  185. data/src/core/ext/upbdefs-gen/envoy/annotations/deprecation.upbdefs.h +5 -1
  186. data/src/core/ext/upbdefs-gen/envoy/annotations/resource.upbdefs.c +34 -18
  187. data/src/core/ext/upbdefs-gen/envoy/annotations/resource.upbdefs.h +5 -1
  188. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +414 -206
  189. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.h +5 -1
  190. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +831 -413
  191. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +5 -1
  192. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +143 -73
  193. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +5 -1
  194. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +1132 -557
  195. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.h +5 -1
  196. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/filter.upbdefs.c +63 -34
  197. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/filter.upbdefs.h +5 -1
  198. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/outlier_detection.upbdefs.c +255 -127
  199. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/outlier_detection.upbdefs.h +5 -1
  200. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +363 -178
  201. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.h +5 -1
  202. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +227 -114
  203. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.h +5 -1
  204. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/backoff.upbdefs.c +57 -31
  205. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/backoff.upbdefs.h +5 -1
  206. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +596 -295
  207. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.h +5 -1
  208. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/config_source.upbdefs.c +271 -137
  209. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/config_source.upbdefs.h +5 -1
  210. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/event_service_config.upbdefs.c +56 -30
  211. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/event_service_config.upbdefs.h +5 -1
  212. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/extension.upbdefs.c +45 -25
  213. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/extension.upbdefs.h +5 -1
  214. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_method_list.upbdefs.c +59 -31
  215. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_method_list.upbdefs.h +5 -1
  216. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +438 -217
  217. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.h +5 -1
  218. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/health_check.upbdefs.c +441 -221
  219. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/health_check.upbdefs.h +5 -1
  220. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/http_service.upbdefs.c +55 -30
  221. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/http_service.upbdefs.h +5 -1
  222. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/http_uri.upbdefs.c +57 -31
  223. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/http_uri.upbdefs.h +5 -1
  224. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +619 -303
  225. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.h +5 -1
  226. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c +70 -36
  227. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.h +5 -1
  228. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/resolver.upbdefs.c +62 -33
  229. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/resolver.upbdefs.h +5 -1
  230. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_cmsg_headers.upbdefs.c +47 -25
  231. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_cmsg_headers.upbdefs.h +5 -1
  232. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_option.upbdefs.c +97 -49
  233. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/socket_option.upbdefs.h +5 -1
  234. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +97 -51
  235. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.h +5 -1
  236. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/udp_socket_config.upbdefs.c +51 -27
  237. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/udp_socket_config.upbdefs.h +5 -1
  238. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint.upbdefs.c +147 -76
  239. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint.upbdefs.h +5 -1
  240. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +230 -116
  241. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +5 -1
  242. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.c +277 -138
  243. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/load_report.upbdefs.h +5 -1
  244. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/api_listener.upbdefs.c +48 -26
  245. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/api_listener.upbdefs.h +5 -1
  246. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +388 -197
  247. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.h +5 -1
  248. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener_components.upbdefs.c +304 -153
  249. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener_components.upbdefs.h +5 -1
  250. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +173 -90
  251. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.h +5 -1
  252. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/udp_listener_config.upbdefs.c +90 -47
  253. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/udp_listener_config.upbdefs.h +5 -1
  254. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c +98 -51
  255. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.h +5 -1
  256. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c +196 -99
  257. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.h +5 -1
  258. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +237 -118
  259. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.h +5 -1
  260. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +418 -210
  261. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.h +5 -1
  262. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +194 -99
  263. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.h +5 -1
  264. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +2003 -973
  265. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.h +5 -1
  266. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/scoped_route.upbdefs.c +101 -53
  267. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/scoped_route.upbdefs.h +5 -1
  268. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +352 -176
  269. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.h +5 -1
  270. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.c +79 -42
  271. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/datadog.upbdefs.h +5 -1
  272. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/dynamic_ot.upbdefs.c +67 -37
  273. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/dynamic_ot.upbdefs.h +5 -1
  274. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/http_tracer.upbdefs.c +63 -34
  275. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/http_tracer.upbdefs.h +5 -1
  276. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/lightstep.upbdefs.c +88 -47
  277. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/lightstep.upbdefs.h +5 -1
  278. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +80 -43
  279. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.h +5 -1
  280. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/service.upbdefs.c +53 -29
  281. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/service.upbdefs.h +5 -1
  282. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/skywalking.upbdefs.c +86 -46
  283. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/skywalking.upbdefs.h +5 -1
  284. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/trace.upbdefs.c +55 -32
  285. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/trace.upbdefs.h +5 -1
  286. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/xray.upbdefs.c +91 -49
  287. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/xray.upbdefs.h +5 -1
  288. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +105 -55
  289. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.h +5 -1
  290. data/src/core/ext/upbdefs-gen/envoy/data/accesslog/v3/accesslog.upbdefs.c +775 -379
  291. data/src/core/ext/upbdefs-gen/envoy/data/accesslog/v3/accesslog.upbdefs.h +5 -1
  292. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +52 -28
  293. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +5 -1
  294. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +134 -68
  295. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +5 -1
  296. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +189 -96
  297. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +5 -1
  298. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/gcp_authn/v3/gcp_authn.upbdefs.c +116 -61
  299. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/gcp_authn/v3/gcp_authn.upbdefs.h +5 -1
  300. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +112 -58
  301. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +5 -1
  302. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/router/v3/router.upbdefs.c +160 -82
  303. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/router/v3/router.upbdefs.h +5 -1
  304. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +75 -39
  305. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +5 -1
  306. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +1161 -570
  307. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -1
  308. data/src/core/ext/upbdefs-gen/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +52 -28
  309. data/src/core/ext/upbdefs-gen/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +5 -1
  310. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upbdefs.c +55 -29
  311. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/http_11_proxy/v3/upstream_http_11_connect.upbdefs.h +5 -1
  312. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -26
  313. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +5 -1
  314. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +390 -194
  315. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +5 -1
  316. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +126 -65
  317. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +5 -1
  318. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +498 -246
  319. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -1
  320. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +74 -38
  321. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +5 -1
  322. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +221 -110
  323. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +5 -1
  324. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/ads.upbdefs.c +68 -36
  325. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/ads.upbdefs.h +5 -1
  326. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/discovery.upbdefs.c +378 -187
  327. data/src/core/ext/upbdefs-gen/envoy/service/discovery/v3/discovery.upbdefs.h +5 -1
  328. data/src/core/ext/upbdefs-gen/envoy/service/load_stats/v3/lrs.upbdefs.c +100 -52
  329. data/src/core/ext/upbdefs-gen/envoy/service/load_stats/v3/lrs.upbdefs.h +5 -1
  330. data/src/core/ext/upbdefs-gen/envoy/service/status/v3/csds.upbdefs.c +257 -129
  331. data/src/core/ext/upbdefs-gen/envoy/service/status/v3/csds.upbdefs.h +5 -1
  332. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c +44 -24
  333. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.h +5 -1
  334. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/path_transformation.upbdefs.c +68 -35
  335. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/path_transformation.upbdefs.h +5 -1
  336. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/address.upbdefs.c +38 -20
  337. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/address.upbdefs.h +5 -1
  338. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/filter_state.upbdefs.c +59 -32
  339. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/filter_state.upbdefs.h +5 -1
  340. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/http_inputs.upbdefs.c +65 -34
  341. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/http_inputs.upbdefs.h +5 -1
  342. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/metadata.upbdefs.c +72 -38
  343. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/metadata.upbdefs.h +5 -1
  344. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/node.upbdefs.c +57 -31
  345. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/node.upbdefs.h +5 -1
  346. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/number.upbdefs.c +52 -29
  347. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/number.upbdefs.h +5 -1
  348. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/path.upbdefs.c +51 -28
  349. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/path.upbdefs.h +5 -1
  350. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/regex.upbdefs.c +89 -47
  351. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/regex.upbdefs.h +5 -1
  352. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/status_code_input.upbdefs.c +37 -20
  353. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/status_code_input.upbdefs.h +5 -1
  354. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/string.upbdefs.c +89 -47
  355. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/string.upbdefs.h +5 -1
  356. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/struct.upbdefs.c +67 -35
  357. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/struct.upbdefs.h +5 -1
  358. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/value.upbdefs.c +112 -58
  359. data/src/core/ext/upbdefs-gen/envoy/type/matcher/v3/value.upbdefs.h +5 -1
  360. data/src/core/ext/upbdefs-gen/envoy/type/metadata/v3/metadata.upbdefs.c +110 -56
  361. data/src/core/ext/upbdefs-gen/envoy/type/metadata/v3/metadata.upbdefs.h +5 -1
  362. data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c +123 -62
  363. data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.h +5 -1
  364. data/src/core/ext/upbdefs-gen/envoy/type/v3/hash_policy.upbdefs.c +59 -31
  365. data/src/core/ext/upbdefs-gen/envoy/type/v3/hash_policy.upbdefs.h +5 -1
  366. data/src/core/ext/upbdefs-gen/envoy/type/v3/http.upbdefs.c +30 -16
  367. data/src/core/ext/upbdefs-gen/envoy/type/v3/http.upbdefs.h +5 -1
  368. data/src/core/ext/upbdefs-gen/envoy/type/v3/http_status.upbdefs.c +143 -72
  369. data/src/core/ext/upbdefs-gen/envoy/type/v3/http_status.upbdefs.h +5 -1
  370. data/src/core/ext/upbdefs-gen/envoy/type/v3/percent.upbdefs.c +61 -32
  371. data/src/core/ext/upbdefs-gen/envoy/type/v3/percent.upbdefs.h +5 -1
  372. data/src/core/ext/upbdefs-gen/envoy/type/v3/range.upbdefs.c +51 -27
  373. data/src/core/ext/upbdefs-gen/envoy/type/v3/range.upbdefs.h +5 -1
  374. data/src/core/ext/upbdefs-gen/envoy/type/v3/ratelimit_strategy.upbdefs.c +85 -45
  375. data/src/core/ext/upbdefs-gen/envoy/type/v3/ratelimit_strategy.upbdefs.h +5 -1
  376. data/src/core/ext/upbdefs-gen/envoy/type/v3/ratelimit_unit.upbdefs.c +35 -19
  377. data/src/core/ext/upbdefs-gen/envoy/type/v3/ratelimit_unit.upbdefs.h +5 -1
  378. data/src/core/ext/upbdefs-gen/envoy/type/v3/semantic_version.upbdefs.c +44 -23
  379. data/src/core/ext/upbdefs-gen/envoy/type/v3/semantic_version.upbdefs.h +5 -1
  380. data/src/core/ext/upbdefs-gen/envoy/type/v3/token_bucket.upbdefs.c +61 -33
  381. data/src/core/ext/upbdefs-gen/envoy/type/v3/token_bucket.upbdefs.h +5 -1
  382. data/src/core/ext/upbdefs-gen/google/api/annotations.upbdefs.c +35 -19
  383. data/src/core/ext/upbdefs-gen/google/api/annotations.upbdefs.h +5 -1
  384. data/src/core/ext/upbdefs-gen/google/api/expr/v1alpha1/checked.upbdefs.c +272 -133
  385. data/src/core/ext/upbdefs-gen/google/api/expr/v1alpha1/checked.upbdefs.h +5 -1
  386. data/src/core/ext/upbdefs-gen/google/api/expr/v1alpha1/syntax.upbdefs.c +315 -154
  387. data/src/core/ext/upbdefs-gen/google/api/expr/v1alpha1/syntax.upbdefs.h +5 -1
  388. data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.c +64 -33
  389. data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.h +5 -1
  390. data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c +35 -19
  391. data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.h +5 -1
  392. data/src/core/ext/upbdefs-gen/google/protobuf/any.upbdefs.c +26 -15
  393. data/src/core/ext/upbdefs-gen/google/protobuf/any.upbdefs.h +5 -1
  394. data/src/core/ext/upbdefs-gen/google/protobuf/descriptor.upbdefs.c +1106 -508
  395. data/src/core/ext/upbdefs-gen/google/protobuf/descriptor.upbdefs.h +10 -1
  396. data/src/core/ext/upbdefs-gen/google/protobuf/duration.upbdefs.c +28 -16
  397. data/src/core/ext/upbdefs-gen/google/protobuf/duration.upbdefs.h +5 -1
  398. data/src/core/ext/upbdefs-gen/google/protobuf/empty.upbdefs.c +23 -13
  399. data/src/core/ext/upbdefs-gen/google/protobuf/empty.upbdefs.h +5 -1
  400. data/src/core/ext/upbdefs-gen/google/protobuf/struct.upbdefs.c +69 -35
  401. data/src/core/ext/upbdefs-gen/google/protobuf/struct.upbdefs.h +5 -1
  402. data/src/core/ext/upbdefs-gen/google/protobuf/timestamp.upbdefs.c +29 -16
  403. data/src/core/ext/upbdefs-gen/google/protobuf/timestamp.upbdefs.h +5 -1
  404. data/src/core/ext/upbdefs-gen/google/protobuf/wrappers.upbdefs.c +51 -26
  405. data/src/core/ext/upbdefs-gen/google/protobuf/wrappers.upbdefs.h +5 -1
  406. data/src/core/ext/upbdefs-gen/google/rpc/status.upbdefs.c +32 -17
  407. data/src/core/ext/upbdefs-gen/google/rpc/status.upbdefs.h +5 -1
  408. data/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +161 -79
  409. data/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +5 -1
  410. data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c +84 -42
  411. data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.h +5 -1
  412. data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c +48 -26
  413. data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.h +5 -1
  414. data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c +26 -14
  415. data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.h +5 -1
  416. data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c +50 -26
  417. data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.h +5 -1
  418. data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c +36 -19
  419. data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.h +5 -1
  420. data/src/core/ext/upbdefs-gen/validate/validate.upbdefs.c +538 -261
  421. data/src/core/ext/upbdefs-gen/validate/validate.upbdefs.h +5 -1
  422. data/src/core/ext/upbdefs-gen/xds/annotations/v3/migrate.upbdefs.c +86 -43
  423. data/src/core/ext/upbdefs-gen/xds/annotations/v3/migrate.upbdefs.h +5 -1
  424. data/src/core/ext/upbdefs-gen/xds/annotations/v3/security.upbdefs.c +49 -26
  425. data/src/core/ext/upbdefs-gen/xds/annotations/v3/security.upbdefs.h +5 -1
  426. data/src/core/ext/upbdefs-gen/xds/annotations/v3/sensitive.upbdefs.c +27 -15
  427. data/src/core/ext/upbdefs-gen/xds/annotations/v3/sensitive.upbdefs.h +5 -1
  428. data/src/core/ext/upbdefs-gen/xds/annotations/v3/status.upbdefs.c +87 -44
  429. data/src/core/ext/upbdefs-gen/xds/annotations/v3/status.upbdefs.h +5 -1
  430. data/src/core/ext/upbdefs-gen/xds/annotations/v3/versioning.upbdefs.c +37 -20
  431. data/src/core/ext/upbdefs-gen/xds/annotations/v3/versioning.upbdefs.h +5 -1
  432. data/src/core/ext/upbdefs-gen/xds/core/v3/authority.upbdefs.c +30 -17
  433. data/src/core/ext/upbdefs-gen/xds/core/v3/authority.upbdefs.h +5 -1
  434. data/src/core/ext/upbdefs-gen/xds/core/v3/cidr.upbdefs.c +41 -23
  435. data/src/core/ext/upbdefs-gen/xds/core/v3/cidr.upbdefs.h +5 -1
  436. data/src/core/ext/upbdefs-gen/xds/core/v3/collection_entry.upbdefs.c +62 -33
  437. data/src/core/ext/upbdefs-gen/xds/core/v3/collection_entry.upbdefs.h +5 -1
  438. data/src/core/ext/upbdefs-gen/xds/core/v3/context_params.upbdefs.c +36 -19
  439. data/src/core/ext/upbdefs-gen/xds/core/v3/context_params.upbdefs.h +5 -1
  440. data/src/core/ext/upbdefs-gen/xds/core/v3/extension.upbdefs.c +36 -20
  441. data/src/core/ext/upbdefs-gen/xds/core/v3/extension.upbdefs.h +5 -1
  442. data/src/core/ext/upbdefs-gen/xds/core/v3/resource.upbdefs.c +42 -23
  443. data/src/core/ext/upbdefs-gen/xds/core/v3/resource.upbdefs.h +5 -1
  444. data/src/core/ext/upbdefs-gen/xds/core/v3/resource_locator.upbdefs.c +76 -39
  445. data/src/core/ext/upbdefs-gen/xds/core/v3/resource_locator.upbdefs.h +5 -1
  446. data/src/core/ext/upbdefs-gen/xds/core/v3/resource_name.upbdefs.c +45 -24
  447. data/src/core/ext/upbdefs-gen/xds/core/v3/resource_name.upbdefs.h +5 -1
  448. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +41 -23
  449. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.h +5 -1
  450. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/domain.upbdefs.c +53 -29
  451. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/domain.upbdefs.h +5 -1
  452. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c +29 -16
  453. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.h +5 -1
  454. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/ip.upbdefs.c +58 -32
  455. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/ip.upbdefs.h +5 -1
  456. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c +207 -103
  457. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.h +5 -1
  458. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/range.upbdefs.c +95 -49
  459. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/range.upbdefs.h +5 -1
  460. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/regex.upbdefs.c +38 -20
  461. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/regex.upbdefs.h +5 -1
  462. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c +60 -31
  463. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.h +5 -1
  464. data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c +67 -36
  465. data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.h +5 -1
  466. data/src/core/ext/upbdefs-gen/xds/type/v3/range.upbdefs.c +31 -17
  467. data/src/core/ext/upbdefs-gen/xds/type/v3/range.upbdefs.h +5 -1
  468. data/src/core/ext/upbdefs-gen/xds/type/v3/typed_struct.upbdefs.c +31 -17
  469. data/src/core/ext/upbdefs-gen/xds/type/v3/typed_struct.upbdefs.h +5 -1
  470. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +7 -22
  471. data/src/core/handshaker/security/legacy_secure_endpoint.cc +596 -0
  472. data/src/core/handshaker/security/secure_endpoint.cc +769 -312
  473. data/src/core/handshaker/security/secure_endpoint.h +17 -0
  474. data/src/core/handshaker/security/security_handshaker.cc +3 -3
  475. data/src/core/lib/address_utils/sockaddr_utils.cc +5 -5
  476. data/src/core/lib/channel/channel_args.h +4 -0
  477. data/src/core/lib/channel/channel_stack.cc +29 -0
  478. data/src/core/lib/channel/channel_stack.h +9 -0
  479. data/src/core/lib/channel/promise_based_filter.h +707 -299
  480. data/src/core/lib/debug/trace_flags.cc +2 -2
  481. data/src/core/lib/debug/trace_flags.h +1 -1
  482. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +6 -2
  483. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +4 -4
  484. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +14 -6
  485. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  486. data/src/core/lib/event_engine/extensions/blocking_dns.h +46 -0
  487. data/src/core/lib/event_engine/extensions/channelz.h +62 -0
  488. data/src/core/lib/event_engine/extensions/tcp_trace.h +2 -2
  489. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +4 -7
  490. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +3 -0
  491. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +6 -7
  492. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +28 -22
  493. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +22 -0
  494. data/src/core/lib/event_engine/posix_engine/posix_engine.h +15 -15
  495. data/src/core/lib/event_engine/query_extensions.h +10 -21
  496. data/src/core/lib/event_engine/tcp_socket_utils.cc +10 -9
  497. data/src/core/lib/event_engine/utils.cc +34 -0
  498. data/src/core/lib/event_engine/utils.h +3 -0
  499. data/src/core/lib/event_engine/windows/windows_endpoint.cc +2 -2
  500. data/src/core/lib/event_engine/windows/windows_endpoint.h +9 -2
  501. data/src/core/lib/experiments/experiments.cc +198 -51
  502. data/src/core/lib/experiments/experiments.h +78 -35
  503. data/src/core/lib/iomgr/combiner.cc +3 -2
  504. data/src/core/lib/iomgr/ev_poll_posix.cc +4 -0
  505. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +11 -8
  506. data/src/core/lib/iomgr/fork_posix.cc +0 -7
  507. data/src/core/lib/iomgr/iomgr.cc +0 -3
  508. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +3 -0
  509. data/src/core/lib/iomgr/resolve_address_posix.cc +37 -47
  510. data/src/core/lib/iomgr/resolve_address_posix.h +15 -0
  511. data/src/core/lib/iomgr/resolve_address_windows.cc +22 -45
  512. data/src/core/lib/iomgr/resolve_address_windows.h +15 -2
  513. data/src/core/lib/iomgr/tcp_client_posix.cc +14 -6
  514. data/src/core/lib/iomgr/tcp_posix.cc +14 -12
  515. data/src/core/lib/iomgr/tcp_server_windows.cc +14 -2
  516. data/src/core/lib/promise/detail/promise_like.h +24 -0
  517. data/src/core/lib/promise/detail/seq_state.h +741 -0
  518. data/src/core/lib/promise/map.h +22 -5
  519. data/src/core/lib/promise/promise.h +2 -0
  520. data/src/core/lib/promise/seq.h +2 -0
  521. data/src/core/lib/promise/sleep.cc +6 -3
  522. data/src/core/lib/promise/try_seq.h +2 -0
  523. data/src/core/lib/resource_quota/memory_quota.cc +9 -0
  524. data/src/core/lib/resource_quota/memory_quota.h +1 -3
  525. data/src/core/lib/slice/slice_buffer.h +6 -0
  526. data/src/core/lib/surface/call.cc +4 -0
  527. data/src/core/lib/surface/channel_create.cc +61 -1
  528. data/src/core/lib/surface/init.cc +2 -2
  529. data/src/core/lib/surface/version.cc +2 -2
  530. data/src/core/lib/transport/status_conversion.cc +7 -34
  531. data/src/core/lib/transport/transport.cc +2 -2
  532. data/src/core/lib/transport/transport.h +3 -0
  533. data/src/core/load_balancing/backend_metric_parser.cc +12 -18
  534. data/src/core/load_balancing/grpclb/grpclb.cc +2 -2
  535. data/src/core/load_balancing/health_check_client.cc +2 -4
  536. data/src/core/load_balancing/oob_backend_metric.cc +2 -4
  537. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +4 -3
  538. data/src/core/load_balancing/pick_first/pick_first.cc +3 -3
  539. data/src/core/load_balancing/rls/rls.cc +6 -5
  540. data/src/core/load_balancing/round_robin/round_robin.cc +2 -3
  541. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +4 -4
  542. data/src/core/load_balancing/weighted_target/weighted_target.cc +3 -9
  543. data/src/core/load_balancing/xds/xds_override_host.cc +55 -34
  544. data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -0
  545. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +2 -1
  546. data/src/core/resolver/xds/xds_resolver.cc +2 -1
  547. data/src/core/server/add_port.cc +87 -0
  548. data/src/core/server/server.cc +48 -53
  549. data/src/core/server/server.h +3 -5
  550. data/src/core/telemetry/call_tracer.cc +2 -2
  551. data/src/core/telemetry/call_tracer.h +1 -1
  552. data/src/core/{ext/transport/chttp2/transport → telemetry}/context_list_entry.h +3 -3
  553. data/src/core/telemetry/default_tcp_tracer.cc +26 -0
  554. data/src/core/telemetry/default_tcp_tracer.h +44 -0
  555. data/src/core/telemetry/stats.h +0 -5
  556. data/src/core/telemetry/stats_data.cc +376 -334
  557. data/src/core/telemetry/stats_data.h +260 -166
  558. data/src/core/telemetry/tcp_tracer.cc +38 -0
  559. data/src/core/telemetry/tcp_tracer.h +14 -16
  560. data/src/core/transport/auth_context.cc +0 -1
  561. data/src/core/transport/auth_context.h +0 -1
  562. data/src/core/transport/endpoint_transport.h +90 -0
  563. data/src/core/transport/endpoint_transport_client_channel_factory.cc +61 -0
  564. data/src/core/transport/endpoint_transport_client_channel_factory.h +57 -0
  565. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +33 -1
  566. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +3 -1
  567. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +76 -22
  568. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +8 -2
  569. data/src/core/tsi/ssl_transport_security.cc +189 -71
  570. data/src/core/tsi/ssl_transport_security.h +6 -1
  571. data/src/core/tsi/transport_security.h +3 -0
  572. data/src/core/tsi/transport_security_grpc.h +7 -3
  573. data/src/core/tsi/transport_security_interface.h +30 -25
  574. data/src/core/util/backoff.cc +7 -14
  575. data/src/core/util/backoff.h +0 -1
  576. data/src/core/util/dual_ref_counted.h +48 -0
  577. data/src/core/util/function_signature.h +66 -0
  578. data/src/core/util/gcp_metadata_query.cc +3 -2
  579. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  580. data/src/core/util/json/json_object_loader.h +3 -3
  581. data/src/core/util/latent_see.cc +28 -2
  582. data/src/core/util/latent_see.h +11 -23
  583. data/src/core/util/linux/env.cc +3 -1
  584. data/src/core/util/ref_counted_ptr.h +26 -0
  585. data/src/core/util/shared_bit_gen.cc +21 -0
  586. data/src/core/util/shared_bit_gen.h +44 -0
  587. data/src/core/util/single_set_ptr.h +35 -4
  588. data/src/core/util/uri.cc +75 -17
  589. data/src/core/util/uri.h +13 -8
  590. data/src/core/xds/grpc/xds_common_types_parser.cc +1 -9
  591. data/src/core/xds/grpc/xds_http_filter_registry.cc +1 -3
  592. data/src/core/xds/grpc/xds_http_rbac_filter.cc +10 -17
  593. data/src/core/xds/grpc/xds_metadata_parser.cc +40 -64
  594. data/src/core/xds/grpc/xds_metadata_parser.h +0 -2
  595. data/src/core/xds/grpc/xds_route_config_parser.cc +55 -77
  596. data/src/core/xds/xds_client/xds_client.cc +1 -1
  597. data/src/ruby/ext/grpc/extconf.rb +1 -1
  598. data/src/ruby/lib/grpc/version.rb +1 -1
  599. data/src/ruby/spec/generic/client_stub_spec.rb +2 -6
  600. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  601. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +2 -2
  602. data/third_party/abseil-cpp/absl/algorithm/container.h +79 -48
  603. data/third_party/abseil-cpp/absl/base/attributes.h +66 -16
  604. data/third_party/abseil-cpp/absl/base/call_once.h +8 -5
  605. data/third_party/abseil-cpp/absl/base/config.h +4 -4
  606. data/third_party/abseil-cpp/absl/base/internal/nullability_impl.h +17 -56
  607. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +1 -1
  608. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -0
  609. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +5 -1
  610. data/third_party/abseil-cpp/absl/base/internal/tracing.cc +39 -0
  611. data/third_party/abseil-cpp/absl/base/internal/tracing.h +81 -0
  612. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +0 -10
  613. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -0
  614. data/third_party/abseil-cpp/absl/base/macros.h +35 -4
  615. data/third_party/abseil-cpp/absl/base/nullability.h +72 -16
  616. data/third_party/abseil-cpp/absl/base/optimization.h +8 -12
  617. data/third_party/abseil-cpp/absl/base/options.h +5 -2
  618. data/third_party/abseil-cpp/absl/base/policy_checks.h +2 -0
  619. data/third_party/abseil-cpp/absl/container/btree_map.h +889 -0
  620. data/third_party/abseil-cpp/absl/container/btree_set.h +824 -0
  621. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -1
  622. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +17 -3
  623. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +17 -3
  624. data/third_party/abseil-cpp/absl/container/inlined_vector.h +2 -1
  625. data/third_party/abseil-cpp/absl/container/internal/btree.h +3046 -0
  626. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +763 -0
  627. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +9 -0
  628. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +1 -0
  629. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +4 -2
  630. data/third_party/abseil-cpp/absl/container/internal/layout.h +1 -1
  631. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +142 -114
  632. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +397 -231
  633. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +56 -0
  634. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +21 -7
  635. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +4 -2
  636. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +1 -1
  637. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +17 -1
  638. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +7 -0
  639. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +9 -6
  640. data/third_party/abseil-cpp/absl/debugging/leak_check.cc +73 -0
  641. data/third_party/abseil-cpp/absl/debugging/leak_check.h +150 -0
  642. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +3 -2
  643. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +48 -9
  644. data/third_party/abseil-cpp/absl/flags/commandlineflag.cc +1 -0
  645. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +7 -0
  646. data/third_party/abseil-cpp/absl/flags/flag.h +14 -12
  647. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +12 -4
  648. data/third_party/abseil-cpp/absl/flags/internal/flag.h +16 -5
  649. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.cc +4 -0
  650. data/third_party/abseil-cpp/absl/flags/internal/private_handle_accessor.h +3 -0
  651. data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +13 -12
  652. data/third_party/abseil-cpp/absl/flags/usage_config.cc +9 -4
  653. data/third_party/abseil-cpp/absl/hash/hash.h +26 -2
  654. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +17 -17
  655. data/third_party/abseil-cpp/absl/hash/internal/hash.h +196 -91
  656. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +2 -4
  657. data/third_party/abseil-cpp/absl/log/absl_vlog_is_on.h +2 -0
  658. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +27 -22
  659. data/third_party/abseil-cpp/absl/log/internal/check_op.h +102 -80
  660. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +90 -38
  661. data/third_party/abseil-cpp/absl/log/internal/log_message.h +80 -48
  662. data/third_party/abseil-cpp/absl/log/internal/proto.cc +0 -3
  663. data/third_party/abseil-cpp/absl/log/internal/proto.h +25 -15
  664. data/third_party/abseil-cpp/absl/log/internal/structured_proto.cc +115 -0
  665. data/third_party/abseil-cpp/absl/log/internal/structured_proto.h +107 -0
  666. data/third_party/abseil-cpp/absl/log/internal/vlog_config.cc +8 -1
  667. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +5 -2
  668. data/third_party/abseil-cpp/absl/log/vlog_is_on.h +2 -0
  669. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -6
  670. data/third_party/abseil-cpp/absl/numeric/int128.h +15 -3
  671. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +6 -4
  672. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +6 -3
  673. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +3 -1
  674. data/third_party/abseil-cpp/absl/random/beta_distribution.h +3 -1
  675. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +2 -1
  676. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +10 -0
  677. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +4 -2
  678. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +1 -0
  679. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +2 -1
  680. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -1
  681. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +5 -2
  682. data/third_party/abseil-cpp/absl/random/internal/platform.h +12 -12
  683. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +56 -5
  684. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +2 -1
  685. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +2 -2
  686. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +0 -1
  687. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +1 -4
  688. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +4 -3
  689. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +2 -3
  690. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -2
  691. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -1
  692. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +2 -0
  693. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +5 -4
  694. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +8 -4
  695. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +1 -1
  696. data/third_party/abseil-cpp/absl/status/status.h +1 -1
  697. data/third_party/abseil-cpp/absl/strings/ascii.cc +41 -26
  698. data/third_party/abseil-cpp/absl/strings/ascii.h +48 -8
  699. data/third_party/abseil-cpp/absl/strings/charconv.cc +4 -7
  700. data/third_party/abseil-cpp/absl/strings/charset.h +3 -4
  701. data/third_party/abseil-cpp/absl/strings/cord.h +5 -19
  702. data/third_party/abseil-cpp/absl/strings/escaping.cc +56 -48
  703. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +1 -1
  704. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +48 -15
  705. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +3 -2
  706. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -0
  707. data/third_party/abseil-cpp/absl/strings/match.h +21 -11
  708. data/third_party/abseil-cpp/absl/strings/numbers.cc +2 -1
  709. data/third_party/abseil-cpp/absl/strings/str_cat.h +11 -0
  710. data/third_party/abseil-cpp/absl/strings/str_split.h +18 -1
  711. data/third_party/abseil-cpp/absl/strings/string_view.h +20 -19
  712. data/third_party/abseil-cpp/absl/strings/strip.h +11 -8
  713. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +16 -10
  714. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +6 -0
  715. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +5 -1
  716. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +38 -12
  717. data/third_party/abseil-cpp/absl/synchronization/notification.cc +10 -2
  718. data/third_party/abseil-cpp/absl/synchronization/notification.h +11 -1
  719. data/third_party/abseil-cpp/absl/time/duration.cc +6 -51
  720. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  721. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
  722. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +3 -3
  723. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +2 -2
  724. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +2 -2
  725. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +3 -3
  726. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +2 -2
  727. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +1 -1
  728. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +1 -1
  729. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +3 -2
  730. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +1 -1
  731. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +6 -4
  732. data/third_party/abseil-cpp/absl/time/time.h +84 -23
  733. data/third_party/abseil-cpp/absl/types/internal/span.h +3 -2
  734. data/third_party/abseil-cpp/absl/types/optional.h +4 -2
  735. data/third_party/abseil-cpp/absl/types/span.h +85 -43
  736. data/third_party/boringssl-with-bazel/src/crypto/aes/aes.cc +41 -0
  737. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.cc +16 -0
  738. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.cc +15 -0
  739. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +19 -3
  740. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.cc +79 -48
  741. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.cc +11 -19
  742. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.cc +3 -7
  743. data/third_party/boringssl-with-bazel/src/crypto/bcm_support.h +0 -35
  744. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.cc +0 -2
  745. data/third_party/boringssl-with-bazel/src/crypto/bio/internal.h +3 -5
  746. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.cc +0 -3
  747. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.cc +0 -2
  748. data/third_party/boringssl-with-bazel/src/crypto/bn/convert.cc +31 -47
  749. data/third_party/boringssl-with-bazel/src/crypto/bn/div.cc +100 -0
  750. data/third_party/boringssl-with-bazel/src/crypto/bn/exponentiation.cc +166 -0
  751. data/third_party/boringssl-with-bazel/src/crypto/bn/sqrt.cc +93 -0
  752. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.cc +14 -8
  753. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.cc +1 -1
  754. data/third_party/boringssl-with-bazel/src/crypto/bytestring/internal.h +3 -3
  755. data/third_party/boringssl-with-bazel/src/crypto/chacha/internal.h +4 -4
  756. data/third_party/boringssl-with-bazel/src/crypto/cipher/derive_key.cc +13 -15
  757. data/third_party/boringssl-with-bazel/src/crypto/cipher/e_aeseax.cc +289 -0
  758. data/third_party/boringssl-with-bazel/src/crypto/cipher/e_aesgcmsiv.cc +179 -102
  759. data/third_party/boringssl-with-bazel/src/crypto/cipher/internal.h +3 -3
  760. data/third_party/boringssl-with-bazel/src/crypto/cms/cms.cc +172 -0
  761. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.cc +28 -5
  762. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.h +11 -9
  763. data/third_party/boringssl-with-bazel/src/crypto/cpu_intel.cc +0 -6
  764. data/third_party/boringssl-with-bazel/src/crypto/crypto.cc +1 -1
  765. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +3 -3
  766. data/third_party/boringssl-with-bazel/src/crypto/des/internal.h +3 -3
  767. data/third_party/boringssl-with-bazel/src/crypto/dh/dh_asn1.cc +13 -14
  768. data/third_party/boringssl-with-bazel/src/crypto/dh/params.cc +27 -61
  769. data/third_party/boringssl-with-bazel/src/crypto/digest/digest_extra.cc +16 -8
  770. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.cc +112 -122
  771. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.cc +23 -35
  772. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +3 -3
  773. data/third_party/boringssl-with-bazel/src/crypto/ec/ec_asn1.cc +47 -63
  774. data/third_party/boringssl-with-bazel/src/crypto/ec/hash_to_curve.cc +60 -68
  775. data/third_party/boringssl-with-bazel/src/crypto/ec/internal.h +3 -3
  776. data/third_party/boringssl-with-bazel/src/crypto/ecdsa/ecdsa_asn1.cc +11 -17
  777. data/third_party/boringssl-with-bazel/src/crypto/err/err.cc +0 -2
  778. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.cc +10 -11
  779. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.cc +10 -11
  780. data/third_party/boringssl-with-bazel/src/crypto/evp/internal.h +3 -3
  781. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.cc +6 -6
  782. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.cc +6 -6
  783. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.cc +6 -6
  784. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.cc +6 -6
  785. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.cc +6 -6
  786. data/third_party/boringssl-with-bazel/src/crypto/evp/sign.cc +23 -42
  787. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.cc.inc +29 -18
  788. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/gcm.cc.inc +10 -10
  789. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +16 -45
  790. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.cc.inc +5 -4
  791. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.cc.inc +15 -6
  792. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.cc +3 -3
  793. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm_interface.h +101 -5
  794. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.cc.inc +96 -187
  795. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.cc.inc +24 -512
  796. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.cc.inc +58 -80
  797. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.cc.inc +29 -45
  798. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +27 -25
  799. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/jacobi.cc.inc +7 -16
  800. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.cc.inc +27 -48
  801. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.cc.inc +34 -34
  802. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.cc.inc +102 -154
  803. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.h +3 -3
  804. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.cc.inc +3 -8
  805. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.cc.inc +1 -78
  806. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.cc.inc +10 -17
  807. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h +3 -3
  808. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h +15 -8
  809. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.cc.inc +40 -53
  810. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.cc.inc +57 -76
  811. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.cc.inc +4 -10
  812. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h +3 -3
  813. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +3 -3
  814. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.cc.inc +37 -52
  815. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.cc.inc +13 -20
  816. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +3 -3
  817. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.cc.inc +28 -39
  818. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.h +3 -3
  819. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.cc.inc +6 -11
  820. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/keccak/internal.h +3 -3
  821. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/mldsa/fips_known_values.inc +1345 -0
  822. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/mldsa/mldsa.cc.inc +335 -28
  823. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/mlkem/fips_known_values.inc +411 -0
  824. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/mlkem/mlkem.cc.inc +265 -33
  825. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +3 -3
  826. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.cc.inc +1 -1
  827. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +3 -3
  828. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.cc.inc +19 -26
  829. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.cc.inc +7 -7
  830. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.cc.inc +121 -138
  831. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.cc.inc +96 -83
  832. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/internal.h +3 -3
  833. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +8 -20
  834. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/slhdsa/fips_known_values.inc +674 -0
  835. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/slhdsa/slhdsa.cc.inc +235 -60
  836. data/third_party/boringssl-with-bazel/src/crypto/fuzzer_mode.cc +30 -0
  837. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +3 -3
  838. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -30
  839. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +3 -3
  840. data/third_party/boringssl-with-bazel/src/crypto/md5/internal.h +3 -3
  841. data/third_party/boringssl-with-bazel/src/crypto/mem.cc +0 -2
  842. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.cc +2 -8
  843. data/third_party/boringssl-with-bazel/src/crypto/pem/internal.h +3 -3
  844. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.cc +8 -13
  845. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +22 -8
  846. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.cc +19 -17
  847. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.cc +134 -136
  848. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +14 -8
  849. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.cc +25 -21
  850. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.cc +36 -52
  851. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.cc +97 -79
  852. data/third_party/boringssl-with-bazel/src/crypto/poly1305/internal.h +3 -3
  853. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +3 -3
  854. data/third_party/boringssl-with-bazel/src/crypto/rand/deterministic.cc +1 -1
  855. data/third_party/boringssl-with-bazel/src/crypto/rand/fork_detect.cc +2 -2
  856. data/third_party/boringssl-with-bazel/src/crypto/rand/getentropy.cc +1 -1
  857. data/third_party/boringssl-with-bazel/src/crypto/rand/{sysrand_internal.h → internal.h} +22 -4
  858. data/third_party/boringssl-with-bazel/src/crypto/rand/ios.cc +1 -1
  859. data/third_party/boringssl-with-bazel/src/crypto/rand/trusty.cc +1 -1
  860. data/third_party/boringssl-with-bazel/src/crypto/rand/urandom.cc +1 -1
  861. data/third_party/boringssl-with-bazel/src/crypto/rand/windows.cc +1 -5
  862. data/third_party/boringssl-with-bazel/src/crypto/rsa/internal.h +3 -3
  863. data/third_party/boringssl-with-bazel/src/crypto/rsa/rsa_crypt.cc +14 -22
  864. data/third_party/boringssl-with-bazel/src/crypto/spake2plus/internal.h +3 -3
  865. data/third_party/boringssl-with-bazel/src/crypto/thread_win.cc +0 -2
  866. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +3 -3
  867. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.cc +3 -5
  868. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.cc +8 -12
  869. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +15 -3
  870. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.cc +16 -24
  871. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_info.cc +18 -21
  872. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.cc +10 -3
  873. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.cc +9 -0
  874. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.cc +10 -1
  875. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.cc +64 -85
  876. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.cc +16 -32
  877. data/third_party/boringssl-with-bazel/src/gen/crypto/err_data.cc +576 -567
  878. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +16 -8
  879. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +1 -1
  880. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -54
  881. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +1 -1
  882. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +8 -4
  883. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +1 -1
  884. data/third_party/boringssl-with-bazel/src/include/openssl/bcm_public.h +1 -1
  885. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +1 -1
  886. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -1
  887. data/third_party/boringssl-with-bazel/src/include/openssl/blowfish.h +1 -1
  888. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +1 -1
  889. data/third_party/boringssl-with-bazel/src/include/openssl/buf.h +1 -1
  890. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +7 -1
  891. data/third_party/boringssl-with-bazel/src/include/openssl/cast.h +1 -1
  892. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  893. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +1 -1
  894. data/third_party/boringssl-with-bazel/src/include/openssl/cmac.h +1 -1
  895. data/third_party/boringssl-with-bazel/src/include/openssl/cms.h +146 -0
  896. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +1 -1
  897. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +23 -3
  898. data/third_party/boringssl-with-bazel/src/include/openssl/ctrdrbg.h +1 -1
  899. data/third_party/boringssl-with-bazel/src/include/openssl/curve25519.h +1 -1
  900. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +1 -1
  901. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +1 -1
  902. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +19 -7
  903. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +1 -1
  904. data/third_party/boringssl-with-bazel/src/include/openssl/e_os2.h +1 -1
  905. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +1 -1
  906. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +1 -1
  907. data/third_party/boringssl-with-bazel/src/include/openssl/ecdh.h +1 -1
  908. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +1 -1
  909. data/third_party/boringssl-with-bazel/src/include/openssl/engine.h +1 -1
  910. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -1
  911. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -1
  912. data/third_party/boringssl-with-bazel/src/include/openssl/ex_data.h +1 -1
  913. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/kyber.h +1 -1
  914. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +1 -1
  915. data/third_party/boringssl-with-bazel/src/include/openssl/hmac.h +1 -1
  916. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +4 -4
  917. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +1 -1
  918. data/third_party/boringssl-with-bazel/src/include/openssl/kdf.h +1 -1
  919. data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +1 -1
  920. data/third_party/boringssl-with-bazel/src/include/openssl/md4.h +1 -1
  921. data/third_party/boringssl-with-bazel/src/include/openssl/md5.h +1 -1
  922. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +1 -1
  923. data/third_party/boringssl-with-bazel/src/include/openssl/mldsa.h +1 -1
  924. data/third_party/boringssl-with-bazel/src/include/openssl/mlkem.h +1 -1
  925. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +1 -1
  926. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +1 -1
  927. data/third_party/boringssl-with-bazel/src/include/openssl/obj_mac.h +1 -1
  928. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +10 -4
  929. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +1 -1
  930. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +19 -6
  931. data/third_party/boringssl-with-bazel/src/include/openssl/poly1305.h +1 -1
  932. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +1 -1
  933. data/third_party/boringssl-with-bazel/src/include/openssl/posix_time.h +1 -1
  934. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  935. data/third_party/boringssl-with-bazel/src/include/openssl/rc4.h +1 -1
  936. data/third_party/boringssl-with-bazel/src/include/openssl/ripemd.h +1 -1
  937. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +2 -2
  938. data/third_party/boringssl-with-bazel/src/include/openssl/service_indicator.h +1 -1
  939. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +1 -1
  940. data/third_party/boringssl-with-bazel/src/include/openssl/siphash.h +1 -1
  941. data/third_party/boringssl-with-bazel/src/include/openssl/slhdsa.h +1 -1
  942. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +1 -1
  943. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +291 -40
  944. data/third_party/boringssl-with-bazel/src/include/openssl/stack.h +1 -1
  945. data/third_party/boringssl-with-bazel/src/include/openssl/target.h +0 -5
  946. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +1 -1
  947. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +9 -1
  948. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +1 -1
  949. data/third_party/boringssl-with-bazel/src/include/openssl/type_check.h +1 -1
  950. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +7 -4
  951. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +2 -0
  952. data/third_party/boringssl-with-bazel/src/ssl/dtls_record.cc +32 -26
  953. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +49 -49
  954. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +253 -50
  955. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +12 -12
  956. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +7 -5
  957. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +2 -1
  958. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +24 -32
  959. data/third_party/boringssl-with-bazel/src/ssl/internal.h +93 -4
  960. data/third_party/boringssl-with-bazel/src/ssl/ssl_aead_ctx.cc +6 -12
  961. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +18 -4
  962. data/third_party/boringssl-with-bazel/src/ssl/ssl_credential.cc +83 -7
  963. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +1 -1
  964. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +173 -19
  965. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +5 -18
  966. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +28 -15
  967. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +1 -1
  968. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +31 -7
  969. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +13 -1
  970. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +7 -11
  971. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +13 -11
  972. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +2 -5
  973. data/third_party/upb/upb/hash/common.c +310 -189
  974. data/third_party/upb/upb/hash/common.h +44 -43
  975. data/third_party/upb/upb/hash/int_table.h +29 -5
  976. data/third_party/upb/upb/hash/str_table.h +6 -0
  977. data/third_party/upb/upb/mem/arena.c +180 -57
  978. data/third_party/upb/upb/mem/arena.h +10 -0
  979. data/third_party/upb/upb/mem/internal/arena.h +62 -24
  980. data/third_party/upb/upb/message/accessors.c +1 -5
  981. data/third_party/upb/upb/message/array.c +7 -6
  982. data/third_party/upb/upb/message/array.h +4 -4
  983. data/third_party/upb/upb/message/internal/accessors.h +3 -3
  984. data/third_party/upb/upb/message/internal/extension.c +0 -12
  985. data/third_party/upb/upb/message/internal/extension.h +0 -4
  986. data/third_party/upb/upb/message/internal/iterator.h +3 -3
  987. data/third_party/upb/upb/message/internal/map.h +75 -20
  988. data/third_party/upb/upb/message/internal/map_sorter.h +10 -2
  989. data/third_party/upb/upb/message/internal/message.h +53 -5
  990. data/third_party/upb/upb/message/map.c +68 -20
  991. data/third_party/upb/upb/message/map.h +8 -1
  992. data/third_party/upb/upb/message/map_gencode_util.h +3 -45
  993. data/third_party/upb/upb/message/map_sorter.c +32 -8
  994. data/third_party/upb/upb/message/merge.h +3 -3
  995. data/third_party/upb/upb/message/message.c +120 -14
  996. data/third_party/upb/upb/message/message.h +17 -8
  997. data/third_party/upb/upb/mini_descriptor/build_enum.c +15 -5
  998. data/third_party/upb/upb/mini_descriptor/decode.c +18 -2
  999. data/third_party/upb/upb/mini_descriptor/link.c +4 -0
  1000. data/third_party/upb/upb/mini_table/extension.h +8 -1
  1001. data/third_party/upb/upb/mini_table/extension_registry.c +1 -1
  1002. data/third_party/upb/upb/mini_table/internal/enum.h +1 -1
  1003. data/third_party/upb/upb/mini_table/internal/extension.h +24 -1
  1004. data/third_party/upb/upb/mini_table/internal/field.h +4 -4
  1005. data/third_party/upb/upb/mini_table/internal/message.h +1 -1
  1006. data/third_party/upb/upb/port/def.inc +32 -16
  1007. data/third_party/upb/upb/port/undef.inc +1 -0
  1008. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  1009. data/third_party/upb/upb/reflection/descriptor_bootstrap.h +3 -3
  1010. data/third_party/upb/upb/reflection/enum_def.c +4 -4
  1011. data/third_party/upb/upb/reflection/enum_reserved_range.c +1 -1
  1012. data/third_party/upb/upb/reflection/enum_value_def.c +9 -8
  1013. data/third_party/upb/upb/reflection/extension_range.c +1 -2
  1014. data/third_party/upb/upb/reflection/field_def.c +3 -5
  1015. data/third_party/upb/upb/reflection/field_def.h +1 -1
  1016. data/third_party/upb/upb/reflection/file_def.c +4 -5
  1017. data/third_party/upb/upb/reflection/internal/def_builder.h +35 -10
  1018. data/third_party/upb/upb/reflection/internal/enum_value_def.h +1 -1
  1019. data/third_party/upb/upb/reflection/internal/upb_edition_defaults.h +1 -1
  1020. data/third_party/upb/upb/reflection/message_def.c +4 -7
  1021. data/third_party/upb/upb/reflection/message_reserved_range.c +1 -1
  1022. data/third_party/upb/upb/reflection/method_def.c +1 -1
  1023. data/third_party/upb/upb/reflection/oneof_def.c +3 -3
  1024. data/third_party/upb/upb/reflection/service_def.c +2 -5
  1025. data/third_party/upb/upb/text/encode.c +16 -0
  1026. data/third_party/upb/upb/text/internal/encode.h +2 -1
  1027. data/third_party/upb/upb/wire/decode.c +104 -72
  1028. data/third_party/upb/upb/wire/encode.c +37 -13
  1029. data/third_party/upb/upb/wire/internal/decode_fast.c +2 -2
  1030. data/third_party/upb/upb/wire/internal/decode_fast.h +4 -0
  1031. metadata +43 -7
  1032. data/src/core/lib/iomgr/executor.cc +0 -441
  1033. data/src/core/lib/iomgr/executor.h +0 -119
  1034. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/polyval.cc.inc +0 -89
@@ -41,12 +41,6 @@
41
41
  // When heterogeneous lookup is disabled, only the explicit `key_type` overloads
42
42
  // exist.
43
43
  //
44
- // find() also supports passing the hash explicitly:
45
- //
46
- // iterator find(const key_type& key, size_t hash);
47
- // template <class U>
48
- // iterator find(const U& key, size_t hash);
49
- //
50
44
  // In addition the pointer to element and iterator stability guarantees are
51
45
  // weaker: all iterators and pointers are invalidated after a new element is
52
46
  // inserted.
@@ -190,6 +184,7 @@
190
184
  #include <cstddef>
191
185
  #include <cstdint>
192
186
  #include <cstring>
187
+ #include <functional>
193
188
  #include <initializer_list>
194
189
  #include <iterator>
195
190
  #include <limits>
@@ -208,11 +203,14 @@
208
203
  #include "absl/base/port.h"
209
204
  #include "absl/base/prefetch.h"
210
205
  #include "absl/container/internal/common.h" // IWYU pragma: export // for node_handle
206
+ #include "absl/container/internal/common_policy_traits.h"
211
207
  #include "absl/container/internal/compressed_tuple.h"
212
208
  #include "absl/container/internal/container_memory.h"
209
+ #include "absl/container/internal/hash_function_defaults.h"
213
210
  #include "absl/container/internal/hash_policy_traits.h"
214
211
  #include "absl/container/internal/hashtable_debug_hooks.h"
215
212
  #include "absl/container/internal/hashtablez_sampler.h"
213
+ #include "absl/hash/hash.h"
216
214
  #include "absl/memory/memory.h"
217
215
  #include "absl/meta/type_traits.h"
218
216
  #include "absl/numeric/bits.h"
@@ -252,6 +250,15 @@ namespace container_internal {
252
250
  #define ABSL_SWISSTABLE_ENABLE_GENERATIONS
253
251
  #endif
254
252
 
253
+ #ifdef ABSL_SWISSTABLE_ASSERT
254
+ #error ABSL_SWISSTABLE_ASSERT cannot be directly set
255
+ #else
256
+ // We use this macro for assertions that users may see when the table is in an
257
+ // invalid state that sanitizers may help diagnose.
258
+ #define ABSL_SWISSTABLE_ASSERT(CONDITION) \
259
+ assert((CONDITION) && "Try enabling sanitizers.")
260
+ #endif
261
+
255
262
  // We use uint8_t so we don't need to worry about padding.
256
263
  using GenerationType = uint8_t;
257
264
 
@@ -322,7 +329,7 @@ class probe_seq {
322
329
  // sequence and `mask` (usually the capacity of the table) as the mask to
323
330
  // apply to each value in the progression.
324
331
  probe_seq(size_t hash, size_t mask) {
325
- assert(((mask + 1) & mask) == 0 && "not a mask");
332
+ ABSL_SWISSTABLE_ASSERT(((mask + 1) & mask) == 0 && "not a mask");
326
333
  mask_ = mask;
327
334
  offset_ = hash & mask_;
328
335
  }
@@ -452,7 +459,7 @@ class BitMask : public NonIterableBitMask<T, SignificantBits, Shift> {
452
459
  public:
453
460
  explicit BitMask(T mask) : Base(mask) {
454
461
  if (Shift == 3 && !NullifyBitsOnIteration) {
455
- assert(this->mask_ == (this->mask_ & kMsbs8Bytes));
462
+ ABSL_SWISSTABLE_ASSERT(this->mask_ == (this->mask_ & kMsbs8Bytes));
456
463
  }
457
464
  }
458
465
  // BitMask is an iterator over the indices of its abstract bits.
@@ -536,6 +543,18 @@ static_assert(ctrl_t::kDeleted == static_cast<ctrl_t>(-2),
536
543
  // See definition comment for why this is size 32.
537
544
  ABSL_DLL extern const ctrl_t kEmptyGroup[32];
538
545
 
546
+ // We use these sentinel capacity values in debug mode to indicate different
547
+ // classes of bugs.
548
+ enum InvalidCapacity : size_t {
549
+ kAboveMaxValidCapacity = ~size_t{} - 100,
550
+ kReentrance,
551
+ kDestroyed,
552
+
553
+ // These two must be last because we use `>= kMovedFrom` to mean moved-from.
554
+ kMovedFrom,
555
+ kSelfMovedFrom,
556
+ };
557
+
539
558
  // Returns a pointer to a control byte group that can be used by empty tables.
540
559
  inline ctrl_t* EmptyGroup() {
541
560
  // Const must be cast away here; no uses of this function will actually write
@@ -687,10 +706,8 @@ struct GroupSse2Impl {
687
706
  // Returns a bitmask representing the positions of slots that match hash.
688
707
  BitMask<uint16_t, kWidth> Match(h2_t hash) const {
689
708
  auto match = _mm_set1_epi8(static_cast<char>(hash));
690
- BitMask<uint16_t, kWidth> result = BitMask<uint16_t, kWidth>(0);
691
- result = BitMask<uint16_t, kWidth>(
709
+ return BitMask<uint16_t, kWidth>(
692
710
  static_cast<uint16_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl))));
693
- return result;
694
711
  }
695
712
 
696
713
  // Returns a bitmask representing the positions of empty slots.
@@ -1105,19 +1122,20 @@ class GrowthInfo {
1105
1122
 
1106
1123
  // Overwrites single empty slot with a full slot.
1107
1124
  void OverwriteEmptyAsFull() {
1108
- assert(GetGrowthLeft() > 0);
1125
+ ABSL_SWISSTABLE_ASSERT(GetGrowthLeft() > 0);
1109
1126
  --growth_left_info_;
1110
1127
  }
1111
1128
 
1112
1129
  // Overwrites several empty slots with full slots.
1113
1130
  void OverwriteManyEmptyAsFull(size_t cnt) {
1114
- assert(GetGrowthLeft() >= cnt);
1131
+ ABSL_SWISSTABLE_ASSERT(GetGrowthLeft() >= cnt);
1115
1132
  growth_left_info_ -= cnt;
1116
1133
  }
1117
1134
 
1118
1135
  // Overwrites specified control element with full slot.
1119
1136
  void OverwriteControlAsFull(ctrl_t ctrl) {
1120
- assert(GetGrowthLeft() >= static_cast<size_t>(IsEmpty(ctrl)));
1137
+ ABSL_SWISSTABLE_ASSERT(GetGrowthLeft() >=
1138
+ static_cast<size_t>(IsEmpty(ctrl)));
1121
1139
  growth_left_info_ -= static_cast<size_t>(IsEmpty(ctrl));
1122
1140
  }
1123
1141
 
@@ -1187,7 +1205,7 @@ class RawHashSetLayout {
1187
1205
  slot_offset_(
1188
1206
  (generation_offset_ + NumGenerationBytes() + slot_align - 1) &
1189
1207
  (~slot_align + 1)) {
1190
- assert(IsValidCapacity(capacity));
1208
+ ABSL_SWISSTABLE_ASSERT(IsValidCapacity(capacity));
1191
1209
  }
1192
1210
 
1193
1211
  // Returns the capacity of a table.
@@ -1208,6 +1226,9 @@ class RawHashSetLayout {
1208
1226
  // Given the capacity of a table, computes the total size of the backing
1209
1227
  // array.
1210
1228
  size_t alloc_size(size_t slot_size) const {
1229
+ ABSL_SWISSTABLE_ASSERT(
1230
+ slot_size <=
1231
+ ((std::numeric_limits<size_t>::max)() - slot_offset_) / capacity_);
1211
1232
  return slot_offset_ + capacity_ * slot_size;
1212
1233
  }
1213
1234
 
@@ -1232,6 +1253,10 @@ constexpr size_t SooCapacity() { return 1; }
1232
1253
  struct soo_tag_t {};
1233
1254
  // Sentinel type to indicate SOO CommonFields construction with full size.
1234
1255
  struct full_soo_tag_t {};
1256
+ // Sentinel type to indicate non-SOO CommonFields construction.
1257
+ struct non_soo_tag_t {};
1258
+ // Sentinel value to indicate an uninitialized CommonFields for use in swapping.
1259
+ struct uninitialized_tag_t {};
1235
1260
 
1236
1261
  // Suppress erroneous uninitialized memory errors on GCC. For example, GCC
1237
1262
  // thinks that the call to slot_array() in find_or_prepare_insert() is reading
@@ -1313,10 +1338,13 @@ union HeapOrSoo {
1313
1338
  // of this state to helper functions as a single argument.
1314
1339
  class CommonFields : public CommonFieldsGenerationInfo {
1315
1340
  public:
1316
- CommonFields() : capacity_(0), size_(0), heap_or_soo_(EmptyGroup()) {}
1317
1341
  explicit CommonFields(soo_tag_t) : capacity_(SooCapacity()), size_(0) {}
1318
1342
  explicit CommonFields(full_soo_tag_t)
1319
1343
  : capacity_(SooCapacity()), size_(size_t{1} << HasInfozShift()) {}
1344
+ explicit CommonFields(non_soo_tag_t)
1345
+ : capacity_(0), size_(0), heap_or_soo_(EmptyGroup()) {}
1346
+ // For use in swapping.
1347
+ explicit CommonFields(uninitialized_tag_t) {}
1320
1348
 
1321
1349
  // Not copyable
1322
1350
  CommonFields(const CommonFields&) = delete;
@@ -1328,7 +1356,8 @@ class CommonFields : public CommonFieldsGenerationInfo {
1328
1356
 
1329
1357
  template <bool kSooEnabled>
1330
1358
  static CommonFields CreateDefault() {
1331
- return kSooEnabled ? CommonFields{soo_tag_t{}} : CommonFields{};
1359
+ return kSooEnabled ? CommonFields{soo_tag_t{}}
1360
+ : CommonFields{non_soo_tag_t{}};
1332
1361
  }
1333
1362
 
1334
1363
  // The inline data for SOO is written on top of control_/slots_.
@@ -1342,7 +1371,8 @@ class CommonFields : public CommonFieldsGenerationInfo {
1342
1371
  void set_control(ctrl_t* c) { heap_or_soo_.control() = c; }
1343
1372
  void* backing_array_start() const {
1344
1373
  // growth_info (and maybe infoz) is stored before control bytes.
1345
- assert(reinterpret_cast<uintptr_t>(control()) % alignof(size_t) == 0);
1374
+ ABSL_SWISSTABLE_ASSERT(
1375
+ reinterpret_cast<uintptr_t>(control()) % alignof(size_t) == 0);
1346
1376
  return control() - ControlOffset(has_infoz());
1347
1377
  }
1348
1378
 
@@ -1365,18 +1395,20 @@ class CommonFields : public CommonFieldsGenerationInfo {
1365
1395
  size_ = size_t{1} << HasInfozShift();
1366
1396
  }
1367
1397
  void increment_size() {
1368
- assert(size() < capacity());
1398
+ ABSL_SWISSTABLE_ASSERT(size() < capacity());
1369
1399
  size_ += size_t{1} << HasInfozShift();
1370
1400
  }
1371
1401
  void decrement_size() {
1372
- assert(size() > 0);
1402
+ ABSL_SWISSTABLE_ASSERT(size() > 0);
1373
1403
  size_ -= size_t{1} << HasInfozShift();
1374
1404
  }
1375
1405
 
1376
1406
  // The total number of available slots.
1377
1407
  size_t capacity() const { return capacity_; }
1378
1408
  void set_capacity(size_t c) {
1379
- assert(c == 0 || IsValidCapacity(c));
1409
+ // We allow setting above the max valid capacity for debugging purposes.
1410
+ ABSL_SWISSTABLE_ASSERT(c == 0 || IsValidCapacity(c) ||
1411
+ c > kAboveMaxValidCapacity);
1380
1412
  capacity_ = c;
1381
1413
  }
1382
1414
 
@@ -1388,7 +1420,8 @@ class CommonFields : public CommonFieldsGenerationInfo {
1388
1420
 
1389
1421
  GrowthInfo& growth_info() {
1390
1422
  auto* gl_ptr = reinterpret_cast<GrowthInfo*>(control()) - 1;
1391
- assert(reinterpret_cast<uintptr_t>(gl_ptr) % alignof(GrowthInfo) == 0);
1423
+ ABSL_SWISSTABLE_ASSERT(
1424
+ reinterpret_cast<uintptr_t>(gl_ptr) % alignof(GrowthInfo) == 0);
1392
1425
  return *gl_ptr;
1393
1426
  }
1394
1427
  GrowthInfo growth_info() const {
@@ -1408,7 +1441,7 @@ class CommonFields : public CommonFieldsGenerationInfo {
1408
1441
  : HashtablezInfoHandle();
1409
1442
  }
1410
1443
  void set_infoz(HashtablezInfoHandle infoz) {
1411
- assert(has_infoz());
1444
+ ABSL_SWISSTABLE_ASSERT(has_infoz());
1412
1445
  *reinterpret_cast<HashtablezInfoHandle*>(backing_array_start()) = infoz;
1413
1446
  }
1414
1447
 
@@ -1444,6 +1477,20 @@ class CommonFields : public CommonFieldsGenerationInfo {
1444
1477
  std::count(control(), control() + capacity(), ctrl_t::kDeleted));
1445
1478
  }
1446
1479
 
1480
+ // Helper to enable sanitizer mode validation to protect against reentrant
1481
+ // calls during element constructor/destructor.
1482
+ template <typename F>
1483
+ void RunWithReentrancyGuard(F f) {
1484
+ #ifdef NDEBUG
1485
+ f();
1486
+ return;
1487
+ #endif
1488
+ const size_t cap = capacity();
1489
+ set_capacity(InvalidCapacity::kReentrance);
1490
+ f();
1491
+ set_capacity(cap);
1492
+ }
1493
+
1447
1494
  private:
1448
1495
  // We store the has_infoz bit in the lowest bit of size_.
1449
1496
  static constexpr size_t HasInfozShift() { return 1; }
@@ -1454,8 +1501,8 @@ class CommonFields : public CommonFieldsGenerationInfo {
1454
1501
  // We can't assert that SOO is enabled because we don't have SooEnabled(), but
1455
1502
  // we assert what we can.
1456
1503
  void AssertInSooMode() const {
1457
- assert(capacity() == SooCapacity());
1458
- assert(!has_infoz());
1504
+ ABSL_SWISSTABLE_ASSERT(capacity() == SooCapacity());
1505
+ ABSL_SWISSTABLE_ASSERT(!has_infoz());
1459
1506
  }
1460
1507
 
1461
1508
  // The number of slots in the backing array. This is always 2^N-1 for an
@@ -1481,7 +1528,7 @@ class raw_hash_set;
1481
1528
 
1482
1529
  // Returns the next valid capacity after `n`.
1483
1530
  inline size_t NextCapacity(size_t n) {
1484
- assert(IsValidCapacity(n) || n == 0);
1531
+ ABSL_SWISSTABLE_ASSERT(IsValidCapacity(n) || n == 0);
1485
1532
  return n * 2 + 1;
1486
1533
  }
1487
1534
 
@@ -1500,6 +1547,15 @@ inline size_t NormalizeCapacity(size_t n) {
1500
1547
  return n ? ~size_t{} >> countl_zero(n) : 1;
1501
1548
  }
1502
1549
 
1550
+ template <size_t kSlotSize>
1551
+ size_t MaxValidCapacity() {
1552
+ return NormalizeCapacity((std::numeric_limits<size_t>::max)() / 4 /
1553
+ kSlotSize);
1554
+ }
1555
+
1556
+ // Use a non-inlined function to avoid code bloat.
1557
+ [[noreturn]] void HashTableSizeOverflow();
1558
+
1503
1559
  // General notes on capacity/growth methods below:
1504
1560
  // - We use 7/8th as maximum load factor. For 16-wide groups, that gives an
1505
1561
  // average of two empty slots per group.
@@ -1511,7 +1567,7 @@ inline size_t NormalizeCapacity(size_t n) {
1511
1567
  // Given `capacity`, applies the load factor; i.e., it returns the maximum
1512
1568
  // number of values we should put into the table before a resizing rehash.
1513
1569
  inline size_t CapacityToGrowth(size_t capacity) {
1514
- assert(IsValidCapacity(capacity));
1570
+ ABSL_SWISSTABLE_ASSERT(IsValidCapacity(capacity));
1515
1571
  // `capacity*7/8`
1516
1572
  if (Group::kWidth == 8 && capacity == 7) {
1517
1573
  // x-x/8 does not work when x==7.
@@ -1703,7 +1759,7 @@ inline void AssertSameContainer(const ctrl_t* ctrl_a, const ctrl_t* ctrl_b,
1703
1759
  "hashtable.");
1704
1760
  fail_if(true, "Comparing non-end() iterators from different hashtables.");
1705
1761
  } else {
1706
- ABSL_HARDENING_ASSERT(
1762
+ ABSL_HARDENING_ASSERT_SLOW(
1707
1763
  AreItersFromSameContainer(ctrl_a, ctrl_b, slot_a, slot_b) &&
1708
1764
  "Invalid iterator comparison. The iterators may be from different "
1709
1765
  "containers or the container might have rehashed or moved. Consider "
@@ -1769,7 +1825,7 @@ inline FindInfo find_first_non_full(const CommonFields& common, size_t hash) {
1769
1825
  seq.index()};
1770
1826
  }
1771
1827
  seq.next();
1772
- assert(seq.index() <= common.capacity() && "full table!");
1828
+ ABSL_SWISSTABLE_ASSERT(seq.index() <= common.capacity() && "full table!");
1773
1829
  }
1774
1830
  }
1775
1831
 
@@ -1801,7 +1857,7 @@ inline void ResetCtrl(CommonFields& common, size_t slot_size) {
1801
1857
  // Sets sanitizer poisoning for slot corresponding to control byte being set.
1802
1858
  inline void DoSanitizeOnSetCtrl(const CommonFields& c, size_t i, ctrl_t h,
1803
1859
  size_t slot_size) {
1804
- assert(i < c.capacity());
1860
+ ABSL_SWISSTABLE_ASSERT(i < c.capacity());
1805
1861
  auto* slot_i = static_cast<const char*>(c.slot_array()) + i * slot_size;
1806
1862
  if (IsFull(h)) {
1807
1863
  SanitizerUnpoisonMemoryRegion(slot_i, slot_size);
@@ -1831,7 +1887,7 @@ inline void SetCtrl(const CommonFields& c, size_t i, h2_t h, size_t slot_size) {
1831
1887
  // setting the cloned control byte.
1832
1888
  inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, ctrl_t h,
1833
1889
  size_t slot_size) {
1834
- assert(is_single_group(c.capacity()));
1890
+ ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity()));
1835
1891
  DoSanitizeOnSetCtrl(c, i, h, slot_size);
1836
1892
  ctrl_t* ctrl = c.control();
1837
1893
  ctrl[i] = h;
@@ -1871,8 +1927,8 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline void IterateOverFullSlots(
1871
1927
  // Small tables capacity fits into portable group, where
1872
1928
  // GroupPortableImpl::MaskFull is more efficient for the
1873
1929
  // capacity <= GroupPortableImpl::kWidth.
1874
- assert(cap <= GroupPortableImpl::kWidth &&
1875
- "unexpectedly large small capacity");
1930
+ ABSL_SWISSTABLE_ASSERT(cap <= GroupPortableImpl::kWidth &&
1931
+ "unexpectedly large small capacity");
1876
1932
  static_assert(Group::kWidth >= GroupPortableImpl::kWidth,
1877
1933
  "unexpected group width");
1878
1934
  // Group starts from kSentinel slot, so indices in the mask will
@@ -1889,19 +1945,21 @@ ABSL_ATTRIBUTE_ALWAYS_INLINE inline void IterateOverFullSlots(
1889
1945
  ABSL_ATTRIBUTE_UNUSED const size_t original_size_for_assert = remaining;
1890
1946
  while (remaining != 0) {
1891
1947
  for (uint32_t i : GroupFullEmptyOrDeleted(ctrl).MaskFull()) {
1892
- assert(IsFull(ctrl[i]) && "hash table was modified unexpectedly");
1948
+ ABSL_SWISSTABLE_ASSERT(IsFull(ctrl[i]) &&
1949
+ "hash table was modified unexpectedly");
1893
1950
  cb(ctrl + i, slot + i);
1894
1951
  --remaining;
1895
1952
  }
1896
1953
  ctrl += Group::kWidth;
1897
1954
  slot += Group::kWidth;
1898
- assert((remaining == 0 || *(ctrl - 1) != ctrl_t::kSentinel) &&
1899
- "hash table was modified unexpectedly");
1955
+ ABSL_SWISSTABLE_ASSERT(
1956
+ (remaining == 0 || *(ctrl - 1) != ctrl_t::kSentinel) &&
1957
+ "hash table was modified unexpectedly");
1900
1958
  }
1901
1959
  // NOTE: erasure of the current element is allowed in callback for
1902
1960
  // absl::erase_if specialization. So we use `>=`.
1903
- assert(original_size_for_assert >= c.size() &&
1904
- "hash table was modified unexpectedly");
1961
+ ABSL_SWISSTABLE_ASSERT(original_size_for_assert >= c.size() &&
1962
+ "hash table was modified unexpectedly");
1905
1963
  }
1906
1964
 
1907
1965
  template <typename CharAlloc>
@@ -1956,34 +2014,16 @@ class HashSetResizeHelper {
1956
2014
  // `GrowSizeIntoSingleGroup*` in case `IsGrowingIntoSingleGroupApplicable`.
1957
2015
  // Falls back to `find_first_non_full` in case of big groups.
1958
2016
  static FindInfo FindFirstNonFullAfterResize(const CommonFields& c,
1959
- size_t old_capacity,
1960
- size_t hash) {
1961
- if (!IsGrowingIntoSingleGroupApplicable(old_capacity, c.capacity())) {
1962
- return find_first_non_full(c, hash);
1963
- }
1964
- // Find a location for the new element non-deterministically.
1965
- // Note that any position is correct.
1966
- // It will located at `half_old_capacity` or one of the other
1967
- // empty slots with approximately 50% probability each.
1968
- size_t offset = probe(c, hash).offset();
1969
-
1970
- // Note that we intentionally use unsigned int underflow.
1971
- if (offset - (old_capacity + 1) >= old_capacity) {
1972
- // Offset fall on kSentinel or into the mostly occupied first half.
1973
- offset = old_capacity / 2;
1974
- }
1975
- assert(IsEmpty(c.control()[offset]));
1976
- return FindInfo{offset, 0};
1977
- }
2017
+ size_t old_capacity, size_t hash);
1978
2018
 
1979
2019
  HeapOrSoo& old_heap_or_soo() { return old_heap_or_soo_; }
1980
2020
  void* old_soo_data() { return old_heap_or_soo_.get_soo_data(); }
1981
2021
  ctrl_t* old_ctrl() const {
1982
- assert(!was_soo_);
2022
+ ABSL_SWISSTABLE_ASSERT(!was_soo_);
1983
2023
  return old_heap_or_soo_.control();
1984
2024
  }
1985
2025
  void* old_slots() const {
1986
- assert(!was_soo_);
2026
+ ABSL_SWISSTABLE_ASSERT(!was_soo_);
1987
2027
  return old_heap_or_soo_.slot_array().get();
1988
2028
  }
1989
2029
  size_t old_capacity() const { return old_capacity_; }
@@ -2034,7 +2074,7 @@ class HashSetResizeHelper {
2034
2074
  ctrl_t soo_slot_h2,
2035
2075
  size_t key_size,
2036
2076
  size_t value_size) {
2037
- assert(c.capacity());
2077
+ ABSL_SWISSTABLE_ASSERT(c.capacity());
2038
2078
  HashtablezInfoHandle infoz =
2039
2079
  ShouldSampleHashtablezInfo<Alloc>()
2040
2080
  ? SampleHashtablezInfo<SooEnabled>(SizeOfSlot, key_size, value_size,
@@ -2091,21 +2131,20 @@ class HashSetResizeHelper {
2091
2131
  // 1. GrowIntoSingleGroupShuffleControlBytes was already called.
2092
2132
  template <class PolicyTraits, class Alloc>
2093
2133
  void GrowSizeIntoSingleGroup(CommonFields& c, Alloc& alloc_ref) {
2094
- assert(old_capacity_ < Group::kWidth / 2);
2095
- assert(IsGrowingIntoSingleGroupApplicable(old_capacity_, c.capacity()));
2134
+ ABSL_SWISSTABLE_ASSERT(old_capacity_ < Group::kWidth / 2);
2135
+ ABSL_SWISSTABLE_ASSERT(
2136
+ IsGrowingIntoSingleGroupApplicable(old_capacity_, c.capacity()));
2096
2137
  using slot_type = typename PolicyTraits::slot_type;
2097
- assert(is_single_group(c.capacity()));
2138
+ ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity()));
2098
2139
 
2099
- auto* new_slots = static_cast<slot_type*>(c.slot_array());
2140
+ auto* new_slots = static_cast<slot_type*>(c.slot_array()) + 1;
2100
2141
  auto* old_slots_ptr = static_cast<slot_type*>(old_slots());
2142
+ auto* old_ctrl_ptr = old_ctrl();
2101
2143
 
2102
- size_t shuffle_bit = old_capacity_ / 2 + 1;
2103
- for (size_t i = 0; i < old_capacity_; ++i) {
2104
- if (IsFull(old_ctrl()[i])) {
2105
- size_t new_i = i ^ shuffle_bit;
2106
- SanitizerUnpoisonMemoryRegion(new_slots + new_i, sizeof(slot_type));
2107
- PolicyTraits::transfer(&alloc_ref, new_slots + new_i,
2108
- old_slots_ptr + i);
2144
+ for (size_t i = 0; i < old_capacity_; ++i, ++new_slots) {
2145
+ if (IsFull(old_ctrl_ptr[i])) {
2146
+ SanitizerUnpoisonMemoryRegion(new_slots, sizeof(slot_type));
2147
+ PolicyTraits::transfer(&alloc_ref, new_slots, old_slots_ptr + i);
2109
2148
  }
2110
2149
  }
2111
2150
  PoisonSingleGroupEmptySlots(c, sizeof(slot_type));
@@ -2147,27 +2186,25 @@ class HashSetResizeHelper {
2147
2186
  // 1. new_ctrl is allocated for new_capacity,
2148
2187
  // but not initialized.
2149
2188
  // 2. new_capacity is a single group.
2189
+ // 3. old_capacity > 0.
2150
2190
  //
2151
2191
  // All elements are transferred into the first `old_capacity + 1` positions
2152
- // of the new_ctrl. Elements are rotated by `old_capacity_ / 2 + 1` positions
2153
- // in order to change an order and keep it non deterministic.
2154
- // Although rotation itself deterministic, position of the new added element
2155
- // will be based on `H1` and is not deterministic.
2192
+ // of the new_ctrl. Elements are shifted by 1 in order to keep a space at the
2193
+ // beginning for the new element.
2194
+ // Position of the new added element will be based on `H1` and is not
2195
+ // deterministic.
2156
2196
  //
2157
2197
  // Examples:
2158
2198
  // S = kSentinel, E = kEmpty
2159
2199
  //
2160
- // old_ctrl = SEEEEEEEE...
2161
- // new_ctrl = ESEEEEEEE...
2162
- //
2163
2200
  // old_ctrl = 0SEEEEEEE...
2164
2201
  // new_ctrl = E0ESE0EEE...
2165
2202
  //
2166
2203
  // old_ctrl = 012S012EEEEEEEEE...
2167
- // new_ctrl = 2E01EEES2E01EEE...
2204
+ // new_ctrl = E012EEESE012EEE...
2168
2205
  //
2169
2206
  // old_ctrl = 0123456S0123456EEEEEEEEEEE...
2170
- // new_ctrl = 456E0123EEEEEES456E0123EEE...
2207
+ // new_ctrl = E0123456EEEEEESE0123456EEE...
2171
2208
  void GrowIntoSingleGroupShuffleControlBytes(ctrl_t* new_ctrl,
2172
2209
  size_t new_capacity) const;
2173
2210
 
@@ -2376,6 +2413,10 @@ class raw_hash_set {
2376
2413
  alignof(slot_type) <= alignof(HeapOrSoo);
2377
2414
  }
2378
2415
 
2416
+ constexpr static size_t DefaultCapacity() {
2417
+ return SooEnabled() ? SooCapacity() : 0;
2418
+ }
2419
+
2379
2420
  // Whether `size` fits in the SOO capacity of this table.
2380
2421
  bool fits_in_soo(size_t size) const {
2381
2422
  return SooEnabled() && size <= SooCapacity();
@@ -2402,23 +2443,14 @@ class raw_hash_set {
2402
2443
  static_assert(std::is_lvalue_reference<reference>::value,
2403
2444
  "Policy::element() must return a reference");
2404
2445
 
2405
- template <typename T>
2406
- struct SameAsElementReference
2407
- : std::is_same<typename std::remove_cv<
2408
- typename std::remove_reference<reference>::type>::type,
2409
- typename std::remove_cv<
2410
- typename std::remove_reference<T>::type>::type> {};
2411
-
2412
2446
  // An enabler for insert(T&&): T must be convertible to init_type or be the
2413
2447
  // same as [cv] value_type [ref].
2414
- // Note: we separate SameAsElementReference into its own type to avoid using
2415
- // reference unless we need to. MSVC doesn't seem to like it in some
2416
- // cases.
2417
2448
  template <class T>
2418
- using RequiresInsertable = typename std::enable_if<
2419
- absl::disjunction<std::is_convertible<T, init_type>,
2420
- SameAsElementReference<T>>::value,
2421
- int>::type;
2449
+ using Insertable = absl::disjunction<
2450
+ std::is_same<absl::remove_cvref_t<reference>, absl::remove_cvref_t<T>>,
2451
+ std::is_convertible<T, init_type>>;
2452
+ template <class T>
2453
+ using IsNotBitField = std::is_pointer<T*>;
2422
2454
 
2423
2455
  // RequiresNotInit is a workaround for gcc prior to 7.1.
2424
2456
  // See https://godbolt.org/g/Y4xsUh.
@@ -2429,6 +2461,17 @@ class raw_hash_set {
2429
2461
  template <class... Ts>
2430
2462
  using IsDecomposable = IsDecomposable<void, PolicyTraits, Hash, Eq, Ts...>;
2431
2463
 
2464
+ template <class T>
2465
+ using IsDecomposableAndInsertable =
2466
+ IsDecomposable<std::enable_if_t<Insertable<T>::value, T>>;
2467
+
2468
+ // Evaluates to true if an assignment from the given type would require the
2469
+ // source object to remain alive for the life of the element.
2470
+ template <class U>
2471
+ using IsLifetimeBoundAssignmentFrom = std::conditional_t<
2472
+ policy_trait_element_is_owner<Policy>::value, std::false_type,
2473
+ type_traits_internal::IsLifetimeBoundAssignment<init_type, U>>;
2474
+
2432
2475
  public:
2433
2476
  static_assert(std::is_same<pointer, value_type*>::value,
2434
2477
  "Allocators with custom pointer types are not supported");
@@ -2613,7 +2656,11 @@ class raw_hash_set {
2613
2656
  const allocator_type& alloc = allocator_type())
2614
2657
  : settings_(CommonFields::CreateDefault<SooEnabled()>(), hash, eq,
2615
2658
  alloc) {
2616
- if (bucket_count > (SooEnabled() ? SooCapacity() : 0)) {
2659
+ if (bucket_count > DefaultCapacity()) {
2660
+ if (ABSL_PREDICT_FALSE(bucket_count >
2661
+ MaxValidCapacity<sizeof(slot_type)>())) {
2662
+ HashTableSizeOverflow();
2663
+ }
2617
2664
  resize(NormalizeCapacity(bucket_count));
2618
2665
  }
2619
2666
  }
@@ -2672,7 +2719,8 @@ class raw_hash_set {
2672
2719
  // absl::flat_hash_set<int> a, b{a};
2673
2720
  //
2674
2721
  // RequiresNotInit<T> is a workaround for gcc prior to 7.1.
2675
- template <class T, RequiresNotInit<T> = 0, RequiresInsertable<T> = 0>
2722
+ template <class T, RequiresNotInit<T> = 0,
2723
+ std::enable_if_t<Insertable<T>::value, int> = 0>
2676
2724
  raw_hash_set(std::initializer_list<T> init, size_t bucket_count = 0,
2677
2725
  const hasher& hash = hasher(), const key_equal& eq = key_equal(),
2678
2726
  const allocator_type& alloc = allocator_type())
@@ -2683,7 +2731,8 @@ class raw_hash_set {
2683
2731
  const allocator_type& alloc = allocator_type())
2684
2732
  : raw_hash_set(init.begin(), init.end(), bucket_count, hash, eq, alloc) {}
2685
2733
 
2686
- template <class T, RequiresNotInit<T> = 0, RequiresInsertable<T> = 0>
2734
+ template <class T, RequiresNotInit<T> = 0,
2735
+ std::enable_if_t<Insertable<T>::value, int> = 0>
2687
2736
  raw_hash_set(std::initializer_list<T> init, size_t bucket_count,
2688
2737
  const hasher& hash, const allocator_type& alloc)
2689
2738
  : raw_hash_set(init, bucket_count, hash, key_equal(), alloc) {}
@@ -2692,7 +2741,8 @@ class raw_hash_set {
2692
2741
  const hasher& hash, const allocator_type& alloc)
2693
2742
  : raw_hash_set(init, bucket_count, hash, key_equal(), alloc) {}
2694
2743
 
2695
- template <class T, RequiresNotInit<T> = 0, RequiresInsertable<T> = 0>
2744
+ template <class T, RequiresNotInit<T> = 0,
2745
+ std::enable_if_t<Insertable<T>::value, int> = 0>
2696
2746
  raw_hash_set(std::initializer_list<T> init, size_t bucket_count,
2697
2747
  const allocator_type& alloc)
2698
2748
  : raw_hash_set(init, bucket_count, hasher(), key_equal(), alloc) {}
@@ -2701,7 +2751,8 @@ class raw_hash_set {
2701
2751
  const allocator_type& alloc)
2702
2752
  : raw_hash_set(init, bucket_count, hasher(), key_equal(), alloc) {}
2703
2753
 
2704
- template <class T, RequiresNotInit<T> = 0, RequiresInsertable<T> = 0>
2754
+ template <class T, RequiresNotInit<T> = 0,
2755
+ std::enable_if_t<Insertable<T>::value, int> = 0>
2705
2756
  raw_hash_set(std::initializer_list<T> init, const allocator_type& alloc)
2706
2757
  : raw_hash_set(init, 0, hasher(), key_equal(), alloc) {}
2707
2758
 
@@ -2716,6 +2767,7 @@ class raw_hash_set {
2716
2767
  raw_hash_set(const raw_hash_set& that, const allocator_type& a)
2717
2768
  : raw_hash_set(GrowthToLowerboundCapacity(that.size()), that.hash_ref(),
2718
2769
  that.eq_ref(), a) {
2770
+ that.AssertNotDebugCapacity();
2719
2771
  const size_t size = that.size();
2720
2772
  if (size == 0) {
2721
2773
  return;
@@ -2723,14 +2775,14 @@ class raw_hash_set {
2723
2775
  // We don't use `that.is_soo()` here because `that` can have non-SOO
2724
2776
  // capacity but have a size that fits into SOO capacity.
2725
2777
  if (fits_in_soo(size)) {
2726
- assert(size == 1);
2778
+ ABSL_SWISSTABLE_ASSERT(size == 1);
2727
2779
  common().set_full_soo();
2728
2780
  emplace_at(soo_iterator(), *that.begin());
2729
2781
  const HashtablezInfoHandle infoz = try_sample_soo();
2730
2782
  if (infoz.IsSampled()) resize_with_soo_infoz(infoz);
2731
2783
  return;
2732
2784
  }
2733
- assert(!that.is_soo());
2785
+ ABSL_SWISSTABLE_ASSERT(!that.is_soo());
2734
2786
  const size_t cap = capacity();
2735
2787
  // Note about single group tables:
2736
2788
  // 1. It is correct to have any order of elements.
@@ -2762,7 +2814,8 @@ class raw_hash_set {
2762
2814
  offset = (offset + shift) & cap;
2763
2815
  }
2764
2816
  const h2_t h2 = static_cast<h2_t>(*that_ctrl);
2765
- assert( // We rely that hash is not changed for small tables.
2817
+ ABSL_SWISSTABLE_ASSERT( // We rely that hash is not changed for small
2818
+ // tables.
2766
2819
  H2(PolicyTraits::apply(HashElement{hash_ref()},
2767
2820
  PolicyTraits::element(that_slot))) == h2 &&
2768
2821
  "hash function value changed unexpectedly during the copy");
@@ -2786,7 +2839,6 @@ class raw_hash_set {
2786
2839
  : // Hash, equality and allocator are copied instead of moved because
2787
2840
  // `that` must be left valid. If Hash is std::function<Key>, moving it
2788
2841
  // would create a nullptr functor that cannot be called.
2789
- // TODO(b/296061262): move instead of copying hash/eq/alloc.
2790
2842
  // Note: we avoid using exchange for better generated code.
2791
2843
  settings_(PolicyTraits::transfer_uses_memcpy() || !that.is_full_soo()
2792
2844
  ? std::move(that.common())
@@ -2796,7 +2848,7 @@ class raw_hash_set {
2796
2848
  transfer(soo_slot(), that.soo_slot());
2797
2849
  }
2798
2850
  that.common() = CommonFields::CreateDefault<SooEnabled()>();
2799
- maybe_increment_generation_or_rehash_on_move();
2851
+ annotate_for_bug_detection_on_move(that);
2800
2852
  }
2801
2853
 
2802
2854
  raw_hash_set(raw_hash_set&& that, const allocator_type& a)
@@ -2804,13 +2856,14 @@ class raw_hash_set {
2804
2856
  that.eq_ref(), a) {
2805
2857
  if (a == that.alloc_ref()) {
2806
2858
  swap_common(that);
2807
- maybe_increment_generation_or_rehash_on_move();
2859
+ annotate_for_bug_detection_on_move(that);
2808
2860
  } else {
2809
2861
  move_elements_allocs_unequal(std::move(that));
2810
2862
  }
2811
2863
  }
2812
2864
 
2813
2865
  raw_hash_set& operator=(const raw_hash_set& that) {
2866
+ that.AssertNotDebugCapacity();
2814
2867
  if (ABSL_PREDICT_FALSE(this == &that)) return *this;
2815
2868
  constexpr bool propagate_alloc =
2816
2869
  AllocTraits::propagate_on_container_copy_assignment::value;
@@ -2835,7 +2888,12 @@ class raw_hash_set {
2835
2888
  typename AllocTraits::propagate_on_container_move_assignment());
2836
2889
  }
2837
2890
 
2838
- ~raw_hash_set() { destructor_impl(); }
2891
+ ~raw_hash_set() {
2892
+ destructor_impl();
2893
+ #ifndef NDEBUG
2894
+ common().set_capacity(InvalidCapacity::kDestroyed);
2895
+ #endif
2896
+ }
2839
2897
 
2840
2898
  iterator begin() ABSL_ATTRIBUTE_LIFETIME_BOUND {
2841
2899
  if (ABSL_PREDICT_FALSE(empty())) return end();
@@ -2843,10 +2901,11 @@ class raw_hash_set {
2843
2901
  iterator it = {control(), common().slots_union(),
2844
2902
  common().generation_ptr()};
2845
2903
  it.skip_empty_or_deleted();
2846
- assert(IsFull(*it.control()));
2904
+ ABSL_SWISSTABLE_ASSERT(IsFull(*it.control()));
2847
2905
  return it;
2848
2906
  }
2849
2907
  iterator end() ABSL_ATTRIBUTE_LIFETIME_BOUND {
2908
+ AssertNotDebugCapacity();
2850
2909
  return iterator(common().generation_ptr());
2851
2910
  }
2852
2911
 
@@ -2854,7 +2913,7 @@ class raw_hash_set {
2854
2913
  return const_cast<raw_hash_set*>(this)->begin();
2855
2914
  }
2856
2915
  const_iterator end() const ABSL_ATTRIBUTE_LIFETIME_BOUND {
2857
- return iterator(common().generation_ptr());
2916
+ return const_cast<raw_hash_set*>(this)->end();
2858
2917
  }
2859
2918
  const_iterator cbegin() const ABSL_ATTRIBUTE_LIFETIME_BOUND {
2860
2919
  return begin();
@@ -2862,18 +2921,28 @@ class raw_hash_set {
2862
2921
  const_iterator cend() const ABSL_ATTRIBUTE_LIFETIME_BOUND { return end(); }
2863
2922
 
2864
2923
  bool empty() const { return !size(); }
2865
- size_t size() const { return common().size(); }
2924
+ size_t size() const {
2925
+ AssertNotDebugCapacity();
2926
+ return common().size();
2927
+ }
2866
2928
  size_t capacity() const {
2867
2929
  const size_t cap = common().capacity();
2868
- // Compiler complains when using functions in assume so use local variables.
2869
- ABSL_ATTRIBUTE_UNUSED static constexpr bool kEnabled = SooEnabled();
2870
- ABSL_ATTRIBUTE_UNUSED static constexpr size_t kCapacity = SooCapacity();
2871
- ABSL_ASSUME(!kEnabled || cap >= kCapacity);
2930
+ // Compiler complains when using functions in ASSUME so use local variable.
2931
+ ABSL_ATTRIBUTE_UNUSED static constexpr size_t kDefaultCapacity =
2932
+ DefaultCapacity();
2933
+ ABSL_ASSUME(cap >= kDefaultCapacity);
2872
2934
  return cap;
2873
2935
  }
2874
- size_t max_size() const { return (std::numeric_limits<size_t>::max)(); }
2936
+ size_t max_size() const {
2937
+ return CapacityToGrowth(MaxValidCapacity<sizeof(slot_type)>());
2938
+ }
2875
2939
 
2876
2940
  ABSL_ATTRIBUTE_REINITIALIZES void clear() {
2941
+ if (SwisstableGenerationsEnabled() &&
2942
+ capacity() >= InvalidCapacity::kMovedFrom) {
2943
+ common().set_capacity(DefaultCapacity());
2944
+ }
2945
+ AssertNotDebugCapacity();
2877
2946
  // Iterating over this container is O(bucket_count()). When bucket_count()
2878
2947
  // is much greater than size(), iteration becomes prohibitively expensive.
2879
2948
  // For clear() it is more important to reuse the allocated array when the
@@ -2901,15 +2970,26 @@ class raw_hash_set {
2901
2970
  //
2902
2971
  // flat_hash_map<std::string, int> m;
2903
2972
  // m.insert(std::make_pair("abc", 42));
2904
- // TODO(cheshire): A type alias T2 is introduced as a workaround for the nvcc
2905
- // bug.
2906
- template <class T, RequiresInsertable<T> = 0, class T2 = T,
2907
- typename std::enable_if<IsDecomposable<T2>::value, int>::type = 0,
2908
- T* = nullptr>
2973
+ template <class T,
2974
+ std::enable_if_t<IsDecomposableAndInsertable<T>::value &&
2975
+ IsNotBitField<T>::value &&
2976
+ !IsLifetimeBoundAssignmentFrom<T>::value,
2977
+ int> = 0>
2909
2978
  std::pair<iterator, bool> insert(T&& value) ABSL_ATTRIBUTE_LIFETIME_BOUND {
2910
2979
  return emplace(std::forward<T>(value));
2911
2980
  }
2912
2981
 
2982
+ template <class T,
2983
+ std::enable_if_t<IsDecomposableAndInsertable<T>::value &&
2984
+ IsNotBitField<T>::value &&
2985
+ IsLifetimeBoundAssignmentFrom<T>::value,
2986
+ int> = 0>
2987
+ std::pair<iterator, bool> insert(
2988
+ T&& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
2989
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
2990
+ return emplace(std::forward<T>(value));
2991
+ }
2992
+
2913
2993
  // This overload kicks in when the argument is a bitfield or an lvalue of
2914
2994
  // insertable and decomposable type.
2915
2995
  //
@@ -2921,13 +3001,23 @@ class raw_hash_set {
2921
3001
  // const char* p = "hello";
2922
3002
  // s.insert(p);
2923
3003
  //
2924
- template <
2925
- class T, RequiresInsertable<const T&> = 0,
2926
- typename std::enable_if<IsDecomposable<const T&>::value, int>::type = 0>
3004
+ template <class T, std::enable_if_t<
3005
+ IsDecomposableAndInsertable<const T&>::value &&
3006
+ !IsLifetimeBoundAssignmentFrom<const T&>::value,
3007
+ int> = 0>
2927
3008
  std::pair<iterator, bool> insert(const T& value)
2928
3009
  ABSL_ATTRIBUTE_LIFETIME_BOUND {
2929
3010
  return emplace(value);
2930
3011
  }
3012
+ template <class T,
3013
+ std::enable_if_t<IsDecomposableAndInsertable<const T&>::value &&
3014
+ IsLifetimeBoundAssignmentFrom<const T&>::value,
3015
+ int> = 0>
3016
+ std::pair<iterator, bool> insert(
3017
+ const T& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
3018
+ ABSL_ATTRIBUTE_LIFETIME_BOUND {
3019
+ return emplace(value);
3020
+ }
2931
3021
 
2932
3022
  // This overload kicks in when the argument is an rvalue of init_type. Its
2933
3023
  // purpose is to handle brace-init-list arguments.
@@ -2935,22 +3025,43 @@ class raw_hash_set {
2935
3025
  // flat_hash_map<std::string, int> s;
2936
3026
  // s.insert({"abc", 42});
2937
3027
  std::pair<iterator, bool> insert(init_type&& value)
2938
- ABSL_ATTRIBUTE_LIFETIME_BOUND {
3028
+ ABSL_ATTRIBUTE_LIFETIME_BOUND
3029
+ #if __cplusplus >= 202002L
3030
+ requires(!IsLifetimeBoundAssignmentFrom<init_type>::value)
3031
+ #endif
3032
+ {
2939
3033
  return emplace(std::move(value));
2940
3034
  }
3035
+ #if __cplusplus >= 202002L
3036
+ std::pair<iterator, bool> insert(
3037
+ init_type&& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(this))
3038
+ ABSL_ATTRIBUTE_LIFETIME_BOUND
3039
+ requires(IsLifetimeBoundAssignmentFrom<init_type>::value)
3040
+ {
3041
+ return emplace(std::move(value));
3042
+ }
3043
+ #endif
2941
3044
 
2942
- // TODO(cheshire): A type alias T2 is introduced as a workaround for the nvcc
2943
- // bug.
2944
- template <class T, RequiresInsertable<T> = 0, class T2 = T,
2945
- typename std::enable_if<IsDecomposable<T2>::value, int>::type = 0,
2946
- T* = nullptr>
3045
+ template <class T,
3046
+ std::enable_if_t<IsDecomposableAndInsertable<T>::value &&
3047
+ IsNotBitField<T>::value &&
3048
+ !IsLifetimeBoundAssignmentFrom<T>::value,
3049
+ int> = 0>
2947
3050
  iterator insert(const_iterator, T&& value) ABSL_ATTRIBUTE_LIFETIME_BOUND {
2948
3051
  return insert(std::forward<T>(value)).first;
2949
3052
  }
3053
+ template <class T,
3054
+ std::enable_if_t<IsDecomposableAndInsertable<T>::value &&
3055
+ IsNotBitField<T>::value &&
3056
+ IsLifetimeBoundAssignmentFrom<T>::value,
3057
+ int> = 0>
3058
+ iterator insert(const_iterator, T&& value ABSL_INTERNAL_ATTRIBUTE_CAPTURED_BY(
3059
+ this)) ABSL_ATTRIBUTE_LIFETIME_BOUND {
3060
+ return insert(std::forward<T>(value)).first;
3061
+ }
2950
3062
 
2951
- template <
2952
- class T, RequiresInsertable<const T&> = 0,
2953
- typename std::enable_if<IsDecomposable<const T&>::value, int>::type = 0>
3063
+ template <class T, std::enable_if_t<
3064
+ IsDecomposableAndInsertable<const T&>::value, int> = 0>
2954
3065
  iterator insert(const_iterator,
2955
3066
  const T& value) ABSL_ATTRIBUTE_LIFETIME_BOUND {
2956
3067
  return insert(value).first;
@@ -2966,7 +3077,8 @@ class raw_hash_set {
2966
3077
  for (; first != last; ++first) emplace(*first);
2967
3078
  }
2968
3079
 
2969
- template <class T, RequiresNotInit<T> = 0, RequiresInsertable<const T&> = 0>
3080
+ template <class T, RequiresNotInit<T> = 0,
3081
+ std::enable_if_t<Insertable<const T&>::value, int> = 0>
2970
3082
  void insert(std::initializer_list<T> ilist) {
2971
3083
  insert(ilist.begin(), ilist.end());
2972
3084
  }
@@ -3005,8 +3117,8 @@ class raw_hash_set {
3005
3117
  // flat_hash_map<std::string, std::string> m = {{"abc", "def"}};
3006
3118
  // // Creates no std::string copies and makes no heap allocations.
3007
3119
  // m.emplace("abc", "xyz");
3008
- template <class... Args, typename std::enable_if<
3009
- IsDecomposable<Args...>::value, int>::type = 0>
3120
+ template <class... Args,
3121
+ std::enable_if_t<IsDecomposable<Args...>::value, int> = 0>
3010
3122
  std::pair<iterator, bool> emplace(Args&&... args)
3011
3123
  ABSL_ATTRIBUTE_LIFETIME_BOUND {
3012
3124
  return PolicyTraits::apply(EmplaceDecomposable{*this},
@@ -3016,8 +3128,8 @@ class raw_hash_set {
3016
3128
  // This overload kicks in if we cannot deduce the key from args. It constructs
3017
3129
  // value_type unconditionally and then either moves it into the table or
3018
3130
  // destroys.
3019
- template <class... Args, typename std::enable_if<
3020
- !IsDecomposable<Args...>::value, int>::type = 0>
3131
+ template <class... Args,
3132
+ std::enable_if_t<!IsDecomposable<Args...>::value, int> = 0>
3021
3133
  std::pair<iterator, bool> emplace(Args&&... args)
3022
3134
  ABSL_ATTRIBUTE_LIFETIME_BOUND {
3023
3135
  alignas(slot_type) unsigned char raw[sizeof(slot_type)];
@@ -3068,7 +3180,7 @@ class raw_hash_set {
3068
3180
  public:
3069
3181
  template <class... Args>
3070
3182
  void operator()(Args&&... args) const {
3071
- assert(*slot_);
3183
+ ABSL_SWISSTABLE_ASSERT(*slot_);
3072
3184
  PolicyTraits::construct(alloc_, *slot_, std::forward<Args>(args)...);
3073
3185
  *slot_ = nullptr;
3074
3186
  }
@@ -3087,7 +3199,7 @@ class raw_hash_set {
3087
3199
  if (res.second) {
3088
3200
  slot_type* slot = res.first.slot();
3089
3201
  std::forward<F>(f)(constructor(&alloc_ref(), &slot));
3090
- assert(!slot);
3202
+ ABSL_SWISSTABLE_ASSERT(!slot);
3091
3203
  }
3092
3204
  return res.first;
3093
3205
  }
@@ -3109,24 +3221,16 @@ class raw_hash_set {
3109
3221
  return 1;
3110
3222
  }
3111
3223
 
3112
- // Erases the element pointed to by `it`. Unlike `std::unordered_set::erase`,
3113
- // this method returns void to reduce algorithmic complexity to O(1). The
3114
- // iterator is invalidated, so any increment should be done before calling
3115
- // erase. In order to erase while iterating across a map, use the following
3116
- // idiom (which also works for some standard containers):
3117
- //
3118
- // for (auto it = m.begin(), end = m.end(); it != end;) {
3119
- // // `erase()` will invalidate `it`, so advance `it` first.
3120
- // auto copy_it = it++;
3121
- // if (<pred>) {
3122
- // m.erase(copy_it);
3123
- // }
3124
- // }
3224
+ // Erases the element pointed to by `it`. Unlike `std::unordered_set::erase`,
3225
+ // this method returns void to reduce algorithmic complexity to O(1). The
3226
+ // iterator is invalidated so any increment should be done before calling
3227
+ // erase (e.g. `erase(it++)`).
3125
3228
  void erase(const_iterator cit) { erase(cit.inner_); }
3126
3229
 
3127
3230
  // This overload is necessary because otherwise erase<K>(const K&) would be
3128
3231
  // a better match if non-const iterator is passed as an argument.
3129
3232
  void erase(iterator it) {
3233
+ AssertNotDebugCapacity();
3130
3234
  AssertIsFull(it.control(), it.generation(), it.generation_ptr(), "erase()");
3131
3235
  destroy(it.slot());
3132
3236
  if (is_soo()) {
@@ -3138,6 +3242,7 @@ class raw_hash_set {
3138
3242
 
3139
3243
  iterator erase(const_iterator first,
3140
3244
  const_iterator last) ABSL_ATTRIBUTE_LIFETIME_BOUND {
3245
+ AssertNotDebugCapacity();
3141
3246
  // We check for empty first because ClearBackingArray requires that
3142
3247
  // capacity() > 0 as a precondition.
3143
3248
  if (empty()) return end();
@@ -3167,6 +3272,8 @@ class raw_hash_set {
3167
3272
  // If the element already exists in `this`, it is left unmodified in `src`.
3168
3273
  template <typename H, typename E>
3169
3274
  void merge(raw_hash_set<Policy, H, E, Alloc>& src) { // NOLINT
3275
+ AssertNotDebugCapacity();
3276
+ src.AssertNotDebugCapacity();
3170
3277
  assert(this != &src);
3171
3278
  // Returns whether insertion took place.
3172
3279
  const auto insert_slot = [this](slot_type* src_slot) {
@@ -3193,6 +3300,7 @@ class raw_hash_set {
3193
3300
  }
3194
3301
 
3195
3302
  node_type extract(const_iterator position) {
3303
+ AssertNotDebugCapacity();
3196
3304
  AssertIsFull(position.control(), position.inner_.generation(),
3197
3305
  position.inner_.generation_ptr(), "extract()");
3198
3306
  auto node = CommonAccess::Transfer<node_type>(alloc_ref(), position.slot());
@@ -3204,9 +3312,8 @@ class raw_hash_set {
3204
3312
  return node;
3205
3313
  }
3206
3314
 
3207
- template <
3208
- class K = key_type,
3209
- typename std::enable_if<!std::is_same<K, iterator>::value, int>::type = 0>
3315
+ template <class K = key_type,
3316
+ std::enable_if_t<!std::is_same<K, iterator>::value, int> = 0>
3210
3317
  node_type extract(const key_arg<K>& key) {
3211
3318
  auto it = find(key);
3212
3319
  return it == end() ? node_type() : extract(const_iterator{it});
@@ -3216,6 +3323,8 @@ class raw_hash_set {
3216
3323
  IsNoThrowSwappable<hasher>() && IsNoThrowSwappable<key_equal>() &&
3217
3324
  IsNoThrowSwappable<allocator_type>(
3218
3325
  typename AllocTraits::propagate_on_container_swap{})) {
3326
+ AssertNotDebugCapacity();
3327
+ that.AssertNotDebugCapacity();
3219
3328
  using std::swap;
3220
3329
  swap_common(that);
3221
3330
  swap(hash_ref(), that.hash_ref());
@@ -3241,7 +3350,7 @@ class raw_hash_set {
3241
3350
  resize(kInitialSampledCapacity);
3242
3351
  }
3243
3352
  // This asserts that we didn't lose sampling coverage in `resize`.
3244
- assert(infoz().IsSampled());
3353
+ ABSL_SWISSTABLE_ASSERT(infoz().IsSampled());
3245
3354
  return;
3246
3355
  }
3247
3356
  alignas(slot_type) unsigned char slot_space[sizeof(slot_type)];
@@ -3260,6 +3369,9 @@ class raw_hash_set {
3260
3369
  auto m = NormalizeCapacity(n | GrowthToLowerboundCapacity(size()));
3261
3370
  // n == 0 unconditionally rehashes as per the standard.
3262
3371
  if (n == 0 || m > cap) {
3372
+ if (ABSL_PREDICT_FALSE(m > MaxValidCapacity<sizeof(slot_type)>())) {
3373
+ HashTableSizeOverflow();
3374
+ }
3263
3375
  resize(m);
3264
3376
 
3265
3377
  // This is after resize, to ensure that we have completed the allocation
@@ -3272,6 +3384,9 @@ class raw_hash_set {
3272
3384
  const size_t max_size_before_growth =
3273
3385
  is_soo() ? SooCapacity() : size() + growth_left();
3274
3386
  if (n > max_size_before_growth) {
3387
+ if (ABSL_PREDICT_FALSE(n > max_size())) {
3388
+ HashTableSizeOverflow();
3389
+ }
3275
3390
  size_t m = GrowthToLowerboundCapacity(n);
3276
3391
  resize(NormalizeCapacity(m));
3277
3392
 
@@ -3304,7 +3419,7 @@ class raw_hash_set {
3304
3419
  // specific benchmarks indicating its importance.
3305
3420
  template <class K = key_type>
3306
3421
  void prefetch(const key_arg<K>& key) const {
3307
- if (SooEnabled() ? is_soo() : capacity() == 0) return;
3422
+ if (capacity() == DefaultCapacity()) return;
3308
3423
  (void)key;
3309
3424
  // Avoid probing if we won't be able to prefetch the addresses received.
3310
3425
  #ifdef ABSL_HAVE_PREFETCH
@@ -3315,32 +3430,27 @@ class raw_hash_set {
3315
3430
  #endif // ABSL_HAVE_PREFETCH
3316
3431
  }
3317
3432
 
3318
- // The API of find() has two extensions.
3319
- //
3320
- // 1. The hash can be passed by the user. It must be equal to the hash of the
3321
- // key.
3322
- //
3323
- // 2. The type of the key argument doesn't have to be key_type. This is so
3324
- // called heterogeneous key support.
3325
3433
  template <class K = key_type>
3434
+ ABSL_DEPRECATE_AND_INLINE()
3326
3435
  iterator find(const key_arg<K>& key,
3327
- size_t hash) ABSL_ATTRIBUTE_LIFETIME_BOUND {
3328
- AssertHashEqConsistent(key);
3329
- if (is_soo()) return find_soo(key);
3330
- return find_non_soo(key, hash);
3436
+ size_t) ABSL_ATTRIBUTE_LIFETIME_BOUND {
3437
+ return find(key);
3331
3438
  }
3439
+ // The API of find() has one extension: the type of the key argument doesn't
3440
+ // have to be key_type. This is so called heterogeneous key support.
3332
3441
  template <class K = key_type>
3333
3442
  iterator find(const key_arg<K>& key) ABSL_ATTRIBUTE_LIFETIME_BOUND {
3334
- AssertHashEqConsistent(key);
3443
+ AssertOnFind(key);
3335
3444
  if (is_soo()) return find_soo(key);
3336
3445
  prefetch_heap_block();
3337
3446
  return find_non_soo(key, hash_ref()(key));
3338
3447
  }
3339
3448
 
3340
3449
  template <class K = key_type>
3450
+ ABSL_DEPRECATE_AND_INLINE()
3341
3451
  const_iterator find(const key_arg<K>& key,
3342
- size_t hash) const ABSL_ATTRIBUTE_LIFETIME_BOUND {
3343
- return const_cast<raw_hash_set*>(this)->find(key, hash);
3452
+ size_t) const ABSL_ATTRIBUTE_LIFETIME_BOUND {
3453
+ return find(key);
3344
3454
  }
3345
3455
  template <class K = key_type>
3346
3456
  const_iterator find(const key_arg<K>& key) const
@@ -3392,7 +3502,16 @@ class raw_hash_set {
3392
3502
  if (outer->capacity() > inner->capacity()) std::swap(outer, inner);
3393
3503
  for (const value_type& elem : *outer) {
3394
3504
  auto it = PolicyTraits::apply(FindElement{*inner}, elem);
3395
- if (it == inner->end() || !(*it == elem)) return false;
3505
+ if (it == inner->end()) return false;
3506
+ // Note: we used key_equal to check for key equality in FindElement, but
3507
+ // we may need to do an additional comparison using
3508
+ // value_type::operator==. E.g. the keys could be equal and the
3509
+ // mapped_types could be unequal in a map or even in a set, key_equal
3510
+ // could ignore some fields that aren't ignored by operator==.
3511
+ static constexpr bool kKeyEqIsValueEq =
3512
+ std::is_same<key_type, value_type>::value &&
3513
+ std::is_same<key_equal, hash_default_eq<key_type>>::value;
3514
+ if (!kKeyEqIsValueEq && !(*it == elem)) return false;
3396
3515
  }
3397
3516
  return true;
3398
3517
  }
@@ -3476,23 +3595,26 @@ class raw_hash_set {
3476
3595
  slot_type&& slot;
3477
3596
  };
3478
3597
 
3479
- // TODO(b/303305702): re-enable reentrant validation.
3480
3598
  template <typename... Args>
3481
3599
  inline void construct(slot_type* slot, Args&&... args) {
3482
- PolicyTraits::construct(&alloc_ref(), slot, std::forward<Args>(args)...);
3600
+ common().RunWithReentrancyGuard([&] {
3601
+ PolicyTraits::construct(&alloc_ref(), slot, std::forward<Args>(args)...);
3602
+ });
3483
3603
  }
3484
3604
  inline void destroy(slot_type* slot) {
3485
- PolicyTraits::destroy(&alloc_ref(), slot);
3605
+ common().RunWithReentrancyGuard(
3606
+ [&] { PolicyTraits::destroy(&alloc_ref(), slot); });
3486
3607
  }
3487
3608
  inline void transfer(slot_type* to, slot_type* from) {
3488
- PolicyTraits::transfer(&alloc_ref(), to, from);
3609
+ common().RunWithReentrancyGuard(
3610
+ [&] { PolicyTraits::transfer(&alloc_ref(), to, from); });
3489
3611
  }
3490
3612
 
3491
3613
  // TODO(b/289225379): consider having a helper class that has the impls for
3492
3614
  // SOO functionality.
3493
3615
  template <class K = key_type>
3494
3616
  iterator find_soo(const key_arg<K>& key) {
3495
- assert(is_soo());
3617
+ ABSL_SWISSTABLE_ASSERT(is_soo());
3496
3618
  return empty() || !PolicyTraits::apply(EqualElement<K>{key, eq_ref()},
3497
3619
  PolicyTraits::element(soo_slot()))
3498
3620
  ? end()
@@ -3501,7 +3623,7 @@ class raw_hash_set {
3501
3623
 
3502
3624
  template <class K = key_type>
3503
3625
  iterator find_non_soo(const key_arg<K>& key, size_t hash) {
3504
- assert(!is_soo());
3626
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3505
3627
  auto seq = probe(common(), hash);
3506
3628
  const ctrl_t* ctrl = control();
3507
3629
  while (true) {
@@ -3514,7 +3636,7 @@ class raw_hash_set {
3514
3636
  }
3515
3637
  if (ABSL_PREDICT_TRUE(g.MaskEmpty())) return end();
3516
3638
  seq.next();
3517
- assert(seq.index() <= capacity() && "full table!");
3639
+ ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity() && "full table!");
3518
3640
  }
3519
3641
  }
3520
3642
 
@@ -3522,14 +3644,14 @@ class raw_hash_set {
3522
3644
  // insertion into an empty SOO table and in copy construction when the size
3523
3645
  // can fit in SOO capacity.
3524
3646
  inline HashtablezInfoHandle try_sample_soo() {
3525
- assert(is_soo());
3647
+ ABSL_SWISSTABLE_ASSERT(is_soo());
3526
3648
  if (!ShouldSampleHashtablezInfo<CharAlloc>()) return HashtablezInfoHandle{};
3527
3649
  return Sample(sizeof(slot_type), sizeof(key_type), sizeof(value_type),
3528
3650
  SooCapacity());
3529
3651
  }
3530
3652
 
3531
3653
  inline void destroy_slots() {
3532
- assert(!is_soo());
3654
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3533
3655
  if (PolicyTraits::template destroy_is_trivial<Alloc>()) return;
3534
3656
  IterateOverFullSlots(
3535
3657
  common(), slot_array(),
@@ -3538,7 +3660,7 @@ class raw_hash_set {
3538
3660
  }
3539
3661
 
3540
3662
  inline void dealloc() {
3541
- assert(capacity() != 0);
3663
+ ABSL_SWISSTABLE_ASSERT(capacity() != 0);
3542
3664
  // Unpoison before returning the memory to the allocator.
3543
3665
  SanitizerUnpoisonMemoryRegion(slot_array(), sizeof(slot_type) * capacity());
3544
3666
  infoz().Unregister();
@@ -3548,6 +3670,10 @@ class raw_hash_set {
3548
3670
  }
3549
3671
 
3550
3672
  inline void destructor_impl() {
3673
+ if (SwisstableGenerationsEnabled() &&
3674
+ capacity() >= InvalidCapacity::kMovedFrom) {
3675
+ return;
3676
+ }
3551
3677
  if (capacity() == 0) return;
3552
3678
  if (is_soo()) {
3553
3679
  if (!empty()) {
@@ -3564,7 +3690,7 @@ class raw_hash_set {
3564
3690
  // This merely updates the pertinent control byte. This can be used in
3565
3691
  // conjunction with Policy::transfer to move the object to another place.
3566
3692
  void erase_meta_only(const_iterator it) {
3567
- assert(!is_soo());
3693
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3568
3694
  EraseMetaOnly(common(), static_cast<size_t>(it.control() - control()),
3569
3695
  sizeof(slot_type));
3570
3696
  }
@@ -3590,7 +3716,7 @@ class raw_hash_set {
3590
3716
  // SOO tables, since they need to switch from SOO to heap in order to
3591
3717
  // store the infoz.
3592
3718
  void resize_with_soo_infoz(HashtablezInfoHandle forced_infoz) {
3593
- assert(forced_infoz.IsSampled());
3719
+ ABSL_SWISSTABLE_ASSERT(forced_infoz.IsSampled());
3594
3720
  raw_hash_set::resize_impl(common(), NextCapacity(SooCapacity()),
3595
3721
  forced_infoz);
3596
3722
  }
@@ -3601,8 +3727,8 @@ class raw_hash_set {
3601
3727
  CommonFields& common, size_t new_capacity,
3602
3728
  HashtablezInfoHandle forced_infoz) {
3603
3729
  raw_hash_set* set = reinterpret_cast<raw_hash_set*>(&common);
3604
- assert(IsValidCapacity(new_capacity));
3605
- assert(!set->fits_in_soo(new_capacity));
3730
+ ABSL_SWISSTABLE_ASSERT(IsValidCapacity(new_capacity));
3731
+ ABSL_SWISSTABLE_ASSERT(!set->fits_in_soo(new_capacity));
3606
3732
  const bool was_soo = set->is_soo();
3607
3733
  const bool had_soo_slot = was_soo && !set->empty();
3608
3734
  const ctrl_t soo_slot_h2 =
@@ -3637,7 +3763,7 @@ class raw_hash_set {
3637
3763
  // InitializeSlots did all the work including infoz().RecordRehash().
3638
3764
  return;
3639
3765
  }
3640
- assert(resize_helper.old_capacity() > 0);
3766
+ ABSL_SWISSTABLE_ASSERT(resize_helper.old_capacity() > 0);
3641
3767
  // Nothing more to do in this case.
3642
3768
  if (was_soo && !had_soo_slot) return;
3643
3769
 
@@ -3690,15 +3816,18 @@ class raw_hash_set {
3690
3816
  static slot_type* to_slot(void* buf) { return static_cast<slot_type*>(buf); }
3691
3817
 
3692
3818
  // Requires that lhs does not have a full SOO slot.
3693
- static void move_common(bool that_is_full_soo, allocator_type& rhs_alloc,
3819
+ static void move_common(bool rhs_is_full_soo, allocator_type& rhs_alloc,
3694
3820
  CommonFields& lhs, CommonFields&& rhs) {
3695
- if (PolicyTraits::transfer_uses_memcpy() || !that_is_full_soo) {
3821
+ if (PolicyTraits::transfer_uses_memcpy() || !rhs_is_full_soo) {
3696
3822
  lhs = std::move(rhs);
3697
3823
  } else {
3698
3824
  lhs.move_non_heap_or_soo_fields(rhs);
3699
- // TODO(b/303305702): add reentrancy guard.
3700
- PolicyTraits::transfer(&rhs_alloc, to_slot(lhs.soo_data()),
3701
- to_slot(rhs.soo_data()));
3825
+ rhs.RunWithReentrancyGuard([&] {
3826
+ lhs.RunWithReentrancyGuard([&] {
3827
+ PolicyTraits::transfer(&rhs_alloc, to_slot(lhs.soo_data()),
3828
+ to_slot(rhs.soo_data()));
3829
+ });
3830
+ });
3702
3831
  }
3703
3832
  }
3704
3833
 
@@ -3710,7 +3839,7 @@ class raw_hash_set {
3710
3839
  swap(common(), that.common());
3711
3840
  return;
3712
3841
  }
3713
- CommonFields tmp = CommonFields::CreateDefault<SooEnabled()>();
3842
+ CommonFields tmp = CommonFields(uninitialized_tag_t{});
3714
3843
  const bool that_is_full_soo = that.is_full_soo();
3715
3844
  move_common(that_is_full_soo, that.alloc_ref(), tmp,
3716
3845
  std::move(that.common()));
@@ -3718,8 +3847,17 @@ class raw_hash_set {
3718
3847
  move_common(that_is_full_soo, that.alloc_ref(), common(), std::move(tmp));
3719
3848
  }
3720
3849
 
3721
- void maybe_increment_generation_or_rehash_on_move() {
3722
- if (!SwisstableGenerationsEnabled() || capacity() == 0 || is_soo()) {
3850
+ void annotate_for_bug_detection_on_move(
3851
+ ABSL_ATTRIBUTE_UNUSED raw_hash_set& that) {
3852
+ // We only enable moved-from validation when generations are enabled (rather
3853
+ // than using NDEBUG) to avoid issues in which NDEBUG is enabled in some
3854
+ // translation units but not in others.
3855
+ if (SwisstableGenerationsEnabled()) {
3856
+ that.common().set_capacity(this == &that ? InvalidCapacity::kSelfMovedFrom
3857
+ : InvalidCapacity::kMovedFrom);
3858
+ }
3859
+ if (!SwisstableGenerationsEnabled() || capacity() == DefaultCapacity() ||
3860
+ capacity() > kAboveMaxValidCapacity) {
3723
3861
  return;
3724
3862
  }
3725
3863
  common().increment_generation();
@@ -3735,13 +3873,12 @@ class raw_hash_set {
3735
3873
  destructor_impl();
3736
3874
  move_common(that.is_full_soo(), that.alloc_ref(), common(),
3737
3875
  std::move(that.common()));
3738
- // TODO(b/296061262): move instead of copying hash/eq/alloc.
3739
3876
  hash_ref() = that.hash_ref();
3740
3877
  eq_ref() = that.eq_ref();
3741
3878
  CopyAlloc(alloc_ref(), that.alloc_ref(),
3742
3879
  std::integral_constant<bool, propagate_alloc>());
3743
3880
  that.common() = CommonFields::CreateDefault<SooEnabled()>();
3744
- maybe_increment_generation_or_rehash_on_move();
3881
+ annotate_for_bug_detection_on_move(that);
3745
3882
  return *this;
3746
3883
  }
3747
3884
 
@@ -3755,7 +3892,7 @@ class raw_hash_set {
3755
3892
  }
3756
3893
  if (!that.is_soo()) that.dealloc();
3757
3894
  that.common() = CommonFields::CreateDefault<SooEnabled()>();
3758
- maybe_increment_generation_or_rehash_on_move();
3895
+ annotate_for_bug_detection_on_move(that);
3759
3896
  return *this;
3760
3897
  }
3761
3898
 
@@ -3774,7 +3911,6 @@ class raw_hash_set {
3774
3911
  // We can't take over that's memory so we need to move each element.
3775
3912
  // While moving elements, this should have that's hash/eq so copy hash/eq
3776
3913
  // before moving elements.
3777
- // TODO(b/296061262): move instead of copying hash/eq.
3778
3914
  hash_ref() = that.hash_ref();
3779
3915
  eq_ref() = that.eq_ref();
3780
3916
  return move_elements_allocs_unequal(std::move(that));
@@ -3803,7 +3939,7 @@ class raw_hash_set {
3803
3939
 
3804
3940
  template <class K>
3805
3941
  std::pair<iterator, bool> find_or_prepare_insert_non_soo(const K& key) {
3806
- assert(!is_soo());
3942
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3807
3943
  prefetch_heap_block();
3808
3944
  auto hash = hash_ref()(key);
3809
3945
  auto seq = probe(common(), hash);
@@ -3826,16 +3962,57 @@ class raw_hash_set {
3826
3962
  true};
3827
3963
  }
3828
3964
  seq.next();
3829
- assert(seq.index() <= capacity() && "full table!");
3965
+ ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity() && "full table!");
3830
3966
  }
3831
3967
  }
3832
3968
 
3833
3969
  protected:
3970
+ // Asserts for correctness that we run on find/find_or_prepare_insert.
3971
+ template <class K>
3972
+ void AssertOnFind(ABSL_ATTRIBUTE_UNUSED const K& key) {
3973
+ AssertHashEqConsistent(key);
3974
+ AssertNotDebugCapacity();
3975
+ }
3976
+
3977
+ // Asserts that the capacity is not a sentinel invalid value.
3978
+ void AssertNotDebugCapacity() const {
3979
+ if (ABSL_PREDICT_TRUE(capacity() <
3980
+ InvalidCapacity::kAboveMaxValidCapacity)) {
3981
+ return;
3982
+ }
3983
+ assert(capacity() != InvalidCapacity::kReentrance &&
3984
+ "Reentrant container access during element construction/destruction "
3985
+ "is not allowed.");
3986
+ assert(capacity() != InvalidCapacity::kDestroyed &&
3987
+ "Use of destroyed hash table.");
3988
+ if (SwisstableGenerationsEnabled() &&
3989
+ ABSL_PREDICT_FALSE(capacity() >= InvalidCapacity::kMovedFrom)) {
3990
+ if (capacity() == InvalidCapacity::kSelfMovedFrom) {
3991
+ // If this log triggers, then a hash table was move-assigned to itself
3992
+ // and then used again later without being reinitialized.
3993
+ ABSL_RAW_LOG(FATAL, "Use of self-move-assigned hash table.");
3994
+ }
3995
+ ABSL_RAW_LOG(FATAL, "Use of moved-from hash table.");
3996
+ }
3997
+ }
3998
+
3834
3999
  // Asserts that hash and equal functors provided by the user are consistent,
3835
4000
  // meaning that `eq(k1, k2)` implies `hash(k1)==hash(k2)`.
3836
4001
  template <class K>
3837
- void AssertHashEqConsistent(ABSL_ATTRIBUTE_UNUSED const K& key) {
3838
- #ifndef NDEBUG
4002
+ void AssertHashEqConsistent(const K& key) {
4003
+ #ifdef NDEBUG
4004
+ return;
4005
+ #endif
4006
+ // If the hash/eq functors are known to be consistent, then skip validation.
4007
+ if (std::is_same<hasher, absl::container_internal::StringHash>::value &&
4008
+ std::is_same<key_equal, absl::container_internal::StringEq>::value) {
4009
+ return;
4010
+ }
4011
+ if (std::is_scalar<key_type>::value &&
4012
+ std::is_same<hasher, absl::Hash<key_type>>::value &&
4013
+ std::is_same<key_equal, std::equal_to<key_type>>::value) {
4014
+ return;
4015
+ }
3839
4016
  if (empty()) return;
3840
4017
 
3841
4018
  const size_t hash_of_arg = hash_ref()(key);
@@ -3847,21 +4024,8 @@ class raw_hash_set {
3847
4024
 
3848
4025
  const size_t hash_of_slot =
3849
4026
  PolicyTraits::apply(HashElement{hash_ref()}, element);
3850
- const bool is_hash_equal = hash_of_arg == hash_of_slot;
3851
- if (!is_hash_equal) {
3852
- // In this case, we're going to crash. Do a couple of other checks for
3853
- // idempotence issues. Recalculating hash/eq here is also convenient for
3854
- // debugging with gdb/lldb.
3855
- const size_t once_more_hash_arg = hash_ref()(key);
3856
- assert(hash_of_arg == once_more_hash_arg && "hash is not idempotent.");
3857
- const size_t once_more_hash_slot =
3858
- PolicyTraits::apply(HashElement{hash_ref()}, element);
3859
- assert(hash_of_slot == once_more_hash_slot &&
3860
- "hash is not idempotent.");
3861
- const bool once_more_eq =
3862
- PolicyTraits::apply(EqualElement<K>{key, eq_ref()}, element);
3863
- assert(is_key_equal == once_more_eq && "equality is not idempotent.");
3864
- }
4027
+ ABSL_ATTRIBUTE_UNUSED const bool is_hash_equal =
4028
+ hash_of_arg == hash_of_slot;
3865
4029
  assert((!is_key_equal || is_hash_equal) &&
3866
4030
  "eq(k1, k2) must imply that hash(k1) == hash(k2). "
3867
4031
  "hash/eq functors are inconsistent.");
@@ -3874,7 +4038,6 @@ class raw_hash_set {
3874
4038
  // We only do validation for small tables so that it's constant time.
3875
4039
  if (capacity() > 16) return;
3876
4040
  IterateOverFullSlots(common(), slot_array(), assert_consistent);
3877
- #endif
3878
4041
  }
3879
4042
 
3880
4043
  // Attempts to find `key` in the table; if it isn't found, returns an iterator
@@ -3882,7 +4045,7 @@ class raw_hash_set {
3882
4045
  // `key`'s H2. Returns a bool indicating whether an insertion can take place.
3883
4046
  template <class K>
3884
4047
  std::pair<iterator, bool> find_or_prepare_insert(const K& key) {
3885
- AssertHashEqConsistent(key);
4048
+ AssertOnFind(key);
3886
4049
  if (is_soo()) return find_or_prepare_insert_soo(key);
3887
4050
  return find_or_prepare_insert_non_soo(key);
3888
4051
  }
@@ -3926,16 +4089,16 @@ class raw_hash_set {
3926
4089
  //
3927
4090
  // See `CapacityToGrowth()`.
3928
4091
  size_t growth_left() const {
3929
- assert(!is_soo());
4092
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3930
4093
  return common().growth_left();
3931
4094
  }
3932
4095
 
3933
4096
  GrowthInfo& growth_info() {
3934
- assert(!is_soo());
4097
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3935
4098
  return common().growth_info();
3936
4099
  }
3937
4100
  GrowthInfo growth_info() const {
3938
- assert(!is_soo());
4101
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3939
4102
  return common().growth_info();
3940
4103
  }
3941
4104
 
@@ -3943,7 +4106,7 @@ class raw_hash_set {
3943
4106
  // cache misses. This is intended to overlap with execution of calculating the
3944
4107
  // hash for a key.
3945
4108
  void prefetch_heap_block() const {
3946
- assert(!is_soo());
4109
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3947
4110
  #if ABSL_HAVE_BUILTIN(__builtin_prefetch) || defined(__GNUC__)
3948
4111
  __builtin_prefetch(control(), 0, 1);
3949
4112
  #endif
@@ -3953,15 +4116,15 @@ class raw_hash_set {
3953
4116
  const CommonFields& common() const { return settings_.template get<0>(); }
3954
4117
 
3955
4118
  ctrl_t* control() const {
3956
- assert(!is_soo());
4119
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3957
4120
  return common().control();
3958
4121
  }
3959
4122
  slot_type* slot_array() const {
3960
- assert(!is_soo());
4123
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3961
4124
  return static_cast<slot_type*>(common().slot_array());
3962
4125
  }
3963
4126
  slot_type* soo_slot() {
3964
- assert(is_soo());
4127
+ ABSL_SWISSTABLE_ASSERT(is_soo());
3965
4128
  return static_cast<slot_type*>(common().soo_data());
3966
4129
  }
3967
4130
  const slot_type* soo_slot() const {
@@ -3974,7 +4137,7 @@ class raw_hash_set {
3974
4137
  return const_cast<raw_hash_set*>(this)->soo_iterator();
3975
4138
  }
3976
4139
  HashtablezInfoHandle infoz() {
3977
- assert(!is_soo());
4140
+ ABSL_SWISSTABLE_ASSERT(!is_soo());
3978
4141
  return common().infoz();
3979
4142
  }
3980
4143
 
@@ -4023,7 +4186,7 @@ class raw_hash_set {
4023
4186
  (std::is_same<SlotAlloc, std::allocator<slot_type>>::value
4024
4187
  ? &DeallocateStandard<alignof(slot_type)>
4025
4188
  : &raw_hash_set::dealloc_fn),
4026
- &raw_hash_set::resize_impl,
4189
+ &raw_hash_set::resize_impl
4027
4190
  };
4028
4191
  return value;
4029
4192
  }
@@ -4047,7 +4210,8 @@ struct HashtableFreeFunctionsAccess {
4047
4210
  if (c->is_soo()) {
4048
4211
  auto it = c->soo_iterator();
4049
4212
  if (!pred(*it)) {
4050
- assert(c->size() == 1 && "hash table was modified unexpectedly");
4213
+ ABSL_SWISSTABLE_ASSERT(c->size() == 1 &&
4214
+ "hash table was modified unexpectedly");
4051
4215
  return 0;
4052
4216
  }
4053
4217
  c->destroy(it.slot());
@@ -4067,8 +4231,9 @@ struct HashtableFreeFunctionsAccess {
4067
4231
  });
4068
4232
  // NOTE: IterateOverFullSlots allow removal of the current element, so we
4069
4233
  // verify the size additionally here.
4070
- assert(original_size_for_assert - num_deleted == c->size() &&
4071
- "hash table was modified unexpectedly");
4234
+ ABSL_SWISSTABLE_ASSERT(original_size_for_assert - num_deleted ==
4235
+ c->size() &&
4236
+ "hash table was modified unexpectedly");
4072
4237
  return num_deleted;
4073
4238
  }
4074
4239
 
@@ -4162,5 +4327,6 @@ ABSL_NAMESPACE_END
4162
4327
  #undef ABSL_SWISSTABLE_ENABLE_GENERATIONS
4163
4328
  #undef ABSL_SWISSTABLE_IGNORE_UNINITIALIZED
4164
4329
  #undef ABSL_SWISSTABLE_IGNORE_UNINITIALIZED_RETURN
4330
+ #undef ABSL_SWISSTABLE_ASSERT
4165
4331
 
4166
4332
  #endif // ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_