grpc 1.46.3 → 1.53.1
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.
- checksums.yaml +4 -4
- data/Makefile +419 -241
- data/include/grpc/byte_buffer.h +76 -1
- data/include/grpc/byte_buffer_reader.h +19 -1
- data/include/grpc/compression.h +2 -2
- data/include/grpc/event_engine/endpoint_config.h +11 -5
- data/include/grpc/event_engine/event_engine.h +129 -39
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
- data/include/grpc/event_engine/internal/slice_cast.h +67 -0
- data/include/grpc/event_engine/memory_allocator.h +1 -16
- data/include/grpc/event_engine/port.h +1 -1
- data/include/grpc/event_engine/slice.h +306 -0
- data/include/grpc/event_engine/slice_buffer.h +159 -0
- data/include/grpc/fork.h +25 -1
- data/include/grpc/grpc.h +4 -14
- data/include/grpc/grpc_posix.h +1 -1
- data/include/grpc/grpc_security.h +11 -0
- data/include/grpc/impl/codegen/atm.h +3 -71
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -67
- data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -61
- data/include/grpc/impl/codegen/atm_windows.h +3 -108
- data/include/grpc/impl/codegen/byte_buffer.h +4 -78
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
- data/include/grpc/impl/codegen/compression_types.h +5 -83
- data/include/grpc/impl/codegen/connectivity_state.h +5 -21
- data/include/grpc/impl/codegen/fork.h +4 -25
- data/include/grpc/impl/codegen/gpr_types.h +4 -35
- data/include/grpc/impl/codegen/grpc_types.h +5 -791
- data/include/grpc/impl/codegen/log.h +3 -86
- data/include/grpc/impl/codegen/port_platform.h +3 -699
- data/include/grpc/impl/codegen/propagation_bits.h +3 -28
- data/include/grpc/impl/codegen/slice.h +4 -107
- data/include/grpc/impl/codegen/status.h +4 -131
- data/include/grpc/impl/codegen/sync.h +3 -42
- data/include/grpc/impl/codegen/sync_abseil.h +3 -12
- data/include/grpc/impl/codegen/sync_custom.h +3 -14
- data/include/grpc/impl/codegen/sync_generic.h +3 -25
- data/include/grpc/impl/codegen/sync_posix.h +3 -28
- data/include/grpc/impl/codegen/sync_windows.h +3 -16
- data/include/grpc/impl/compression_types.h +109 -0
- data/include/grpc/impl/connectivity_state.h +47 -0
- data/include/grpc/impl/grpc_types.h +836 -0
- data/include/grpc/impl/propagation_bits.h +54 -0
- data/include/grpc/impl/slice_type.h +112 -0
- data/include/grpc/load_reporting.h +1 -1
- data/include/grpc/module.modulemap +5 -1
- data/include/grpc/slice.h +1 -1
- data/include/grpc/status.h +131 -1
- data/include/grpc/support/atm.h +70 -1
- data/include/grpc/support/atm_gcc_atomic.h +59 -1
- data/include/grpc/support/atm_gcc_sync.h +58 -1
- data/include/grpc/support/atm_windows.h +105 -1
- data/include/grpc/support/log.h +87 -1
- data/include/grpc/support/log_windows.h +1 -1
- data/include/grpc/support/port_platform.h +767 -1
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +35 -2
- data/include/grpc/support/sync_abseil.h +11 -1
- data/include/grpc/support/sync_custom.h +13 -1
- data/include/grpc/support/sync_generic.h +24 -1
- data/include/grpc/support/sync_posix.h +27 -1
- data/include/grpc/support/sync_windows.h +15 -1
- data/include/grpc/support/time.h +31 -6
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +148 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +52 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +29 -0
- data/src/core/ext/filters/census/grpc_context.cc +19 -17
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +67 -61
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +26 -6
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +6 -4
- data/src/core/ext/filters/client_channel/backend_metric.cc +19 -12
- data/src/core/ext/filters/client_channel/backend_metric.h +21 -11
- data/src/core/ext/filters/client_channel/backup_poller.cc +34 -34
- data/src/core/ext/filters/client_channel/backup_poller.h +26 -28
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +89 -44
- data/src/core/ext/filters/client_channel/client_channel.cc +401 -451
- data/src/core/ext/filters/client_channel/client_channel.h +68 -26
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -23
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +33 -23
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +19 -43
- data/src/core/ext/filters/client_channel/client_channel_factory.h +11 -11
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +22 -47
- data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
- data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +33 -27
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
- data/src/core/ext/filters/client_channel/config_selector.h +29 -23
- data/src/core/ext/filters/client_channel/connector.h +19 -10
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +40 -54
- data/src/core/ext/filters/client_channel/dynamic_filters.h +20 -11
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +24 -21
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -4
- data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -3
- data/src/core/ext/filters/client_channel/http_proxy.cc +100 -112
- data/src/core/ext/filters/client_channel/http_proxy.h +38 -31
- data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +8 -5
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +37 -16
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +18 -13
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +71 -131
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +41 -24
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +410 -375
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +26 -27
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +15 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +9 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +27 -22
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +28 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +26 -25
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +338 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric_internal.h +117 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1129 -0
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +94 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +174 -180
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +366 -407
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +491 -405
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +19 -9
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +619 -634
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +261 -234
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +165 -143
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +128 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.h +71 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +972 -0
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +223 -220
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +214 -153
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +19 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +178 -256
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +199 -210
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +382 -368
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +819 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +67 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +369 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +22 -21
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +34 -19
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +531 -163
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +50 -44
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +31 -30
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +89 -84
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +300 -209
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +82 -61
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +20 -19
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +22 -22
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +54 -22
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +21 -34
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +19 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +135 -63
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +136 -68
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +29 -14
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +21 -27
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +368 -305
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +6 -4
- data/src/core/ext/filters/client_channel/retry_filter.cc +166 -163
- data/src/core/ext/filters/client_channel/retry_filter.h +4 -3
- data/src/core/ext/filters/client_channel/retry_service_config.cc +197 -229
- data/src/core/ext/filters/client_channel/retry_service_config.h +29 -26
- data/src/core/ext/filters/client_channel/retry_throttle.cc +28 -37
- data/src/core/ext/filters/client_channel/retry_throttle.h +36 -29
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +34 -17
- data/src/core/ext/filters/client_channel/subchannel.cc +332 -384
- data/src/core/ext/filters/client_channel/subchannel.h +112 -82
- data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +17 -77
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +41 -47
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +34 -108
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +20 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +94 -76
- data/src/core/ext/filters/deadline/deadline_filter.h +14 -12
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +44 -22
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +20 -11
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
- data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +34 -13
- data/src/core/ext/filters/http/client/http_client_filter.cc +76 -54
- data/src/core/ext/filters/http/client/http_client_filter.h +36 -23
- data/src/core/ext/filters/http/client_authority_filter.cc +33 -38
- data/src/core/ext/filters/http/client_authority_filter.h +27 -24
- data/src/core/ext/filters/http/http_filters_plugin.cc +46 -55
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +307 -0
- data/src/core/ext/filters/http/message_compress/compression_filter.h +139 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +111 -271
- data/src/core/ext/filters/http/server/http_server_filter.h +58 -24
- data/src/core/ext/filters/message_size/message_size_filter.cc +117 -137
- data/src/core/ext/filters/message_size/message_size_filter.h +34 -17
- data/src/core/ext/filters/rbac/rbac_filter.cc +29 -16
- data/src/core/ext/filters/rbac/rbac_filter.h +11 -3
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +736 -523
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +18 -7
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +20 -8
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +28 -12
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +4 -3
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +219 -0
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
- data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
- data/src/core/ext/transport/chttp2/alpn/alpn.h +24 -24
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +185 -241
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +38 -30
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +204 -211
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +26 -26
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +24 -24
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +35 -34
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +43 -38
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +35 -31
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +801 -1067
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +28 -23
- data/src/core/ext/transport/chttp2/transport/context_list.cc +23 -19
- data/src/core/ext/transport/chttp2/transport/context_list.h +32 -29
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +251 -0
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +971 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +350 -300
- data/src/core/ext/transport/chttp2/transport/flow_control.h +248 -325
- data/src/core/ext/transport/chttp2/transport/frame.h +22 -26
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +85 -234
- data/src/core/ext/transport/chttp2/transport/frame_data.h +38 -61
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +41 -36
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +24 -22
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +31 -25
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +25 -22
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +35 -26
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +24 -21
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +44 -77
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +27 -23
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +34 -33
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +24 -21
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +10 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +221 -372
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +338 -158
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +6 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +16 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +516 -751
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +38 -27
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +86 -76
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +79 -49
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +39 -38
- data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
- data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +21 -21
- data/src/core/ext/transport/chttp2/transport/internal.h +248 -296
- data/src/core/ext/transport/chttp2/transport/parsing.cc +363 -132
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +30 -30
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +24 -24
- data/src/core/ext/transport/chttp2/transport/stream_map.h +34 -33
- data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
- data/src/core/ext/transport/chttp2/transport/varint.h +39 -34
- data/src/core/ext/transport/chttp2/transport/writing.cc +121 -94
- data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -18
- data/src/core/ext/transport/inproc/inproc_transport.cc +227 -274
- data/src/core/ext/transport/inproc/inproc_transport.h +23 -21
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +6 -5
- data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +33 -8
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +8 -327
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +83 -1723
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +388 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1953 -0
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +6 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +33 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -3
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +14 -14
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +90 -30
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +25 -19
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +168 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +35 -43
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +195 -116
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +11 -11
- data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +84 -28
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +35 -12
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +179 -14
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -23
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +156 -48
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +12 -12
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +78 -26
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +23 -20
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +137 -69
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +23 -21
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +132 -44
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +17 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +67 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +15 -9
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +73 -18
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +39 -13
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +194 -15
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +5 -3
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +28 -2
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +7 -4
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +36 -4
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +48 -16
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +54 -18
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +26 -11
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +124 -14
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +19 -15
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +78 -69
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +168 -82
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +887 -166
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +34 -15
- data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +161 -22
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +15 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +107 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -6
- data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +27 -14
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +11 -4
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +58 -4
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +6 -3
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +29 -2
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +38 -27
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +207 -52
- data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
- 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
- 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
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.c +111 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +444 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +56 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +192 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +98 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +10 -8
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +66 -14
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +13 -11
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +73 -23
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +133 -16
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +656 -12
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/filter_state.upb.h +113 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +4 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +24 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.c +43 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/status_code_input.upb.h +114 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +42 -14
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +5 -5
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +30 -10
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +3 -3
- data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +12 -4
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +2 -2
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -6
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
- data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +3 -1
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +6 -2
- data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +6 -2
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +11 -11
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +66 -22
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +9 -9
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +72 -24
- data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
- data/src/core/ext/upb-generated/google/api/http.upb.h +18 -6
- data/src/core/ext/upb-generated/google/api/httpbody.upb.c +1 -1
- data/src/core/ext/upb-generated/google/api/httpbody.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +44 -43
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +177 -55
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +2 -2
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +18 -6
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +6 -2
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +6 -6
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +54 -18
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +6 -2
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +2 -2
- data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +24 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +6 -2
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +7 -7
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +60 -20
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +1 -1
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +6 -6
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +54 -18
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +2 -2
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +12 -4
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +7 -7
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +42 -14
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +23 -11
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -3
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -3
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -3
- data/src/core/ext/upb-generated/validate/validate.upb.c +22 -22
- data/src/core/ext/upb-generated/validate/validate.upb.h +139 -47
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +23 -11
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +7 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +3 -3
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +27 -11
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +7 -3
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
- data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +6 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -2
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +46 -0
- data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +113 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +6 -6
- data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +54 -18
- data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +2 -2
- data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +12 -4
- data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
- data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
- data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
- data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +1 -2
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +6 -2
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +54 -53
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +277 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +125 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +199 -187
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +232 -222
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +0 -5
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +95 -75
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +187 -183
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +81 -75
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +190 -186
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +7 -3
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +71 -66
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +164 -137
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +140 -129
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +82 -74
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +2 -2
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +740 -667
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +20 -0
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
- data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +16 -14
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +48 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +20 -18
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +53 -42
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +485 -467
- data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +149 -145
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +156 -84
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.c +48 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/filter_state.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.c +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/status_code_input.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +10 -9
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
- data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
- data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
- data/src/core/ext/xds/certificate_provider_store.cc +69 -5
- data/src/core/ext/xds/certificate_provider_store.h +22 -5
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +17 -10
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +12 -4
- data/src/core/ext/xds/upb_utils.h +3 -25
- data/src/core/ext/xds/xds_api.cc +90 -196
- data/src/core/ext/xds/xds_api.h +41 -39
- data/src/core/ext/xds/xds_bootstrap.cc +5 -537
- data/src/core/ext/xds/xds_bootstrap.h +41 -96
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +362 -0
- data/src/core/ext/xds/xds_bootstrap_grpc.h +184 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +35 -26
- data/src/core/ext/xds/xds_certificate_provider.h +29 -5
- data/src/core/ext/xds/xds_channel_args.h +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +17 -7
- data/src/core/ext/xds/xds_channel_stack_modifier.h +16 -4
- data/src/core/ext/xds/xds_client.cc +849 -1316
- data/src/core/ext/xds/xds_client.h +57 -61
- data/src/core/ext/xds/xds_client_grpc.cc +235 -0
- data/src/core/ext/xds/xds_client_grpc.h +79 -0
- data/src/core/ext/xds/xds_client_stats.cc +24 -25
- data/src/core/ext/xds/xds_client_stats.h +26 -24
- data/src/core/ext/xds/xds_cluster.cc +505 -247
- data/src/core/ext/xds/xds_cluster.h +69 -40
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +67 -77
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +47 -29
- data/src/core/ext/xds/xds_common_types.cc +238 -123
- data/src/core/ext/xds/xds_common_types.h +29 -16
- data/src/core/ext/xds/xds_endpoint.cc +265 -162
- data/src/core/ext/xds/xds_endpoint.h +19 -15
- data/src/core/ext/xds/xds_health_status.cc +80 -0
- data/src/core/ext/xds/xds_health_status.h +109 -0
- data/src/core/ext/xds/xds_http_fault_filter.cc +67 -58
- data/src/core/ext/xds/xds_http_fault_filter.h +19 -25
- data/src/core/ext/xds/xds_http_filters.cc +70 -71
- data/src/core/ext/xds/xds_http_filters.h +73 -25
- data/src/core/ext/xds/xds_http_rbac_filter.cc +168 -225
- data/src/core/ext/xds/xds_http_rbac_filter.h +22 -18
- data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
- data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
- data/src/core/ext/xds/xds_lb_policy_registry.cc +334 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +71 -0
- data/src/core/ext/xds/xds_listener.cc +573 -481
- data/src/core/ext/xds/xds_listener.h +57 -51
- data/src/core/ext/xds/xds_resource_type.h +28 -22
- data/src/core/ext/xds/xds_resource_type_impl.h +18 -17
- data/src/core/ext/xds/xds_route_config.cc +592 -570
- data/src/core/ext/xds/xds_route_config.h +74 -40
- data/src/core/ext/xds/xds_routing.cc +21 -7
- data/src/core/ext/xds/xds_routing.h +17 -12
- data/src/core/ext/xds/xds_server_config_fetcher.cc +227 -178
- data/src/core/ext/xds/xds_transport.h +86 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +356 -0
- data/src/core/ext/xds/xds_transport_grpc.h +135 -0
- data/src/core/lib/address_utils/parse_address.cc +52 -52
- data/src/core/lib/address_utils/parse_address.h +46 -42
- data/src/core/lib/address_utils/sockaddr_utils.cc +90 -54
- data/src/core/lib/address_utils/sockaddr_utils.h +45 -40
- data/src/core/lib/avl/avl.h +57 -33
- data/src/core/lib/backoff/backoff.cc +19 -21
- data/src/core/lib/backoff/backoff.h +21 -21
- data/src/core/lib/backoff/random_early_detection.cc +31 -0
- data/src/core/lib/backoff/random_early_detection.h +59 -0
- data/src/core/lib/channel/call_finalization.h +6 -4
- data/src/core/lib/channel/call_tracer.h +23 -8
- data/src/core/lib/channel/channel_args.cc +149 -61
- data/src/core/lib/channel/channel_args.h +308 -104
- data/src/core/lib/channel/channel_args_preconditioning.cc +4 -3
- data/src/core/lib/channel/channel_args_preconditioning.h +6 -5
- data/src/core/lib/channel/channel_fwd.h +26 -0
- data/src/core/lib/channel/channel_stack.cc +92 -52
- data/src/core/lib/channel/channel_stack.h +184 -135
- data/src/core/lib/channel/channel_stack_builder.cc +26 -39
- data/src/core/lib/channel/channel_stack_builder.h +33 -40
- data/src/core/lib/channel/channel_stack_builder_impl.cc +84 -60
- data/src/core/lib/channel/channel_stack_builder_impl.h +9 -9
- data/src/core/lib/channel/channel_trace.cc +29 -36
- data/src/core/lib/channel/channel_trace.h +27 -24
- data/src/core/lib/channel/channelz.cc +50 -65
- data/src/core/lib/channel/channelz.h +50 -33
- data/src/core/lib/channel/channelz_registry.cc +28 -36
- data/src/core/lib/channel/channelz_registry.h +31 -30
- data/src/core/lib/channel/connected_channel.cc +1267 -78
- data/src/core/lib/channel/connected_channel.h +21 -23
- data/src/core/lib/channel/context.h +25 -21
- data/src/core/lib/channel/promise_based_filter.cc +1896 -377
- data/src/core/lib/channel/promise_based_filter.h +592 -92
- data/src/core/lib/channel/status_util.cc +64 -17
- data/src/core/lib/channel/status_util.h +38 -24
- data/src/core/lib/compression/compression.cc +24 -19
- data/src/core/lib/compression/compression_internal.cc +88 -63
- data/src/core/lib/compression/compression_internal.h +28 -27
- data/src/core/lib/compression/message_compress.cc +28 -26
- data/src/core/lib/compression/message_compress.h +28 -29
- data/src/core/lib/config/core_configuration.cc +8 -1
- data/src/core/lib/config/core_configuration.h +86 -39
- data/src/core/lib/debug/event_log.cc +88 -0
- data/src/core/lib/debug/event_log.h +81 -0
- data/src/core/lib/debug/histogram_view.cc +69 -0
- data/src/core/lib/debug/histogram_view.h +37 -0
- data/src/core/lib/debug/stats.cc +48 -152
- data/src/core/lib/debug/stats.h +50 -57
- data/src/core/lib/debug/stats_data.cc +302 -645
- data/src/core/lib/debug/stats_data.h +293 -545
- data/src/core/lib/debug/trace.cc +18 -20
- data/src/core/lib/debug/trace.h +27 -48
- data/src/core/lib/event_engine/channel_args_endpoint_config.cc +16 -17
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +16 -9
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +99 -0
- data/src/core/lib/event_engine/default_event_engine.h +73 -0
- data/src/core/lib/event_engine/default_event_engine_factory.cc +24 -3
- data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine_factory.h} +6 -9
- data/src/core/lib/event_engine/event_engine.cc +3 -30
- data/src/core/lib/event_engine/executor/executor.h +38 -0
- data/src/core/lib/event_engine/forkable.cc +106 -0
- data/src/core/lib/event_engine/forkable.h +61 -0
- data/src/core/lib/event_engine/handle_containers.h +74 -0
- data/src/core/lib/event_engine/memory_allocator.cc +11 -3
- data/src/core/lib/event_engine/poller.h +62 -0
- data/src/core/lib/event_engine/posix.h +158 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +642 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +139 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +899 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
- data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +33 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1305 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +717 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +640 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +259 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +289 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +279 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +379 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
- data/src/core/lib/event_engine/posix_engine/timer.cc +311 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +194 -0
- data/src/core/lib/event_engine/posix_engine/timer_heap.cc +107 -0
- data/src/core/lib/event_engine/posix_engine/timer_heap.h +56 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +173 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +114 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
- data/src/core/lib/{iomgr/event_engine/promise.h → event_engine/posix_engine/wakeup_fd_pipe.h} +19 -25
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
- data/src/core/lib/event_engine/resolved_address.cc +23 -2
- data/src/core/lib/{iomgr/event_engine → event_engine}/resolved_address_internal.h +5 -8
- data/src/core/lib/event_engine/shim.cc +56 -0
- data/src/core/lib/event_engine/shim.h +33 -0
- data/src/core/lib/event_engine/slice.cc +103 -0
- data/src/core/lib/event_engine/slice_buffer.cc +50 -0
- data/src/core/lib/event_engine/tcp_socket_utils.cc +389 -0
- data/src/core/lib/event_engine/tcp_socket_utils.h +90 -0
- data/src/core/lib/event_engine/thread_local.cc +29 -0
- data/src/core/lib/event_engine/thread_local.h +32 -0
- data/src/core/lib/event_engine/thread_pool.cc +253 -0
- data/src/core/lib/event_engine/thread_pool.h +141 -0
- data/src/core/lib/event_engine/time_util.cc +30 -0
- data/src/core/lib/event_engine/time_util.h +32 -0
- data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.cc} +9 -17
- data/src/core/lib/event_engine/trace.h +43 -0
- data/src/core/lib/event_engine/utils.cc +44 -0
- data/src/core/lib/event_engine/utils.h +44 -0
- data/src/core/lib/event_engine/windows/iocp.cc +140 -0
- data/src/core/lib/event_engine/windows/iocp.h +69 -0
- data/src/core/lib/event_engine/windows/win_socket.cc +219 -0
- data/src/core/lib/event_engine/windows/win_socket.h +129 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.cc +331 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.h +103 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +388 -0
- data/src/core/lib/event_engine/windows/windows_engine.h +163 -0
- data/src/core/lib/experiments/config.cc +161 -0
- data/src/core/lib/experiments/config.h +53 -0
- data/src/core/lib/experiments/experiments.cc +81 -0
- data/src/core/lib/experiments/experiments.h +117 -0
- data/src/core/lib/gpr/alloc.cc +19 -25
- data/src/core/lib/gpr/alloc.h +20 -20
- data/src/core/lib/gpr/atm.cc +17 -17
- data/src/core/lib/gpr/cpu_iphone.cc +24 -24
- data/src/core/lib/gpr/cpu_linux.cc +28 -23
- data/src/core/lib/gpr/cpu_posix.cc +23 -22
- data/src/core/lib/gpr/cpu_windows.cc +20 -18
- data/src/core/lib/gpr/log.cc +30 -17
- data/src/core/lib/gpr/log_android.cc +22 -20
- data/src/core/lib/gpr/log_linux.cc +24 -24
- data/src/core/lib/gpr/log_posix.cc +20 -19
- data/src/core/lib/gpr/log_windows.cc +25 -25
- data/src/core/lib/gpr/spinlock.h +20 -20
- data/src/core/lib/gpr/string.cc +25 -24
- data/src/core/lib/gpr/string.h +61 -61
- data/src/core/lib/gpr/string_posix.cc +24 -24
- data/src/core/lib/gpr/string_util_windows.cc +25 -52
- data/src/core/lib/gpr/string_windows.cc +24 -24
- data/src/core/lib/gpr/sync.cc +25 -25
- data/src/core/lib/gpr/sync_abseil.cc +36 -40
- data/src/core/lib/gpr/sync_posix.cc +22 -34
- data/src/core/lib/gpr/sync_windows.cc +29 -27
- data/src/core/lib/gpr/time.cc +34 -30
- data/src/core/lib/gpr/time_posix.cc +41 -45
- data/src/core/lib/gpr/time_precise.cc +22 -22
- data/src/core/lib/gpr/time_precise.h +21 -22
- data/src/core/lib/gpr/time_windows.cc +35 -29
- data/src/core/lib/gpr/tmpfile.h +24 -24
- data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
- data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
- data/src/core/lib/gpr/tmpfile_windows.cc +28 -29
- data/src/core/lib/gpr/useful.h +83 -30
- data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
- data/src/core/lib/gprpp/atomic_utils.h +20 -20
- data/src/core/lib/gprpp/bitset.h +35 -17
- data/src/core/lib/gprpp/chunked_vector.h +7 -3
- data/src/core/lib/gprpp/construct_destruct.h +4 -3
- data/src/core/lib/gprpp/cpp_impl_of.h +3 -3
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
- data/src/core/lib/gprpp/crash.h +34 -0
- data/src/core/lib/gprpp/debug_location.h +60 -31
- data/src/core/lib/gprpp/dual_ref_counted.h +4 -7
- data/src/core/lib/gprpp/env.h +53 -0
- data/src/core/lib/gprpp/env_linux.cc +80 -0
- 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
- data/src/core/lib/gprpp/env_windows.cc +56 -0
- data/src/core/lib/gprpp/examine_stack.cc +17 -17
- data/src/core/lib/gprpp/examine_stack.h +21 -22
- data/src/core/lib/gprpp/fork.cc +58 -53
- data/src/core/lib/gprpp/fork.h +29 -35
- data/src/core/lib/gprpp/global_config.h +22 -24
- data/src/core/lib/gprpp/global_config_custom.h +20 -20
- data/src/core/lib/gprpp/global_config_env.cc +28 -25
- data/src/core/lib/gprpp/global_config_env.h +29 -27
- data/src/core/lib/gprpp/global_config_generic.h +21 -25
- data/src/core/lib/gprpp/host_port.cc +30 -26
- data/src/core/lib/gprpp/host_port.h +32 -31
- data/src/core/lib/gprpp/load_file.cc +75 -0
- data/src/core/lib/gprpp/load_file.h +33 -0
- data/src/core/lib/gprpp/manual_constructor.h +21 -89
- data/src/core/lib/gprpp/match.h +5 -3
- data/src/core/lib/gprpp/memory.h +22 -26
- data/src/core/lib/gprpp/mpscq.cc +17 -17
- data/src/core/lib/gprpp/mpscq.h +21 -21
- data/src/core/lib/gprpp/no_destruct.h +95 -0
- data/src/core/lib/gprpp/notification.h +67 -0
- data/src/core/lib/gprpp/orphanable.h +22 -25
- data/src/core/lib/gprpp/overload.h +3 -3
- data/src/core/lib/gprpp/packed_table.h +40 -0
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/ref_counted.h +22 -24
- data/src/core/lib/gprpp/ref_counted_ptr.h +42 -55
- data/src/core/lib/gprpp/single_set_ptr.h +3 -3
- data/src/core/lib/gprpp/sorted_pack.h +98 -0
- data/src/core/lib/gprpp/stat.h +3 -5
- data/src/core/lib/gprpp/stat_posix.cc +10 -4
- data/src/core/lib/gprpp/stat_windows.cc +4 -2
- data/src/core/lib/gprpp/status_helper.cc +55 -35
- data/src/core/lib/gprpp/status_helper.h +13 -5
- data/src/core/lib/gprpp/strerror.cc +43 -0
- data/src/core/lib/gprpp/strerror.h +29 -0
- data/src/core/lib/gprpp/sync.h +26 -24
- data/src/core/lib/gprpp/table.h +22 -4
- data/src/core/lib/gprpp/tchar.cc +49 -0
- data/src/core/lib/gprpp/tchar.h +33 -0
- data/src/core/lib/gprpp/thd.h +25 -28
- data/src/core/lib/gprpp/thd_posix.cc +33 -32
- data/src/core/lib/gprpp/thd_windows.cc +28 -26
- data/src/core/lib/gprpp/time.cc +52 -9
- data/src/core/lib/gprpp/time.h +78 -4
- data/src/core/lib/gprpp/time_averaged_stats.cc +60 -0
- data/src/core/lib/gprpp/time_averaged_stats.h +79 -0
- data/src/core/lib/gprpp/time_util.cc +4 -0
- data/src/core/lib/gprpp/time_util.h +3 -3
- data/src/core/lib/gprpp/unique_type_name.h +104 -0
- data/src/core/lib/gprpp/validation_errors.cc +61 -0
- data/src/core/lib/gprpp/validation_errors.h +127 -0
- data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
- data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -28
- data/src/core/lib/handshaker/proxy_mapper.h +53 -0
- data/src/core/lib/handshaker/proxy_mapper_registry.cc +71 -0
- data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
- data/src/core/lib/http/format_request.cc +53 -22
- data/src/core/lib/http/format_request.h +23 -21
- data/src/core/lib/http/httpcli.cc +139 -141
- data/src/core/lib/http/httpcli.h +86 -38
- data/src/core/lib/http/httpcli_security_connector.cc +50 -42
- data/src/core/lib/http/httpcli_ssl_credentials.h +6 -4
- data/src/core/lib/http/parser.cc +78 -90
- data/src/core/lib/http/parser.h +38 -35
- data/src/core/lib/iomgr/block_annotate.h +23 -23
- data/src/core/lib/iomgr/buffer_list.cc +156 -136
- data/src/core/lib/iomgr/buffer_list.h +123 -101
- data/src/core/lib/iomgr/call_combiner.cc +32 -64
- data/src/core/lib/iomgr/call_combiner.h +24 -25
- data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
- data/src/core/lib/iomgr/cfstream_handle.h +25 -25
- data/src/core/lib/iomgr/{event_engine/pollset.h → closure.cc} +9 -7
- data/src/core/lib/iomgr/closure.h +95 -58
- data/src/core/lib/iomgr/combiner.cc +20 -39
- data/src/core/lib/iomgr/combiner.h +20 -20
- data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
- data/src/core/lib/iomgr/dynamic_annotations.h +22 -22
- data/src/core/lib/iomgr/endpoint.cc +21 -21
- data/src/core/lib/iomgr/endpoint.h +53 -51
- data/src/core/lib/iomgr/endpoint_cfstream.cc +51 -47
- data/src/core/lib/iomgr/endpoint_cfstream.h +32 -32
- data/src/core/lib/iomgr/endpoint_pair.h +22 -22
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +36 -29
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +31 -22
- data/src/core/lib/iomgr/error.cc +51 -834
- data/src/core/lib/iomgr/error.h +45 -317
- data/src/core/lib/iomgr/error_cfstream.cc +18 -23
- data/src/core/lib/iomgr/error_cfstream.h +21 -21
- data/src/core/lib/iomgr/ev_apple.cc +21 -21
- data/src/core/lib/iomgr/ev_apple.h +21 -21
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +263 -248
- data/src/core/lib/iomgr/ev_epoll1_linux.h +21 -21
- data/src/core/lib/iomgr/ev_poll_posix.cc +296 -271
- data/src/core/lib/iomgr/ev_poll_posix.h +22 -22
- data/src/core/lib/iomgr/ev_posix.cc +88 -121
- data/src/core/lib/iomgr/ev_posix.h +93 -87
- data/src/core/lib/iomgr/ev_windows.cc +18 -18
- data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.cc +15 -30
- data/src/core/lib/iomgr/{event_engine → event_engine_shims}/closure.h +10 -13
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +430 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +43 -0
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.cc +91 -0
- data/src/core/lib/iomgr/event_engine_shims/tcp_client.h +44 -0
- data/src/core/lib/iomgr/exec_ctx.cc +34 -56
- data/src/core/lib/iomgr/exec_ctx.h +152 -177
- data/src/core/lib/iomgr/executor.cc +21 -31
- data/src/core/lib/iomgr/executor.h +27 -30
- data/src/core/lib/iomgr/fork_posix.cc +30 -27
- data/src/core/lib/iomgr/fork_windows.cc +21 -21
- data/src/core/lib/iomgr/gethostname.h +20 -20
- data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
- data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
- data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
- data/src/core/lib/iomgr/grpc_if_nametoindex.h +22 -22
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
- data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
- data/src/core/lib/iomgr/internal_errqueue.cc +41 -48
- data/src/core/lib/iomgr/internal_errqueue.h +84 -89
- data/src/core/lib/iomgr/iocp_windows.cc +23 -23
- data/src/core/lib/iomgr/iocp_windows.h +21 -21
- data/src/core/lib/iomgr/iomgr.cc +25 -20
- data/src/core/lib/iomgr/iomgr.h +35 -35
- data/src/core/lib/iomgr/iomgr_fwd.h +26 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
- data/src/core/lib/iomgr/iomgr_internal.h +28 -28
- data/src/core/lib/iomgr/iomgr_posix.cc +21 -20
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +21 -19
- data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
- data/src/core/lib/iomgr/load_file.cc +24 -27
- data/src/core/lib/iomgr/load_file.h +22 -22
- data/src/core/lib/iomgr/lockfree_event.cc +114 -131
- data/src/core/lib/iomgr/lockfree_event.h +23 -23
- data/src/core/lib/iomgr/nameser.h +86 -86
- data/src/core/lib/iomgr/polling_entity.cc +25 -21
- data/src/core/lib/iomgr/polling_entity.h +29 -29
- data/src/core/lib/iomgr/pollset.cc +17 -17
- data/src/core/lib/iomgr/pollset.h +55 -55
- data/src/core/lib/iomgr/pollset_set.cc +17 -17
- data/src/core/lib/iomgr/pollset_set.h +26 -28
- data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
- data/src/core/lib/iomgr/pollset_set_windows.h +20 -20
- data/src/core/lib/iomgr/pollset_windows.cc +32 -31
- data/src/core/lib/iomgr/pollset_windows.h +24 -24
- data/src/core/lib/iomgr/port.h +59 -37
- data/src/core/lib/iomgr/python_util.h +24 -24
- data/src/core/lib/iomgr/resolve_address.cc +34 -20
- data/src/core/lib/iomgr/resolve_address.h +73 -43
- data/src/core/lib/iomgr/resolve_address_impl.h +7 -7
- data/src/core/lib/iomgr/resolve_address_posix.cc +81 -62
- data/src/core/lib/iomgr/resolve_address_posix.h +26 -10
- data/src/core/lib/iomgr/resolve_address_windows.cc +64 -38
- data/src/core/lib/iomgr/resolve_address_windows.h +26 -10
- data/src/core/lib/iomgr/resolved_address.h +3 -3
- data/src/core/lib/iomgr/sockaddr.h +25 -26
- data/src/core/lib/iomgr/sockaddr_posix.h +23 -21
- data/src/core/lib/iomgr/sockaddr_utils_posix.cc +20 -18
- data/src/core/lib/iomgr/sockaddr_windows.h +23 -21
- data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
- data/src/core/lib/iomgr/socket_factory_posix.h +32 -32
- data/src/core/lib/iomgr/socket_mutator.cc +19 -18
- data/src/core/lib/iomgr/socket_mutator.h +39 -39
- data/src/core/lib/iomgr/socket_utils.h +27 -27
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +82 -101
- data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
- data/src/core/lib/iomgr/socket_utils_posix.cc +103 -19
- data/src/core/lib/iomgr/socket_utils_posix.h +176 -84
- data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
- data/src/core/lib/iomgr/socket_windows.cc +37 -36
- data/src/core/lib/iomgr/socket_windows.h +59 -61
- data/src/core/lib/iomgr/systemd_utils.cc +116 -0
- data/src/core/lib/iomgr/systemd_utils.h +33 -0
- data/src/core/lib/iomgr/tcp_client.cc +28 -24
- data/src/core/lib/iomgr/tcp_client.h +49 -38
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +46 -35
- data/src/core/lib/iomgr/tcp_client_posix.cc +243 -105
- data/src/core/lib/iomgr/tcp_client_posix.h +55 -52
- data/src/core/lib/iomgr/tcp_client_windows.cc +73 -53
- data/src/core/lib/iomgr/tcp_posix.cc +505 -362
- data/src/core/lib/iomgr/tcp_posix.h +32 -30
- data/src/core/lib/iomgr/tcp_server.cc +33 -24
- data/src/core/lib/iomgr/tcp_server.h +78 -69
- data/src/core/lib/iomgr/tcp_server_posix.cc +381 -133
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +68 -55
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +120 -82
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +46 -43
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
- data/src/core/lib/iomgr/tcp_server_windows.cc +116 -118
- data/src/core/lib/iomgr/tcp_windows.cc +116 -98
- data/src/core/lib/iomgr/tcp_windows.h +34 -35
- data/src/core/lib/iomgr/timer.cc +17 -17
- data/src/core/lib/iomgr/timer.h +68 -68
- data/src/core/lib/iomgr/timer_generic.cc +125 -134
- data/src/core/lib/iomgr/timer_generic.h +21 -21
- data/src/core/lib/iomgr/timer_heap.cc +25 -25
- data/src/core/lib/iomgr/timer_heap.h +22 -22
- data/src/core/lib/iomgr/timer_manager.cc +31 -31
- data/src/core/lib/iomgr/timer_manager.h +27 -27
- data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
- data/src/core/lib/iomgr/unix_sockets_posix.h +21 -21
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -23
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +20 -20
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +33 -30
- data/src/core/lib/iomgr/wakeup_fd_posix.h +52 -54
- data/src/core/lib/json/json.h +23 -27
- data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/json/json_args.h} +13 -10
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +217 -0
- data/src/core/lib/json/json_object_loader.h +634 -0
- data/src/core/lib/json/json_reader.cc +123 -90
- data/src/core/lib/json/json_util.cc +14 -34
- data/src/core/lib/json/json_util.h +17 -8
- data/src/core/lib/json/json_writer.cc +62 -57
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +30 -60
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +47 -62
- data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
- data/src/core/lib/load_balancing/lb_policy_registry.cc +142 -0
- data/src/core/lib/load_balancing/lb_policy_registry.h +82 -0
- data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +57 -52
- data/src/core/lib/matchers/matchers.cc +12 -7
- data/src/core/lib/matchers/matchers.h +5 -3
- data/src/core/lib/promise/activity.cc +23 -8
- data/src/core/lib/promise/activity.h +116 -58
- data/src/core/lib/promise/arena_promise.h +115 -72
- data/src/core/lib/promise/context.h +18 -11
- data/src/core/lib/promise/detail/basic_join.h +197 -0
- data/src/core/lib/promise/detail/basic_seq.h +28 -33
- data/src/core/lib/promise/detail/promise_factory.h +61 -14
- data/src/core/lib/promise/detail/promise_like.h +3 -3
- data/src/core/lib/promise/detail/status.h +31 -3
- data/src/core/lib/promise/detail/switch.h +21 -21
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +23 -15
- data/src/core/lib/promise/if.h +195 -0
- data/src/core/lib/promise/interceptor_list.h +308 -0
- data/src/core/lib/promise/intra_activity_waiter.h +9 -3
- data/src/core/lib/promise/latch.h +109 -22
- data/src/core/lib/promise/loop.h +13 -9
- data/src/core/lib/promise/map.h +4 -6
- data/src/core/lib/promise/pipe.h +608 -0
- data/src/core/lib/promise/poll.h +129 -11
- data/src/core/lib/promise/promise.h +5 -5
- data/src/core/lib/promise/race.h +6 -10
- data/src/core/lib/promise/seq.h +32 -14
- data/src/core/lib/promise/sleep.cc +58 -42
- data/src/core/lib/promise/sleep.h +44 -26
- data/src/core/lib/promise/trace.cc +20 -0
- data/src/core/lib/promise/trace.h +24 -0
- data/src/core/lib/promise/try_join.h +82 -0
- data/src/core/lib/promise/try_seq.h +41 -23
- data/src/core/lib/resolver/resolver.cc +17 -59
- data/src/core/lib/resolver/resolver.h +21 -18
- data/src/core/lib/resolver/resolver_factory.h +11 -10
- data/src/core/lib/resolver/resolver_registry.cc +17 -9
- data/src/core/lib/resolver/resolver_registry.h +15 -5
- data/src/core/lib/resolver/server_address.cc +46 -34
- data/src/core/lib/resolver/server_address.h +36 -35
- data/src/core/lib/resource_quota/api.cc +23 -2
- data/src/core/lib/resource_quota/api.h +13 -4
- data/src/core/lib/resource_quota/arena.cc +85 -27
- data/src/core/lib/resource_quota/arena.h +197 -25
- data/src/core/lib/resource_quota/memory_quota.cc +322 -101
- data/src/core/lib/resource_quota/memory_quota.h +191 -56
- data/src/core/lib/resource_quota/periodic_update.cc +78 -0
- data/src/core/lib/resource_quota/periodic_update.h +71 -0
- data/src/core/lib/resource_quota/resource_quota.h +12 -4
- data/src/core/lib/resource_quota/thread_quota.cc +2 -0
- data/src/core/lib/resource_quota/thread_quota.h +7 -3
- data/src/core/lib/resource_quota/trace.h +3 -3
- data/src/core/lib/security/authorization/authorization_engine.h +3 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +10 -3
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +3 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +17 -8
- data/src/core/lib/security/authorization/evaluate_args.h +9 -6
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +5 -1
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +10 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +19 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +16 -5
- data/src/core/lib/security/authorization/matchers.cc +44 -30
- data/src/core/lib/security/authorization/matchers.h +10 -3
- data/src/core/lib/security/authorization/rbac_policy.cc +6 -2
- data/src/core/lib/security/authorization/rbac_policy.h +10 -3
- data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +9 -4
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
- data/src/core/lib/security/context/security_context.cc +27 -25
- data/src/core/lib/security/context/security_context.h +56 -34
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +31 -24
- data/src/core/lib/security/credentials/alts/alts_credentials.h +63 -59
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
- data/src/core/lib/security/credentials/alts/check_gcp_environment.h +43 -43
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
- data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +20 -22
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +38 -39
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +19 -22
- data/src/core/lib/security/credentials/call_creds_util.cc +10 -0
- data/src/core/lib/security/credentials/call_creds_util.h +4 -3
- data/src/core/lib/security/credentials/channel_creds_registry.h +10 -4
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +13 -3
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +34 -34
- data/src/core/lib/security/credentials/composite/composite_credentials.h +45 -33
- data/src/core/lib/security/credentials/credentials.cc +23 -26
- data/src/core/lib/security/credentials/credentials.h +79 -65
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +202 -74
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +21 -3
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +14 -3
- data/src/core/lib/security/credentials/external/aws_request_signer.h +3 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +86 -68
- data/src/core/lib/security/credentials/external/external_account_credentials.h +14 -3
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +29 -26
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +9 -3
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +44 -31
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +13 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +43 -39
- data/src/core/lib/security/credentials/fake/fake_credentials.h +51 -44
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +23 -25
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +146 -114
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +33 -27
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +31 -21
- data/src/core/lib/security/credentials/iam/iam_credentials.h +33 -23
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +15 -5
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +14 -10
- data/src/core/lib/security/credentials/jwt/json_token.cc +40 -29
- data/src/core/lib/security/credentials/jwt/json_token.h +36 -36
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +32 -29
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +37 -23
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +113 -89
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +49 -47
- data/src/core/lib/security/credentials/local/local_credentials.cc +32 -26
- data/src/core/lib/security/credentials/local/local_credentials.h +34 -28
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +95 -87
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +46 -25
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +35 -31
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +48 -24
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +44 -42
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +39 -27
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +22 -30
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +16 -17
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +65 -48
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +27 -16
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +36 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +37 -14
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +22 -23
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +3 -3
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +46 -44
- data/src/core/lib/security/credentials/tls/tls_credentials.h +30 -27
- data/src/core/lib/security/credentials/tls/tls_utils.cc +5 -1
- data/src/core/lib/security/credentials/tls/tls_utils.h +4 -4
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +33 -35
- data/src/core/lib/security/credentials/xds/xds_credentials.h +24 -10
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +60 -54
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +49 -47
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +75 -79
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +25 -26
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +15 -6
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +26 -15
- data/src/core/lib/security/security_connector/load_system_roots.h +20 -20
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +22 -20
- data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +43 -38
- data/src/core/lib/security/security_connector/load_system_roots_supported.h +45 -0
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +64 -47
- data/src/core/lib/security/security_connector/local/local_security_connector.h +49 -46
- data/src/core/lib/security/security_connector/security_connector.cc +37 -35
- data/src/core/lib/security/security_connector/security_connector.h +58 -45
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +55 -46
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +44 -43
- data/src/core/lib/security/security_connector/ssl_utils.cc +47 -39
- data/src/core/lib/security/security_connector/ssl_utils.h +45 -42
- data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
- data/src/core/lib/security/security_connector/ssl_utils_config.h +21 -22
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +58 -56
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +48 -28
- data/src/core/lib/security/transport/auth_filters.h +53 -24
- data/src/core/lib/security/transport/client_auth_filter.cc +57 -40
- data/src/core/lib/security/transport/secure_endpoint.cc +130 -75
- data/src/core/lib/security/transport/secure_endpoint.h +28 -27
- data/src/core/lib/security/transport/security_handshaker.cc +144 -114
- data/src/core/lib/security/transport/security_handshaker.h +28 -23
- data/src/core/lib/security/transport/server_auth_filter.cc +157 -266
- data/src/core/lib/security/transport/tsi_error.cc +23 -20
- data/src/core/lib/security/transport/tsi_error.h +20 -20
- data/src/core/lib/security/util/json_util.cc +24 -24
- data/src/core/lib/security/util/json_util.h +21 -23
- data/src/core/lib/service_config/service_config.h +19 -12
- data/src/core/lib/service_config/service_config_call_data.h +15 -5
- data/src/core/lib/service_config/service_config_impl.cc +111 -150
- data/src/core/lib/service_config/service_config_impl.h +27 -27
- data/src/core/lib/service_config/service_config_parser.cc +16 -28
- data/src/core/lib/service_config/service_config_parser.h +18 -19
- data/src/core/lib/slice/b64.cc +26 -26
- data/src/core/lib/slice/b64.h +34 -32
- data/src/core/lib/slice/percent_encoding.cc +24 -30
- data/src/core/lib/slice/percent_encoding.h +28 -34
- data/src/core/lib/slice/slice.cc +59 -46
- data/src/core/lib/slice/slice.h +64 -20
- data/src/core/lib/slice/slice_buffer.cc +136 -76
- data/src/core/lib/slice/slice_buffer.h +168 -0
- data/src/core/lib/slice/slice_internal.h +38 -45
- data/src/core/lib/slice/slice_refcount.cc +3 -18
- data/src/core/lib/slice/slice_refcount.h +53 -19
- data/src/core/lib/slice/slice_string_helpers.cc +17 -33
- data/src/core/lib/slice/slice_string_helpers.h +23 -30
- data/src/core/lib/surface/api_trace.cc +17 -17
- data/src/core/lib/surface/api_trace.h +25 -25
- data/src/core/lib/surface/builtins.cc +7 -2
- data/src/core/lib/surface/builtins.h +3 -3
- data/src/core/lib/surface/byte_buffer.cc +26 -21
- data/src/core/lib/surface/byte_buffer_reader.cc +24 -24
- data/src/core/lib/surface/call.cc +2232 -483
- data/src/core/lib/surface/call.h +135 -42
- data/src/core/lib/surface/call_details.cc +22 -23
- data/src/core/lib/surface/call_log_batch.cc +25 -18
- data/src/core/lib/surface/call_test_only.h +34 -31
- data/src/core/lib/surface/call_trace.cc +123 -0
- data/src/core/{ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc → lib/surface/call_trace.h} +12 -10
- data/src/core/lib/surface/channel.cc +217 -284
- data/src/core/lib/surface/channel.h +137 -90
- data/src/core/lib/surface/channel_init.cc +17 -17
- data/src/core/lib/surface/channel_init.h +22 -20
- data/src/core/lib/surface/channel_ping.cc +26 -20
- data/src/core/lib/surface/channel_stack_type.cc +21 -19
- data/src/core/lib/surface/channel_stack_type.h +22 -22
- data/src/core/lib/surface/completion_queue.cc +200 -222
- data/src/core/lib/surface/completion_queue.h +42 -40
- data/src/core/lib/surface/completion_queue_factory.cc +34 -28
- data/src/core/lib/surface/completion_queue_factory.h +21 -23
- data/src/core/lib/surface/event_string.cc +19 -24
- data/src/core/lib/surface/event_string.h +21 -21
- data/src/core/lib/surface/init.cc +57 -114
- data/src/core/lib/surface/init.h +20 -28
- data/src/core/lib/surface/init_internally.cc +25 -0
- data/src/core/lib/surface/init_internally.h +37 -0
- data/src/core/lib/surface/lame_client.cc +87 -130
- data/src/core/lib/surface/lame_client.h +62 -24
- data/src/core/lib/surface/metadata_array.cc +18 -17
- data/src/core/lib/surface/server.cc +406 -174
- data/src/core/lib/surface/server.h +56 -24
- data/src/core/lib/surface/validate_metadata.cc +64 -77
- data/src/core/lib/surface/validate_metadata.h +33 -21
- data/src/core/lib/surface/version.cc +21 -21
- data/src/core/lib/transport/bdp_estimator.cc +19 -19
- data/src/core/lib/transport/bdp_estimator.h +22 -24
- data/src/core/lib/transport/connectivity_state.cc +24 -23
- data/src/core/lib/transport/connectivity_state.h +24 -25
- data/src/core/lib/transport/error_utils.cc +57 -79
- data/src/core/lib/transport/error_utils.h +29 -25
- data/src/core/lib/{channel → transport}/handshaker.cc +75 -58
- data/src/core/lib/{channel → transport}/handshaker.h +59 -48
- data/src/core/lib/transport/handshaker_factory.h +74 -0
- data/src/core/lib/transport/handshaker_registry.cc +61 -0
- data/src/core/lib/transport/handshaker_registry.h +69 -0
- data/src/core/lib/transport/http2_errors.h +22 -22
- data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +78 -65
- data/src/core/lib/transport/http_connect_handshaker.h +42 -0
- data/src/core/lib/transport/metadata_batch.cc +305 -0
- data/src/core/lib/transport/metadata_batch.h +405 -304
- data/src/core/lib/transport/parsed_metadata.cc +2 -4
- data/src/core/lib/transport/parsed_metadata.h +33 -14
- data/src/core/lib/transport/pid_controller.cc +20 -20
- data/src/core/lib/transport/pid_controller.h +27 -27
- data/src/core/lib/transport/status_conversion.cc +23 -23
- data/src/core/lib/transport/status_conversion.h +24 -24
- data/src/core/lib/transport/tcp_connect_handshaker.cc +245 -0
- data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
- data/src/core/lib/transport/timeout_encoding.cc +24 -28
- data/src/core/lib/transport/timeout_encoding.h +25 -21
- data/src/core/lib/transport/transport.cc +97 -57
- data/src/core/lib/transport/transport.h +243 -213
- data/src/core/lib/transport/transport_fwd.h +20 -0
- data/src/core/lib/transport/transport_impl.h +55 -45
- data/src/core/lib/transport/transport_op_string.cc +40 -39
- data/src/core/lib/uri/uri_parser.cc +12 -4
- data/src/core/lib/uri/uri_parser.h +3 -5
- data/src/core/plugin_registry/grpc_plugin_registry.cc +60 -69
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +20 -39
- data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
- data/src/core/tsi/alts/crypt/gsec.cc +26 -26
- data/src/core/tsi/alts/crypt/gsec.h +336 -336
- data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
- data/src/core/tsi/alts/frame_protector/alts_counter.h +68 -68
- data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
- data/src/core/tsi/alts/frame_protector/alts_crypter.h +209 -209
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +40 -40
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +82 -83
- data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
- data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
- data/src/core/tsi/alts/frame_protector/frame_handler.h +169 -169
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +117 -97
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +104 -104
- data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +43 -44
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +51 -43
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +60 -60
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +24 -24
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +38 -38
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +105 -104
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +40 -41
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +35 -36
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +67 -68
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +55 -56
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +141 -142
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +67 -58
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +43 -44
- data/src/core/tsi/fake_transport_security.cc +146 -110
- data/src/core/tsi/fake_transport_security.h +36 -30
- data/src/core/tsi/local_transport_security.cc +43 -38
- data/src/core/tsi/local_transport_security.h +33 -33
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +9 -4
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +3 -3
- data/src/core/tsi/ssl/session_cache/ssl_session.h +23 -21
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +21 -19
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +31 -22
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +27 -20
- data/src/core/tsi/ssl_transport_security.cc +299 -370
- data/src/core/tsi/ssl_transport_security.h +206 -203
- data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
- data/src/core/tsi/ssl_transport_security_utils.h +147 -0
- data/src/core/tsi/ssl_types.h +27 -27
- data/src/core/tsi/transport_security.cc +44 -32
- data/src/core/tsi/transport_security.h +49 -48
- data/src/core/tsi/transport_security_grpc.cc +23 -22
- data/src/core/tsi/transport_security_grpc.h +44 -41
- data/src/core/tsi/transport_security_interface.h +344 -332
- data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-truffleruby-with-ruby-abi-version.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.gcc +1 -1
- data/src/ruby/ext/grpc/extconf.rb +98 -20
- data/src/ruby/ext/grpc/rb_call.c +1 -0
- data/src/ruby/ext/grpc/rb_channel.c +1 -0
- data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
- data/src/ruby/ext/grpc/rb_grpc.c +1 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +60 -60
- data/src/ruby/ext/grpc/rb_loader.c +6 -2
- data/src/ruby/lib/grpc/errors.rb +1 -1
- data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +0 -6
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
- data/src/ruby/spec/channel_spec.rb +5 -43
- data/src/ruby/spec/client_server_spec.rb +20 -8
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
- data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
- data/src/ruby/spec/user_agent_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +57 -58
- data/third_party/abseil-cpp/absl/base/attributes.h +88 -41
- data/third_party/abseil-cpp/absl/base/casts.h +61 -68
- data/third_party/abseil-cpp/absl/base/config.h +221 -39
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +52 -2
- data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +55 -0
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +5 -4
- data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +3 -3
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +1 -1
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +39 -28
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +36 -36
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +6 -3
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +10 -6
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
- data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +4 -1
- data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
- data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +14 -11
- data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +9 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -40
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +62 -0
- data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
- data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
- data/third_party/abseil-cpp/absl/base/macros.h +4 -21
- data/third_party/abseil-cpp/absl/base/optimization.h +76 -16
- data/third_party/abseil-cpp/absl/base/options.h +1 -7
- data/third_party/abseil-cpp/absl/base/policy_checks.h +15 -13
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/abseil-cpp/absl/container/fixed_array.h +9 -5
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +84 -25
- data/third_party/abseil-cpp/absl/container/internal/common.h +9 -8
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +132 -0
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +23 -29
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +4 -55
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +116 -23
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +40 -54
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +165 -66
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +159 -4
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1121 -470
- data/third_party/abseil-cpp/absl/crc/crc32c.cc +99 -0
- data/third_party/abseil-cpp/absl/crc/crc32c.h +183 -0
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +256 -0
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +57 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc.cc +468 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc.h +91 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +269 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32c.h +39 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc32c_inline.h +72 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.cc +130 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_cord_state.h +159 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +179 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy.h +119 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_fallback.cc +75 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_64.cc +434 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_non_temporal_memcpy.cc +93 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +725 -0
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +79 -0
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_memcpy.h +180 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +67 -38
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +16 -13
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +19 -12
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +59 -102
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +5 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +41 -11
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +18 -4
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +164 -101
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +7 -6
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +316 -0
- data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +878 -0
- data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +10 -10
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +235 -26
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +3 -14
- data/third_party/abseil-cpp/absl/memory/memory.h +26 -447
- data/third_party/abseil-cpp/absl/meta/type_traits.h +104 -12
- data/third_party/abseil-cpp/absl/numeric/bits.h +1 -1
- data/third_party/abseil-cpp/absl/numeric/int128.cc +14 -10
- data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +33 -10
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
- data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +4 -2
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +3 -24
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +9 -9
- data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +2 -2
- data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
- data/third_party/abseil-cpp/absl/random/random.h +6 -6
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
- data/third_party/abseil-cpp/absl/status/status.cc +193 -14
- data/third_party/abseil-cpp/absl/status/status.h +24 -14
- data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
- data/third_party/abseil-cpp/absl/strings/ascii.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
- data/third_party/abseil-cpp/absl/strings/charconv.cc +534 -96
- data/third_party/abseil-cpp/absl/strings/cord.cc +257 -924
- data/third_party/abseil-cpp/absl/strings/cord.h +268 -156
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +575 -0
- data/third_party/abseil-cpp/absl/strings/escaping.cc +73 -62
- data/third_party/abseil-cpp/absl/strings/escaping.h +24 -19
- data/third_party/abseil-cpp/absl/strings/internal/char_map.h +14 -12
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +441 -150
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +157 -53
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +70 -73
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +8 -6
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +56 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +103 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +7 -15
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +19 -43
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +7 -7
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +93 -0
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +34 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +18 -15
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +7 -9
- data/third_party/abseil-cpp/absl/strings/internal/has_absl_stringify.h +55 -0
- data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +14 -7
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +35 -10
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +113 -46
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +127 -30
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +42 -10
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +56 -289
- data/third_party/abseil-cpp/absl/strings/internal/str_format/constexpr_parser.h +351 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +9 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +215 -181
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +10 -209
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -103
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.cc +28 -0
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +57 -0
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/numbers.cc +42 -39
- data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +9 -6
- data/third_party/abseil-cpp/absl/strings/str_cat.h +70 -16
- data/third_party/abseil-cpp/absl/strings/str_format.h +71 -9
- data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +8 -19
- data/third_party/abseil-cpp/absl/strings/string_view.h +6 -12
- data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.cc +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +55 -21
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +20 -17
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +37 -31
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +22 -8
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +172 -88
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +102 -55
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +0 -1
- data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -3
- data/third_party/abseil-cpp/absl/time/civil_time.cc +26 -0
- data/third_party/abseil-cpp/absl/time/civil_time.h +25 -0
- data/third_party/abseil-cpp/absl/time/clock.cc +17 -11
- data/third_party/abseil-cpp/absl/time/duration.cc +12 -11
- data/third_party/abseil-cpp/absl/time/format.cc +2 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +26 -5
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +7 -6
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +36 -35
- data/third_party/abseil-cpp/absl/time/time.cc +2 -2
- data/third_party/abseil-cpp/absl/time/time.h +268 -169
- data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
- data/third_party/abseil-cpp/absl/types/internal/span.h +30 -19
- data/third_party/abseil-cpp/absl/types/internal/variant.h +28 -40
- data/third_party/abseil-cpp/absl/types/optional.h +17 -14
- data/third_party/abseil-cpp/absl/types/span.h +31 -8
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +1 -2
- data/third_party/re2/re2/bitstate.cc +3 -3
- data/third_party/re2/re2/dfa.cc +13 -13
- data/third_party/re2/re2/nfa.cc +4 -4
- data/third_party/re2/re2/onepass.cc +2 -2
- data/third_party/re2/re2/prefilter_tree.cc +27 -59
- data/third_party/re2/re2/prefilter_tree.h +3 -2
- data/third_party/re2/re2/prog.cc +11 -2
- data/third_party/re2/re2/prog.h +17 -5
- data/third_party/re2/re2/re2.cc +6 -11
- data/third_party/re2/re2/re2.h +1 -1
- data/third_party/re2/re2/regexp.cc +1 -2
- data/third_party/re2/re2/stringpiece.h +10 -7
- data/third_party/re2/re2/unicode_casefold.cc +25 -11
- data/third_party/re2/re2/unicode_groups.cc +319 -151
- data/third_party/re2/re2/walker-inl.h +3 -2
- data/third_party/re2/util/mutex.h +4 -4
- data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
- data/third_party/upb/upb/arena.c +277 -0
- data/third_party/upb/upb/arena.h +225 -0
- data/third_party/upb/upb/array.c +114 -0
- data/third_party/upb/upb/array.h +83 -0
- data/third_party/upb/upb/collections.h +36 -0
- data/third_party/upb/upb/decode.c +161 -65
- data/third_party/upb/upb/decode.h +1 -0
- data/third_party/upb/upb/decode_fast.c +1 -1
- data/third_party/upb/upb/def.c +10 -2
- data/third_party/upb/upb/def.h +8 -1
- data/third_party/upb/upb/def.hpp +7 -4
- data/third_party/upb/upb/encode.c +29 -20
- data/third_party/upb/upb/encode.h +16 -6
- data/third_party/upb/upb/extension_registry.c +93 -0
- data/third_party/upb/upb/extension_registry.h +84 -0
- data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
- data/third_party/upb/upb/internal/table.h +385 -0
- data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
- data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
- data/third_party/upb/upb/json_decode.c +1512 -0
- data/third_party/upb/upb/json_decode.h +47 -0
- data/third_party/upb/upb/json_encode.c +7 -3
- data/third_party/upb/upb/json_encode.h +6 -3
- data/third_party/upb/upb/map.c +108 -0
- data/third_party/upb/upb/map.h +117 -0
- data/third_party/upb/upb/message_value.h +66 -0
- data/third_party/upb/upb/mini_table.c +1147 -0
- data/third_party/upb/upb/mini_table.h +189 -0
- data/third_party/upb/upb/mini_table.hpp +112 -0
- data/third_party/upb/upb/msg.c +2 -62
- data/third_party/upb/upb/msg.h +2 -45
- data/third_party/upb/upb/msg_internal.h +28 -22
- data/third_party/upb/upb/port_def.inc +2 -1
- data/third_party/upb/upb/port_undef.inc +1 -0
- data/third_party/upb/upb/reflection.c +2 -159
- data/third_party/upb/upb/reflection.h +2 -112
- data/third_party/upb/upb/status.c +86 -0
- data/third_party/upb/upb/status.h +66 -0
- data/third_party/upb/upb/table.c +2 -2
- data/third_party/upb/upb/table_internal.h +3 -352
- data/third_party/upb/upb/text_encode.c +3 -2
- data/third_party/upb/upb/upb.c +4 -290
- data/third_party/upb/upb/upb.h +7 -196
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +21 -12
- data/third_party/zlib/deflate.c +112 -106
- data/third_party/zlib/deflate.h +2 -2
- data/third_party/zlib/gzlib.c +1 -1
- data/third_party/zlib/gzread.c +3 -5
- data/third_party/zlib/gzwrite.c +1 -1
- data/third_party/zlib/infback.c +10 -7
- data/third_party/zlib/inflate.c +5 -2
- data/third_party/zlib/inftrees.c +2 -2
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +61 -62
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +10 -10
- data/third_party/zlib/zutil.c +9 -7
- data/third_party/zlib/zutil.h +1 -0
- metadata +372 -102
- data/include/grpc/impl/codegen/gpr_slice.h +0 -71
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -42
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -48
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +0 -185
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +0 -65
- data/src/core/ext/filters/client_channel/proxy_mapper.h +0 -54
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -89
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -50
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -186
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -179
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -456
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -53
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -386
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -61
- data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
- data/src/core/ext/xds/certificate_provider_registry.h +0 -57
- data/src/core/lib/channel/handshaker_factory.h +0 -50
- data/src/core/lib/channel/handshaker_registry.cc +0 -50
- data/src/core/lib/channel/handshaker_registry.h +0 -71
- data/src/core/lib/event_engine/sockaddr.cc +0 -40
- data/src/core/lib/event_engine/sockaddr.h +0 -44
- data/src/core/lib/gpr/env.h +0 -40
- data/src/core/lib/gpr/env_linux.cc +0 -75
- data/src/core/lib/gpr/env_posix.cc +0 -46
- data/src/core/lib/gpr/env_windows.cc +0 -74
- data/src/core/lib/gpr/murmur_hash.cc +0 -82
- data/src/core/lib/gpr/murmur_hash.h +0 -29
- data/src/core/lib/gpr/string_windows.h +0 -32
- data/src/core/lib/gpr/tls.h +0 -158
- data/src/core/lib/gprpp/capture.h +0 -76
- data/src/core/lib/iomgr/error_internal.h +0 -66
- data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
- data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
- data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
- data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
- data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
- data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
- data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
- data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
- data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
- data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
- data/src/core/lib/iomgr/executor/threadpool.h +0 -150
- data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
- data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
- data/src/core/lib/profiling/basic_timers.cc +0 -295
- data/src/core/lib/profiling/stap_timers.cc +0 -50
- data/src/core/lib/profiling/timers.h +0 -94
- data/src/core/lib/promise/call_push_pull.h +0 -144
- data/src/core/lib/security/security_connector/load_system_roots_linux.h +0 -46
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_refcount_base.h +0 -61
- data/src/core/lib/slice/slice_split.cc +0 -100
- data/src/core/lib/slice/slice_split.h +0 -40
- data/src/core/lib/transport/byte_stream.cc +0 -164
- data/src/core/lib/transport/byte_stream.h +0 -166
- 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
|
-
//
|
57
|
-
//
|
58
|
-
//
|
59
|
-
//
|
60
|
-
//
|
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
|
-
//
|
68
|
-
//
|
69
|
-
//
|
70
|
-
//
|
71
|
-
//
|
72
|
-
//
|
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
|
-
//
|
75
|
-
// filled in order.
|
105
|
+
// # Table operations.
|
76
106
|
//
|
77
|
-
//
|
78
|
-
// before the erase, the erased slot is marked as deleted.
|
107
|
+
// The key operations are `insert`, `find`, and `erase`.
|
79
108
|
//
|
80
|
-
//
|
81
|
-
//
|
82
|
-
// the
|
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
|
-
//
|
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
|
-
//
|
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
|
-
//
|
89
|
-
//
|
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
|
-
//
|
92
|
-
//
|
93
|
-
//
|
94
|
-
//
|
95
|
-
//
|
96
|
-
//
|
97
|
-
//
|
98
|
-
//
|
99
|
-
//
|
100
|
-
//
|
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
|
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
|
-
|
187
|
-
|
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
|
-
|
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
|
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
|
-
//
|
214
|
-
//
|
215
|
-
//
|
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
|
218
|
-
static_assert(std::is_unsigned<T>::value, "");
|
219
|
-
static_assert(Shift == 0 || Shift == 3, "");
|
220
|
-
|
354
|
+
class NonIterableBitMask {
|
221
355
|
public:
|
222
|
-
|
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
|
228
|
-
|
229
|
-
|
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
|
-
|
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.
|
269
|
-
|
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
|
-
"
|
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
|
-
|
303
|
-
|
304
|
-
|
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
|
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
|
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) ^
|
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
|
-
#
|
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
|
-
|
368
|
-
#
|
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
|
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
|
-
|
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
|
-
|
379
|
-
auto special = _mm_set1_epi8(static_cast<
|
380
|
-
return
|
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<
|
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
|
-
#
|
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
|
-
|
713
|
+
NonIterableBitMask<uint64_t, kWidth, 3> MaskEmpty() const {
|
435
714
|
constexpr uint64_t msbs = 0x8080808080808080ULL;
|
436
|
-
return
|
715
|
+
return NonIterableBitMask<uint64_t, kWidth, 3>((ctrl & (~ctrl << 6)) &
|
716
|
+
msbs);
|
437
717
|
}
|
438
718
|
|
439
|
-
|
719
|
+
NonIterableBitMask<uint64_t, kWidth, 3> MaskEmptyOrDeleted() const {
|
440
720
|
constexpr uint64_t msbs = 0x8080808080808080ULL;
|
441
|
-
return
|
721
|
+
return NonIterableBitMask<uint64_t, kWidth, 3>((ctrl & (~ctrl << 7)) &
|
722
|
+
msbs);
|
442
723
|
}
|
443
724
|
|
444
725
|
uint32_t CountLeadingEmptyOrDeleted() const {
|
445
|
-
|
446
|
-
|
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
|
-
#
|
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
|
-
|
467
|
-
//
|
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
|
-
//
|
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
|
499
|
-
//
|
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
|
-
|
510
|
-
//
|
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
|
-
|
537
|
-
|
538
|
-
|
539
|
-
|
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
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
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
|
-
//
|
554
|
-
//
|
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
|
-
//
|
558
|
-
//
|
559
|
-
//
|
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
|
-
//
|
563
|
-
//
|
564
|
-
//
|
565
|
-
//
|
566
|
-
//
|
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
|
-
|
570
|
-
|
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
|
575
|
-
//
|
576
|
-
//
|
577
|
-
//
|
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
|
-
//
|
581
|
-
//
|
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
|
586
|
-
|
587
|
-
|
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.
|
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(
|
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() <=
|
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
|
1149
|
+
extern template FindInfo find_first_non_full(const CommonFields&, size_t);
|
612
1150
|
|
613
|
-
//
|
614
|
-
|
615
|
-
|
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(
|
1167
|
+
SanitizerPoisonMemoryRegion(common.slots_, slot_size * capacity);
|
1168
|
+
ResetGrowthLeft(common);
|
620
1169
|
}
|
621
1170
|
|
622
|
-
// Sets
|
623
|
-
//
|
624
|
-
|
625
|
-
|
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*>(
|
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
|
-
|
640
|
-
|
641
|
-
|
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
|
-
//
|
645
|
-
//
|
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) &
|
1211
|
+
return (num_control_bytes + NumGenerationBytes() + slot_align - 1) &
|
1212
|
+
(~slot_align + 1);
|
651
1213
|
}
|
652
1214
|
|
653
|
-
//
|
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
|
-
|
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 {
|
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
|
-
|
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
|
-
|
796
|
-
|
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
|
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
|
-
|
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
|
-
|
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(
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
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 =
|
986
|
-
SetCtrl(target.offset, H2(hash),
|
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
|
-
:
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
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
|
-
:
|
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(
|
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() {
|
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
|
-
|
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
|
-
|
1085
|
-
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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(
|
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 &&
|
1395
|
-
if (n == 0 &&
|
1396
|
-
|
1397
|
-
|
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 >
|
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
|
-
|
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(
|
1451
|
-
|
1452
|
-
|
1453
|
-
#endif //
|
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(
|
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{
|
1468
|
-
for (
|
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(
|
2145
|
+
PolicyTraits::element(slot_ptr + seq.offset(i)))))
|
1472
2146
|
return iterator_at(seq.offset(i));
|
1473
2147
|
}
|
1474
|
-
if (ABSL_PREDICT_TRUE(g.
|
2148
|
+
if (ABSL_PREDICT_TRUE(g.MaskEmpty())) return end();
|
1475
2149
|
seq.next();
|
1476
|
-
assert(seq.index() <=
|
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
|
2188
|
+
size_t bucket_count() const { return capacity(); }
|
1515
2189
|
float load_factor() const {
|
1516
|
-
return
|
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.
|
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
|
-
//
|
1607
|
-
//
|
1608
|
-
// This
|
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
|
-
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1619
|
-
|
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).
|
1643
|
-
|
1644
|
-
|
1645
|
-
|
1646
|
-
|
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 =
|
1683
|
-
auto* old_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(
|
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),
|
1697
|
-
PolicyTraits::transfer(&alloc_ref(),
|
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
|
-
|
1711
|
-
|
1712
|
-
|
1713
|
-
|
1714
|
-
// -
|
1715
|
-
|
1716
|
-
|
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
|
-
|
1778
|
-
|
1779
|
-
|
1780
|
-
|
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
|
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*
|
1803
|
-
// if we can recover 3/32*
|
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(
|
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(
|
2412
|
+
auto seq = probe(common(), hash);
|
2413
|
+
const ctrl_t* ctrl = control();
|
1833
2414
|
while (true) {
|
1834
|
-
Group g{
|
1835
|
-
for (
|
1836
|
-
if (ABSL_PREDICT_TRUE(
|
1837
|
-
|
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.
|
2421
|
+
if (ABSL_PREDICT_TRUE(g.MaskEmpty())) return false;
|
1841
2422
|
seq.next();
|
1842
|
-
assert(seq.index() <=
|
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(
|
2448
|
+
auto seq = probe(common(), hash);
|
2449
|
+
const ctrl_t* ctrl = control();
|
1865
2450
|
while (true) {
|
1866
|
-
Group g{
|
1867
|
-
for (
|
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(
|
2455
|
+
PolicyTraits::element(slot_array() + seq.offset(i)))))
|
1871
2456
|
return {seq.offset(i), false};
|
1872
2457
|
}
|
1873
|
-
if (ABSL_PREDICT_TRUE(g.
|
2458
|
+
if (ABSL_PREDICT_TRUE(g.MaskEmpty())) break;
|
1874
2459
|
seq.next();
|
1875
|
-
assert(seq.index() <=
|
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
|
-
|
1882
|
-
|
1883
|
-
|
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(
|
2482
|
+
target = find_first_non_full(common(), hash);
|
1886
2483
|
}
|
1887
|
-
++size_;
|
1888
|
-
growth_left() -= IsEmpty(
|
1889
|
-
SetCtrl(target.offset, H2(hash),
|
1890
|
-
|
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(),
|
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) {
|
1914
|
-
|
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
|
-
|
1920
|
-
|
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
|
-
|
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
|
-
|
1926
|
-
|
1927
|
-
|
1928
|
-
|
1929
|
-
|
1930
|
-
|
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
|
-
|
2572
|
+
// Unpoison before returning the memory to the allocator.
|
2573
|
+
SanitizerUnpoisonMemoryRegion(slot_mem, sizeof(slot_type) * n);
|
1935
2574
|
|
1936
|
-
|
1937
|
-
|
1938
|
-
|
1939
|
-
|
1940
|
-
|
1941
|
-
const
|
1942
|
-
|
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
|
-
//
|
1946
|
-
//
|
1947
|
-
//
|
1948
|
-
|
1949
|
-
|
1950
|
-
|
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
|
-
|
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.
|
2627
|
+
auto seq = probe(set.common(), hash);
|
2628
|
+
const ctrl_t* ctrl = set.control();
|
1982
2629
|
while (true) {
|
1983
|
-
container_internal::Group g{
|
1984
|
-
for (
|
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.
|
2635
|
+
Traits::element(set.slot_array() + seq.offset(i))))
|
1989
2636
|
return num_probes;
|
1990
2637
|
++num_probes;
|
1991
2638
|
}
|
1992
|
-
if (g.
|
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.
|
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(
|
2009
|
-
m += Traits::space_used(c.
|
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_
|