grpc 1.45.0 → 1.53.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (1842) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +437 -254
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/endpoint_config.h +11 -5
  7. data/include/grpc/event_engine/event_engine.h +129 -39
  8. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  9. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  10. data/include/grpc/event_engine/memory_allocator.h +1 -16
  11. data/include/grpc/event_engine/port.h +1 -1
  12. data/include/grpc/event_engine/slice.h +306 -0
  13. data/include/grpc/event_engine/slice_buffer.h +159 -0
  14. data/include/grpc/fork.h +25 -1
  15. data/include/grpc/grpc.h +4 -14
  16. data/include/grpc/grpc_posix.h +1 -1
  17. data/include/grpc/grpc_security.h +11 -0
  18. data/include/grpc/impl/codegen/atm.h +3 -71
  19. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -67
  20. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -61
  21. data/include/grpc/impl/codegen/atm_windows.h +3 -108
  22. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  23. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  24. data/include/grpc/impl/codegen/compression_types.h +5 -83
  25. data/include/grpc/impl/codegen/connectivity_state.h +5 -21
  26. data/include/grpc/impl/codegen/fork.h +4 -25
  27. data/include/grpc/impl/codegen/gpr_types.h +4 -35
  28. data/include/grpc/impl/codegen/grpc_types.h +5 -797
  29. data/include/grpc/impl/codegen/log.h +3 -86
  30. data/include/grpc/impl/codegen/port_platform.h +3 -699
  31. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  32. data/include/grpc/impl/codegen/slice.h +4 -107
  33. data/include/grpc/impl/codegen/status.h +4 -131
  34. data/include/grpc/impl/codegen/sync.h +3 -42
  35. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  36. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  37. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  38. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  39. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  40. data/include/grpc/impl/compression_types.h +109 -0
  41. data/include/grpc/impl/connectivity_state.h +47 -0
  42. data/include/grpc/impl/grpc_types.h +827 -0
  43. data/include/grpc/impl/propagation_bits.h +54 -0
  44. data/include/grpc/impl/slice_type.h +112 -0
  45. data/include/grpc/load_reporting.h +1 -1
  46. data/include/grpc/module.modulemap +5 -1
  47. data/include/grpc/slice.h +1 -1
  48. data/include/grpc/status.h +131 -1
  49. data/include/grpc/support/atm.h +70 -1
  50. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  51. data/include/grpc/support/atm_gcc_sync.h +58 -1
  52. data/include/grpc/support/atm_windows.h +105 -1
  53. data/include/grpc/support/log.h +87 -1
  54. data/include/grpc/support/log_windows.h +1 -1
  55. data/include/grpc/support/port_platform.h +767 -1
  56. data/include/grpc/support/string_util.h +1 -1
  57. data/include/grpc/support/sync.h +35 -2
  58. data/include/grpc/support/sync_abseil.h +11 -1
  59. data/include/grpc/support/sync_custom.h +13 -1
  60. data/include/grpc/support/sync_generic.h +24 -1
  61. data/include/grpc/support/sync_posix.h +27 -1
  62. data/include/grpc/support/sync_windows.h +15 -1
  63. data/include/grpc/support/time.h +31 -6
  64. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
  65. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
  66. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
  67. data/src/core/ext/filters/census/grpc_context.cc +19 -17
  68. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +315 -0
  69. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +142 -0
  70. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  71. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +6 -4
  72. data/src/core/ext/filters/client_channel/backend_metric.cc +19 -12
  73. data/src/core/ext/filters/client_channel/backend_metric.h +21 -11
  74. data/src/core/ext/filters/client_channel/backup_poller.cc +34 -34
  75. data/src/core/ext/filters/client_channel/backup_poller.h +26 -28
  76. data/src/core/ext/filters/client_channel/channel_connectivity.cc +89 -44
  77. data/src/core/ext/filters/client_channel/client_channel.cc +557 -540
  78. data/src/core/ext/filters/client_channel/client_channel.h +70 -26
  79. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -23
  80. data/src/core/ext/filters/client_channel/client_channel_channelz.h +33 -23
  81. data/src/core/ext/filters/client_channel/client_channel_factory.cc +19 -43
  82. data/src/core/ext/filters/client_channel/client_channel_factory.h +11 -11
  83. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +22 -47
  84. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  85. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +33 -27
  86. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  87. data/src/core/ext/filters/client_channel/config_selector.h +29 -23
  88. data/src/core/ext/filters/client_channel/connector.h +19 -10
  89. data/src/core/ext/filters/client_channel/dynamic_filters.cc +40 -54
  90. data/src/core/ext/filters/client_channel/dynamic_filters.h +20 -11
  91. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  92. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +24 -21
  93. data/src/core/ext/filters/client_channel/health/health_check_client.cc +137 -582
  94. data/src/core/ext/filters/client_channel/health/health_check_client.h +29 -163
  95. data/src/core/ext/filters/client_channel/http_proxy.cc +130 -164
  96. data/src/core/ext/filters/client_channel/http_proxy.h +46 -22
  97. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  98. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +8 -5
  99. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +4 -3
  100. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  101. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +37 -16
  102. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +18 -13
  103. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +71 -131
  104. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +41 -24
  105. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +410 -375
  106. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +26 -27
  107. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
  108. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +9 -7
  109. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  110. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +27 -22
  111. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +28 -19
  112. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +26 -25
  113. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +338 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  115. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
  116. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1129 -0
  117. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
  118. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +174 -180
  119. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +478 -479
  120. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +491 -409
  121. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +19 -9
  122. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +618 -642
  123. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +261 -234
  124. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +165 -143
  125. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
  126. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
  127. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
  128. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +280 -248
  129. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +251 -187
  130. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  131. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +19 -15
  132. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
  133. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +178 -256
  134. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +212 -216
  135. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +543 -584
  136. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +819 -0
  137. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +67 -0
  138. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +369 -0
  139. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  140. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +22 -21
  141. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +34 -19
  142. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +579 -376
  143. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +50 -44
  144. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +31 -30
  145. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +89 -84
  146. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +300 -209
  147. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +82 -61
  148. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  149. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +20 -19
  150. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  151. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +22 -22
  152. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +86 -224
  153. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -34
  154. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +19 -5
  155. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +135 -63
  156. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +269 -0
  157. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +121 -0
  158. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -27
  159. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +413 -303
  160. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +6 -4
  161. data/src/core/ext/filters/client_channel/retry_filter.cc +184 -166
  162. data/src/core/ext/filters/client_channel/retry_filter.h +4 -3
  163. data/src/core/ext/filters/client_channel/retry_service_config.cc +197 -229
  164. data/src/core/ext/filters/client_channel/retry_service_config.h +29 -26
  165. data/src/core/ext/filters/client_channel/retry_throttle.cc +28 -37
  166. data/src/core/ext/filters/client_channel/retry_throttle.h +36 -29
  167. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +34 -17
  168. data/src/core/ext/filters/client_channel/subchannel.cc +336 -388
  169. data/src/core/ext/filters/client_channel/subchannel.h +112 -82
  170. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  171. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
  172. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +41 -47
  173. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +470 -0
  174. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +222 -0
  175. data/src/core/ext/filters/deadline/deadline_filter.cc +94 -76
  176. data/src/core/ext/filters/deadline/deadline_filter.h +14 -12
  177. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +154 -372
  178. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +41 -9
  179. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  180. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +34 -13
  181. data/src/core/ext/filters/http/client/http_client_filter.cc +119 -477
  182. data/src/core/ext/filters/http/client/http_client_filter.h +55 -25
  183. data/src/core/ext/filters/http/client_authority_filter.cc +48 -58
  184. data/src/core/ext/filters/http/client_authority_filter.h +32 -28
  185. data/src/core/ext/filters/http/http_filters_plugin.cc +46 -52
  186. data/src/core/ext/filters/http/message_compress/compression_filter.cc +307 -0
  187. data/src/core/ext/filters/http/message_compress/compression_filter.h +139 -0
  188. data/src/core/ext/filters/http/server/http_server_filter.cc +111 -385
  189. data/src/core/ext/filters/http/server/http_server_filter.h +58 -24
  190. data/src/core/ext/filters/message_size/message_size_filter.cc +117 -137
  191. data/src/core/ext/filters/message_size/message_size_filter.h +34 -17
  192. data/src/core/ext/filters/rbac/rbac_filter.cc +29 -16
  193. data/src/core/ext/filters/rbac/rbac_filter.h +11 -3
  194. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +736 -523
  195. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +18 -7
  196. data/src/core/ext/filters/server_config_selector/server_config_selector.h +20 -8
  197. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +90 -202
  198. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +4 -3
  199. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +219 -0
  200. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  201. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  202. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  203. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  204. data/src/core/ext/transport/chttp2/alpn/alpn.h +24 -24
  205. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +186 -241
  206. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +38 -30
  207. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +209 -215
  208. data/src/core/ext/transport/chttp2/server/chttp2_server.h +26 -26
  209. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +24 -24
  210. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +35 -34
  211. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +31 -30
  212. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +29 -29
  213. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +893 -1079
  214. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +28 -23
  215. data/src/core/ext/transport/chttp2/transport/context_list.cc +23 -19
  216. data/src/core/ext/transport/chttp2/transport/context_list.h +32 -29
  217. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +251 -0
  218. data/src/core/ext/transport/chttp2/transport/decode_huff.h +971 -0
  219. data/src/core/ext/transport/chttp2/transport/flow_control.cc +350 -300
  220. data/src/core/ext/transport/chttp2/transport/flow_control.h +248 -325
  221. data/src/core/ext/transport/chttp2/transport/frame.h +22 -26
  222. data/src/core/ext/transport/chttp2/transport/frame_data.cc +85 -234
  223. data/src/core/ext/transport/chttp2/transport/frame_data.h +38 -61
  224. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +41 -36
  225. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +24 -22
  226. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +31 -25
  227. data/src/core/ext/transport/chttp2/transport/frame_ping.h +25 -22
  228. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +35 -26
  229. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +24 -21
  230. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +46 -77
  231. data/src/core/ext/transport/chttp2/transport/frame_settings.h +27 -23
  232. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +34 -33
  233. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +24 -21
  234. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +10 -4
  235. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +169 -220
  236. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +59 -61
  237. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +4 -1
  238. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +14 -5
  239. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +114 -542
  240. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +31 -24
  241. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +75 -67
  242. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +70 -48
  243. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  244. data/src/core/ext/transport/chttp2/transport/http2_settings.h +39 -38
  245. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  246. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  247. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  248. data/src/core/ext/transport/chttp2/transport/huffsyms.h +21 -21
  249. data/src/core/ext/transport/chttp2/transport/internal.h +250 -298
  250. data/src/core/ext/transport/chttp2/transport/parsing.cc +365 -132
  251. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +30 -30
  252. data/src/core/ext/transport/chttp2/transport/stream_map.cc +24 -24
  253. data/src/core/ext/transport/chttp2/transport/stream_map.h +34 -33
  254. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  255. data/src/core/ext/transport/chttp2/transport/varint.h +39 -34
  256. data/src/core/ext/transport/chttp2/transport/writing.cc +144 -106
  257. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -18
  258. data/src/core/ext/transport/inproc/inproc_transport.cc +227 -274
  259. data/src/core/ext/transport/inproc/inproc_transport.h +23 -21
  260. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
  261. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +173 -73
  262. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +39 -36
  263. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +210 -85
  264. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +29 -344
  265. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +189 -1489
  266. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +388 -0
  267. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1953 -0
  268. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
  269. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +38 -17
  270. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +9 -7
  271. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +56 -13
  272. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
  273. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +24 -2
  274. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
  275. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +19 -6
  276. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
  277. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +15 -2
  278. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
  279. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +229 -82
  280. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
  281. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +16 -4
  282. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
  283. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
  284. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
  285. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +26 -4
  286. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
  287. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +379 -140
  288. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +140 -126
  289. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +824 -301
  290. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
  291. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +114 -29
  292. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +195 -191
  293. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1042 -412
  294. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  295. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +16 -4
  296. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
  297. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +171 -42
  298. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
  299. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +517 -202
  300. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +61 -36
  301. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +333 -66
  302. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
  303. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +20 -6
  304. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +93 -91
  305. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +615 -213
  306. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
  307. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +417 -79
  308. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
  309. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +20 -8
  310. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
  311. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +16 -93
  312. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
  313. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +38 -17
  314. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
  315. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +447 -157
  316. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +98 -66
  317. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +545 -191
  318. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  319. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +33 -13
  320. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +108 -87
  321. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +502 -149
  322. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
  323. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +9 -2
  324. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
  325. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +42 -17
  326. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +24 -9
  327. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +110 -18
  328. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  329. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +64 -26
  330. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  331. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +20 -6
  332. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
  333. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +118 -49
  334. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +39 -32
  335. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +242 -87
  336. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  337. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +226 -105
  338. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  339. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +13 -4
  340. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +86 -53
  341. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +475 -141
  342. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
  343. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +379 -160
  344. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +16 -12
  345. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +77 -16
  346. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +9 -6
  347. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +50 -8
  348. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
  349. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +26 -6
  350. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
  351. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +253 -102
  352. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
  353. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +229 -92
  354. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +74 -55
  355. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +494 -160
  356. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +38 -30
  357. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +232 -124
  358. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +458 -351
  359. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2879 -947
  360. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
  361. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +67 -22
  362. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +79 -54
  363. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +454 -133
  364. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +5 -4
  365. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +21 -2
  366. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
  367. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +16 -4
  368. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
  369. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +38 -14
  370. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
  371. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +33 -14
  372. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
  373. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +89 -38
  374. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +47 -0
  375. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +107 -0
  376. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
  377. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +13 -4
  378. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
  379. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +58 -21
  380. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
  381. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
  382. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
  383. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +50 -16
  384. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +9 -8
  385. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +43 -10
  386. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
  387. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +16 -8
  388. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
  389. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +101 -38
  390. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
  391. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +167 -71
  392. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +16 -8
  393. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +88 -16
  394. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +14 -11
  395. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +71 -17
  396. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  397. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  398. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +184 -144
  399. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1091 -361
  400. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  401. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  402. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.c +54 -0
  403. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +188 -0
  404. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
  405. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
  406. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +56 -0
  407. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +192 -0
  408. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  409. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
  410. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +56 -48
  411. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +327 -130
  412. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
  413. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +88 -31
  414. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +83 -56
  415. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +472 -136
  416. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
  417. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +35 -13
  418. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  419. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
  420. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +171 -54
  421. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +917 -134
  422. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
  423. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +59 -25
  424. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +33 -33
  425. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +205 -76
  426. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
  427. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +23 -8
  428. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  429. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +62 -25
  430. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
  431. data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
  432. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
  433. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +36 -8
  434. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
  435. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +55 -22
  436. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
  437. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +26 -11
  438. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
  439. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +30 -11
  440. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
  441. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +20 -8
  442. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
  443. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +58 -22
  444. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
  445. data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
  446. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
  447. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +82 -29
  448. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
  449. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +49 -22
  450. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
  451. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +99 -36
  452. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
  453. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +118 -44
  454. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
  455. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +120 -40
  456. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
  457. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +46 -16
  458. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
  459. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +9 -2
  460. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
  461. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +25 -8
  462. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
  463. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +36 -6
  464. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  465. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  466. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
  467. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
  468. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +15 -2
  469. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
  470. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +23 -6
  471. data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
  472. data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
  473. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
  474. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +477 -185
  475. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
  476. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +512 -182
  477. data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
  478. data/src/core/ext/upb-generated/google/api/http.upb.h +134 -49
  479. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
  480. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +25 -9
  481. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
  482. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +12 -2
  483. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +183 -181
  484. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1332 -488
  485. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
  486. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +16 -6
  487. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  488. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
  489. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  490. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +126 -46
  491. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
  492. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +16 -6
  493. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
  494. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +81 -18
  495. data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
  496. data/src/core/ext/upb-generated/google/rpc/status.upb.h +25 -9
  497. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
  498. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +89 -30
  499. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  500. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +55 -14
  501. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
  502. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +424 -169
  503. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
  504. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +32 -8
  505. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
  506. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +18 -4
  507. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  508. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +204 -76
  509. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
  510. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +63 -22
  511. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  512. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +792 -0
  513. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
  514. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +115 -16
  515. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
  516. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +29 -4
  517. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
  518. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
  519. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
  520. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +33 -8
  521. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
  522. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +26 -4
  523. data/src/core/ext/upb-generated/validate/validate.upb.c +264 -253
  524. data/src/core/ext/upb-generated/validate/validate.upb.h +1974 -709
  525. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
  526. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +115 -16
  527. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
  528. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +29 -4
  529. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
  530. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
  531. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
  532. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +94 -18
  533. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
  534. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +26 -4
  535. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
  536. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +9 -2
  537. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  538. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  539. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  540. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +50 -16
  541. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
  542. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +33 -12
  543. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
  544. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +16 -4
  545. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  546. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +27 -10
  547. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
  548. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +83 -34
  549. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
  550. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +22 -4
  551. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +14 -13
  552. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +84 -28
  553. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +46 -0
  554. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
  555. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  556. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  557. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  558. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  559. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  560. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  561. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  562. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  563. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
  564. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +309 -121
  565. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  566. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  567. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
  568. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +31 -12
  569. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
  570. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +82 -29
  571. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  572. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  573. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  574. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  575. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -4
  576. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +16 -4
  577. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
  578. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
  579. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
  580. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +277 -0
  581. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +125 -0
  582. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
  583. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
  584. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +199 -187
  585. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
  586. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +149 -129
  587. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
  588. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
  589. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
  590. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
  591. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +187 -183
  592. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
  593. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
  594. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
  595. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
  596. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +168 -154
  597. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
  598. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +190 -186
  599. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
  600. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
  601. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
  602. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
  603. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +164 -137
  604. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  605. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
  606. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
  607. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
  608. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -129
  609. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  610. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -68
  611. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +2 -2
  612. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +828 -747
  613. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +20 -0
  614. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
  615. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
  616. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +16 -14
  617. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +48 -0
  618. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  619. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
  620. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
  621. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
  622. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
  623. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  624. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  625. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +483 -445
  626. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  627. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  628. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  629. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
  630. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +211 -193
  631. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
  632. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +156 -84
  633. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
  634. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
  635. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
  636. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
  637. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
  638. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
  639. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
  640. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  641. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  642. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
  643. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
  644. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  645. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  646. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  647. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  648. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  649. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  650. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  651. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  652. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  653. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  654. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  655. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  656. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  657. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  658. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  659. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  660. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  661. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  662. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  663. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  664. data/src/core/ext/xds/certificate_provider_store.cc +75 -3
  665. data/src/core/ext/xds/certificate_provider_store.h +30 -4
  666. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +17 -10
  667. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +12 -4
  668. data/src/core/ext/xds/upb_utils.h +3 -25
  669. data/src/core/ext/xds/xds_api.cc +106 -192
  670. data/src/core/ext/xds/xds_api.h +41 -39
  671. data/src/core/ext/xds/xds_bootstrap.cc +5 -537
  672. data/src/core/ext/xds/xds_bootstrap.h +42 -95
  673. data/src/core/ext/xds/xds_bootstrap_grpc.cc +362 -0
  674. data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
  675. data/src/core/ext/xds/xds_certificate_provider.cc +36 -25
  676. data/src/core/ext/xds/xds_certificate_provider.h +36 -4
  677. data/src/core/ext/xds/xds_channel_args.h +3 -3
  678. data/src/core/ext/xds/xds_channel_stack_modifier.cc +17 -7
  679. data/src/core/ext/xds/xds_channel_stack_modifier.h +16 -4
  680. data/src/core/ext/xds/xds_client.cc +885 -1360
  681. data/src/core/ext/xds/xds_client.h +69 -65
  682. data/src/core/ext/xds/xds_client_grpc.cc +235 -0
  683. data/src/core/ext/xds/xds_client_grpc.h +79 -0
  684. data/src/core/ext/xds/xds_client_stats.cc +24 -25
  685. data/src/core/ext/xds/xds_client_stats.h +26 -24
  686. data/src/core/ext/xds/xds_cluster.cc +505 -247
  687. data/src/core/ext/xds/xds_cluster.h +69 -40
  688. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +132 -0
  689. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +97 -0
  690. data/src/core/ext/xds/xds_common_types.cc +238 -123
  691. data/src/core/ext/xds/xds_common_types.h +29 -16
  692. data/src/core/ext/xds/xds_endpoint.cc +266 -156
  693. data/src/core/ext/xds/xds_endpoint.h +19 -15
  694. data/src/core/ext/xds/xds_health_status.cc +80 -0
  695. data/src/core/ext/xds/xds_health_status.h +109 -0
  696. data/src/core/ext/xds/xds_http_fault_filter.cc +68 -59
  697. data/src/core/ext/xds/xds_http_fault_filter.h +19 -25
  698. data/src/core/ext/xds/xds_http_filters.cc +70 -71
  699. data/src/core/ext/xds/xds_http_filters.h +73 -25
  700. data/src/core/ext/xds/xds_http_rbac_filter.cc +168 -225
  701. data/src/core/ext/xds/xds_http_rbac_filter.h +22 -18
  702. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  703. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  704. data/src/core/ext/xds/xds_lb_policy_registry.cc +334 -0
  705. data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
  706. data/src/core/ext/xds/xds_listener.cc +573 -481
  707. data/src/core/ext/xds/xds_listener.h +57 -51
  708. data/src/core/ext/xds/xds_resource_type.h +28 -22
  709. data/src/core/ext/xds/xds_resource_type_impl.h +18 -17
  710. data/src/core/ext/xds/xds_route_config.cc +638 -479
  711. data/src/core/ext/xds/xds_route_config.h +79 -42
  712. data/src/core/ext/xds/xds_routing.cc +21 -7
  713. data/src/core/ext/xds/xds_routing.h +17 -12
  714. data/src/core/ext/xds/xds_server_config_fetcher.cc +244 -200
  715. data/src/core/ext/xds/xds_transport.h +86 -0
  716. data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
  717. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  718. data/src/core/lib/address_utils/parse_address.cc +52 -52
  719. data/src/core/lib/address_utils/parse_address.h +46 -42
  720. data/src/core/lib/address_utils/sockaddr_utils.cc +90 -54
  721. data/src/core/lib/address_utils/sockaddr_utils.h +45 -40
  722. data/src/core/lib/avl/avl.h +100 -13
  723. data/src/core/lib/backoff/backoff.cc +19 -21
  724. data/src/core/lib/backoff/backoff.h +21 -21
  725. data/src/core/lib/channel/call_finalization.h +6 -4
  726. data/src/core/lib/channel/call_tracer.h +27 -9
  727. data/src/core/lib/channel/channel_args.cc +268 -101
  728. data/src/core/lib/channel/channel_args.h +461 -56
  729. data/src/core/lib/channel/channel_args_preconditioning.cc +6 -11
  730. data/src/core/lib/channel/channel_args_preconditioning.h +7 -7
  731. data/src/core/lib/channel/channel_fwd.h +26 -0
  732. data/src/core/lib/channel/channel_stack.cc +92 -52
  733. data/src/core/lib/channel/channel_stack.h +186 -140
  734. data/src/core/lib/channel/channel_stack_builder.cc +26 -104
  735. data/src/core/lib/channel/channel_stack_builder.h +45 -31
  736. data/src/core/lib/channel/channel_stack_builder_impl.cc +126 -0
  737. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  738. data/src/core/lib/channel/channel_trace.cc +29 -36
  739. data/src/core/lib/channel/channel_trace.h +27 -24
  740. data/src/core/lib/channel/channelz.cc +50 -65
  741. data/src/core/lib/channel/channelz.h +50 -33
  742. data/src/core/lib/channel/channelz_registry.cc +28 -36
  743. data/src/core/lib/channel/channelz_registry.h +31 -30
  744. data/src/core/lib/channel/connected_channel.cc +1267 -78
  745. data/src/core/lib/channel/connected_channel.h +22 -23
  746. data/src/core/lib/channel/context.h +25 -21
  747. data/src/core/lib/channel/promise_based_filter.cc +2155 -303
  748. data/src/core/lib/channel/promise_based_filter.h +636 -122
  749. data/src/core/lib/channel/status_util.cc +64 -17
  750. data/src/core/lib/channel/status_util.h +38 -24
  751. data/src/core/lib/compression/compression.cc +24 -19
  752. data/src/core/lib/compression/compression_internal.cc +89 -70
  753. data/src/core/lib/compression/compression_internal.h +28 -27
  754. data/src/core/lib/compression/message_compress.cc +28 -26
  755. data/src/core/lib/compression/message_compress.h +28 -29
  756. data/src/core/lib/config/core_configuration.cc +8 -1
  757. data/src/core/lib/config/core_configuration.h +86 -39
  758. data/src/core/lib/debug/event_log.cc +88 -0
  759. data/src/core/lib/debug/event_log.h +81 -0
  760. data/src/core/lib/debug/histogram_view.cc +69 -0
  761. data/src/core/lib/debug/histogram_view.h +37 -0
  762. data/src/core/lib/debug/stats.cc +48 -152
  763. data/src/core/lib/debug/stats.h +50 -57
  764. data/src/core/lib/debug/stats_data.cc +302 -649
  765. data/src/core/lib/debug/stats_data.h +293 -548
  766. data/src/core/lib/debug/trace.cc +18 -20
  767. data/src/core/lib/debug/trace.h +27 -48
  768. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +16 -17
  769. data/src/core/lib/event_engine/channel_args_endpoint_config.h +16 -9
  770. data/src/core/lib/event_engine/common_closures.h +71 -0
  771. data/src/core/lib/event_engine/default_event_engine.cc +99 -0
  772. data/src/core/lib/event_engine/default_event_engine.h +73 -0
  773. data/src/core/lib/event_engine/default_event_engine_factory.cc +24 -3
  774. data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine_factory.h} +6 -9
  775. data/src/core/lib/event_engine/event_engine.cc +3 -30
  776. data/src/core/lib/event_engine/executor/executor.h +38 -0
  777. data/src/core/lib/event_engine/forkable.cc +106 -0
  778. data/src/core/lib/event_engine/forkable.h +61 -0
  779. data/src/core/lib/event_engine/handle_containers.h +74 -0
  780. data/src/core/lib/event_engine/memory_allocator.cc +11 -3
  781. data/src/core/lib/event_engine/poller.h +62 -0
  782. data/src/core/lib/event_engine/posix.h +158 -0
  783. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +642 -0
  784. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +139 -0
  785. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +899 -0
  786. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  787. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  788. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  789. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +33 -0
  790. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  791. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  792. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  793. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  794. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1305 -0
  795. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +717 -0
  796. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +640 -0
  797. data/src/core/lib/event_engine/posix_engine/posix_engine.h +259 -0
  798. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  799. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +289 -0
  800. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +279 -0
  801. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +379 -0
  802. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  803. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  804. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  805. data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
  806. data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
  807. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
  808. data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
  809. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +173 -0
  810. data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
  811. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  812. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  813. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  814. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  815. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  816. data/src/core/lib/{iomgr/event_engine/promise.h → event_engine/posix_engine/wakeup_fd_pipe.h} +19 -25
  817. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  818. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  819. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  820. data/src/core/lib/event_engine/resolved_address.cc +23 -2
  821. data/src/core/lib/{iomgr/event_engine → event_engine}/resolved_address_internal.h +5 -8
  822. data/src/core/lib/event_engine/shim.cc +56 -0
  823. data/src/core/lib/event_engine/shim.h +33 -0
  824. data/src/core/lib/event_engine/slice.cc +103 -0
  825. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  826. data/src/core/lib/event_engine/tcp_socket_utils.cc +389 -0
  827. data/src/core/lib/event_engine/tcp_socket_utils.h +90 -0
  828. data/src/core/lib/event_engine/thread_local.cc +29 -0
  829. data/src/core/lib/event_engine/thread_local.h +32 -0
  830. data/src/core/lib/event_engine/thread_pool.cc +253 -0
  831. data/src/core/lib/event_engine/thread_pool.h +141 -0
  832. data/src/core/lib/event_engine/time_util.cc +30 -0
  833. data/src/core/lib/event_engine/time_util.h +32 -0
  834. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/event_engine/trace.cc} +9 -13
  835. data/src/core/lib/event_engine/trace.h +43 -0
  836. data/src/core/lib/event_engine/utils.cc +44 -0
  837. data/src/core/lib/event_engine/utils.h +44 -0
  838. data/src/core/lib/event_engine/windows/iocp.cc +140 -0
  839. data/src/core/lib/event_engine/windows/iocp.h +69 -0
  840. data/src/core/lib/event_engine/windows/win_socket.cc +219 -0
  841. data/src/core/lib/event_engine/windows/win_socket.h +129 -0
  842. data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
  843. data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
  844. data/src/core/lib/event_engine/windows/windows_engine.cc +388 -0
  845. data/src/core/lib/event_engine/windows/windows_engine.h +163 -0
  846. data/src/core/lib/experiments/config.cc +161 -0
  847. data/src/core/lib/experiments/config.h +53 -0
  848. data/src/core/lib/experiments/experiments.cc +81 -0
  849. data/src/core/lib/experiments/experiments.h +117 -0
  850. data/src/core/lib/gpr/alloc.cc +19 -25
  851. data/src/core/lib/gpr/alloc.h +20 -20
  852. data/src/core/lib/gpr/atm.cc +17 -17
  853. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  854. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  855. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  856. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  857. data/src/core/lib/gpr/log.cc +30 -17
  858. data/src/core/lib/gpr/log_android.cc +22 -20
  859. data/src/core/lib/gpr/log_linux.cc +24 -24
  860. data/src/core/lib/gpr/log_posix.cc +20 -19
  861. data/src/core/lib/gpr/log_windows.cc +25 -25
  862. data/src/core/lib/gpr/spinlock.h +20 -20
  863. data/src/core/lib/gpr/string.cc +25 -24
  864. data/src/core/lib/gpr/string.h +61 -61
  865. data/src/core/lib/gpr/string_posix.cc +24 -24
  866. data/src/core/lib/gpr/string_util_windows.cc +25 -52
  867. data/src/core/lib/gpr/string_windows.cc +24 -24
  868. data/src/core/lib/gpr/sync.cc +25 -25
  869. data/src/core/lib/gpr/sync_abseil.cc +36 -40
  870. data/src/core/lib/gpr/sync_posix.cc +22 -34
  871. data/src/core/lib/gpr/sync_windows.cc +29 -27
  872. data/src/core/lib/gpr/time.cc +34 -30
  873. data/src/core/lib/gpr/time_posix.cc +41 -45
  874. data/src/core/lib/gpr/time_precise.cc +22 -22
  875. data/src/core/lib/gpr/time_precise.h +21 -22
  876. data/src/core/lib/gpr/time_windows.cc +35 -29
  877. data/src/core/lib/gpr/tmpfile.h +24 -24
  878. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  879. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  880. data/src/core/lib/gpr/tmpfile_windows.cc +28 -29
  881. data/src/core/lib/gpr/useful.h +83 -30
  882. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  883. data/src/core/lib/gprpp/atomic_utils.h +20 -20
  884. data/src/core/lib/gprpp/bitset.h +47 -17
  885. data/src/core/lib/gprpp/chunked_vector.h +7 -3
  886. data/src/core/lib/gprpp/construct_destruct.h +4 -3
  887. data/src/core/lib/gprpp/cpp_impl_of.h +7 -3
  888. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  889. data/src/core/lib/gprpp/crash.h +34 -0
  890. data/src/core/lib/gprpp/debug_location.h +60 -31
  891. data/src/core/lib/gprpp/dual_ref_counted.h +4 -7
  892. data/src/core/lib/gprpp/env.h +53 -0
  893. data/src/core/lib/gprpp/env_linux.cc +80 -0
  894. data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc → lib/gprpp/env_posix.cc} +25 -9
  895. data/src/core/lib/gprpp/env_windows.cc +56 -0
  896. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  897. data/src/core/lib/gprpp/examine_stack.h +21 -22
  898. data/src/core/lib/gprpp/fork.cc +58 -53
  899. data/src/core/lib/gprpp/fork.h +29 -35
  900. data/src/core/lib/gprpp/global_config.h +22 -24
  901. data/src/core/lib/gprpp/global_config_custom.h +20 -20
  902. data/src/core/lib/gprpp/global_config_env.cc +28 -25
  903. data/src/core/lib/gprpp/global_config_env.h +29 -27
  904. data/src/core/lib/gprpp/global_config_generic.h +21 -25
  905. data/src/core/lib/gprpp/host_port.cc +30 -26
  906. data/src/core/lib/gprpp/host_port.h +32 -31
  907. data/src/core/lib/gprpp/load_file.cc +75 -0
  908. data/src/core/lib/gprpp/load_file.h +33 -0
  909. data/src/core/lib/gprpp/manual_constructor.h +21 -89
  910. data/src/core/lib/gprpp/match.h +75 -0
  911. data/src/core/lib/gprpp/memory.h +22 -26
  912. data/src/core/lib/gprpp/mpscq.cc +17 -17
  913. data/src/core/lib/gprpp/mpscq.h +21 -21
  914. data/src/core/lib/gprpp/no_destruct.h +95 -0
  915. data/src/core/lib/gprpp/notification.h +67 -0
  916. data/src/core/lib/gprpp/orphanable.h +22 -25
  917. data/src/core/lib/gprpp/overload.h +59 -0
  918. data/src/core/lib/gprpp/packed_table.h +40 -0
  919. data/src/core/lib/gprpp/per_cpu.h +46 -0
  920. data/src/core/lib/gprpp/ref_counted.h +24 -24
  921. data/src/core/lib/gprpp/ref_counted_ptr.h +42 -55
  922. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  923. data/src/core/lib/gprpp/sorted_pack.h +98 -0
  924. data/src/core/lib/gprpp/stat.h +3 -5
  925. data/src/core/lib/gprpp/stat_posix.cc +10 -4
  926. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  927. data/src/core/lib/gprpp/status_helper.cc +56 -20
  928. data/src/core/lib/gprpp/status_helper.h +13 -5
  929. data/src/core/lib/gprpp/strerror.cc +43 -0
  930. data/src/core/lib/gprpp/strerror.h +29 -0
  931. data/src/core/lib/gprpp/sync.h +26 -24
  932. data/src/core/lib/gprpp/table.h +22 -4
  933. data/src/core/lib/gprpp/tchar.cc +49 -0
  934. data/src/core/lib/gprpp/tchar.h +33 -0
  935. data/src/core/lib/gprpp/thd.h +25 -28
  936. data/src/core/lib/gprpp/thd_posix.cc +33 -32
  937. data/src/core/lib/gprpp/thd_windows.cc +28 -26
  938. data/src/core/lib/gprpp/time.cc +64 -9
  939. data/src/core/lib/gprpp/time.h +79 -5
  940. data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
  941. data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
  942. data/src/core/lib/gprpp/time_util.cc +4 -0
  943. data/src/core/lib/gprpp/time_util.h +3 -3
  944. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  945. data/src/core/lib/gprpp/validation_errors.cc +61 -0
  946. data/src/core/lib/gprpp/validation_errors.h +127 -0
  947. data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
  948. data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -28
  949. data/src/core/lib/handshaker/proxy_mapper.h +53 -0
  950. data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
  951. data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
  952. data/src/core/lib/http/format_request.cc +54 -24
  953. data/src/core/lib/http/format_request.h +23 -21
  954. data/src/core/lib/http/httpcli.cc +139 -141
  955. data/src/core/lib/http/httpcli.h +86 -38
  956. data/src/core/lib/http/httpcli_security_connector.cc +53 -45
  957. data/src/core/lib/http/httpcli_ssl_credentials.h +6 -4
  958. data/src/core/lib/http/parser.cc +144 -85
  959. data/src/core/lib/http/parser.h +51 -35
  960. data/src/core/lib/iomgr/block_annotate.h +23 -23
  961. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  962. data/src/core/lib/iomgr/buffer_list.h +123 -101
  963. data/src/core/lib/iomgr/call_combiner.cc +32 -64
  964. data/src/core/lib/iomgr/call_combiner.h +24 -25
  965. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  966. data/src/core/lib/iomgr/cfstream_handle.h +25 -25
  967. data/src/core/lib/iomgr/{event_engine/pollset.h → closure.cc} +9 -7
  968. data/src/core/lib/iomgr/closure.h +95 -58
  969. data/src/core/lib/iomgr/combiner.cc +20 -39
  970. data/src/core/lib/iomgr/combiner.h +20 -20
  971. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  972. data/src/core/lib/iomgr/dynamic_annotations.h +22 -22
  973. data/src/core/lib/iomgr/endpoint.cc +21 -21
  974. data/src/core/lib/iomgr/endpoint.h +53 -51
  975. data/src/core/lib/iomgr/endpoint_cfstream.cc +51 -47
  976. data/src/core/lib/iomgr/endpoint_cfstream.h +32 -32
  977. data/src/core/lib/iomgr/endpoint_pair.h +20 -20
  978. data/src/core/lib/iomgr/endpoint_pair_posix.cc +34 -27
  979. data/src/core/lib/iomgr/endpoint_pair_windows.cc +30 -21
  980. data/src/core/lib/iomgr/error.cc +51 -834
  981. data/src/core/lib/iomgr/error.h +45 -317
  982. data/src/core/lib/iomgr/error_cfstream.cc +18 -23
  983. data/src/core/lib/iomgr/error_cfstream.h +21 -21
  984. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  985. data/src/core/lib/iomgr/ev_apple.h +21 -21
  986. data/src/core/lib/iomgr/ev_epoll1_linux.cc +263 -248
  987. data/src/core/lib/iomgr/ev_epoll1_linux.h +21 -21
  988. data/src/core/lib/iomgr/ev_poll_posix.cc +296 -271
  989. data/src/core/lib/iomgr/ev_poll_posix.h +22 -22
  990. data/src/core/lib/iomgr/ev_posix.cc +88 -122
  991. data/src/core/lib/iomgr/ev_posix.h +93 -87
  992. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  993. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.cc +15 -30
  994. data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.h +10 -13
  995. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
  996. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
  997. data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
  998. data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
  999. data/src/core/lib/iomgr/exec_ctx.cc +34 -56
  1000. data/src/core/lib/iomgr/exec_ctx.h +152 -177
  1001. data/src/core/lib/iomgr/executor.cc +21 -31
  1002. data/src/core/lib/iomgr/executor.h +27 -30
  1003. data/src/core/lib/iomgr/fork_posix.cc +31 -28
  1004. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  1005. data/src/core/lib/iomgr/gethostname.h +20 -20
  1006. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  1007. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  1008. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  1009. data/src/core/lib/iomgr/grpc_if_nametoindex.h +22 -22
  1010. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  1011. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  1012. data/src/core/lib/iomgr/internal_errqueue.cc +41 -48
  1013. data/src/core/lib/iomgr/internal_errqueue.h +84 -89
  1014. data/src/core/lib/iomgr/iocp_windows.cc +23 -23
  1015. data/src/core/lib/iomgr/iocp_windows.h +21 -21
  1016. data/src/core/lib/iomgr/iomgr.cc +25 -20
  1017. data/src/core/lib/iomgr/iomgr.h +35 -35
  1018. data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
  1019. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  1020. data/src/core/lib/iomgr/iomgr_internal.h +28 -28
  1021. data/src/core/lib/iomgr/iomgr_posix.cc +21 -20
  1022. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +21 -19
  1023. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  1024. data/src/core/lib/iomgr/load_file.cc +24 -27
  1025. data/src/core/lib/iomgr/load_file.h +22 -22
  1026. data/src/core/lib/iomgr/lockfree_event.cc +114 -131
  1027. data/src/core/lib/iomgr/lockfree_event.h +23 -23
  1028. data/src/core/lib/iomgr/nameser.h +86 -86
  1029. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  1030. data/src/core/lib/iomgr/polling_entity.h +29 -29
  1031. data/src/core/lib/iomgr/pollset.cc +17 -17
  1032. data/src/core/lib/iomgr/pollset.h +55 -55
  1033. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  1034. data/src/core/lib/iomgr/pollset_set.h +26 -28
  1035. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  1036. data/src/core/lib/iomgr/pollset_set_windows.h +20 -20
  1037. data/src/core/lib/iomgr/pollset_windows.cc +32 -31
  1038. data/src/core/lib/iomgr/pollset_windows.h +24 -24
  1039. data/src/core/lib/iomgr/port.h +59 -39
  1040. data/src/core/lib/iomgr/python_util.h +24 -24
  1041. data/src/core/lib/iomgr/resolve_address.cc +34 -20
  1042. data/src/core/lib/iomgr/resolve_address.h +73 -43
  1043. data/src/core/lib/iomgr/resolve_address_impl.h +7 -7
  1044. data/src/core/lib/iomgr/resolve_address_posix.cc +81 -62
  1045. data/src/core/lib/iomgr/resolve_address_posix.h +26 -10
  1046. data/src/core/lib/iomgr/resolve_address_windows.cc +64 -38
  1047. data/src/core/lib/iomgr/resolve_address_windows.h +26 -10
  1048. data/src/core/lib/iomgr/resolved_address.h +3 -3
  1049. data/src/core/lib/iomgr/sockaddr.h +25 -26
  1050. data/src/core/lib/iomgr/sockaddr_posix.h +23 -21
  1051. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +20 -18
  1052. data/src/core/lib/iomgr/sockaddr_windows.h +23 -21
  1053. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  1054. data/src/core/lib/iomgr/socket_factory_posix.h +32 -32
  1055. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  1056. data/src/core/lib/iomgr/socket_mutator.h +39 -39
  1057. data/src/core/lib/iomgr/socket_utils.h +27 -27
  1058. data/src/core/lib/iomgr/socket_utils_common_posix.cc +82 -101
  1059. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  1060. data/src/core/lib/iomgr/socket_utils_posix.cc +103 -19
  1061. data/src/core/lib/iomgr/socket_utils_posix.h +176 -84
  1062. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  1063. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  1064. data/src/core/lib/iomgr/socket_windows.h +59 -61
  1065. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  1066. data/src/core/lib/iomgr/systemd_utils.h +33 -0
  1067. data/src/core/lib/iomgr/tcp_client.cc +28 -24
  1068. data/src/core/lib/iomgr/tcp_client.h +49 -38
  1069. data/src/core/lib/iomgr/tcp_client_cfstream.cc +46 -35
  1070. data/src/core/lib/iomgr/tcp_client_posix.cc +244 -106
  1071. data/src/core/lib/iomgr/tcp_client_posix.h +55 -52
  1072. data/src/core/lib/iomgr/tcp_client_windows.cc +73 -53
  1073. data/src/core/lib/iomgr/tcp_posix.cc +562 -361
  1074. data/src/core/lib/iomgr/tcp_posix.h +32 -30
  1075. data/src/core/lib/iomgr/tcp_server.cc +33 -24
  1076. data/src/core/lib/iomgr/tcp_server.h +78 -69
  1077. data/src/core/lib/iomgr/tcp_server_posix.cc +402 -145
  1078. data/src/core/lib/iomgr/tcp_server_utils_posix.h +68 -55
  1079. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +120 -82
  1080. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +46 -43
  1081. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  1082. data/src/core/lib/iomgr/tcp_server_windows.cc +116 -118
  1083. data/src/core/lib/iomgr/tcp_windows.cc +116 -98
  1084. data/src/core/lib/iomgr/tcp_windows.h +34 -35
  1085. data/src/core/lib/iomgr/timer.cc +17 -17
  1086. data/src/core/lib/iomgr/timer.h +68 -68
  1087. data/src/core/lib/iomgr/timer_generic.cc +125 -134
  1088. data/src/core/lib/iomgr/timer_generic.h +21 -21
  1089. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  1090. data/src/core/lib/iomgr/timer_heap.h +22 -22
  1091. data/src/core/lib/iomgr/timer_manager.cc +31 -31
  1092. data/src/core/lib/iomgr/timer_manager.h +27 -27
  1093. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  1094. data/src/core/lib/iomgr/unix_sockets_posix.h +21 -21
  1095. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  1096. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -23
  1097. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  1098. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  1099. data/src/core/lib/iomgr/wakeup_fd_pipe.h +20 -20
  1100. data/src/core/lib/iomgr/wakeup_fd_posix.cc +33 -30
  1101. data/src/core/lib/iomgr/wakeup_fd_posix.h +52 -54
  1102. data/src/core/lib/json/json.h +23 -27
  1103. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/json/json_args.h} +13 -10
  1104. data/src/core/lib/json/json_channel_args.h +42 -0
  1105. data/src/core/lib/json/json_object_loader.cc +217 -0
  1106. data/src/core/lib/json/json_object_loader.h +634 -0
  1107. data/src/core/lib/json/json_reader.cc +123 -90
  1108. data/src/core/lib/json/json_util.cc +14 -34
  1109. data/src/core/lib/json/json_util.h +19 -10
  1110. data/src/core/lib/json/json_writer.cc +62 -57
  1111. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +30 -60
  1112. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +47 -62
  1113. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  1114. data/src/core/lib/load_balancing/lb_policy_registry.cc +142 -0
  1115. data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
  1116. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +57 -52
  1117. data/src/core/lib/matchers/matchers.cc +12 -7
  1118. data/src/core/lib/matchers/matchers.h +5 -3
  1119. data/src/core/lib/promise/activity.cc +23 -8
  1120. data/src/core/lib/promise/activity.h +116 -58
  1121. data/src/core/lib/promise/arena_promise.h +115 -72
  1122. data/src/core/lib/promise/context.h +18 -11
  1123. data/src/core/lib/promise/detail/basic_join.h +197 -0
  1124. data/src/core/lib/promise/detail/basic_seq.h +28 -33
  1125. data/src/core/lib/promise/detail/promise_factory.h +61 -14
  1126. data/src/core/lib/promise/detail/promise_like.h +3 -3
  1127. data/src/core/lib/promise/detail/status.h +33 -4
  1128. data/src/core/lib/promise/detail/switch.h +21 -21
  1129. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +23 -15
  1130. data/src/core/lib/promise/if.h +195 -0
  1131. data/src/core/lib/promise/interceptor_list.h +308 -0
  1132. data/src/core/lib/promise/intra_activity_waiter.h +55 -0
  1133. data/src/core/lib/promise/latch.h +191 -0
  1134. data/src/core/lib/promise/loop.h +13 -9
  1135. data/src/core/lib/promise/map.h +4 -6
  1136. data/src/core/lib/promise/pipe.h +608 -0
  1137. data/src/core/lib/promise/poll.h +129 -11
  1138. data/src/core/lib/promise/promise.h +5 -5
  1139. data/src/core/lib/promise/race.h +6 -10
  1140. data/src/core/lib/promise/seq.h +32 -14
  1141. data/src/core/lib/promise/sleep.cc +58 -42
  1142. data/src/core/lib/promise/sleep.h +44 -26
  1143. data/src/core/lib/promise/trace.cc +20 -0
  1144. data/src/core/{ext/filters/max_age/max_age_filter.h → lib/promise/trace.h} +6 -8
  1145. data/src/core/lib/promise/try_join.h +82 -0
  1146. data/src/core/lib/promise/try_seq.h +41 -23
  1147. data/src/core/lib/resolver/resolver.cc +17 -59
  1148. data/src/core/lib/resolver/resolver.h +21 -18
  1149. data/src/core/lib/resolver/resolver_factory.h +11 -10
  1150. data/src/core/lib/resolver/resolver_registry.cc +17 -9
  1151. data/src/core/lib/resolver/resolver_registry.h +15 -5
  1152. data/src/core/lib/resolver/server_address.cc +46 -34
  1153. data/src/core/lib/resolver/server_address.h +36 -35
  1154. data/src/core/lib/resource_quota/api.cc +25 -29
  1155. data/src/core/lib/resource_quota/api.h +14 -5
  1156. data/src/core/lib/resource_quota/arena.cc +85 -27
  1157. data/src/core/lib/resource_quota/arena.h +197 -25
  1158. data/src/core/lib/resource_quota/memory_quota.cc +322 -101
  1159. data/src/core/lib/resource_quota/memory_quota.h +191 -56
  1160. data/src/core/lib/resource_quota/periodic_update.cc +78 -0
  1161. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  1162. data/src/core/lib/resource_quota/resource_quota.h +20 -4
  1163. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  1164. data/src/core/lib/resource_quota/thread_quota.h +7 -3
  1165. data/src/core/lib/resource_quota/trace.h +3 -3
  1166. data/src/core/lib/security/authorization/authorization_engine.h +3 -3
  1167. data/src/core/lib/security/authorization/authorization_policy_provider.h +17 -3
  1168. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +3 -0
  1169. data/src/core/lib/security/authorization/evaluate_args.cc +17 -8
  1170. data/src/core/lib/security/authorization/evaluate_args.h +9 -6
  1171. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +5 -1
  1172. data/src/core/lib/security/authorization/grpc_authorization_engine.h +10 -3
  1173. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +26 -13
  1174. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +20 -10
  1175. data/src/core/lib/security/authorization/matchers.cc +44 -30
  1176. data/src/core/lib/security/authorization/matchers.h +10 -3
  1177. data/src/core/lib/security/authorization/rbac_policy.cc +6 -2
  1178. data/src/core/lib/security/authorization/rbac_policy.h +10 -3
  1179. data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +9 -4
  1180. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
  1181. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
  1182. data/src/core/lib/security/context/security_context.cc +27 -25
  1183. data/src/core/lib/security/context/security_context.h +64 -35
  1184. data/src/core/lib/security/credentials/alts/alts_credentials.cc +35 -27
  1185. data/src/core/lib/security/credentials/alts/alts_credentials.h +65 -57
  1186. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  1187. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +43 -43
  1188. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  1189. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  1190. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  1191. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +20 -22
  1192. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  1193. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +38 -39
  1194. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +19 -22
  1195. data/src/core/lib/security/credentials/call_creds_util.cc +13 -3
  1196. data/src/core/lib/security/credentials/call_creds_util.h +6 -5
  1197. data/src/core/lib/security/credentials/channel_creds_registry.h +10 -4
  1198. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +13 -3
  1199. data/src/core/lib/security/credentials/composite/composite_credentials.cc +46 -41
  1200. data/src/core/lib/security/credentials/composite/composite_credentials.h +51 -38
  1201. data/src/core/lib/security/credentials/credentials.cc +23 -26
  1202. data/src/core/lib/security/credentials/credentials.h +91 -94
  1203. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +202 -74
  1204. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +21 -3
  1205. data/src/core/lib/security/credentials/external/aws_request_signer.cc +14 -3
  1206. data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
  1207. data/src/core/lib/security/credentials/external/external_account_credentials.cc +86 -68
  1208. data/src/core/lib/security/credentials/external/external_account_credentials.h +14 -3
  1209. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -26
  1210. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +9 -3
  1211. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +44 -31
  1212. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +13 -3
  1213. data/src/core/lib/security/credentials/fake/fake_credentials.cc +48 -48
  1214. data/src/core/lib/security/credentials/fake/fake_credentials.h +57 -47
  1215. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +23 -25
  1216. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +148 -112
  1217. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +35 -29
  1218. data/src/core/lib/security/credentials/iam/iam_credentials.cc +35 -24
  1219. data/src/core/lib/security/credentials/iam/iam_credentials.h +37 -23
  1220. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +32 -29
  1221. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +61 -0
  1222. data/src/core/lib/security/credentials/jwt/json_token.cc +40 -29
  1223. data/src/core/lib/security/credentials/jwt/json_token.h +36 -36
  1224. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +37 -30
  1225. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +41 -23
  1226. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +113 -89
  1227. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +49 -47
  1228. data/src/core/lib/security/credentials/local/local_credentials.cc +36 -30
  1229. data/src/core/lib/security/credentials/local/local_credentials.h +36 -26
  1230. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +107 -91
  1231. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +56 -27
  1232. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +42 -36
  1233. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +55 -29
  1234. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +48 -44
  1235. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +43 -23
  1236. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +22 -30
  1237. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +16 -17
  1238. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +65 -48
  1239. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +69 -9
  1240. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +44 -4
  1241. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +75 -13
  1242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +22 -23
  1243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +69 -98
  1244. data/src/core/lib/security/credentials/tls/tls_credentials.cc +55 -50
  1245. data/src/core/lib/security/credentials/tls/tls_credentials.h +33 -30
  1246. data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
  1247. data/src/core/lib/security/credentials/tls/tls_utils.h +4 -4
  1248. data/src/core/lib/security/credentials/xds/xds_credentials.cc +77 -81
  1249. data/src/core/lib/security/credentials/xds/xds_credentials.h +50 -10
  1250. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +60 -54
  1251. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +49 -47
  1252. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +75 -79
  1253. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +25 -26
  1254. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +15 -6
  1255. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +26 -15
  1256. data/src/core/lib/security/security_connector/load_system_roots.h +20 -20
  1257. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +22 -20
  1258. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +43 -38
  1259. data/src/core/lib/security/security_connector/load_system_roots_supported.h +45 -0
  1260. data/src/core/lib/security/security_connector/local/local_security_connector.cc +66 -49
  1261. data/src/core/lib/security/security_connector/local/local_security_connector.h +49 -46
  1262. data/src/core/lib/security/security_connector/security_connector.cc +37 -35
  1263. data/src/core/lib/security/security_connector/security_connector.h +67 -45
  1264. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +59 -48
  1265. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +44 -43
  1266. data/src/core/lib/security/security_connector/ssl_utils.cc +47 -39
  1267. data/src/core/lib/security/security_connector/ssl_utils.h +45 -42
  1268. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  1269. data/src/core/lib/security/security_connector/ssl_utils_config.h +21 -22
  1270. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +62 -58
  1271. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +48 -28
  1272. data/src/core/lib/security/transport/auth_filters.h +59 -30
  1273. data/src/core/lib/security/transport/client_auth_filter.cc +73 -48
  1274. data/src/core/lib/security/transport/secure_endpoint.cc +305 -181
  1275. data/src/core/lib/security/transport/secure_endpoint.h +29 -28
  1276. data/src/core/lib/security/transport/security_handshaker.cc +142 -110
  1277. data/src/core/lib/security/transport/security_handshaker.h +28 -23
  1278. data/src/core/lib/security/transport/server_auth_filter.cc +157 -266
  1279. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  1280. data/src/core/lib/security/transport/tsi_error.h +20 -20
  1281. data/src/core/lib/security/util/json_util.cc +24 -24
  1282. data/src/core/lib/security/util/json_util.h +21 -23
  1283. data/src/core/lib/service_config/service_config.h +19 -12
  1284. data/src/core/lib/service_config/service_config_call_data.h +15 -5
  1285. data/src/core/lib/service_config/service_config_impl.cc +111 -150
  1286. data/src/core/lib/service_config/service_config_impl.h +27 -27
  1287. data/src/core/lib/service_config/service_config_parser.cc +16 -28
  1288. data/src/core/lib/service_config/service_config_parser.h +18 -19
  1289. data/src/core/lib/slice/b64.cc +26 -26
  1290. data/src/core/lib/slice/b64.h +34 -32
  1291. data/src/core/lib/slice/percent_encoding.cc +24 -30
  1292. data/src/core/lib/slice/percent_encoding.h +28 -34
  1293. data/src/core/lib/slice/slice.cc +59 -46
  1294. data/src/core/lib/slice/slice.h +64 -20
  1295. data/src/core/lib/slice/slice_buffer.cc +136 -76
  1296. data/src/core/lib/slice/slice_buffer.h +168 -0
  1297. data/src/core/lib/slice/slice_internal.h +38 -45
  1298. data/src/core/lib/slice/slice_refcount.cc +3 -18
  1299. data/src/core/lib/slice/slice_refcount.h +53 -19
  1300. data/src/core/lib/slice/slice_string_helpers.cc +17 -33
  1301. data/src/core/lib/slice/slice_string_helpers.h +23 -30
  1302. data/src/core/lib/surface/api_trace.cc +17 -17
  1303. data/src/core/lib/surface/api_trace.h +25 -25
  1304. data/src/core/lib/surface/builtins.cc +7 -2
  1305. data/src/core/lib/surface/builtins.h +3 -3
  1306. data/src/core/lib/surface/byte_buffer.cc +26 -21
  1307. data/src/core/lib/surface/byte_buffer_reader.cc +24 -24
  1308. data/src/core/lib/surface/call.cc +3000 -1131
  1309. data/src/core/lib/surface/call.h +135 -56
  1310. data/src/core/lib/surface/call_details.cc +22 -23
  1311. data/src/core/lib/surface/call_log_batch.cc +25 -18
  1312. data/src/core/lib/surface/call_test_only.h +34 -31
  1313. data/src/core/lib/surface/call_trace.cc +123 -0
  1314. data/src/core/lib/surface/call_trace.h +30 -0
  1315. data/src/core/lib/surface/channel.cc +218 -284
  1316. data/src/core/lib/surface/channel.h +137 -90
  1317. data/src/core/lib/surface/channel_init.cc +19 -20
  1318. data/src/core/lib/surface/channel_init.h +24 -26
  1319. data/src/core/lib/surface/channel_ping.cc +26 -20
  1320. data/src/core/lib/surface/channel_stack_type.cc +21 -19
  1321. data/src/core/lib/surface/channel_stack_type.h +22 -22
  1322. data/src/core/lib/surface/completion_queue.cc +200 -222
  1323. data/src/core/lib/surface/completion_queue.h +42 -40
  1324. data/src/core/lib/surface/completion_queue_factory.cc +34 -28
  1325. data/src/core/lib/surface/completion_queue_factory.h +21 -23
  1326. data/src/core/lib/surface/event_string.cc +19 -24
  1327. data/src/core/lib/surface/event_string.h +21 -21
  1328. data/src/core/lib/surface/init.cc +57 -114
  1329. data/src/core/lib/surface/init.h +20 -28
  1330. data/src/core/lib/surface/init_internally.cc +25 -0
  1331. data/src/core/lib/surface/init_internally.h +37 -0
  1332. data/src/core/lib/surface/lame_client.cc +87 -130
  1333. data/src/core/lib/surface/lame_client.h +62 -24
  1334. data/src/core/lib/surface/metadata_array.cc +18 -17
  1335. data/src/core/lib/surface/server.cc +409 -188
  1336. data/src/core/lib/surface/server.h +57 -26
  1337. data/src/core/lib/surface/validate_metadata.cc +34 -48
  1338. data/src/core/lib/surface/validate_metadata.h +24 -21
  1339. data/src/core/lib/surface/version.cc +21 -21
  1340. data/src/core/lib/transport/bdp_estimator.cc +19 -19
  1341. data/src/core/lib/transport/bdp_estimator.h +22 -24
  1342. data/src/core/lib/transport/connectivity_state.cc +24 -23
  1343. data/src/core/lib/transport/connectivity_state.h +24 -25
  1344. data/src/core/lib/transport/error_utils.cc +57 -79
  1345. data/src/core/lib/transport/error_utils.h +29 -25
  1346. data/src/core/lib/{channel → transport}/handshaker.cc +75 -58
  1347. data/src/core/lib/{channel → transport}/handshaker.h +59 -48
  1348. data/src/core/lib/transport/handshaker_factory.h +74 -0
  1349. data/src/core/lib/transport/handshaker_registry.cc +61 -0
  1350. data/src/core/lib/transport/handshaker_registry.h +69 -0
  1351. data/src/core/lib/transport/http2_errors.h +22 -22
  1352. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +78 -65
  1353. data/src/core/lib/transport/http_connect_handshaker.h +42 -0
  1354. data/src/core/lib/transport/metadata_batch.cc +305 -0
  1355. data/src/core/lib/transport/metadata_batch.h +269 -302
  1356. data/src/core/lib/transport/parsed_metadata.cc +2 -4
  1357. data/src/core/lib/transport/parsed_metadata.h +17 -8
  1358. data/src/core/lib/transport/pid_controller.cc +20 -20
  1359. data/src/core/lib/transport/pid_controller.h +27 -27
  1360. data/src/core/lib/transport/status_conversion.cc +23 -23
  1361. data/src/core/lib/transport/status_conversion.h +24 -24
  1362. data/src/core/lib/transport/tcp_connect_handshaker.cc +245 -0
  1363. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  1364. data/src/core/lib/transport/timeout_encoding.cc +24 -28
  1365. data/src/core/lib/transport/timeout_encoding.h +25 -21
  1366. data/src/core/lib/transport/transport.cc +97 -57
  1367. data/src/core/lib/transport/transport.h +252 -207
  1368. data/src/core/lib/transport/transport_fwd.h +20 -0
  1369. data/src/core/lib/transport/transport_impl.h +59 -48
  1370. data/src/core/lib/transport/transport_op_string.cc +40 -39
  1371. data/src/core/lib/uri/uri_parser.cc +12 -4
  1372. data/src/core/lib/uri/uri_parser.h +3 -5
  1373. data/src/core/plugin_registry/grpc_plugin_registry.cc +62 -73
  1374. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +20 -39
  1375. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  1376. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  1377. data/src/core/tsi/alts/crypt/gsec.h +336 -336
  1378. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  1379. data/src/core/tsi/alts/frame_protector/alts_counter.h +68 -68
  1380. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  1381. data/src/core/tsi/alts/frame_protector/alts_crypter.h +209 -209
  1382. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  1383. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +40 -40
  1384. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  1385. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +82 -83
  1386. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  1387. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  1388. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  1389. data/src/core/tsi/alts/frame_protector/frame_handler.h +169 -169
  1390. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +117 -97
  1391. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +104 -104
  1392. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  1393. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +43 -44
  1394. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +53 -45
  1395. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +60 -60
  1396. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +24 -24
  1397. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  1398. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +38 -38
  1399. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  1400. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +105 -104
  1401. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  1402. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +40 -41
  1403. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  1404. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +35 -36
  1405. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +67 -68
  1406. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  1407. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +55 -56
  1408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  1409. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +141 -142
  1410. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +67 -58
  1411. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +43 -44
  1412. data/src/core/tsi/fake_transport_security.cc +146 -110
  1413. data/src/core/tsi/fake_transport_security.h +36 -30
  1414. data/src/core/tsi/local_transport_security.cc +43 -38
  1415. data/src/core/tsi/local_transport_security.h +33 -33
  1416. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +9 -4
  1417. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
  1418. data/src/core/tsi/ssl/session_cache/ssl_session.h +23 -21
  1419. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +21 -19
  1420. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  1421. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +31 -22
  1422. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +27 -20
  1423. data/src/core/tsi/ssl_transport_security.cc +356 -390
  1424. data/src/core/tsi/ssl_transport_security.h +210 -201
  1425. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  1426. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  1427. data/src/core/tsi/ssl_types.h +27 -27
  1428. data/src/core/tsi/transport_security.cc +44 -32
  1429. data/src/core/tsi/transport_security.h +49 -48
  1430. data/src/core/tsi/transport_security_grpc.cc +23 -22
  1431. data/src/core/tsi/transport_security_grpc.h +44 -41
  1432. data/src/core/tsi/transport_security_interface.h +346 -332
  1433. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.clang +2 -0
  1434. data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.gcc +7 -0
  1435. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  1436. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  1437. data/src/ruby/ext/grpc/ext-export.gcc +1 -1
  1438. data/src/ruby/ext/grpc/extconf.rb +98 -20
  1439. data/src/ruby/ext/grpc/rb_call.c +1 -0
  1440. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  1441. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  1442. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  1443. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  1444. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  1445. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +60 -60
  1446. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  1447. data/src/ruby/lib/grpc/errors.rb +1 -1
  1448. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1449. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  1450. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1451. data/src/ruby/lib/grpc/version.rb +1 -1
  1452. data/src/ruby/pb/generate_proto_ruby.sh +1 -6
  1453. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  1454. data/src/ruby/pb/test/client.rb +769 -0
  1455. data/src/ruby/pb/test/server.rb +252 -0
  1456. data/src/ruby/pb/test/xds_client.rb +415 -0
  1457. data/src/ruby/spec/channel_spec.rb +5 -43
  1458. data/src/ruby/spec/client_server_spec.rb +20 -8
  1459. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  1460. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  1461. data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
  1462. data/src/ruby/spec/user_agent_spec.rb +1 -1
  1463. data/third_party/abseil-cpp/absl/algorithm/container.h +57 -58
  1464. data/third_party/abseil-cpp/absl/base/attributes.h +88 -41
  1465. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  1466. data/third_party/abseil-cpp/absl/base/config.h +221 -39
  1467. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  1468. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +52 -2
  1469. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
  1470. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -4
  1471. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  1472. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  1473. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
  1474. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  1475. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
  1476. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
  1477. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  1478. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +39 -28
  1479. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +36 -36
  1480. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +6 -3
  1481. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +10 -6
  1482. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  1483. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
  1484. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  1485. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  1486. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -11
  1487. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
  1488. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  1489. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
  1490. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  1491. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -40
  1492. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
  1493. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  1494. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  1495. data/third_party/abseil-cpp/absl/base/macros.h +4 -21
  1496. data/third_party/abseil-cpp/absl/base/optimization.h +76 -16
  1497. data/third_party/abseil-cpp/absl/base/options.h +1 -7
  1498. data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
  1499. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  1500. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  1501. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  1502. data/third_party/abseil-cpp/absl/container/fixed_array.h +9 -5
  1503. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  1504. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  1505. data/third_party/abseil-cpp/absl/container/inlined_vector.h +84 -25
  1506. data/third_party/abseil-cpp/absl/container/internal/common.h +9 -8
  1507. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
  1508. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +23 -29
  1509. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
  1510. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +116 -23
  1511. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +40 -54
  1512. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +165 -66
  1513. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +159 -4
  1514. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1121 -470
  1515. data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
  1516. data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
  1517. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
  1518. data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
  1519. data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
  1520. data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
  1521. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
  1522. data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
  1523. data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
  1524. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
  1525. data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
  1526. data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
  1527. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
  1528. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
  1529. data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
  1530. data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
  1531. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
  1532. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
  1533. data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
  1534. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  1535. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
  1536. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
  1537. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -13
  1538. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  1539. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +19 -12
  1540. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  1541. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  1542. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
  1543. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  1544. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +59 -102
  1545. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
  1546. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +41 -11
  1547. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +18 -4
  1548. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  1549. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
  1550. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +164 -101
  1551. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
  1552. data/third_party/abseil-cpp/absl/functional/any_invocable.h +316 -0
  1553. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  1554. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  1555. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +878 -0
  1556. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  1557. data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
  1558. data/third_party/abseil-cpp/absl/hash/internal/hash.h +235 -26
  1559. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
  1560. data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
  1561. data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
  1562. data/third_party/abseil-cpp/absl/numeric/bits.h +1 -1
  1563. data/third_party/abseil-cpp/absl/numeric/int128.cc +14 -10
  1564. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  1565. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +33 -10
  1566. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  1567. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  1568. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  1569. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -2
  1570. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  1571. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  1572. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +3 -24
  1573. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
  1574. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  1575. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  1576. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  1577. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  1578. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
  1579. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  1580. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  1581. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  1582. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  1583. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  1584. data/third_party/abseil-cpp/absl/random/random.h +6 -6
  1585. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  1586. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  1587. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  1588. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  1589. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  1590. data/third_party/abseil-cpp/absl/status/status.cc +193 -14
  1591. data/third_party/abseil-cpp/absl/status/status.h +24 -14
  1592. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  1593. data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
  1594. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  1595. data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
  1596. data/third_party/abseil-cpp/absl/strings/cord.cc +257 -924
  1597. data/third_party/abseil-cpp/absl/strings/cord.h +268 -156
  1598. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  1599. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  1600. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  1601. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +575 -0
  1602. data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
  1603. data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
  1604. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
  1605. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
  1606. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
  1607. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  1608. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  1609. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +441 -150
  1610. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +157 -53
  1611. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +70 -73
  1612. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +8 -6
  1613. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  1614. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  1615. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  1616. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  1617. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +56 -0
  1618. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +103 -0
  1619. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  1620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  1621. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
  1622. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
  1623. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +19 -43
  1624. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
  1625. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +5 -4
  1626. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  1627. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
  1628. data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
  1629. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +18 -15
  1630. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
  1631. data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
  1632. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
  1633. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
  1634. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
  1635. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
  1636. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +127 -30
  1637. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
  1638. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +42 -10
  1639. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +56 -289
  1640. data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
  1641. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  1642. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +9 -4
  1643. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
  1644. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  1645. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
  1646. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -103
  1647. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  1648. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
  1649. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  1650. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
  1651. data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
  1652. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  1653. data/third_party/abseil-cpp/absl/strings/numbers.cc +42 -39
  1654. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  1655. data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
  1656. data/third_party/abseil-cpp/absl/strings/str_cat.h +70 -16
  1657. data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
  1658. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  1659. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  1660. data/third_party/abseil-cpp/absl/strings/string_view.cc +8 -19
  1661. data/third_party/abseil-cpp/absl/strings/string_view.h +6 -12
  1662. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  1663. data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
  1664. data/third_party/abseil-cpp/absl/strings/substitute.h +55 -21
  1665. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  1666. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  1667. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
  1668. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
  1669. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
  1670. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  1671. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  1672. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  1673. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  1674. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +172 -88
  1675. data/third_party/abseil-cpp/absl/synchronization/mutex.h +102 -55
  1676. data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
  1677. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -3
  1678. data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
  1679. data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
  1680. data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
  1681. data/third_party/abseil-cpp/absl/time/duration.cc +12 -11
  1682. data/third_party/abseil-cpp/absl/time/format.cc +2 -1
  1683. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  1684. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
  1685. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
  1686. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
  1687. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
  1688. data/third_party/abseil-cpp/absl/time/time.cc +2 -2
  1689. data/third_party/abseil-cpp/absl/time/time.h +268 -169
  1690. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  1691. data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
  1692. data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
  1693. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  1694. data/third_party/abseil-cpp/absl/types/span.h +31 -8
  1695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +1 -1
  1696. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -2
  1697. data/third_party/re2/re2/bitstate.cc +3 -3
  1698. data/third_party/re2/re2/dfa.cc +13 -13
  1699. data/third_party/re2/re2/nfa.cc +4 -4
  1700. data/third_party/re2/re2/onepass.cc +2 -2
  1701. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  1702. data/third_party/re2/re2/prefilter_tree.h +3 -2
  1703. data/third_party/re2/re2/prog.cc +11 -2
  1704. data/third_party/re2/re2/prog.h +17 -5
  1705. data/third_party/re2/re2/re2.cc +6 -11
  1706. data/third_party/re2/re2/re2.h +1 -1
  1707. data/third_party/re2/re2/regexp.cc +1 -2
  1708. data/third_party/re2/re2/stringpiece.h +10 -7
  1709. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  1710. data/third_party/re2/re2/unicode_groups.cc +319 -151
  1711. data/third_party/re2/re2/walker-inl.h +3 -2
  1712. data/third_party/re2/util/mutex.h +4 -4
  1713. data/third_party/upb/upb/arena.c +277 -0
  1714. data/third_party/upb/upb/arena.h +225 -0
  1715. data/third_party/upb/upb/array.c +114 -0
  1716. data/third_party/upb/upb/array.h +83 -0
  1717. data/third_party/upb/upb/collections.h +36 -0
  1718. data/third_party/upb/upb/decode.c +188 -76
  1719. data/third_party/upb/upb/decode.h +1 -0
  1720. data/third_party/upb/upb/decode_fast.c +1 -1
  1721. data/third_party/upb/upb/def.c +128 -57
  1722. data/third_party/upb/upb/def.h +20 -4
  1723. data/third_party/upb/upb/def.hpp +7 -4
  1724. data/third_party/upb/upb/encode.c +43 -28
  1725. data/third_party/upb/upb/encode.h +16 -6
  1726. data/third_party/upb/upb/extension_registry.c +93 -0
  1727. data/third_party/upb/upb/extension_registry.h +84 -0
  1728. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
  1729. data/third_party/upb/upb/internal/table.h +385 -0
  1730. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
  1731. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  1732. data/third_party/upb/upb/json_decode.c +1512 -0
  1733. data/third_party/upb/upb/json_decode.h +47 -0
  1734. data/third_party/upb/upb/json_encode.c +780 -0
  1735. data/third_party/upb/upb/json_encode.h +65 -0
  1736. data/third_party/upb/upb/map.c +108 -0
  1737. data/third_party/upb/upb/map.h +117 -0
  1738. data/third_party/upb/upb/message_value.h +66 -0
  1739. data/third_party/upb/upb/mini_table.c +1147 -0
  1740. data/third_party/upb/upb/mini_table.h +189 -0
  1741. data/third_party/upb/upb/mini_table.hpp +112 -0
  1742. data/third_party/upb/upb/msg.c +6 -68
  1743. data/third_party/upb/upb/msg.h +2 -46
  1744. data/third_party/upb/upb/msg_internal.h +77 -58
  1745. data/third_party/upb/upb/port_def.inc +10 -1
  1746. data/third_party/upb/upb/port_undef.inc +2 -0
  1747. data/third_party/upb/upb/reflection.c +2 -159
  1748. data/third_party/upb/upb/reflection.h +2 -112
  1749. data/third_party/upb/upb/status.c +86 -0
  1750. data/third_party/upb/upb/status.h +66 -0
  1751. data/third_party/upb/upb/table.c +12 -8
  1752. data/third_party/upb/upb/table_internal.h +3 -350
  1753. data/third_party/upb/upb/text_encode.c +3 -2
  1754. data/third_party/upb/upb/upb.c +4 -290
  1755. data/third_party/upb/upb/upb.h +8 -167
  1756. data/third_party/zlib/compress.c +3 -3
  1757. data/third_party/zlib/crc32.c +975 -292
  1758. data/third_party/zlib/crc32.h +9441 -436
  1759. data/third_party/zlib/deflate.c +183 -129
  1760. data/third_party/zlib/deflate.h +12 -15
  1761. data/third_party/zlib/gzguts.h +3 -2
  1762. data/third_party/zlib/gzlib.c +6 -4
  1763. data/third_party/zlib/gzread.c +8 -12
  1764. data/third_party/zlib/gzwrite.c +26 -14
  1765. data/third_party/zlib/infback.c +12 -8
  1766. data/third_party/zlib/inffast.c +14 -14
  1767. data/third_party/zlib/inflate.c +44 -10
  1768. data/third_party/zlib/inflate.h +3 -2
  1769. data/third_party/zlib/inftrees.c +3 -3
  1770. data/third_party/zlib/inftrees.h +1 -1
  1771. data/third_party/zlib/trees.c +85 -107
  1772. data/third_party/zlib/uncompr.c +2 -2
  1773. data/third_party/zlib/zconf.h +16 -3
  1774. data/third_party/zlib/zlib.h +129 -106
  1775. data/third_party/zlib/zutil.c +11 -9
  1776. data/third_party/zlib/zutil.h +13 -9
  1777. metadata +424 -135
  1778. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  1779. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
  1780. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
  1781. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
  1782. data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
  1783. data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
  1784. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
  1785. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
  1786. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -186
  1787. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  1788. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -179
  1789. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -456
  1790. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -53
  1791. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -386
  1792. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  1793. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -67
  1794. data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
  1795. data/src/core/ext/xds/certificate_provider_registry.h +0 -57
  1796. data/src/core/lib/channel/handshaker_factory.h +0 -50
  1797. data/src/core/lib/channel/handshaker_registry.cc +0 -50
  1798. data/src/core/lib/channel/handshaker_registry.h +0 -71
  1799. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  1800. data/src/core/lib/event_engine/sockaddr.h +0 -44
  1801. data/src/core/lib/gpr/env.h +0 -40
  1802. data/src/core/lib/gpr/env_linux.cc +0 -75
  1803. data/src/core/lib/gpr/env_posix.cc +0 -46
  1804. data/src/core/lib/gpr/env_windows.cc +0 -74
  1805. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1806. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1807. data/src/core/lib/gpr/string_windows.h +0 -32
  1808. data/src/core/lib/gpr/tls.h +0 -157
  1809. data/src/core/lib/gprpp/capture.h +0 -76
  1810. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +0 -32
  1811. data/src/core/lib/iomgr/error_internal.h +0 -66
  1812. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  1813. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  1814. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  1815. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  1816. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  1817. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  1818. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  1819. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  1820. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  1821. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  1822. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  1823. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  1824. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  1825. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  1826. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  1827. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  1828. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  1829. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  1830. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  1831. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  1832. data/src/core/lib/profiling/basic_timers.cc +0 -295
  1833. data/src/core/lib/profiling/stap_timers.cc +0 -50
  1834. data/src/core/lib/profiling/timers.h +0 -94
  1835. data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
  1836. data/src/core/lib/slice/slice_api.cc +0 -39
  1837. data/src/core/lib/slice/slice_refcount_base.h +0 -61
  1838. data/src/core/lib/slice/slice_split.cc +0 -100
  1839. data/src/core/lib/slice/slice_split.h +0 -40
  1840. data/src/core/lib/transport/byte_stream.cc +0 -162
  1841. data/src/core/lib/transport/byte_stream.h +0 -166
  1842. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -53,51 +53,121 @@
53
53
  //
54
54
  // IMPLEMENTATION DETAILS
55
55
  //
56
- // The table stores elements inline in a slot array. In addition to the slot
57
- // array the table maintains some control state per slot. The extra state is one
58
- // byte per slot and stores empty or deleted marks, or alternatively 7 bits from
59
- // the hash of an occupied slot. The table is split into logical groups of
60
- // slots, like so:
56
+ // # Table Layout
57
+ //
58
+ // A raw_hash_set's backing array consists of control bytes followed by slots
59
+ // that may or may not contain objects.
60
+ //
61
+ // The layout of the backing array, for `capacity` slots, is thus, as a
62
+ // pseudo-struct:
63
+ //
64
+ // struct BackingArray {
65
+ // // Control bytes for the "real" slots.
66
+ // ctrl_t ctrl[capacity];
67
+ // // Always `ctrl_t::kSentinel`. This is used by iterators to find when to
68
+ // // stop and serves no other purpose.
69
+ // ctrl_t sentinel;
70
+ // // A copy of the first `kWidth - 1` elements of `ctrl`. This is used so
71
+ // // that if a probe sequence picks a value near the end of `ctrl`,
72
+ // // `Group` will have valid control bytes to look at.
73
+ // ctrl_t clones[kWidth - 1];
74
+ // // The actual slot data.
75
+ // slot_type slots[capacity];
76
+ // };
77
+ //
78
+ // The length of this array is computed by `AllocSize()` below.
79
+ //
80
+ // Control bytes (`ctrl_t`) are bytes (collected into groups of a
81
+ // platform-specific size) that define the state of the corresponding slot in
82
+ // the slot array. Group manipulation is tightly optimized to be as efficient
83
+ // as possible: SSE and friends on x86, clever bit operations on other arches.
61
84
  //
62
85
  // Group 1 Group 2 Group 3
63
86
  // +---------------+---------------+---------------+
64
87
  // | | | | | | | | | | | | | | | | | | | | | | | | |
65
88
  // +---------------+---------------+---------------+
66
89
  //
67
- // On lookup the hash is split into two parts:
68
- // - H2: 7 bits (those stored in the control bytes)
69
- // - H1: the rest of the bits
70
- // The groups are probed using H1. For each group the slots are matched to H2 in
71
- // parallel. Because H2 is 7 bits (128 states) and the number of slots per group
72
- // is low (8 or 16) in almost all cases a match in H2 is also a lookup hit.
90
+ // Each control byte is either a special value for empty slots, deleted slots
91
+ // (sometimes called *tombstones*), and a special end-of-table marker used by
92
+ // iterators, or, if occupied, seven bits (H2) from the hash of the value in the
93
+ // corresponding slot.
94
+ //
95
+ // Storing control bytes in a separate array also has beneficial cache effects,
96
+ // since more logical slots will fit into a cache line.
97
+ //
98
+ // # Hashing
99
+ //
100
+ // We compute two separate hashes, `H1` and `H2`, from the hash of an object.
101
+ // `H1(hash(x))` is an index into `slots`, and essentially the starting point
102
+ // for the probe sequence. `H2(hash(x))` is a 7-bit value used to filter out
103
+ // objects that cannot possibly be the one we are looking for.
73
104
  //
74
- // On insert, once the right group is found (as in lookup), its slots are
75
- // filled in order.
105
+ // # Table operations.
76
106
  //
77
- // On erase a slot is cleared. In case the group did not have any empty slots
78
- // before the erase, the erased slot is marked as deleted.
107
+ // The key operations are `insert`, `find`, and `erase`.
79
108
  //
80
- // Groups without empty slots (but maybe with deleted slots) extend the probe
81
- // sequence. The probing algorithm is quadratic. Given N the number of groups,
82
- // the probing function for the i'th probe is:
109
+ // Since `insert` and `erase` are implemented in terms of `find`, we describe
110
+ // `find` first. To `find` a value `x`, we compute `hash(x)`. From
111
+ // `H1(hash(x))` and the capacity, we construct a `probe_seq` that visits every
112
+ // group of slots in some interesting order.
83
113
  //
84
- // P(0) = H1 % N
114
+ // We now walk through these indices. At each index, we select the entire group
115
+ // starting with that index and extract potential candidates: occupied slots
116
+ // with a control byte equal to `H2(hash(x))`. If we find an empty slot in the
117
+ // group, we stop and return an error. Each candidate slot `y` is compared with
118
+ // `x`; if `x == y`, we are done and return `&y`; otherwise we contine to the
119
+ // next probe index. Tombstones effectively behave like full slots that never
120
+ // match the value we're looking for.
85
121
  //
86
- // P(i) = (P(i - 1) + i) % N
122
+ // The `H2` bits ensure when we compare a slot to an object with `==`, we are
123
+ // likely to have actually found the object. That is, the chance is low that
124
+ // `==` is called and returns `false`. Thus, when we search for an object, we
125
+ // are unlikely to call `==` many times. This likelyhood can be analyzed as
126
+ // follows (assuming that H2 is a random enough hash function).
87
127
  //
88
- // This probing function guarantees that after N probes, all the groups of the
89
- // table will be probed exactly once.
128
+ // Let's assume that there are `k` "wrong" objects that must be examined in a
129
+ // probe sequence. For example, when doing a `find` on an object that is in the
130
+ // table, `k` is the number of objects between the start of the probe sequence
131
+ // and the final found object (not including the final found object). The
132
+ // expected number of objects with an H2 match is then `k/128`. Measurements
133
+ // and analysis indicate that even at high load factors, `k` is less than 32,
134
+ // meaning that the number of "false positive" comparisons we must perform is
135
+ // less than 1/8 per `find`.
136
+
137
+ // `insert` is implemented in terms of `unchecked_insert`, which inserts a
138
+ // value presumed to not be in the table (violating this requirement will cause
139
+ // the table to behave erratically). Given `x` and its hash `hash(x)`, to insert
140
+ // it, we construct a `probe_seq` once again, and use it to find the first
141
+ // group with an unoccupied (empty *or* deleted) slot. We place `x` into the
142
+ // first such slot in the group and mark it as full with `x`'s H2.
90
143
  //
91
- // The control state and slot array are stored contiguously in a shared heap
92
- // allocation. The layout of this allocation is: `capacity()` control bytes,
93
- // one sentinel control byte, `Group::kWidth - 1` cloned control bytes,
94
- // <possible padding>, `capacity()` slots. The sentinel control byte is used in
95
- // iteration so we know when we reach the end of the table. The cloned control
96
- // bytes at the end of the table are cloned from the beginning of the table so
97
- // groups that begin near the end of the table can see a full group. In cases in
98
- // which there are more than `capacity()` cloned control bytes, the extra bytes
99
- // are `kEmpty`, and these ensure that we always see at least one empty slot and
100
- // can stop an unsuccessful search.
144
+ // To `insert`, we compose `unchecked_insert` with `find`. We compute `h(x)` and
145
+ // perform a `find` to see if it's already present; if it is, we're done. If
146
+ // it's not, we may decide the table is getting overcrowded (i.e. the load
147
+ // factor is greater than 7/8 for big tables; `is_small()` tables use a max load
148
+ // factor of 1); in this case, we allocate a bigger array, `unchecked_insert`
149
+ // each element of the table into the new array (we know that no insertion here
150
+ // will insert an already-present value), and discard the old backing array. At
151
+ // this point, we may `unchecked_insert` the value `x`.
152
+ //
153
+ // Below, `unchecked_insert` is partly implemented by `prepare_insert`, which
154
+ // presents a viable, initialized slot pointee to the caller.
155
+ //
156
+ // `erase` is implemented in terms of `erase_at`, which takes an index to a
157
+ // slot. Given an offset, we simply create a tombstone and destroy its contents.
158
+ // If we can prove that the slot would not appear in a probe sequence, we can
159
+ // make the slot as empty, instead. We can prove this by observing that if a
160
+ // group has any empty slots, it has never been full (assuming we never create
161
+ // an empty slot in a group with no empties, which this heuristic guarantees we
162
+ // never do) and find would stop at this group anyways (since it does not probe
163
+ // beyond groups with empties).
164
+ //
165
+ // `erase` is `erase_at` composed with `find`: if we
166
+ // have a value `x`, we can perform a `find`, and then `erase_at` the resulting
167
+ // slot.
168
+ //
169
+ // To iterate, we simply traverse the array, skipping empty and deleted slots
170
+ // and stopping when we hit a `kSentinel`.
101
171
 
102
172
  #ifndef ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_
103
173
  #define ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_
@@ -113,7 +183,10 @@
113
183
  #include <type_traits>
114
184
  #include <utility>
115
185
 
186
+ #include "absl/base/config.h"
116
187
  #include "absl/base/internal/endian.h"
188
+ #include "absl/base/internal/prefetch.h"
189
+ #include "absl/base/internal/raw_logging.h"
117
190
  #include "absl/base/optimization.h"
118
191
  #include "absl/base/port.h"
119
192
  #include "absl/container/internal/common.h"
@@ -122,16 +195,54 @@
122
195
  #include "absl/container/internal/hash_policy_traits.h"
123
196
  #include "absl/container/internal/hashtable_debug_hooks.h"
124
197
  #include "absl/container/internal/hashtablez_sampler.h"
125
- #include "absl/container/internal/have_sse.h"
126
198
  #include "absl/memory/memory.h"
127
199
  #include "absl/meta/type_traits.h"
128
200
  #include "absl/numeric/bits.h"
129
201
  #include "absl/utility/utility.h"
130
202
 
203
+ #ifdef ABSL_INTERNAL_HAVE_SSE2
204
+ #include <emmintrin.h>
205
+ #endif
206
+
207
+ #ifdef ABSL_INTERNAL_HAVE_SSSE3
208
+ #include <tmmintrin.h>
209
+ #endif
210
+
211
+ #ifdef _MSC_VER
212
+ #include <intrin.h>
213
+ #endif
214
+
215
+ #ifdef ABSL_INTERNAL_HAVE_ARM_NEON
216
+ #include <arm_neon.h>
217
+ #endif
218
+
131
219
  namespace absl {
132
220
  ABSL_NAMESPACE_BEGIN
133
221
  namespace container_internal {
134
222
 
223
+ #ifdef ABSL_SWISSTABLE_ENABLE_GENERATIONS
224
+ #error ABSL_SWISSTABLE_ENABLE_GENERATIONS cannot be directly set
225
+ #elif defined(ABSL_HAVE_ADDRESS_SANITIZER) || \
226
+ defined(ABSL_HAVE_MEMORY_SANITIZER)
227
+ // When compiled in sanitizer mode, we add generation integers to the backing
228
+ // array and iterators. In the backing array, we store the generation between
229
+ // the control bytes and the slots. When iterators are dereferenced, we assert
230
+ // that the container has not been mutated in a way that could cause iterator
231
+ // invalidation since the iterator was initialized.
232
+ #define ABSL_SWISSTABLE_ENABLE_GENERATIONS
233
+ #endif
234
+
235
+ // We use uint8_t so we don't need to worry about padding.
236
+ using GenerationType = uint8_t;
237
+
238
+ #ifdef ABSL_SWISSTABLE_ENABLE_GENERATIONS
239
+ constexpr bool SwisstableGenerationsEnabled() { return true; }
240
+ constexpr size_t NumGenerationBytes() { return sizeof(GenerationType); }
241
+ #else
242
+ constexpr bool SwisstableGenerationsEnabled() { return false; }
243
+ constexpr size_t NumGenerationBytes() { return 0; }
244
+ #endif
245
+
135
246
  template <typename AllocType>
136
247
  void SwapAlloc(AllocType& lhs, AllocType& rhs,
137
248
  std::true_type /* propagate_on_container_swap */) {
@@ -142,14 +253,40 @@ template <typename AllocType>
142
253
  void SwapAlloc(AllocType& /*lhs*/, AllocType& /*rhs*/,
143
254
  std::false_type /* propagate_on_container_swap */) {}
144
255
 
256
+ // The state for a probe sequence.
257
+ //
258
+ // Currently, the sequence is a triangular progression of the form
259
+ //
260
+ // p(i) := Width * (i^2 + i)/2 + hash (mod mask + 1)
261
+ //
262
+ // The use of `Width` ensures that each probe step does not overlap groups;
263
+ // the sequence effectively outputs the addresses of *groups* (although not
264
+ // necessarily aligned to any boundary). The `Group` machinery allows us
265
+ // to check an entire group with minimal branching.
266
+ //
267
+ // Wrapping around at `mask + 1` is important, but not for the obvious reason.
268
+ // As described above, the first few entries of the control byte array
269
+ // are mirrored at the end of the array, which `Group` will find and use
270
+ // for selecting candidates. However, when those candidates' slots are
271
+ // actually inspected, there are no corresponding slots for the cloned bytes,
272
+ // so we need to make sure we've treated those offsets as "wrapping around".
273
+ //
274
+ // It turns out that this probe sequence visits every group exactly once if the
275
+ // number of groups is a power of two, since (i^2+i)/2 is a bijection in
276
+ // Z/(2^m). See https://en.wikipedia.org/wiki/Quadratic_probing
145
277
  template <size_t Width>
146
278
  class probe_seq {
147
279
  public:
280
+ // Creates a new probe sequence using `hash` as the initial value of the
281
+ // sequence and `mask` (usually the capacity of the table) as the mask to
282
+ // apply to each value in the progression.
148
283
  probe_seq(size_t hash, size_t mask) {
149
284
  assert(((mask + 1) & mask) == 0 && "not a mask");
150
285
  mask_ = mask;
151
286
  offset_ = hash & mask_;
152
287
  }
288
+
289
+ // The offset within the table, i.e., the value `p(i)` above.
153
290
  size_t offset() const { return offset_; }
154
291
  size_t offset(size_t i) const { return (offset_ + i) & mask_; }
155
292
 
@@ -158,7 +295,7 @@ class probe_seq {
158
295
  offset_ += index_;
159
296
  offset_ &= mask_;
160
297
  }
161
- // 0-based probe index. The i-th probe in the probe sequence.
298
+ // 0-based probe index, a multiple of `Width`.
162
299
  size_t index() const { return index_; }
163
300
 
164
301
  private:
@@ -182,9 +319,9 @@ struct IsDecomposable : std::false_type {};
182
319
 
183
320
  template <class Policy, class Hash, class Eq, class... Ts>
184
321
  struct IsDecomposable<
185
- absl::void_t<decltype(
186
- Policy::apply(RequireUsableKey<typename Policy::key_type, Hash, Eq>(),
187
- std::declval<Ts>()...))>,
322
+ absl::void_t<decltype(Policy::apply(
323
+ RequireUsableKey<typename Policy::key_type, Hash, Eq>(),
324
+ std::declval<Ts>()...))>,
188
325
  Policy, Hash, Eq, Ts...> : std::true_type {};
189
326
 
190
327
  // TODO(alkis): Switch to std::is_nothrow_swappable when gcc/clang supports it.
@@ -200,57 +337,84 @@ constexpr bool IsNoThrowSwappable(std::false_type /* is_swappable */) {
200
337
 
201
338
  template <typename T>
202
339
  uint32_t TrailingZeros(T x) {
203
- ABSL_INTERNAL_ASSUME(x != 0);
204
- return countr_zero(x);
340
+ ABSL_ASSUME(x != 0);
341
+ return static_cast<uint32_t>(countr_zero(x));
205
342
  }
206
343
 
207
- // An abstraction over a bitmask. It provides an easy way to iterate through the
208
- // indexes of the set bits of a bitmask. When Shift=0 (platforms with SSE),
209
- // this is a true bitmask. On non-SSE, platforms the arithematic used to
210
- // emulate the SSE behavior works in bytes (Shift=3) and leaves each bytes as
211
- // either 0x00 or 0x80.
344
+ // An abstract bitmask, such as that emitted by a SIMD instruction.
212
345
  //
213
- // For example:
214
- // for (int i : BitMask<uint32_t, 16>(0x5)) -> yields 0, 2
215
- // for (int i : BitMask<uint64_t, 8, 3>(0x0000000080800000)) -> yields 2, 3
346
+ // Specifically, this type implements a simple bitset whose representation is
347
+ // controlled by `SignificantBits` and `Shift`. `SignificantBits` is the number
348
+ // of abstract bits in the bitset, while `Shift` is the log-base-two of the
349
+ // width of an abstract bit in the representation.
350
+ // This mask provides operations for any number of real bits set in an abstract
351
+ // bit. To add iteration on top of that, implementation must guarantee no more
352
+ // than one real bit is set in an abstract bit.
216
353
  template <class T, int SignificantBits, int Shift = 0>
217
- class BitMask {
218
- static_assert(std::is_unsigned<T>::value, "");
219
- static_assert(Shift == 0 || Shift == 3, "");
220
-
354
+ class NonIterableBitMask {
221
355
  public:
222
- // These are useful for unit tests (gunit).
223
- using value_type = int;
224
- using iterator = BitMask;
225
- using const_iterator = BitMask;
356
+ explicit NonIterableBitMask(T mask) : mask_(mask) {}
226
357
 
227
- explicit BitMask(T mask) : mask_(mask) {}
228
- BitMask& operator++() {
229
- mask_ &= (mask_ - 1);
230
- return *this;
231
- }
232
- explicit operator bool() const { return mask_ != 0; }
233
- int operator*() const { return LowestBitSet(); }
358
+ explicit operator bool() const { return this->mask_ != 0; }
359
+
360
+ // Returns the index of the lowest *abstract* bit set in `self`.
234
361
  uint32_t LowestBitSet() const {
235
362
  return container_internal::TrailingZeros(mask_) >> Shift;
236
363
  }
364
+
365
+ // Returns the index of the highest *abstract* bit set in `self`.
237
366
  uint32_t HighestBitSet() const {
238
367
  return static_cast<uint32_t>((bit_width(mask_) - 1) >> Shift);
239
368
  }
240
369
 
241
- BitMask begin() const { return *this; }
242
- BitMask end() const { return BitMask(0); }
243
-
370
+ // Return the number of trailing zero *abstract* bits.
244
371
  uint32_t TrailingZeros() const {
245
372
  return container_internal::TrailingZeros(mask_) >> Shift;
246
373
  }
247
374
 
375
+ // Return the number of leading zero *abstract* bits.
248
376
  uint32_t LeadingZeros() const {
249
377
  constexpr int total_significant_bits = SignificantBits << Shift;
250
378
  constexpr int extra_bits = sizeof(T) * 8 - total_significant_bits;
251
- return countl_zero(mask_ << extra_bits) >> Shift;
379
+ return static_cast<uint32_t>(countl_zero(mask_ << extra_bits)) >> Shift;
252
380
  }
253
381
 
382
+ T mask_;
383
+ };
384
+
385
+ // Mask that can be iterable
386
+ //
387
+ // For example, when `SignificantBits` is 16 and `Shift` is zero, this is just
388
+ // an ordinary 16-bit bitset occupying the low 16 bits of `mask`. When
389
+ // `SignificantBits` is 8 and `Shift` is 3, abstract bits are represented as
390
+ // the bytes `0x00` and `0x80`, and it occupies all 64 bits of the bitmask.
391
+ //
392
+ // For example:
393
+ // for (int i : BitMask<uint32_t, 16>(0b101)) -> yields 0, 2
394
+ // for (int i : BitMask<uint64_t, 8, 3>(0x0000000080800000)) -> yields 2, 3
395
+ template <class T, int SignificantBits, int Shift = 0>
396
+ class BitMask : public NonIterableBitMask<T, SignificantBits, Shift> {
397
+ using Base = NonIterableBitMask<T, SignificantBits, Shift>;
398
+ static_assert(std::is_unsigned<T>::value, "");
399
+ static_assert(Shift == 0 || Shift == 3, "");
400
+
401
+ public:
402
+ explicit BitMask(T mask) : Base(mask) {}
403
+ // BitMask is an iterator over the indices of its abstract bits.
404
+ using value_type = int;
405
+ using iterator = BitMask;
406
+ using const_iterator = BitMask;
407
+
408
+ BitMask& operator++() {
409
+ this->mask_ &= (this->mask_ - 1);
410
+ return *this;
411
+ }
412
+
413
+ uint32_t operator*() const { return Base::LowestBitSet(); }
414
+
415
+ BitMask begin() const { return *this; }
416
+ BitMask end() const { return BitMask(0); }
417
+
254
418
  private:
255
419
  friend bool operator==(const BitMask& a, const BitMask& b) {
256
420
  return a.mask_ == b.mask_;
@@ -258,15 +422,27 @@ class BitMask {
258
422
  friend bool operator!=(const BitMask& a, const BitMask& b) {
259
423
  return a.mask_ != b.mask_;
260
424
  }
261
-
262
- T mask_;
263
425
  };
264
426
 
265
427
  using h2_t = uint8_t;
266
428
 
267
429
  // The values here are selected for maximum performance. See the static asserts
268
- // below for details. We use an enum class so that when strict aliasing is
269
- // enabled, the compiler knows ctrl_t doesn't alias other types.
430
+ // below for details.
431
+
432
+ // A `ctrl_t` is a single control byte, which can have one of four
433
+ // states: empty, deleted, full (which has an associated seven-bit h2_t value)
434
+ // and the sentinel. They have the following bit patterns:
435
+ //
436
+ // empty: 1 0 0 0 0 0 0 0
437
+ // deleted: 1 1 1 1 1 1 1 0
438
+ // full: 0 h h h h h h h // h represents the hash bits.
439
+ // sentinel: 1 1 1 1 1 1 1 1
440
+ //
441
+ // These values are specifically tuned for SSE-flavored SIMD.
442
+ // The static_asserts below detail the source of these choices.
443
+ //
444
+ // We use an enum class so that when strict aliasing is enabled, the compiler
445
+ // knows ctrl_t doesn't alias other types.
270
446
  enum class ctrl_t : int8_t {
271
447
  kEmpty = -128, // 0b10000000
272
448
  kDeleted = -2, // 0b11111110
@@ -294,44 +470,85 @@ static_assert(
294
470
  static_cast<int8_t>(ctrl_t::kSentinel) & 0x7F) != 0,
295
471
  "ctrl_t::kEmpty and ctrl_t::kDeleted must share an unset bit that is not "
296
472
  "shared by ctrl_t::kSentinel to make the scalar test for "
297
- "MatchEmptyOrDeleted() efficient");
473
+ "MaskEmptyOrDeleted() efficient");
298
474
  static_assert(ctrl_t::kDeleted == static_cast<ctrl_t>(-2),
299
475
  "ctrl_t::kDeleted must be -2 to make the implementation of "
300
476
  "ConvertSpecialToEmptyAndFullToDeleted efficient");
301
477
 
302
- // A single block of empty control bytes for tables without any slots allocated.
303
- // This enables removing a branch in the hot path of find().
304
- ABSL_DLL extern const ctrl_t kEmptyGroup[16];
478
+ ABSL_DLL extern const ctrl_t kEmptyGroup[17];
479
+
480
+ // Returns a pointer to a control byte group that can be used by empty tables.
305
481
  inline ctrl_t* EmptyGroup() {
482
+ // Const must be cast away here; no uses of this function will actually write
483
+ // to it, because it is only used for empty tables.
306
484
  return const_cast<ctrl_t*>(kEmptyGroup);
307
485
  }
308
486
 
487
+ // Returns a pointer to the generation byte at the end of the empty group, if it
488
+ // exists.
489
+ inline GenerationType* EmptyGeneration() {
490
+ return reinterpret_cast<GenerationType*>(EmptyGroup() + 16);
491
+ }
492
+
309
493
  // Mixes a randomly generated per-process seed with `hash` and `ctrl` to
310
494
  // randomize insertion order within groups.
311
495
  bool ShouldInsertBackwards(size_t hash, const ctrl_t* ctrl);
312
496
 
313
- // Returns a hash seed.
497
+ // Returns a per-table, hash salt, which changes on resize. This gets mixed into
498
+ // H1 to randomize iteration order per-table.
314
499
  //
315
500
  // The seed consists of the ctrl_ pointer, which adds enough entropy to ensure
316
501
  // non-determinism of iteration order in most cases.
317
- inline size_t HashSeed(const ctrl_t* ctrl) {
502
+ inline size_t PerTableSalt(const ctrl_t* ctrl) {
318
503
  // The low bits of the pointer have little or no entropy because of
319
504
  // alignment. We shift the pointer to try to use higher entropy bits. A
320
505
  // good number seems to be 12 bits, because that aligns with page size.
321
506
  return reinterpret_cast<uintptr_t>(ctrl) >> 12;
322
507
  }
323
-
508
+ // Extracts the H1 portion of a hash: 57 bits mixed with a per-table salt.
324
509
  inline size_t H1(size_t hash, const ctrl_t* ctrl) {
325
- return (hash >> 7) ^ HashSeed(ctrl);
510
+ return (hash >> 7) ^ PerTableSalt(ctrl);
326
511
  }
512
+
513
+ // Extracts the H2 portion of a hash: the 7 bits not used for H1.
514
+ //
515
+ // These are used as an occupied control byte.
327
516
  inline h2_t H2(size_t hash) { return hash & 0x7F; }
328
517
 
518
+ // Helpers for checking the state of a control byte.
329
519
  inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; }
330
520
  inline bool IsFull(ctrl_t c) { return c >= static_cast<ctrl_t>(0); }
331
521
  inline bool IsDeleted(ctrl_t c) { return c == ctrl_t::kDeleted; }
332
522
  inline bool IsEmptyOrDeleted(ctrl_t c) { return c < ctrl_t::kSentinel; }
333
523
 
334
- #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
524
+ #ifdef ABSL_INTERNAL_HAVE_SSE2
525
+ // Quick reference guide for intrinsics used below:
526
+ //
527
+ // * __m128i: An XMM (128-bit) word.
528
+ //
529
+ // * _mm_setzero_si128: Returns a zero vector.
530
+ // * _mm_set1_epi8: Returns a vector with the same i8 in each lane.
531
+ //
532
+ // * _mm_subs_epi8: Saturating-subtracts two i8 vectors.
533
+ // * _mm_and_si128: Ands two i128s together.
534
+ // * _mm_or_si128: Ors two i128s together.
535
+ // * _mm_andnot_si128: And-nots two i128s together.
536
+ //
537
+ // * _mm_cmpeq_epi8: Component-wise compares two i8 vectors for equality,
538
+ // filling each lane with 0x00 or 0xff.
539
+ // * _mm_cmpgt_epi8: Same as above, but using > rather than ==.
540
+ //
541
+ // * _mm_loadu_si128: Performs an unaligned load of an i128.
542
+ // * _mm_storeu_si128: Performs an unaligned store of an i128.
543
+ //
544
+ // * _mm_sign_epi8: Retains, negates, or zeroes each i8 lane of the first
545
+ // argument if the corresponding lane of the second
546
+ // argument is positive, negative, or zero, respectively.
547
+ // * _mm_movemask_epi8: Selects the sign bit out of each i8 lane and produces a
548
+ // bitmask consisting of those bits.
549
+ // * _mm_shuffle_epi8: Selects i8s from the first argument, using the low
550
+ // four bits of each i8 lane in the second argument as
551
+ // indices.
335
552
 
336
553
  // https://github.com/abseil/abseil-cpp/issues/209
337
554
  // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87853
@@ -358,32 +575,34 @@ struct GroupSse2Impl {
358
575
 
359
576
  // Returns a bitmask representing the positions of slots that match hash.
360
577
  BitMask<uint32_t, kWidth> Match(h2_t hash) const {
361
- auto match = _mm_set1_epi8(hash);
578
+ auto match = _mm_set1_epi8(static_cast<char>(hash));
362
579
  return BitMask<uint32_t, kWidth>(
363
- _mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl)));
580
+ static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl))));
364
581
  }
365
582
 
366
583
  // Returns a bitmask representing the positions of empty slots.
367
- BitMask<uint32_t, kWidth> MatchEmpty() const {
368
- #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSSE3
584
+ NonIterableBitMask<uint32_t, kWidth> MaskEmpty() const {
585
+ #ifdef ABSL_INTERNAL_HAVE_SSSE3
369
586
  // This only works because ctrl_t::kEmpty is -128.
370
- return BitMask<uint32_t, kWidth>(
371
- _mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl)));
587
+ return NonIterableBitMask<uint32_t, kWidth>(
588
+ static_cast<uint32_t>(_mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl))));
372
589
  #else
373
- return Match(static_cast<h2_t>(ctrl_t::kEmpty));
590
+ auto match = _mm_set1_epi8(static_cast<char>(ctrl_t::kEmpty));
591
+ return NonIterableBitMask<uint32_t, kWidth>(
592
+ static_cast<uint32_t>(_mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl))));
374
593
  #endif
375
594
  }
376
595
 
377
596
  // Returns a bitmask representing the positions of empty or deleted slots.
378
- BitMask<uint32_t, kWidth> MatchEmptyOrDeleted() const {
379
- auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
380
- return BitMask<uint32_t, kWidth>(
381
- _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)));
597
+ NonIterableBitMask<uint32_t, kWidth> MaskEmptyOrDeleted() const {
598
+ auto special = _mm_set1_epi8(static_cast<char>(ctrl_t::kSentinel));
599
+ return NonIterableBitMask<uint32_t, kWidth>(static_cast<uint32_t>(
600
+ _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl))));
382
601
  }
383
602
 
384
603
  // Returns the number of trailing empty or deleted elements in the group.
385
604
  uint32_t CountLeadingEmptyOrDeleted() const {
386
- auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
605
+ auto special = _mm_set1_epi8(static_cast<char>(ctrl_t::kSentinel));
387
606
  return TrailingZeros(static_cast<uint32_t>(
388
607
  _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1));
389
608
  }
@@ -391,7 +610,7 @@ struct GroupSse2Impl {
391
610
  void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const {
392
611
  auto msbs = _mm_set1_epi8(static_cast<char>(-128));
393
612
  auto x126 = _mm_set1_epi8(126);
394
- #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSSE3
613
+ #ifdef ABSL_INTERNAL_HAVE_SSSE3
395
614
  auto res = _mm_or_si128(_mm_shuffle_epi8(x126, ctrl), msbs);
396
615
  #else
397
616
  auto zero = _mm_setzero_si128();
@@ -405,6 +624,66 @@ struct GroupSse2Impl {
405
624
  };
406
625
  #endif // ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
407
626
 
627
+ #if defined(ABSL_INTERNAL_HAVE_ARM_NEON) && defined(ABSL_IS_LITTLE_ENDIAN)
628
+ struct GroupAArch64Impl {
629
+ static constexpr size_t kWidth = 8;
630
+
631
+ explicit GroupAArch64Impl(const ctrl_t* pos) {
632
+ ctrl = vld1_u8(reinterpret_cast<const uint8_t*>(pos));
633
+ }
634
+
635
+ BitMask<uint64_t, kWidth, 3> Match(h2_t hash) const {
636
+ uint8x8_t dup = vdup_n_u8(hash);
637
+ auto mask = vceq_u8(ctrl, dup);
638
+ constexpr uint64_t msbs = 0x8080808080808080ULL;
639
+ return BitMask<uint64_t, kWidth, 3>(
640
+ vget_lane_u64(vreinterpret_u64_u8(mask), 0) & msbs);
641
+ }
642
+
643
+ NonIterableBitMask<uint64_t, kWidth, 3> MaskEmpty() const {
644
+ uint64_t mask =
645
+ vget_lane_u64(vreinterpret_u64_u8(vceq_s8(
646
+ vdup_n_s8(static_cast<int8_t>(ctrl_t::kEmpty)),
647
+ vreinterpret_s8_u8(ctrl))),
648
+ 0);
649
+ return NonIterableBitMask<uint64_t, kWidth, 3>(mask);
650
+ }
651
+
652
+ NonIterableBitMask<uint64_t, kWidth, 3> MaskEmptyOrDeleted() const {
653
+ uint64_t mask =
654
+ vget_lane_u64(vreinterpret_u64_u8(vcgt_s8(
655
+ vdup_n_s8(static_cast<int8_t>(ctrl_t::kSentinel)),
656
+ vreinterpret_s8_u8(ctrl))),
657
+ 0);
658
+ return NonIterableBitMask<uint64_t, kWidth, 3>(mask);
659
+ }
660
+
661
+ uint32_t CountLeadingEmptyOrDeleted() const {
662
+ uint64_t mask =
663
+ vget_lane_u64(vreinterpret_u64_u8(vcle_s8(
664
+ vdup_n_s8(static_cast<int8_t>(ctrl_t::kSentinel)),
665
+ vreinterpret_s8_u8(ctrl))),
666
+ 0);
667
+ // Similar to MaskEmptyorDeleted() but we invert the logic to invert the
668
+ // produced bitfield. We then count number of trailing zeros.
669
+ // Clang and GCC optimize countr_zero to rbit+clz without any check for 0,
670
+ // so we should be fine.
671
+ return static_cast<uint32_t>(countr_zero(mask)) >> 3;
672
+ }
673
+
674
+ void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const {
675
+ uint64_t mask = vget_lane_u64(vreinterpret_u64_u8(ctrl), 0);
676
+ constexpr uint64_t msbs = 0x8080808080808080ULL;
677
+ constexpr uint64_t lsbs = 0x0101010101010101ULL;
678
+ auto x = mask & msbs;
679
+ auto res = (~x + (x >> 7)) & ~lsbs;
680
+ little_endian::Store64(dst, res);
681
+ }
682
+
683
+ uint8x8_t ctrl;
684
+ };
685
+ #endif // ABSL_INTERNAL_HAVE_ARM_NEON && ABSL_IS_LITTLE_ENDIAN
686
+
408
687
  struct GroupPortableImpl {
409
688
  static constexpr size_t kWidth = 8;
410
689
 
@@ -431,19 +710,24 @@ struct GroupPortableImpl {
431
710
  return BitMask<uint64_t, kWidth, 3>((x - lsbs) & ~x & msbs);
432
711
  }
433
712
 
434
- BitMask<uint64_t, kWidth, 3> MatchEmpty() const {
713
+ NonIterableBitMask<uint64_t, kWidth, 3> MaskEmpty() const {
435
714
  constexpr uint64_t msbs = 0x8080808080808080ULL;
436
- return BitMask<uint64_t, kWidth, 3>((ctrl & (~ctrl << 6)) & msbs);
715
+ return NonIterableBitMask<uint64_t, kWidth, 3>((ctrl & (~ctrl << 6)) &
716
+ msbs);
437
717
  }
438
718
 
439
- BitMask<uint64_t, kWidth, 3> MatchEmptyOrDeleted() const {
719
+ NonIterableBitMask<uint64_t, kWidth, 3> MaskEmptyOrDeleted() const {
440
720
  constexpr uint64_t msbs = 0x8080808080808080ULL;
441
- return BitMask<uint64_t, kWidth, 3>((ctrl & (~ctrl << 7)) & msbs);
721
+ return NonIterableBitMask<uint64_t, kWidth, 3>((ctrl & (~ctrl << 7)) &
722
+ msbs);
442
723
  }
443
724
 
444
725
  uint32_t CountLeadingEmptyOrDeleted() const {
445
- constexpr uint64_t gaps = 0x00FEFEFEFEFEFEFEULL;
446
- return (TrailingZeros(((~ctrl & (ctrl >> 7)) | gaps) + 1) + 7) >> 3;
726
+ // ctrl | ~(ctrl >> 7) will have the lowest bit set to zero for kEmpty and
727
+ // kDeleted. We lower all other bits and count number of trailing zeros.
728
+ constexpr uint64_t bits = 0x0101010101010101ULL;
729
+ return static_cast<uint32_t>(countr_zero((ctrl | ~(ctrl >> 7)) & bits) >>
730
+ 3);
447
731
  }
448
732
 
449
733
  void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const {
@@ -457,32 +741,232 @@ struct GroupPortableImpl {
457
741
  uint64_t ctrl;
458
742
  };
459
743
 
460
- #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
744
+ #ifdef ABSL_INTERNAL_HAVE_SSE2
461
745
  using Group = GroupSse2Impl;
746
+ #elif defined(ABSL_INTERNAL_HAVE_ARM_NEON) && defined(ABSL_IS_LITTLE_ENDIAN)
747
+ using Group = GroupAArch64Impl;
462
748
  #else
463
749
  using Group = GroupPortableImpl;
464
750
  #endif
465
751
 
466
- // The number of cloned control bytes that we copy from the beginning to the
467
- // end of the control bytes array.
752
+ class CommonFieldsGenerationInfoEnabled {
753
+ // A sentinel value for reserved_growth_ indicating that we just ran out of
754
+ // reserved growth on the last insertion. When reserve is called and then
755
+ // insertions take place, reserved_growth_'s state machine is N, ..., 1,
756
+ // kReservedGrowthJustRanOut, 0.
757
+ static constexpr size_t kReservedGrowthJustRanOut =
758
+ (std::numeric_limits<size_t>::max)();
759
+
760
+ public:
761
+ CommonFieldsGenerationInfoEnabled() = default;
762
+ CommonFieldsGenerationInfoEnabled(CommonFieldsGenerationInfoEnabled&& that)
763
+ : reserved_growth_(that.reserved_growth_), generation_(that.generation_) {
764
+ that.reserved_growth_ = 0;
765
+ that.generation_ = EmptyGeneration();
766
+ }
767
+ CommonFieldsGenerationInfoEnabled& operator=(
768
+ CommonFieldsGenerationInfoEnabled&&) = default;
769
+
770
+ // Whether we should rehash on insert in order to detect bugs of using invalid
771
+ // references. We rehash on the first insertion after reserved_growth_ reaches
772
+ // 0 after a call to reserve.
773
+ // TODO(b/254649633): we could potentially do a rehash with low probability
774
+ // whenever reserved_growth_ is zero.
775
+ bool should_rehash_for_bug_detection_on_insert() const {
776
+ return reserved_growth_ == kReservedGrowthJustRanOut;
777
+ }
778
+ void maybe_increment_generation_on_insert() {
779
+ if (reserved_growth_ == kReservedGrowthJustRanOut) reserved_growth_ = 0;
780
+
781
+ if (reserved_growth_ > 0) {
782
+ if (--reserved_growth_ == 0) reserved_growth_ = kReservedGrowthJustRanOut;
783
+ } else {
784
+ ++*generation_;
785
+ }
786
+ }
787
+ void reset_reserved_growth(size_t reservation, size_t size) {
788
+ reserved_growth_ = reservation - size;
789
+ }
790
+ size_t reserved_growth() const { return reserved_growth_; }
791
+ void set_reserved_growth(size_t r) { reserved_growth_ = r; }
792
+ GenerationType generation() const { return *generation_; }
793
+ void set_generation(GenerationType g) { *generation_ = g; }
794
+ GenerationType* generation_ptr() const { return generation_; }
795
+ void set_generation_ptr(GenerationType* g) { generation_ = g; }
796
+
797
+ private:
798
+ // The number of insertions remaining that are guaranteed to not rehash due to
799
+ // a prior call to reserve. Note: we store reserved growth rather than
800
+ // reservation size because calls to erase() decrease size_ but don't decrease
801
+ // reserved growth.
802
+ size_t reserved_growth_ = 0;
803
+ // Pointer to the generation counter, which is used to validate iterators and
804
+ // is stored in the backing array between the control bytes and the slots.
805
+ // Note that we can't store the generation inside the container itself and
806
+ // keep a pointer to the container in the iterators because iterators must
807
+ // remain valid when the container is moved.
808
+ // Note: we could derive this pointer from the control pointer, but it makes
809
+ // the code more complicated, and there's a benefit in having the sizes of
810
+ // raw_hash_set in sanitizer mode and non-sanitizer mode a bit more different,
811
+ // which is that tests are less likely to rely on the size remaining the same.
812
+ GenerationType* generation_ = EmptyGeneration();
813
+ };
814
+
815
+ class CommonFieldsGenerationInfoDisabled {
816
+ public:
817
+ CommonFieldsGenerationInfoDisabled() = default;
818
+ CommonFieldsGenerationInfoDisabled(CommonFieldsGenerationInfoDisabled&&) =
819
+ default;
820
+ CommonFieldsGenerationInfoDisabled& operator=(
821
+ CommonFieldsGenerationInfoDisabled&&) = default;
822
+
823
+ bool should_rehash_for_bug_detection_on_insert() const { return false; }
824
+ void maybe_increment_generation_on_insert() {}
825
+ void reset_reserved_growth(size_t, size_t) {}
826
+ size_t reserved_growth() const { return 0; }
827
+ void set_reserved_growth(size_t) {}
828
+ GenerationType generation() const { return 0; }
829
+ void set_generation(GenerationType) {}
830
+ GenerationType* generation_ptr() const { return nullptr; }
831
+ void set_generation_ptr(GenerationType*) {}
832
+ };
833
+
834
+ class HashSetIteratorGenerationInfoEnabled {
835
+ public:
836
+ HashSetIteratorGenerationInfoEnabled() = default;
837
+ explicit HashSetIteratorGenerationInfoEnabled(
838
+ const GenerationType* generation_ptr)
839
+ : generation_ptr_(generation_ptr), generation_(*generation_ptr) {}
840
+
841
+ GenerationType generation() const { return generation_; }
842
+ void reset_generation() { generation_ = *generation_ptr_; }
843
+ const GenerationType* generation_ptr() const { return generation_ptr_; }
844
+ void set_generation_ptr(const GenerationType* ptr) { generation_ptr_ = ptr; }
845
+
846
+ private:
847
+ const GenerationType* generation_ptr_ = EmptyGeneration();
848
+ GenerationType generation_ = *generation_ptr_;
849
+ };
850
+
851
+ class HashSetIteratorGenerationInfoDisabled {
852
+ public:
853
+ HashSetIteratorGenerationInfoDisabled() = default;
854
+ explicit HashSetIteratorGenerationInfoDisabled(const GenerationType*) {}
855
+
856
+ GenerationType generation() const { return 0; }
857
+ void reset_generation() {}
858
+ const GenerationType* generation_ptr() const { return nullptr; }
859
+ void set_generation_ptr(const GenerationType*) {}
860
+ };
861
+
862
+ #ifdef ABSL_SWISSTABLE_ENABLE_GENERATIONS
863
+ using CommonFieldsGenerationInfo = CommonFieldsGenerationInfoEnabled;
864
+ using HashSetIteratorGenerationInfo = HashSetIteratorGenerationInfoEnabled;
865
+ #else
866
+ using CommonFieldsGenerationInfo = CommonFieldsGenerationInfoDisabled;
867
+ using HashSetIteratorGenerationInfo = HashSetIteratorGenerationInfoDisabled;
868
+ #endif
869
+
870
+ // CommonFields hold the fields in raw_hash_set that do not depend
871
+ // on template parameters. This allows us to conveniently pass all
872
+ // of this state to helper functions as a single argument.
873
+ class CommonFields : public CommonFieldsGenerationInfo {
874
+ public:
875
+ CommonFields() = default;
876
+
877
+ // Not copyable
878
+ CommonFields(const CommonFields&) = delete;
879
+ CommonFields& operator=(const CommonFields&) = delete;
880
+
881
+ // Movable
882
+ CommonFields(CommonFields&& that)
883
+ : CommonFieldsGenerationInfo(
884
+ std::move(static_cast<CommonFieldsGenerationInfo&&>(that))),
885
+ // Explicitly copying fields into "this" and then resetting "that"
886
+ // fields generates less code then calling absl::exchange per field.
887
+ control_(that.control_),
888
+ slots_(that.slots_),
889
+ size_(that.size_),
890
+ capacity_(that.capacity_),
891
+ compressed_tuple_(that.growth_left(), std::move(that.infoz())) {
892
+ that.control_ = EmptyGroup();
893
+ that.slots_ = nullptr;
894
+ that.size_ = 0;
895
+ that.capacity_ = 0;
896
+ that.growth_left() = 0;
897
+ }
898
+ CommonFields& operator=(CommonFields&&) = default;
899
+
900
+ // The number of slots we can still fill without needing to rehash.
901
+ size_t& growth_left() { return compressed_tuple_.template get<0>(); }
902
+
903
+ HashtablezInfoHandle& infoz() { return compressed_tuple_.template get<1>(); }
904
+ const HashtablezInfoHandle& infoz() const {
905
+ return compressed_tuple_.template get<1>();
906
+ }
907
+
908
+ void reset_reserved_growth(size_t reservation) {
909
+ CommonFieldsGenerationInfo::reset_reserved_growth(reservation, size_);
910
+ }
911
+
912
+ // TODO(b/259599413): Investigate removing some of these fields:
913
+ // - control/slots can be derived from each other
914
+ // - size can be moved into the slot array
915
+
916
+ // The control bytes (and, also, a pointer to the base of the backing array).
917
+ //
918
+ // This contains `capacity + 1 + NumClonedBytes()` entries, even
919
+ // when the table is empty (hence EmptyGroup).
920
+ ctrl_t* control_ = EmptyGroup();
921
+
922
+ // The beginning of the slots, located at `SlotOffset()` bytes after
923
+ // `control`. May be null for empty tables.
924
+ void* slots_ = nullptr;
925
+
926
+ // The number of filled slots.
927
+ size_t size_ = 0;
928
+
929
+ // The total number of available slots.
930
+ size_t capacity_ = 0;
931
+
932
+ // Bundle together growth_left and HashtablezInfoHandle to ensure EBO for
933
+ // HashtablezInfoHandle when sampling is turned off.
934
+ absl::container_internal::CompressedTuple<size_t, HashtablezInfoHandle>
935
+ compressed_tuple_{0u, HashtablezInfoHandle{}};
936
+ };
937
+
938
+ // Returns he number of "cloned control bytes".
939
+ //
940
+ // This is the number of control bytes that are present both at the beginning
941
+ // of the control byte array and at the end, such that we can create a
942
+ // `Group::kWidth`-width probe window starting from any control byte.
468
943
  constexpr size_t NumClonedBytes() { return Group::kWidth - 1; }
469
944
 
470
945
  template <class Policy, class Hash, class Eq, class Alloc>
471
946
  class raw_hash_set;
472
947
 
948
+ // Returns whether `n` is a valid capacity (i.e., number of slots).
949
+ //
950
+ // A valid capacity is a non-zero integer `2^m - 1`.
473
951
  inline bool IsValidCapacity(size_t n) { return ((n + 1) & n) == 0 && n > 0; }
474
952
 
953
+ // Returns the next valid capacity after `n`.
954
+ inline size_t NextCapacity(size_t n) {
955
+ assert(IsValidCapacity(n) || n == 0);
956
+ return n * 2 + 1;
957
+ }
958
+
959
+ // Applies the following mapping to every byte in the control array:
960
+ // * kDeleted -> kEmpty
961
+ // * kEmpty -> kEmpty
962
+ // * _ -> kDeleted
475
963
  // PRECONDITION:
476
964
  // IsValidCapacity(capacity)
477
965
  // ctrl[capacity] == ctrl_t::kSentinel
478
966
  // ctrl[i] != ctrl_t::kSentinel for all i < capacity
479
- // Applies mapping for every byte in ctrl:
480
- // DELETED -> EMPTY
481
- // EMPTY -> EMPTY
482
- // FULL -> DELETED
483
967
  void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity);
484
968
 
485
- // Rounds up the capacity to the next power of 2 minus 1, with a minimum of 1.
969
+ // Converts `n` into the next valid capacity, per `IsValidCapacity`.
486
970
  inline size_t NormalizeCapacity(size_t n) {
487
971
  return n ? ~size_t{} >> countl_zero(n) : 1;
488
972
  }
@@ -495,8 +979,8 @@ inline size_t NormalizeCapacity(size_t n) {
495
979
  // never need to probe (the whole table fits in one group) so we don't need a
496
980
  // load factor less than 1.
497
981
 
498
- // Given `capacity` of the table, returns the size (i.e. number of full slots)
499
- // at which we should grow the capacity.
982
+ // Given `capacity`, applies the load factor; i.e., it returns the maximum
983
+ // number of values we should put into the table before a resizing rehash.
500
984
  inline size_t CapacityToGrowth(size_t capacity) {
501
985
  assert(IsValidCapacity(capacity));
502
986
  // `capacity*7/8`
@@ -506,8 +990,12 @@ inline size_t CapacityToGrowth(size_t capacity) {
506
990
  }
507
991
  return capacity - capacity / 8;
508
992
  }
509
- // From desired "growth" to a lowerbound of the necessary capacity.
510
- // Might not be a valid one and requires NormalizeCapacity().
993
+
994
+ // Given `growth`, "unapplies" the load factor to find how large the capacity
995
+ // should be to stay within the load factor.
996
+ //
997
+ // This might not be a valid capacity and `NormalizeCapacity()` should be
998
+ // called on this.
511
999
  inline size_t GrowthToLowerboundCapacity(size_t growth) {
512
1000
  // `growth*8/7`
513
1001
  if (Group::kWidth == 8 && growth == 7) {
@@ -533,16 +1021,69 @@ size_t SelectBucketCountForIterRange(InputIter first, InputIter last,
533
1021
  return 0;
534
1022
  }
535
1023
 
536
- inline void AssertIsFull(ctrl_t* ctrl) {
537
- ABSL_HARDENING_ASSERT((ctrl != nullptr && IsFull(*ctrl)) &&
538
- "Invalid operation on iterator. The element might have "
539
- "been erased, or the table might have rehashed.");
1024
+ #define ABSL_INTERNAL_ASSERT_IS_FULL(ctrl, generation, generation_ptr, \
1025
+ operation) \
1026
+ do { \
1027
+ ABSL_HARDENING_ASSERT( \
1028
+ (ctrl != nullptr) && operation \
1029
+ " called on invalid iterator. The iterator might be an end() " \
1030
+ "iterator or may have been default constructed."); \
1031
+ if (SwisstableGenerationsEnabled() && generation != *generation_ptr) \
1032
+ ABSL_INTERNAL_LOG(FATAL, operation \
1033
+ " called on invalidated iterator. The table could " \
1034
+ "have rehashed since this iterator was initialized."); \
1035
+ ABSL_HARDENING_ASSERT( \
1036
+ (IsFull(*ctrl)) && operation \
1037
+ " called on invalid iterator. The element might have been erased or " \
1038
+ "the table might have rehashed."); \
1039
+ } while (0)
1040
+
1041
+ // Note that for comparisons, null/end iterators are valid.
1042
+ inline void AssertIsValidForComparison(const ctrl_t* ctrl,
1043
+ GenerationType generation,
1044
+ const GenerationType* generation_ptr) {
1045
+ ABSL_HARDENING_ASSERT((ctrl == nullptr || IsFull(*ctrl)) &&
1046
+ "Invalid iterator comparison. The element might have "
1047
+ "been erased or the table might have rehashed.");
1048
+ if (SwisstableGenerationsEnabled() && generation != *generation_ptr) {
1049
+ ABSL_INTERNAL_LOG(FATAL,
1050
+ "Invalid iterator comparison. The table could have "
1051
+ "rehashed since this iterator was initialized.");
1052
+ }
1053
+ }
1054
+
1055
+ // If the two iterators come from the same container, then their pointers will
1056
+ // interleave such that ctrl_a <= ctrl_b < slot_a <= slot_b or vice/versa.
1057
+ // Note: we take slots by reference so that it's not UB if they're uninitialized
1058
+ // as long as we don't read them (when ctrl is null).
1059
+ inline bool AreItersFromSameContainer(const ctrl_t* ctrl_a,
1060
+ const ctrl_t* ctrl_b,
1061
+ const void* const& slot_a,
1062
+ const void* const& slot_b) {
1063
+ // If either control byte is null, then we can't tell.
1064
+ if (ctrl_a == nullptr || ctrl_b == nullptr) return true;
1065
+ const void* low_slot = slot_a;
1066
+ const void* hi_slot = slot_b;
1067
+ if (ctrl_a > ctrl_b) {
1068
+ std::swap(ctrl_a, ctrl_b);
1069
+ std::swap(low_slot, hi_slot);
1070
+ }
1071
+ return ctrl_b < low_slot && low_slot <= hi_slot;
540
1072
  }
541
1073
 
542
- inline void AssertIsValid(ctrl_t* ctrl) {
543
- ABSL_HARDENING_ASSERT((ctrl == nullptr || IsFull(*ctrl)) &&
544
- "Invalid operation on iterator. The element might have "
545
- "been erased, or the table might have rehashed.");
1074
+ // Asserts that two iterators come from the same container.
1075
+ // Note: we take slots by reference so that it's not UB if they're uninitialized
1076
+ // as long as we don't read them (when ctrl is null).
1077
+ // TODO(b/254649633): when generations are enabled, we can detect more cases of
1078
+ // different containers by comparing the pointers to the generations - this
1079
+ // can cover cases of end iterators that we would otherwise miss.
1080
+ inline void AssertSameContainer(const ctrl_t* ctrl_a, const ctrl_t* ctrl_b,
1081
+ const void* const& slot_a,
1082
+ const void* const& slot_b) {
1083
+ ABSL_HARDENING_ASSERT(
1084
+ AreItersFromSameContainer(ctrl_a, ctrl_b, slot_a, slot_b) &&
1085
+ "Invalid iterator comparison. The iterators may be from different "
1086
+ "containers or the container might have rehashed.");
546
1087
  }
547
1088
 
548
1089
  struct FindInfo {
@@ -550,111 +1091,220 @@ struct FindInfo {
550
1091
  size_t probe_length;
551
1092
  };
552
1093
 
553
- // The representation of the object has two modes:
554
- // - small: For capacities < kWidth-1
555
- // - large: For the rest.
1094
+ // Whether a table is "small". A small table fits entirely into a probing
1095
+ // group, i.e., has a capacity < `Group::kWidth`.
556
1096
  //
557
- // Differences:
558
- // - In small mode we are able to use the whole capacity. The extra control
559
- // bytes give us at least one "empty" control byte to stop the iteration.
560
- // This is important to make 1 a valid capacity.
1097
+ // In small mode we are able to use the whole capacity. The extra control
1098
+ // bytes give us at least one "empty" control byte to stop the iteration.
1099
+ // This is important to make 1 a valid capacity.
561
1100
  //
562
- // - In small mode only the first `capacity()` control bytes after the
563
- // sentinel are valid. The rest contain dummy ctrl_t::kEmpty values that do not
564
- // represent a real slot. This is important to take into account on
565
- // find_first_non_full(), where we never try ShouldInsertBackwards() for
566
- // small tables.
1101
+ // In small mode only the first `capacity` control bytes after the sentinel
1102
+ // are valid. The rest contain dummy ctrl_t::kEmpty values that do not
1103
+ // represent a real slot. This is important to take into account on
1104
+ // `find_first_non_full()`, where we never try
1105
+ // `ShouldInsertBackwards()` for small tables.
567
1106
  inline bool is_small(size_t capacity) { return capacity < Group::kWidth - 1; }
568
1107
 
569
- inline probe_seq<Group::kWidth> probe(const ctrl_t* ctrl, size_t hash,
570
- size_t capacity) {
1108
+ // Begins a probing operation on `common.control`, using `hash`.
1109
+ inline probe_seq<Group::kWidth> probe(const CommonFields& common, size_t hash) {
1110
+ const ctrl_t* ctrl = common.control_;
1111
+ const size_t capacity = common.capacity_;
571
1112
  return probe_seq<Group::kWidth>(H1(hash, ctrl), capacity);
572
1113
  }
573
1114
 
574
- // Probes the raw_hash_set with the probe sequence for hash and returns the
575
- // pointer to the first empty or deleted slot.
576
- // NOTE: this function must work with tables having both ctrl_t::kEmpty and
577
- // ctrl_t::kDeleted in one group. Such tables appears during
578
- // drop_deletes_without_resize.
1115
+ // Probes an array of control bits using a probe sequence derived from `hash`,
1116
+ // and returns the offset corresponding to the first deleted or empty slot.
1117
+ //
1118
+ // Behavior when the entire table is full is undefined.
579
1119
  //
580
- // This function is very useful when insertions happen and:
581
- // - the input is already a set
582
- // - there are enough slots
583
- // - the element with the hash is not in the table
1120
+ // NOTE: this function must work with tables having both empty and deleted
1121
+ // slots in the same group. Such tables appear during `erase()`.
584
1122
  template <typename = void>
585
- inline FindInfo find_first_non_full(const ctrl_t* ctrl, size_t hash,
586
- size_t capacity) {
587
- auto seq = probe(ctrl, hash, capacity);
1123
+ inline FindInfo find_first_non_full(const CommonFields& common, size_t hash) {
1124
+ auto seq = probe(common, hash);
1125
+ const ctrl_t* ctrl = common.control_;
588
1126
  while (true) {
589
1127
  Group g{ctrl + seq.offset()};
590
- auto mask = g.MatchEmptyOrDeleted();
1128
+ auto mask = g.MaskEmptyOrDeleted();
591
1129
  if (mask) {
592
1130
  #if !defined(NDEBUG)
593
1131
  // We want to add entropy even when ASLR is not enabled.
594
1132
  // In debug build we will randomly insert in either the front or back of
595
1133
  // the group.
596
1134
  // TODO(kfm,sbenza): revisit after we do unconditional mixing
597
- if (!is_small(capacity) && ShouldInsertBackwards(hash, ctrl)) {
1135
+ if (!is_small(common.capacity_) && ShouldInsertBackwards(hash, ctrl)) {
598
1136
  return {seq.offset(mask.HighestBitSet()), seq.index()};
599
1137
  }
600
1138
  #endif
601
1139
  return {seq.offset(mask.LowestBitSet()), seq.index()};
602
1140
  }
603
1141
  seq.next();
604
- assert(seq.index() <= capacity && "full table!");
1142
+ assert(seq.index() <= common.capacity_ && "full table!");
605
1143
  }
606
1144
  }
607
1145
 
608
1146
  // Extern template for inline function keep possibility of inlining.
609
1147
  // When compiler decided to not inline, no symbols will be added to the
610
1148
  // corresponding translation unit.
611
- extern template FindInfo find_first_non_full(const ctrl_t*, size_t, size_t);
1149
+ extern template FindInfo find_first_non_full(const CommonFields&, size_t);
612
1150
 
613
- // Reset all ctrl bytes back to ctrl_t::kEmpty, except the sentinel.
614
- inline void ResetCtrl(size_t capacity, ctrl_t* ctrl, const void* slot,
615
- size_t slot_size) {
1151
+ // Non-inlined version of find_first_non_full for use in less
1152
+ // performance critical routines.
1153
+ FindInfo find_first_non_full_outofline(const CommonFields&, size_t);
1154
+
1155
+ inline void ResetGrowthLeft(CommonFields& common) {
1156
+ common.growth_left() = CapacityToGrowth(common.capacity_) - common.size_;
1157
+ }
1158
+
1159
+ // Sets `ctrl` to `{kEmpty, kSentinel, ..., kEmpty}`, marking the entire
1160
+ // array as marked as empty.
1161
+ inline void ResetCtrl(CommonFields& common, size_t slot_size) {
1162
+ const size_t capacity = common.capacity_;
1163
+ ctrl_t* ctrl = common.control_;
616
1164
  std::memset(ctrl, static_cast<int8_t>(ctrl_t::kEmpty),
617
1165
  capacity + 1 + NumClonedBytes());
618
1166
  ctrl[capacity] = ctrl_t::kSentinel;
619
- SanitizerPoisonMemoryRegion(slot, slot_size * capacity);
1167
+ SanitizerPoisonMemoryRegion(common.slots_, slot_size * capacity);
1168
+ ResetGrowthLeft(common);
620
1169
  }
621
1170
 
622
- // Sets the control byte, and if `i < NumClonedBytes()`, set the cloned byte
623
- // at the end too.
624
- inline void SetCtrl(size_t i, ctrl_t h, size_t capacity, ctrl_t* ctrl,
625
- const void* slot, size_t slot_size) {
1171
+ // Sets `ctrl[i]` to `h`.
1172
+ //
1173
+ // Unlike setting it directly, this function will perform bounds checks and
1174
+ // mirror the value to the cloned tail if necessary.
1175
+ inline void SetCtrl(const CommonFields& common, size_t i, ctrl_t h,
1176
+ size_t slot_size) {
1177
+ const size_t capacity = common.capacity_;
626
1178
  assert(i < capacity);
627
1179
 
628
- auto* slot_i = static_cast<const char*>(slot) + i * slot_size;
1180
+ auto* slot_i = static_cast<const char*>(common.slots_) + i * slot_size;
629
1181
  if (IsFull(h)) {
630
1182
  SanitizerUnpoisonMemoryRegion(slot_i, slot_size);
631
1183
  } else {
632
1184
  SanitizerPoisonMemoryRegion(slot_i, slot_size);
633
1185
  }
634
1186
 
1187
+ ctrl_t* ctrl = common.control_;
635
1188
  ctrl[i] = h;
636
1189
  ctrl[((i - NumClonedBytes()) & capacity) + (NumClonedBytes() & capacity)] = h;
637
1190
  }
638
1191
 
639
- inline void SetCtrl(size_t i, h2_t h, size_t capacity, ctrl_t* ctrl,
640
- const void* slot, size_t slot_size) {
641
- SetCtrl(i, static_cast<ctrl_t>(h), capacity, ctrl, slot, slot_size);
1192
+ // Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`.
1193
+ inline void SetCtrl(const CommonFields& common, size_t i, h2_t h,
1194
+ size_t slot_size) {
1195
+ SetCtrl(common, i, static_cast<ctrl_t>(h), slot_size);
1196
+ }
1197
+
1198
+ // Given the capacity of a table, computes the offset (from the start of the
1199
+ // backing allocation) of the generation counter (if it exists).
1200
+ inline size_t GenerationOffset(size_t capacity) {
1201
+ assert(IsValidCapacity(capacity));
1202
+ const size_t num_control_bytes = capacity + 1 + NumClonedBytes();
1203
+ return num_control_bytes;
642
1204
  }
643
1205
 
644
- // The allocated block consists of `capacity + 1 + NumClonedBytes()` control
645
- // bytes followed by `capacity` slots, which must be aligned to `slot_align`.
646
- // SlotOffset returns the offset of the slots into the allocated block.
1206
+ // Given the capacity of a table, computes the offset (from the start of the
1207
+ // backing allocation) at which the slots begin.
647
1208
  inline size_t SlotOffset(size_t capacity, size_t slot_align) {
648
1209
  assert(IsValidCapacity(capacity));
649
1210
  const size_t num_control_bytes = capacity + 1 + NumClonedBytes();
650
- return (num_control_bytes + slot_align - 1) & (~slot_align + 1);
1211
+ return (num_control_bytes + NumGenerationBytes() + slot_align - 1) &
1212
+ (~slot_align + 1);
651
1213
  }
652
1214
 
653
- // Returns the size of the allocated block. See also above comment.
1215
+ // Given the capacity of a table, computes the total size of the backing
1216
+ // array.
654
1217
  inline size_t AllocSize(size_t capacity, size_t slot_size, size_t slot_align) {
655
1218
  return SlotOffset(capacity, slot_align) + capacity * slot_size;
656
1219
  }
657
1220
 
1221
+ template <typename Alloc, size_t SizeOfSlot, size_t AlignOfSlot>
1222
+ ABSL_ATTRIBUTE_NOINLINE void InitializeSlots(CommonFields& c, Alloc alloc) {
1223
+ assert(c.capacity_);
1224
+ // Folks with custom allocators often make unwarranted assumptions about the
1225
+ // behavior of their classes vis-a-vis trivial destructability and what
1226
+ // calls they will or won't make. Avoid sampling for people with custom
1227
+ // allocators to get us out of this mess. This is not a hard guarantee but
1228
+ // a workaround while we plan the exact guarantee we want to provide.
1229
+ const size_t sample_size =
1230
+ (std::is_same<Alloc, std::allocator<char>>::value && c.slots_ == nullptr)
1231
+ ? SizeOfSlot
1232
+ : 0;
1233
+
1234
+ const size_t cap = c.capacity_;
1235
+ char* mem = static_cast<char*>(
1236
+ Allocate<AlignOfSlot>(&alloc, AllocSize(cap, SizeOfSlot, AlignOfSlot)));
1237
+ const GenerationType old_generation = c.generation();
1238
+ c.set_generation_ptr(
1239
+ reinterpret_cast<GenerationType*>(mem + GenerationOffset(cap)));
1240
+ c.set_generation(old_generation + 1);
1241
+ c.control_ = reinterpret_cast<ctrl_t*>(mem);
1242
+ c.slots_ = mem + SlotOffset(cap, AlignOfSlot);
1243
+ ResetCtrl(c, SizeOfSlot);
1244
+ if (sample_size) {
1245
+ c.infoz() = Sample(sample_size);
1246
+ }
1247
+ c.infoz().RecordStorageChanged(c.size_, cap);
1248
+ }
1249
+
1250
+ // PolicyFunctions bundles together some information for a particular
1251
+ // raw_hash_set<T, ...> instantiation. This information is passed to
1252
+ // type-erased functions that want to do small amounts of type-specific
1253
+ // work.
1254
+ struct PolicyFunctions {
1255
+ size_t slot_size;
1256
+
1257
+ // Return the hash of the pointed-to slot.
1258
+ size_t (*hash_slot)(void* set, void* slot);
1259
+
1260
+ // Transfer the contents of src_slot to dst_slot.
1261
+ void (*transfer)(void* set, void* dst_slot, void* src_slot);
1262
+
1263
+ // Deallocate the specified backing store which is sized for n slots.
1264
+ void (*dealloc)(void* set, const PolicyFunctions& policy, ctrl_t* ctrl,
1265
+ void* slot_array, size_t n);
1266
+ };
1267
+
1268
+ // ClearBackingArray clears the backing array, either modifying it in place,
1269
+ // or creating a new one based on the value of "reuse".
1270
+ // REQUIRES: c.capacity > 0
1271
+ void ClearBackingArray(CommonFields& c, const PolicyFunctions& policy,
1272
+ bool reuse);
1273
+
1274
+ // Type-erased version of raw_hash_set::erase_meta_only.
1275
+ void EraseMetaOnly(CommonFields& c, ctrl_t* it, size_t slot_size);
1276
+
1277
+ // Function to place in PolicyFunctions::dealloc for raw_hash_sets
1278
+ // that are using std::allocator. This allows us to share the same
1279
+ // function body for raw_hash_set instantiations that have the
1280
+ // same slot alignment.
1281
+ template <size_t AlignOfSlot>
1282
+ ABSL_ATTRIBUTE_NOINLINE void DeallocateStandard(void*,
1283
+ const PolicyFunctions& policy,
1284
+ ctrl_t* ctrl, void* slot_array,
1285
+ size_t n) {
1286
+ // Unpoison before returning the memory to the allocator.
1287
+ SanitizerUnpoisonMemoryRegion(slot_array, policy.slot_size * n);
1288
+
1289
+ std::allocator<char> alloc;
1290
+ Deallocate<AlignOfSlot>(&alloc, ctrl,
1291
+ AllocSize(n, policy.slot_size, AlignOfSlot));
1292
+ }
1293
+
1294
+ // For trivially relocatable types we use memcpy directly. This allows us to
1295
+ // share the same function body for raw_hash_set instantiations that have the
1296
+ // same slot size as long as they are relocatable.
1297
+ template <size_t SizeOfSlot>
1298
+ ABSL_ATTRIBUTE_NOINLINE void TransferRelocatable(void*, void* dst, void* src) {
1299
+ memcpy(dst, src, SizeOfSlot);
1300
+ }
1301
+
1302
+ // Type-erased version of raw_hash_set::drop_deletes_without_resize.
1303
+ void DropDeletesWithoutResize(CommonFields& common,
1304
+ const PolicyFunctions& policy, void* tmp_space);
1305
+
1306
+ // A SwissTable.
1307
+ //
658
1308
  // Policy: a policy defines how to perform different operations on
659
1309
  // the slots of the hashtable (see hash_policy_traits.h for the full interface
660
1310
  // of policy).
@@ -753,7 +1403,7 @@ class raw_hash_set {
753
1403
  static_assert(std::is_same<const_pointer, const value_type*>::value,
754
1404
  "Allocators with custom pointer types are not supported");
755
1405
 
756
- class iterator {
1406
+ class iterator : private HashSetIteratorGenerationInfo {
757
1407
  friend class raw_hash_set;
758
1408
 
759
1409
  public:
@@ -769,16 +1419,22 @@ class raw_hash_set {
769
1419
 
770
1420
  // PRECONDITION: not an end() iterator.
771
1421
  reference operator*() const {
772
- AssertIsFull(ctrl_);
1422
+ ABSL_INTERNAL_ASSERT_IS_FULL(ctrl_, generation(), generation_ptr(),
1423
+ "operator*()");
773
1424
  return PolicyTraits::element(slot_);
774
1425
  }
775
1426
 
776
1427
  // PRECONDITION: not an end() iterator.
777
- pointer operator->() const { return &operator*(); }
1428
+ pointer operator->() const {
1429
+ ABSL_INTERNAL_ASSERT_IS_FULL(ctrl_, generation(), generation_ptr(),
1430
+ "operator->");
1431
+ return &operator*();
1432
+ }
778
1433
 
779
1434
  // PRECONDITION: not an end() iterator.
780
1435
  iterator& operator++() {
781
- AssertIsFull(ctrl_);
1436
+ ABSL_INTERNAL_ASSERT_IS_FULL(ctrl_, generation(), generation_ptr(),
1437
+ "operator++");
782
1438
  ++ctrl_;
783
1439
  ++slot_;
784
1440
  skip_empty_or_deleted();
@@ -792,8 +1448,9 @@ class raw_hash_set {
792
1448
  }
793
1449
 
794
1450
  friend bool operator==(const iterator& a, const iterator& b) {
795
- AssertIsValid(a.ctrl_);
796
- AssertIsValid(b.ctrl_);
1451
+ AssertSameContainer(a.ctrl_, b.ctrl_, a.slot_, b.slot_);
1452
+ AssertIsValidForComparison(a.ctrl_, a.generation(), a.generation_ptr());
1453
+ AssertIsValidForComparison(b.ctrl_, b.generation(), b.generation_ptr());
797
1454
  return a.ctrl_ == b.ctrl_;
798
1455
  }
799
1456
  friend bool operator!=(const iterator& a, const iterator& b) {
@@ -801,12 +1458,23 @@ class raw_hash_set {
801
1458
  }
802
1459
 
803
1460
  private:
804
- iterator(ctrl_t* ctrl, slot_type* slot) : ctrl_(ctrl), slot_(slot) {
1461
+ iterator(ctrl_t* ctrl, slot_type* slot,
1462
+ const GenerationType* generation_ptr)
1463
+ : HashSetIteratorGenerationInfo(generation_ptr),
1464
+ ctrl_(ctrl),
1465
+ slot_(slot) {
805
1466
  // This assumption helps the compiler know that any non-end iterator is
806
1467
  // not equal to any end iterator.
807
- ABSL_INTERNAL_ASSUME(ctrl != nullptr);
1468
+ ABSL_ASSUME(ctrl != nullptr);
808
1469
  }
1470
+ // For end() iterators.
1471
+ explicit iterator(const GenerationType* generation_ptr)
1472
+ : HashSetIteratorGenerationInfo(generation_ptr) {}
809
1473
 
1474
+ // Fixes up `ctrl_` to point to a full by advancing it and `slot_` until
1475
+ // they reach one.
1476
+ //
1477
+ // If a sentinel is reached, we null `ctrl_` out instead.
810
1478
  void skip_empty_or_deleted() {
811
1479
  while (IsEmptyOrDeleted(*ctrl_)) {
812
1480
  uint32_t shift = Group{ctrl_}.CountLeadingEmptyOrDeleted();
@@ -834,9 +1502,9 @@ class raw_hash_set {
834
1502
  using pointer = typename raw_hash_set::const_pointer;
835
1503
  using difference_type = typename raw_hash_set::difference_type;
836
1504
 
837
- const_iterator() {}
1505
+ const_iterator() = default;
838
1506
  // Implicit construction from iterator.
839
- const_iterator(iterator i) : inner_(std::move(i)) {}
1507
+ const_iterator(iterator i) : inner_(std::move(i)) {} // NOLINT
840
1508
 
841
1509
  reference operator*() const { return *inner_; }
842
1510
  pointer operator->() const { return inner_.operator->(); }
@@ -855,8 +1523,10 @@ class raw_hash_set {
855
1523
  }
856
1524
 
857
1525
  private:
858
- const_iterator(const ctrl_t* ctrl, const slot_type* slot)
859
- : inner_(const_cast<ctrl_t*>(ctrl), const_cast<slot_type*>(slot)) {}
1526
+ const_iterator(const ctrl_t* ctrl, const slot_type* slot,
1527
+ const GenerationType* gen)
1528
+ : inner_(const_cast<ctrl_t*>(ctrl), const_cast<slot_type*>(slot), gen) {
1529
+ }
860
1530
 
861
1531
  iterator inner_;
862
1532
  };
@@ -864,18 +1534,20 @@ class raw_hash_set {
864
1534
  using node_type = node_handle<Policy, hash_policy_traits<Policy>, Alloc>;
865
1535
  using insert_return_type = InsertReturnType<iterator, node_type>;
866
1536
 
1537
+ // Note: can't use `= default` due to non-default noexcept (causes
1538
+ // problems for some compilers). NOLINTNEXTLINE
867
1539
  raw_hash_set() noexcept(
868
1540
  std::is_nothrow_default_constructible<hasher>::value&&
869
1541
  std::is_nothrow_default_constructible<key_equal>::value&&
870
1542
  std::is_nothrow_default_constructible<allocator_type>::value) {}
871
1543
 
872
- explicit raw_hash_set(size_t bucket_count, const hasher& hash = hasher(),
873
- const key_equal& eq = key_equal(),
874
- const allocator_type& alloc = allocator_type())
875
- : ctrl_(EmptyGroup()),
876
- settings_(0, HashtablezInfoHandle(), hash, eq, alloc) {
1544
+ ABSL_ATTRIBUTE_NOINLINE explicit raw_hash_set(
1545
+ size_t bucket_count, const hasher& hash = hasher(),
1546
+ const key_equal& eq = key_equal(),
1547
+ const allocator_type& alloc = allocator_type())
1548
+ : settings_(CommonFields{}, hash, eq, alloc) {
877
1549
  if (bucket_count) {
878
- capacity_ = NormalizeCapacity(bucket_count);
1550
+ common().capacity_ = NormalizeCapacity(bucket_count);
879
1551
  initialize_slots();
880
1552
  }
881
1553
  }
@@ -982,45 +1654,30 @@ class raw_hash_set {
982
1654
  // than a full `insert`.
983
1655
  for (const auto& v : that) {
984
1656
  const size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, v);
985
- auto target = find_first_non_full(ctrl_, hash, capacity_);
986
- SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
987
- sizeof(slot_type));
1657
+ auto target = find_first_non_full_outofline(common(), hash);
1658
+ SetCtrl(common(), target.offset, H2(hash), sizeof(slot_type));
988
1659
  emplace_at(target.offset, v);
1660
+ common().maybe_increment_generation_on_insert();
989
1661
  infoz().RecordInsert(hash, target.probe_length);
990
1662
  }
991
- size_ = that.size();
1663
+ common().size_ = that.size();
992
1664
  growth_left() -= that.size();
993
1665
  }
994
1666
 
995
- raw_hash_set(raw_hash_set&& that) noexcept(
1667
+ ABSL_ATTRIBUTE_NOINLINE raw_hash_set(raw_hash_set&& that) noexcept(
996
1668
  std::is_nothrow_copy_constructible<hasher>::value&&
997
1669
  std::is_nothrow_copy_constructible<key_equal>::value&&
998
1670
  std::is_nothrow_copy_constructible<allocator_type>::value)
999
- : ctrl_(absl::exchange(that.ctrl_, EmptyGroup())),
1000
- slots_(absl::exchange(that.slots_, nullptr)),
1001
- size_(absl::exchange(that.size_, 0)),
1002
- capacity_(absl::exchange(that.capacity_, 0)),
1003
- // Hash, equality and allocator are copied instead of moved because
1004
- // `that` must be left valid. If Hash is std::function<Key>, moving it
1005
- // would create a nullptr functor that cannot be called.
1006
- settings_(absl::exchange(that.growth_left(), 0),
1007
- absl::exchange(that.infoz(), HashtablezInfoHandle()),
1671
+ : // Hash, equality and allocator are copied instead of moved because
1672
+ // `that` must be left valid. If Hash is std::function<Key>, moving it
1673
+ // would create a nullptr functor that cannot be called.
1674
+ settings_(absl::exchange(that.common(), CommonFields{}),
1008
1675
  that.hash_ref(), that.eq_ref(), that.alloc_ref()) {}
1009
1676
 
1010
1677
  raw_hash_set(raw_hash_set&& that, const allocator_type& a)
1011
- : ctrl_(EmptyGroup()),
1012
- slots_(nullptr),
1013
- size_(0),
1014
- capacity_(0),
1015
- settings_(0, HashtablezInfoHandle(), that.hash_ref(), that.eq_ref(),
1016
- a) {
1678
+ : settings_(CommonFields{}, that.hash_ref(), that.eq_ref(), a) {
1017
1679
  if (a == that.alloc_ref()) {
1018
- std::swap(ctrl_, that.ctrl_);
1019
- std::swap(slots_, that.slots_);
1020
- std::swap(size_, that.size_);
1021
- std::swap(capacity_, that.capacity_);
1022
- std::swap(growth_left(), that.growth_left());
1023
- std::swap(infoz(), that.infoz());
1680
+ std::swap(common(), that.common());
1024
1681
  } else {
1025
1682
  reserve(that.size());
1026
1683
  // Note: this will copy elements of dense_set and unordered_set instead of
@@ -1044,30 +1701,43 @@ class raw_hash_set {
1044
1701
  std::is_nothrow_move_assignable<key_equal>::value) {
1045
1702
  // TODO(sbenza): We should only use the operations from the noexcept clause
1046
1703
  // to make sure we actually adhere to that contract.
1704
+ // NOLINTNEXTLINE: not returning *this for performance.
1047
1705
  return move_assign(
1048
1706
  std::move(that),
1049
1707
  typename AllocTraits::propagate_on_container_move_assignment());
1050
1708
  }
1051
1709
 
1052
- ~raw_hash_set() { destroy_slots(); }
1710
+ ~raw_hash_set() {
1711
+ const size_t cap = capacity();
1712
+ if (!cap) return;
1713
+ destroy_slots();
1714
+
1715
+ // Unpoison before returning the memory to the allocator.
1716
+ SanitizerUnpoisonMemoryRegion(slot_array(), sizeof(slot_type) * cap);
1717
+ Deallocate<alignof(slot_type)>(
1718
+ &alloc_ref(), control(),
1719
+ AllocSize(cap, sizeof(slot_type), alignof(slot_type)));
1720
+
1721
+ infoz().Unregister();
1722
+ }
1053
1723
 
1054
1724
  iterator begin() {
1055
1725
  auto it = iterator_at(0);
1056
1726
  it.skip_empty_or_deleted();
1057
1727
  return it;
1058
1728
  }
1059
- iterator end() { return {}; }
1729
+ iterator end() { return iterator(common().generation_ptr()); }
1060
1730
 
1061
1731
  const_iterator begin() const {
1062
1732
  return const_cast<raw_hash_set*>(this)->begin();
1063
1733
  }
1064
- const_iterator end() const { return {}; }
1734
+ const_iterator end() const { return iterator(common().generation_ptr()); }
1065
1735
  const_iterator cbegin() const { return begin(); }
1066
1736
  const_iterator cend() const { return end(); }
1067
1737
 
1068
1738
  bool empty() const { return !size(); }
1069
- size_t size() const { return size_; }
1070
- size_t capacity() const { return capacity_; }
1739
+ size_t size() const { return common().size_; }
1740
+ size_t capacity() const { return common().capacity_; }
1071
1741
  size_t max_size() const { return (std::numeric_limits<size_t>::max)(); }
1072
1742
 
1073
1743
  ABSL_ATTRIBUTE_REINITIALIZES void clear() {
@@ -1078,22 +1748,26 @@ class raw_hash_set {
1078
1748
  // compared to destruction of the elements of the container. So we pick the
1079
1749
  // largest bucket_count() threshold for which iteration is still fast and
1080
1750
  // past that we simply deallocate the array.
1081
- if (capacity_ > 127) {
1751
+ const size_t cap = capacity();
1752
+ if (cap == 0) {
1753
+ // Already guaranteed to be empty; so nothing to do.
1754
+ } else {
1082
1755
  destroy_slots();
1756
+ ClearBackingArray(common(), GetPolicyFunctions(),
1757
+ /*reuse=*/cap < 128);
1758
+ }
1759
+ common().set_reserved_growth(0);
1760
+ }
1083
1761
 
1084
- infoz().RecordClearedReservation();
1085
- } else if (capacity_) {
1086
- for (size_t i = 0; i != capacity_; ++i) {
1087
- if (IsFull(ctrl_[i])) {
1088
- PolicyTraits::destroy(&alloc_ref(), slots_ + i);
1089
- }
1762
+ inline void destroy_slots() {
1763
+ const size_t cap = capacity();
1764
+ const ctrl_t* ctrl = control();
1765
+ slot_type* slot = slot_array();
1766
+ for (size_t i = 0; i != cap; ++i) {
1767
+ if (IsFull(ctrl[i])) {
1768
+ PolicyTraits::destroy(&alloc_ref(), slot + i);
1090
1769
  }
1091
- size_ = 0;
1092
- ResetCtrl(capacity_, ctrl_, slots_, sizeof(slot_type));
1093
- reset_growth_left();
1094
1770
  }
1095
- assert(empty());
1096
- infoz().RecordStorageChanged(0, capacity_);
1097
1771
  }
1098
1772
 
1099
1773
  // This overload kicks in when the argument is an rvalue of insertable and
@@ -1103,8 +1777,7 @@ class raw_hash_set {
1103
1777
  // m.insert(std::make_pair("abc", 42));
1104
1778
  // TODO(cheshire): A type alias T2 is introduced as a workaround for the nvcc
1105
1779
  // bug.
1106
- template <class T, RequiresInsertable<T> = 0,
1107
- class T2 = T,
1780
+ template <class T, RequiresInsertable<T> = 0, class T2 = T,
1108
1781
  typename std::enable_if<IsDecomposable<T2>::value, int>::type = 0,
1109
1782
  T* = nullptr>
1110
1783
  std::pair<iterator, bool> insert(T&& value) {
@@ -1282,7 +1955,7 @@ class raw_hash_set {
1282
1955
  iterator lazy_emplace(const key_arg<K>& key, F&& f) {
1283
1956
  auto res = find_or_prepare_insert(key);
1284
1957
  if (res.second) {
1285
- slot_type* slot = slots_ + res.first;
1958
+ slot_type* slot = slot_array() + res.first;
1286
1959
  std::forward<F>(f)(constructor(&alloc_ref(), &slot));
1287
1960
  assert(!slot);
1288
1961
  }
@@ -1324,7 +1997,8 @@ class raw_hash_set {
1324
1997
  // This overload is necessary because otherwise erase<K>(const K&) would be
1325
1998
  // a better match if non-const iterator is passed as an argument.
1326
1999
  void erase(iterator it) {
1327
- AssertIsFull(it.ctrl_);
2000
+ ABSL_INTERNAL_ASSERT_IS_FULL(it.ctrl_, it.generation(), it.generation_ptr(),
2001
+ "erase()");
1328
2002
  PolicyTraits::destroy(&alloc_ref(), it.slot_);
1329
2003
  erase_meta_only(it);
1330
2004
  }
@@ -1358,7 +2032,9 @@ class raw_hash_set {
1358
2032
  }
1359
2033
 
1360
2034
  node_type extract(const_iterator position) {
1361
- AssertIsFull(position.inner_.ctrl_);
2035
+ ABSL_INTERNAL_ASSERT_IS_FULL(position.inner_.ctrl_,
2036
+ position.inner_.generation(),
2037
+ position.inner_.generation_ptr(), "extract()");
1362
2038
  auto node =
1363
2039
  CommonAccess::Transfer<node_type>(alloc_ref(), position.inner_.slot_);
1364
2040
  erase_meta_only(position);
@@ -1378,24 +2054,18 @@ class raw_hash_set {
1378
2054
  IsNoThrowSwappable<allocator_type>(
1379
2055
  typename AllocTraits::propagate_on_container_swap{})) {
1380
2056
  using std::swap;
1381
- swap(ctrl_, that.ctrl_);
1382
- swap(slots_, that.slots_);
1383
- swap(size_, that.size_);
1384
- swap(capacity_, that.capacity_);
1385
- swap(growth_left(), that.growth_left());
2057
+ swap(common(), that.common());
1386
2058
  swap(hash_ref(), that.hash_ref());
1387
2059
  swap(eq_ref(), that.eq_ref());
1388
- swap(infoz(), that.infoz());
1389
2060
  SwapAlloc(alloc_ref(), that.alloc_ref(),
1390
2061
  typename AllocTraits::propagate_on_container_swap{});
1391
2062
  }
1392
2063
 
1393
2064
  void rehash(size_t n) {
1394
- if (n == 0 && capacity_ == 0) return;
1395
- if (n == 0 && size_ == 0) {
1396
- destroy_slots();
1397
- infoz().RecordStorageChanged(0, 0);
1398
- infoz().RecordClearedReservation();
2065
+ if (n == 0 && capacity() == 0) return;
2066
+ if (n == 0 && size() == 0) {
2067
+ ClearBackingArray(common(), GetPolicyFunctions(),
2068
+ /*reuse=*/false);
1399
2069
  return;
1400
2070
  }
1401
2071
 
@@ -1403,7 +2073,7 @@ class raw_hash_set {
1403
2073
  // power-of-2-minus-1, so bitor is good enough.
1404
2074
  auto m = NormalizeCapacity(n | GrowthToLowerboundCapacity(size()));
1405
2075
  // n == 0 unconditionally rehashes as per the standard.
1406
- if (n == 0 || m > capacity_) {
2076
+ if (n == 0 || m > capacity()) {
1407
2077
  resize(m);
1408
2078
 
1409
2079
  // This is after resize, to ensure that we have completed the allocation
@@ -1421,6 +2091,7 @@ class raw_hash_set {
1421
2091
  // and have potentially sampled the hashtable.
1422
2092
  infoz().RecordReservation(n);
1423
2093
  }
2094
+ common().reset_reserved_growth(n);
1424
2095
  }
1425
2096
 
1426
2097
  // Extension API: support for heterogeneous keys.
@@ -1445,12 +2116,13 @@ class raw_hash_set {
1445
2116
  template <class K = key_type>
1446
2117
  void prefetch(const key_arg<K>& key) const {
1447
2118
  (void)key;
1448
- #if defined(__GNUC__)
2119
+ // Avoid probing if we won't be able to prefetch the addresses received.
2120
+ #ifdef ABSL_INTERNAL_HAVE_PREFETCH
1449
2121
  prefetch_heap_block();
1450
- auto seq = probe(ctrl_, hash_ref()(key), capacity_);
1451
- __builtin_prefetch(static_cast<const void*>(ctrl_ + seq.offset()));
1452
- __builtin_prefetch(static_cast<const void*>(slots_ + seq.offset()));
1453
- #endif // __GNUC__
2122
+ auto seq = probe(common(), hash_ref()(key));
2123
+ base_internal::PrefetchT0(control() + seq.offset());
2124
+ base_internal::PrefetchT0(slot_array() + seq.offset());
2125
+ #endif // ABSL_INTERNAL_HAVE_PREFETCH
1454
2126
  }
1455
2127
 
1456
2128
  // The API of find() has two extensions.
@@ -1462,18 +2134,20 @@ class raw_hash_set {
1462
2134
  // called heterogeneous key support.
1463
2135
  template <class K = key_type>
1464
2136
  iterator find(const key_arg<K>& key, size_t hash) {
1465
- auto seq = probe(ctrl_, hash, capacity_);
2137
+ auto seq = probe(common(), hash);
2138
+ slot_type* slot_ptr = slot_array();
2139
+ const ctrl_t* ctrl = control();
1466
2140
  while (true) {
1467
- Group g{ctrl_ + seq.offset()};
1468
- for (int i : g.Match(H2(hash))) {
2141
+ Group g{ctrl + seq.offset()};
2142
+ for (uint32_t i : g.Match(H2(hash))) {
1469
2143
  if (ABSL_PREDICT_TRUE(PolicyTraits::apply(
1470
2144
  EqualElement<K>{key, eq_ref()},
1471
- PolicyTraits::element(slots_ + seq.offset(i)))))
2145
+ PolicyTraits::element(slot_ptr + seq.offset(i)))))
1472
2146
  return iterator_at(seq.offset(i));
1473
2147
  }
1474
- if (ABSL_PREDICT_TRUE(g.MatchEmpty())) return end();
2148
+ if (ABSL_PREDICT_TRUE(g.MaskEmpty())) return end();
1475
2149
  seq.next();
1476
- assert(seq.index() <= capacity_ && "full table!");
2150
+ assert(seq.index() <= capacity() && "full table!");
1477
2151
  }
1478
2152
  }
1479
2153
  template <class K = key_type>
@@ -1511,9 +2185,9 @@ class raw_hash_set {
1511
2185
  return {it, it};
1512
2186
  }
1513
2187
 
1514
- size_t bucket_count() const { return capacity_; }
2188
+ size_t bucket_count() const { return capacity(); }
1515
2189
  float load_factor() const {
1516
- return capacity_ ? static_cast<double>(size()) / capacity_ : 0.0;
2190
+ return capacity() ? static_cast<double>(size()) / capacity() : 0.0;
1517
2191
  }
1518
2192
  float max_load_factor() const { return 1.0f; }
1519
2193
  void max_load_factor(float) {
@@ -1538,6 +2212,14 @@ class raw_hash_set {
1538
2212
  return !(a == b);
1539
2213
  }
1540
2214
 
2215
+ template <typename H>
2216
+ friend typename std::enable_if<H::template is_hashable<value_type>::value,
2217
+ H>::type
2218
+ AbslHashValue(H h, const raw_hash_set& s) {
2219
+ return H::combine(H::combine_unordered(std::move(h), s.begin(), s.end()),
2220
+ s.size());
2221
+ }
2222
+
1541
2223
  friend void swap(raw_hash_set& a,
1542
2224
  raw_hash_set& b) noexcept(noexcept(a.swap(b))) {
1543
2225
  a.swap(b);
@@ -1592,7 +2274,8 @@ class raw_hash_set {
1592
2274
  std::pair<iterator, bool> operator()(const K& key, Args&&...) && {
1593
2275
  auto res = s.find_or_prepare_insert(key);
1594
2276
  if (res.second) {
1595
- PolicyTraits::transfer(&s.alloc_ref(), s.slots_ + res.first, &slot);
2277
+ PolicyTraits::transfer(&s.alloc_ref(), s.slot_array() + res.first,
2278
+ &slot);
1596
2279
  } else if (do_destroy) {
1597
2280
  PolicyTraits::destroy(&s.alloc_ref(), &slot);
1598
2281
  }
@@ -1603,98 +2286,48 @@ class raw_hash_set {
1603
2286
  slot_type&& slot;
1604
2287
  };
1605
2288
 
1606
- // "erases" the object from the container, except that it doesn't actually
1607
- // destroy the object. It only updates all the metadata of the class.
1608
- // This can be used in conjunction with Policy::transfer to move the object to
1609
- // another place.
2289
+ // Erases, but does not destroy, the value pointed to by `it`.
2290
+ //
2291
+ // This merely updates the pertinent control byte. This can be used in
2292
+ // conjunction with Policy::transfer to move the object to another place.
1610
2293
  void erase_meta_only(const_iterator it) {
1611
- assert(IsFull(*it.inner_.ctrl_) && "erasing a dangling iterator");
1612
- --size_;
1613
- const size_t index = it.inner_.ctrl_ - ctrl_;
1614
- const size_t index_before = (index - Group::kWidth) & capacity_;
1615
- const auto empty_after = Group(it.inner_.ctrl_).MatchEmpty();
1616
- const auto empty_before = Group(ctrl_ + index_before).MatchEmpty();
1617
-
1618
- // We count how many consecutive non empties we have to the right and to the
1619
- // left of `it`. If the sum is >= kWidth then there is at least one probe
1620
- // window that might have seen a full group.
1621
- bool was_never_full =
1622
- empty_before && empty_after &&
1623
- static_cast<size_t>(empty_after.TrailingZeros() +
1624
- empty_before.LeadingZeros()) < Group::kWidth;
1625
-
1626
- SetCtrl(index, was_never_full ? ctrl_t::kEmpty : ctrl_t::kDeleted,
1627
- capacity_, ctrl_, slots_, sizeof(slot_type));
1628
- growth_left() += was_never_full;
1629
- infoz().RecordErase();
1630
- }
1631
-
1632
- void initialize_slots() {
1633
- assert(capacity_);
1634
- // Folks with custom allocators often make unwarranted assumptions about the
1635
- // behavior of their classes vis-a-vis trivial destructability and what
1636
- // calls they will or wont make. Avoid sampling for people with custom
1637
- // allocators to get us out of this mess. This is not a hard guarantee but
1638
- // a workaround while we plan the exact guarantee we want to provide.
1639
- //
2294
+ EraseMetaOnly(common(), it.inner_.ctrl_, sizeof(slot_type));
2295
+ }
2296
+
2297
+ // Allocates a backing array for `self` and initializes its control bytes.
2298
+ // This reads `capacity` and updates all other fields based on the result of
2299
+ // the allocation.
2300
+ //
2301
+ // This does not free the currently held array; `capacity` must be nonzero.
2302
+ inline void initialize_slots() {
1640
2303
  // People are often sloppy with the exact type of their allocator (sometimes
1641
2304
  // it has an extra const or is missing the pair, but rebinds made it work
1642
- // anyway). To avoid the ambiguity, we work off SlotAlloc which we have
1643
- // bound more carefully.
1644
- if (std::is_same<SlotAlloc, std::allocator<slot_type>>::value &&
1645
- slots_ == nullptr) {
1646
- infoz() = Sample(sizeof(slot_type));
1647
- }
1648
-
1649
- char* mem = static_cast<char*>(Allocate<alignof(slot_type)>(
1650
- &alloc_ref(),
1651
- AllocSize(capacity_, sizeof(slot_type), alignof(slot_type))));
1652
- ctrl_ = reinterpret_cast<ctrl_t*>(mem);
1653
- slots_ = reinterpret_cast<slot_type*>(
1654
- mem + SlotOffset(capacity_, alignof(slot_type)));
1655
- ResetCtrl(capacity_, ctrl_, slots_, sizeof(slot_type));
1656
- reset_growth_left();
1657
- infoz().RecordStorageChanged(size_, capacity_);
1658
- }
1659
-
1660
- void destroy_slots() {
1661
- if (!capacity_) return;
1662
- for (size_t i = 0; i != capacity_; ++i) {
1663
- if (IsFull(ctrl_[i])) {
1664
- PolicyTraits::destroy(&alloc_ref(), slots_ + i);
1665
- }
1666
- }
1667
-
1668
- // Unpoison before returning the memory to the allocator.
1669
- SanitizerUnpoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_);
1670
- Deallocate<alignof(slot_type)>(
1671
- &alloc_ref(), ctrl_,
1672
- AllocSize(capacity_, sizeof(slot_type), alignof(slot_type)));
1673
- ctrl_ = EmptyGroup();
1674
- slots_ = nullptr;
1675
- size_ = 0;
1676
- capacity_ = 0;
1677
- growth_left() = 0;
2305
+ // anyway).
2306
+ using CharAlloc =
2307
+ typename absl::allocator_traits<Alloc>::template rebind_alloc<char>;
2308
+ InitializeSlots<CharAlloc, sizeof(slot_type), alignof(slot_type)>(
2309
+ common(), CharAlloc(alloc_ref()));
1678
2310
  }
1679
2311
 
1680
- void resize(size_t new_capacity) {
2312
+ ABSL_ATTRIBUTE_NOINLINE void resize(size_t new_capacity) {
1681
2313
  assert(IsValidCapacity(new_capacity));
1682
- auto* old_ctrl = ctrl_;
1683
- auto* old_slots = slots_;
1684
- const size_t old_capacity = capacity_;
1685
- capacity_ = new_capacity;
2314
+ auto* old_ctrl = control();
2315
+ auto* old_slots = slot_array();
2316
+ const size_t old_capacity = common().capacity_;
2317
+ common().capacity_ = new_capacity;
1686
2318
  initialize_slots();
1687
2319
 
2320
+ auto* new_slots = slot_array();
1688
2321
  size_t total_probe_length = 0;
1689
2322
  for (size_t i = 0; i != old_capacity; ++i) {
1690
2323
  if (IsFull(old_ctrl[i])) {
1691
2324
  size_t hash = PolicyTraits::apply(HashElement{hash_ref()},
1692
2325
  PolicyTraits::element(old_slots + i));
1693
- auto target = find_first_non_full(ctrl_, hash, capacity_);
2326
+ auto target = find_first_non_full(common(), hash);
1694
2327
  size_t new_i = target.offset;
1695
2328
  total_probe_length += target.probe_length;
1696
- SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1697
- PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, old_slots + i);
2329
+ SetCtrl(common(), new_i, H2(hash), sizeof(slot_type));
2330
+ PolicyTraits::transfer(&alloc_ref(), new_slots + new_i, old_slots + i);
1698
2331
  }
1699
2332
  }
1700
2333
  if (old_capacity) {
@@ -1707,81 +2340,28 @@ class raw_hash_set {
1707
2340
  infoz().RecordRehash(total_probe_length);
1708
2341
  }
1709
2342
 
1710
- void drop_deletes_without_resize() ABSL_ATTRIBUTE_NOINLINE {
1711
- assert(IsValidCapacity(capacity_));
1712
- assert(!is_small(capacity_));
1713
- // Algorithm:
1714
- // - mark all DELETED slots as EMPTY
1715
- // - mark all FULL slots as DELETED
1716
- // - for each slot marked as DELETED
1717
- // hash = Hash(element)
1718
- // target = find_first_non_full(hash)
1719
- // if target is in the same group
1720
- // mark slot as FULL
1721
- // else if target is EMPTY
1722
- // transfer element to target
1723
- // mark slot as EMPTY
1724
- // mark target as FULL
1725
- // else if target is DELETED
1726
- // swap current element with target element
1727
- // mark target as FULL
1728
- // repeat procedure for current slot with moved from element (target)
1729
- ConvertDeletedToEmptyAndFullToDeleted(ctrl_, capacity_);
1730
- alignas(slot_type) unsigned char raw[sizeof(slot_type)];
1731
- size_t total_probe_length = 0;
1732
- slot_type* slot = reinterpret_cast<slot_type*>(&raw);
1733
- for (size_t i = 0; i != capacity_; ++i) {
1734
- if (!IsDeleted(ctrl_[i])) continue;
1735
- const size_t hash = PolicyTraits::apply(
1736
- HashElement{hash_ref()}, PolicyTraits::element(slots_ + i));
1737
- const FindInfo target = find_first_non_full(ctrl_, hash, capacity_);
1738
- const size_t new_i = target.offset;
1739
- total_probe_length += target.probe_length;
1740
-
1741
- // Verify if the old and new i fall within the same group wrt the hash.
1742
- // If they do, we don't need to move the object as it falls already in the
1743
- // best probe we can.
1744
- const size_t probe_offset = probe(ctrl_, hash, capacity_).offset();
1745
- const auto probe_index = [probe_offset, this](size_t pos) {
1746
- return ((pos - probe_offset) & capacity_) / Group::kWidth;
1747
- };
1748
-
1749
- // Element doesn't move.
1750
- if (ABSL_PREDICT_TRUE(probe_index(new_i) == probe_index(i))) {
1751
- SetCtrl(i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1752
- continue;
1753
- }
1754
- if (IsEmpty(ctrl_[new_i])) {
1755
- // Transfer element to the empty spot.
1756
- // SetCtrl poisons/unpoisons the slots so we have to call it at the
1757
- // right time.
1758
- SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1759
- PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, slots_ + i);
1760
- SetCtrl(i, ctrl_t::kEmpty, capacity_, ctrl_, slots_, sizeof(slot_type));
1761
- } else {
1762
- assert(IsDeleted(ctrl_[new_i]));
1763
- SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
1764
- // Until we are done rehashing, DELETED marks previously FULL slots.
1765
- // Swap i and new_i elements.
1766
- PolicyTraits::transfer(&alloc_ref(), slot, slots_ + i);
1767
- PolicyTraits::transfer(&alloc_ref(), slots_ + i, slots_ + new_i);
1768
- PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, slot);
1769
- --i; // repeat
1770
- }
1771
- }
1772
- reset_growth_left();
1773
- infoz().RecordRehash(total_probe_length);
2343
+ // Prunes control bytes to remove as many tombstones as possible.
2344
+ //
2345
+ // See the comment on `rehash_and_grow_if_necessary()`.
2346
+ inline void drop_deletes_without_resize() {
2347
+ // Stack-allocate space for swapping elements.
2348
+ alignas(slot_type) unsigned char tmp[sizeof(slot_type)];
2349
+ DropDeletesWithoutResize(common(), GetPolicyFunctions(), tmp);
1774
2350
  }
1775
2351
 
2352
+ // Called whenever the table *might* need to conditionally grow.
2353
+ //
2354
+ // This function is an optimization opportunity to perform a rehash even when
2355
+ // growth is unnecessary, because vacating tombstones is beneficial for
2356
+ // performance in the long-run.
1776
2357
  void rehash_and_grow_if_necessary() {
1777
- if (capacity_ == 0) {
1778
- resize(1);
1779
- } else if (capacity_ > Group::kWidth &&
1780
- // Do these calcuations in 64-bit to avoid overflow.
1781
- size() * uint64_t{32} <= capacity_ * uint64_t{25}) {
2358
+ const size_t cap = capacity();
2359
+ if (cap > Group::kWidth &&
2360
+ // Do these calcuations in 64-bit to avoid overflow.
2361
+ size() * uint64_t{32} <= cap* uint64_t{25}) {
1782
2362
  // Squash DELETED without growing if there is enough capacity.
1783
2363
  //
1784
- // Rehash in place if the current size is <= 25/32 of capacity_.
2364
+ // Rehash in place if the current size is <= 25/32 of capacity.
1785
2365
  // Rationale for such a high factor: 1) drop_deletes_without_resize() is
1786
2366
  // faster than resize, and 2) it takes quite a bit of work to add
1787
2367
  // tombstones. In the worst case, seems to take approximately 4
@@ -1799,8 +2379,8 @@ class raw_hash_set {
1799
2379
  //
1800
2380
  // Here is output of an experiment using the BM_CacheInSteadyState
1801
2381
  // benchmark running the old case (where we rehash-in-place only if we can
1802
- // reclaim at least 7/16*capacity_) vs. this code (which rehashes in place
1803
- // if we can recover 3/32*capacity_).
2382
+ // reclaim at least 7/16*capacity) vs. this code (which rehashes in place
2383
+ // if we can recover 3/32*capacity).
1804
2384
  //
1805
2385
  // Note that although in the worst-case number of rehashes jumped up from
1806
2386
  // 15 to 190, but the number of operations per second is almost the same.
@@ -1823,23 +2403,24 @@ class raw_hash_set {
1823
2403
  drop_deletes_without_resize();
1824
2404
  } else {
1825
2405
  // Otherwise grow the container.
1826
- resize(capacity_ * 2 + 1);
2406
+ resize(NextCapacity(cap));
1827
2407
  }
1828
2408
  }
1829
2409
 
1830
2410
  bool has_element(const value_type& elem) const {
1831
2411
  size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, elem);
1832
- auto seq = probe(ctrl_, hash, capacity_);
2412
+ auto seq = probe(common(), hash);
2413
+ const ctrl_t* ctrl = control();
1833
2414
  while (true) {
1834
- Group g{ctrl_ + seq.offset()};
1835
- for (int i : g.Match(H2(hash))) {
1836
- if (ABSL_PREDICT_TRUE(PolicyTraits::element(slots_ + seq.offset(i)) ==
1837
- elem))
2415
+ Group g{ctrl + seq.offset()};
2416
+ for (uint32_t i : g.Match(H2(hash))) {
2417
+ if (ABSL_PREDICT_TRUE(
2418
+ PolicyTraits::element(slot_array() + seq.offset(i)) == elem))
1838
2419
  return true;
1839
2420
  }
1840
- if (ABSL_PREDICT_TRUE(g.MatchEmpty())) return false;
2421
+ if (ABSL_PREDICT_TRUE(g.MaskEmpty())) return false;
1841
2422
  seq.next();
1842
- assert(seq.index() <= capacity_ && "full table!");
2423
+ assert(seq.index() <= capacity() && "full table!");
1843
2424
  }
1844
2425
  return false;
1845
2426
  }
@@ -1857,37 +2438,53 @@ class raw_hash_set {
1857
2438
  }
1858
2439
 
1859
2440
  protected:
2441
+ // Attempts to find `key` in the table; if it isn't found, returns a slot that
2442
+ // the value can be inserted into, with the control byte already set to
2443
+ // `key`'s H2.
1860
2444
  template <class K>
1861
2445
  std::pair<size_t, bool> find_or_prepare_insert(const K& key) {
1862
2446
  prefetch_heap_block();
1863
2447
  auto hash = hash_ref()(key);
1864
- auto seq = probe(ctrl_, hash, capacity_);
2448
+ auto seq = probe(common(), hash);
2449
+ const ctrl_t* ctrl = control();
1865
2450
  while (true) {
1866
- Group g{ctrl_ + seq.offset()};
1867
- for (int i : g.Match(H2(hash))) {
2451
+ Group g{ctrl + seq.offset()};
2452
+ for (uint32_t i : g.Match(H2(hash))) {
1868
2453
  if (ABSL_PREDICT_TRUE(PolicyTraits::apply(
1869
2454
  EqualElement<K>{key, eq_ref()},
1870
- PolicyTraits::element(slots_ + seq.offset(i)))))
2455
+ PolicyTraits::element(slot_array() + seq.offset(i)))))
1871
2456
  return {seq.offset(i), false};
1872
2457
  }
1873
- if (ABSL_PREDICT_TRUE(g.MatchEmpty())) break;
2458
+ if (ABSL_PREDICT_TRUE(g.MaskEmpty())) break;
1874
2459
  seq.next();
1875
- assert(seq.index() <= capacity_ && "full table!");
2460
+ assert(seq.index() <= capacity() && "full table!");
1876
2461
  }
1877
2462
  return {prepare_insert(hash), true};
1878
2463
  }
1879
2464
 
2465
+ // Given the hash of a value not currently in the table, finds the next
2466
+ // viable slot index to insert it at.
2467
+ //
2468
+ // REQUIRES: At least one non-full slot available.
1880
2469
  size_t prepare_insert(size_t hash) ABSL_ATTRIBUTE_NOINLINE {
1881
- auto target = find_first_non_full(ctrl_, hash, capacity_);
1882
- if (ABSL_PREDICT_FALSE(growth_left() == 0 &&
1883
- !IsDeleted(ctrl_[target.offset]))) {
2470
+ const bool rehash_for_bug_detection =
2471
+ common().should_rehash_for_bug_detection_on_insert();
2472
+ if (rehash_for_bug_detection) {
2473
+ // Move to a different heap allocation in order to detect bugs.
2474
+ const size_t cap = capacity();
2475
+ resize(growth_left() > 0 ? cap : NextCapacity(cap));
2476
+ }
2477
+ auto target = find_first_non_full(common(), hash);
2478
+ if (!rehash_for_bug_detection &&
2479
+ ABSL_PREDICT_FALSE(growth_left() == 0 &&
2480
+ !IsDeleted(control()[target.offset]))) {
1884
2481
  rehash_and_grow_if_necessary();
1885
- target = find_first_non_full(ctrl_, hash, capacity_);
2482
+ target = find_first_non_full(common(), hash);
1886
2483
  }
1887
- ++size_;
1888
- growth_left() -= IsEmpty(ctrl_[target.offset]);
1889
- SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
1890
- sizeof(slot_type));
2484
+ ++common().size_;
2485
+ growth_left() -= IsEmpty(control()[target.offset]);
2486
+ SetCtrl(common(), target.offset, H2(hash), sizeof(slot_type));
2487
+ common().maybe_increment_generation_on_insert();
1891
2488
  infoz().RecordInsert(hash, target.probe_length);
1892
2489
  return target.offset;
1893
2490
  }
@@ -1902,7 +2499,7 @@ class raw_hash_set {
1902
2499
  // POSTCONDITION: *m.iterator_at(i) == value_type(forward<Args>(args)...).
1903
2500
  template <class... Args>
1904
2501
  void emplace_at(size_t i, Args&&... args) {
1905
- PolicyTraits::construct(&alloc_ref(), slots_ + i,
2502
+ PolicyTraits::construct(&alloc_ref(), slot_array() + i,
1906
2503
  std::forward<Args>(args)...);
1907
2504
 
1908
2505
  assert(PolicyTraits::apply(FindElement{*this}, *iterator_at(i)) ==
@@ -1910,55 +2507,103 @@ class raw_hash_set {
1910
2507
  "constructed value does not match the lookup key");
1911
2508
  }
1912
2509
 
1913
- iterator iterator_at(size_t i) { return {ctrl_ + i, slots_ + i}; }
1914
- const_iterator iterator_at(size_t i) const { return {ctrl_ + i, slots_ + i}; }
2510
+ iterator iterator_at(size_t i) {
2511
+ return {control() + i, slot_array() + i, common().generation_ptr()};
2512
+ }
2513
+ const_iterator iterator_at(size_t i) const {
2514
+ return {control() + i, slot_array() + i, common().generation_ptr()};
2515
+ }
1915
2516
 
1916
2517
  private:
1917
2518
  friend struct RawHashSetTestOnlyAccess;
1918
2519
 
1919
- void reset_growth_left() {
1920
- growth_left() = CapacityToGrowth(capacity()) - size_;
2520
+ // The number of slots we can still fill without needing to rehash.
2521
+ //
2522
+ // This is stored separately due to tombstones: we do not include tombstones
2523
+ // in the growth capacity, because we'd like to rehash when the table is
2524
+ // otherwise filled with tombstones: otherwise, probe sequences might get
2525
+ // unacceptably long without triggering a rehash. Callers can also force a
2526
+ // rehash via the standard `rehash(0)`, which will recompute this value as a
2527
+ // side-effect.
2528
+ //
2529
+ // See `CapacityToGrowth()`.
2530
+ size_t& growth_left() { return common().growth_left(); }
2531
+
2532
+ // Prefetch the heap-allocated memory region to resolve potential TLB misses.
2533
+ // This is intended to overlap with execution of calculating the hash for a
2534
+ // key.
2535
+ void prefetch_heap_block() const { base_internal::PrefetchT2(control()); }
2536
+
2537
+ CommonFields& common() { return settings_.template get<0>(); }
2538
+ const CommonFields& common() const { return settings_.template get<0>(); }
2539
+
2540
+ ctrl_t* control() const { return common().control_; }
2541
+ slot_type* slot_array() const {
2542
+ return static_cast<slot_type*>(common().slots_);
1921
2543
  }
2544
+ HashtablezInfoHandle& infoz() { return common().infoz(); }
1922
2545
 
1923
- size_t& growth_left() { return settings_.template get<0>(); }
2546
+ hasher& hash_ref() { return settings_.template get<1>(); }
2547
+ const hasher& hash_ref() const { return settings_.template get<1>(); }
2548
+ key_equal& eq_ref() { return settings_.template get<2>(); }
2549
+ const key_equal& eq_ref() const { return settings_.template get<2>(); }
2550
+ allocator_type& alloc_ref() { return settings_.template get<3>(); }
2551
+ const allocator_type& alloc_ref() const {
2552
+ return settings_.template get<3>();
2553
+ }
1924
2554
 
1925
- void prefetch_heap_block() const {
1926
- // Prefetch the heap-allocated memory region to resolve potential TLB
1927
- // misses. This is intended to overlap with execution of calculating the
1928
- // hash for a key.
1929
- #if defined(__GNUC__)
1930
- __builtin_prefetch(static_cast<const void*>(ctrl_), 0, 1);
1931
- #endif // __GNUC__
2555
+ // Make type-specific functions for this type's PolicyFunctions struct.
2556
+ static size_t hash_slot_fn(void* set, void* slot) {
2557
+ auto* h = static_cast<raw_hash_set*>(set);
2558
+ return PolicyTraits::apply(
2559
+ HashElement{h->hash_ref()},
2560
+ PolicyTraits::element(static_cast<slot_type*>(slot)));
1932
2561
  }
2562
+ static void transfer_slot_fn(void* set, void* dst, void* src) {
2563
+ auto* h = static_cast<raw_hash_set*>(set);
2564
+ PolicyTraits::transfer(&h->alloc_ref(), static_cast<slot_type*>(dst),
2565
+ static_cast<slot_type*>(src));
2566
+ }
2567
+ // Note: dealloc_fn will only be used if we have a non-standard allocator.
2568
+ static void dealloc_fn(void* set, const PolicyFunctions&, ctrl_t* ctrl,
2569
+ void* slot_mem, size_t n) {
2570
+ auto* h = static_cast<raw_hash_set*>(set);
1933
2571
 
1934
- HashtablezInfoHandle& infoz() { return settings_.template get<1>(); }
2572
+ // Unpoison before returning the memory to the allocator.
2573
+ SanitizerUnpoisonMemoryRegion(slot_mem, sizeof(slot_type) * n);
1935
2574
 
1936
- hasher& hash_ref() { return settings_.template get<2>(); }
1937
- const hasher& hash_ref() const { return settings_.template get<2>(); }
1938
- key_equal& eq_ref() { return settings_.template get<3>(); }
1939
- const key_equal& eq_ref() const { return settings_.template get<3>(); }
1940
- allocator_type& alloc_ref() { return settings_.template get<4>(); }
1941
- const allocator_type& alloc_ref() const {
1942
- return settings_.template get<4>();
2575
+ Deallocate<alignof(slot_type)>(
2576
+ &h->alloc_ref(), ctrl,
2577
+ AllocSize(n, sizeof(slot_type), alignof(slot_type)));
2578
+ }
2579
+
2580
+ static const PolicyFunctions& GetPolicyFunctions() {
2581
+ static constexpr PolicyFunctions value = {
2582
+ sizeof(slot_type),
2583
+ &raw_hash_set::hash_slot_fn,
2584
+ PolicyTraits::transfer_uses_memcpy()
2585
+ ? TransferRelocatable<sizeof(slot_type)>
2586
+ : &raw_hash_set::transfer_slot_fn,
2587
+ (std::is_same<SlotAlloc, std::allocator<slot_type>>::value
2588
+ ? &DeallocateStandard<alignof(slot_type)>
2589
+ : &raw_hash_set::dealloc_fn),
2590
+ };
2591
+ return value;
1943
2592
  }
1944
2593
 
1945
- // TODO(alkis): Investigate removing some of these fields:
1946
- // - ctrl/slots can be derived from each other
1947
- // - size can be moved into the slot array
1948
- ctrl_t* ctrl_ = EmptyGroup(); // [(capacity + 1 + NumClonedBytes()) * ctrl_t]
1949
- slot_type* slots_ = nullptr; // [capacity * slot_type]
1950
- size_t size_ = 0; // number of full slots
1951
- size_t capacity_ = 0; // total number of slots
1952
- absl::container_internal::CompressedTuple<size_t /* growth_left */,
1953
- HashtablezInfoHandle, hasher,
1954
- key_equal, allocator_type>
1955
- settings_{0, HashtablezInfoHandle{}, hasher{}, key_equal{},
1956
- allocator_type{}};
2594
+ // Bundle together CommonFields plus other objects which might be empty.
2595
+ // CompressedTuple will ensure that sizeof is not affected by any of the empty
2596
+ // fields that occur after CommonFields.
2597
+ absl::container_internal::CompressedTuple<CommonFields, hasher, key_equal,
2598
+ allocator_type>
2599
+ settings_{CommonFields{}, hasher{}, key_equal{}, allocator_type{}};
1957
2600
  };
1958
2601
 
1959
2602
  // Erases all elements that satisfy the predicate `pred` from the container `c`.
1960
2603
  template <typename P, typename H, typename E, typename A, typename Predicate>
1961
- void EraseIf(Predicate& pred, raw_hash_set<P, H, E, A>* c) {
2604
+ typename raw_hash_set<P, H, E, A>::size_type EraseIf(
2605
+ Predicate& pred, raw_hash_set<P, H, E, A>* c) {
2606
+ const auto initial_size = c->size();
1962
2607
  for (auto it = c->begin(), last = c->end(); it != last;) {
1963
2608
  if (pred(*it)) {
1964
2609
  c->erase(it++);
@@ -1966,6 +2611,7 @@ void EraseIf(Predicate& pred, raw_hash_set<P, H, E, A>* c) {
1966
2611
  ++it;
1967
2612
  }
1968
2613
  }
2614
+ return initial_size - c->size();
1969
2615
  }
1970
2616
 
1971
2617
  namespace hashtable_debug_internal {
@@ -1978,25 +2624,26 @@ struct HashtableDebugAccess<Set, absl::void_t<typename Set::raw_hash_set>> {
1978
2624
  const typename Set::key_type& key) {
1979
2625
  size_t num_probes = 0;
1980
2626
  size_t hash = set.hash_ref()(key);
1981
- auto seq = probe(set.ctrl_, hash, set.capacity_);
2627
+ auto seq = probe(set.common(), hash);
2628
+ const ctrl_t* ctrl = set.control();
1982
2629
  while (true) {
1983
- container_internal::Group g{set.ctrl_ + seq.offset()};
1984
- for (int i : g.Match(container_internal::H2(hash))) {
2630
+ container_internal::Group g{ctrl + seq.offset()};
2631
+ for (uint32_t i : g.Match(container_internal::H2(hash))) {
1985
2632
  if (Traits::apply(
1986
2633
  typename Set::template EqualElement<typename Set::key_type>{
1987
2634
  key, set.eq_ref()},
1988
- Traits::element(set.slots_ + seq.offset(i))))
2635
+ Traits::element(set.slot_array() + seq.offset(i))))
1989
2636
  return num_probes;
1990
2637
  ++num_probes;
1991
2638
  }
1992
- if (g.MatchEmpty()) return num_probes;
2639
+ if (g.MaskEmpty()) return num_probes;
1993
2640
  seq.next();
1994
2641
  ++num_probes;
1995
2642
  }
1996
2643
  }
1997
2644
 
1998
2645
  static size_t AllocatedByteSize(const Set& c) {
1999
- size_t capacity = c.capacity_;
2646
+ size_t capacity = c.capacity();
2000
2647
  if (capacity == 0) return 0;
2001
2648
  size_t m = AllocSize(capacity, sizeof(Slot), alignof(Slot));
2002
2649
 
@@ -2004,9 +2651,10 @@ struct HashtableDebugAccess<Set, absl::void_t<typename Set::raw_hash_set>> {
2004
2651
  if (per_slot != ~size_t{}) {
2005
2652
  m += per_slot * c.size();
2006
2653
  } else {
2654
+ const ctrl_t* ctrl = c.control();
2007
2655
  for (size_t i = 0; i != capacity; ++i) {
2008
- if (container_internal::IsFull(c.ctrl_[i])) {
2009
- m += Traits::space_used(c.slots_ + i);
2656
+ if (container_internal::IsFull(ctrl[i])) {
2657
+ m += Traits::space_used(c.slot_array() + i);
2010
2658
  }
2011
2659
  }
2012
2660
  }
@@ -2031,4 +2679,7 @@ struct HashtableDebugAccess<Set, absl::void_t<typename Set::raw_hash_set>> {
2031
2679
  ABSL_NAMESPACE_END
2032
2680
  } // namespace absl
2033
2681
 
2682
+ #undef ABSL_SWISSTABLE_ENABLE_GENERATIONS
2683
+ #undef ABSL_INTERNAL_ASSERT_IS_FULL
2684
+
2034
2685
  #endif // ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_