grpc 1.42.0 → 1.43.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 +85 -34
- data/include/grpc/event_engine/event_engine.h +37 -13
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
- data/include/grpc/event_engine/memory_allocator.h +27 -11
- data/include/grpc/event_engine/memory_request.h +57 -0
- data/include/grpc/grpc_security.h +276 -145
- data/include/grpc/grpc_security_constants.h +1 -14
- data/include/grpc/impl/codegen/port_platform.h +7 -3
- data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
- data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
- data/src/core/ext/filters/client_channel/client_channel.h +5 -4
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
- data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
- data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
- data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
- data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
- data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
- data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
- data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
- data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
- data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
- data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
- data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
- data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
- data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
- data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
- data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
- data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
- data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
- data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
- data/src/core/ext/xds/certificate_provider_store.h +1 -1
- data/src/core/ext/xds/xds_api.cc +409 -304
- data/src/core/ext/xds/xds_api.h +3 -1
- data/src/core/ext/xds/xds_bootstrap.cc +6 -3
- data/src/core/ext/xds/xds_certificate_provider.h +1 -2
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
- data/src/core/ext/xds/xds_client.cc +395 -291
- data/src/core/ext/xds/xds_client.h +47 -38
- data/src/core/ext/xds/xds_routing.cc +247 -0
- data/src/core/ext/xds/xds_routing.h +98 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
- data/src/core/lib/avl/avl.h +389 -88
- data/src/core/lib/backoff/backoff.cc +2 -2
- data/src/core/lib/channel/channel_args.cc +17 -17
- data/src/core/lib/channel/channel_args.h +11 -10
- data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
- data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
- data/src/core/lib/channel/channel_stack_builder.cc +0 -2
- data/src/core/lib/channel/channel_trace.cc +6 -6
- data/src/core/lib/channel/channelz.cc +1 -1
- data/src/core/lib/compression/compression_args.cc +7 -5
- data/src/core/lib/compression/compression_args.h +6 -4
- data/src/core/lib/config/core_configuration.cc +3 -1
- data/src/core/lib/config/core_configuration.h +11 -0
- data/src/core/lib/debug/trace.h +2 -2
- data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
- data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
- data/src/core/lib/event_engine/event_engine.cc +0 -13
- data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
- data/src/core/lib/event_engine/event_engine_factory.h +33 -0
- data/src/core/lib/event_engine/memory_allocator.cc +70 -0
- data/src/core/lib/gpr/tls.h +6 -0
- data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
- data/src/core/lib/gprpp/global_config_env.cc +7 -7
- data/src/core/lib/gprpp/global_config_env.h +2 -2
- data/src/core/lib/gprpp/manual_constructor.h +2 -3
- data/src/core/lib/gprpp/orphanable.h +1 -1
- data/src/core/lib/gprpp/ref_counted.h +1 -1
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
- data/src/core/lib/gprpp/status_helper.h +1 -1
- data/src/core/lib/gprpp/table.h +13 -1
- data/src/core/lib/http/httpcli.cc +30 -26
- data/src/core/lib/http/httpcli.h +14 -12
- data/src/core/lib/iomgr/buffer_list.cc +9 -9
- data/src/core/lib/iomgr/buffer_list.h +13 -13
- data/src/core/lib/iomgr/call_combiner.cc +2 -3
- data/src/core/lib/iomgr/endpoint.h +0 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
- data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
- data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
- data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
- data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
- data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
- data/src/core/lib/iomgr/exec_ctx.h +11 -11
- data/src/core/lib/iomgr/executor.cc +12 -15
- data/src/core/lib/iomgr/executor.h +1 -1
- data/src/core/lib/iomgr/tcp_client.cc +2 -4
- data/src/core/lib/iomgr/tcp_client.h +1 -3
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
- data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
- data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
- data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
- data/src/core/lib/iomgr/tcp_custom.cc +9 -36
- data/src/core/lib/iomgr/tcp_custom.h +0 -1
- data/src/core/lib/iomgr/tcp_posix.cc +28 -33
- data/src/core/lib/iomgr/tcp_posix.h +1 -3
- data/src/core/lib/iomgr/tcp_server.cc +4 -6
- data/src/core/lib/iomgr/tcp_server.h +6 -8
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
- data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
- data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
- data/src/core/lib/iomgr/tcp_windows.cc +2 -7
- data/src/core/lib/iomgr/tcp_windows.h +1 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
- data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
- data/src/core/lib/iomgr/work_serializer.cc +115 -44
- data/src/core/lib/iomgr/work_serializer.h +16 -4
- data/src/core/lib/json/json_reader.cc +83 -35
- data/src/core/lib/json/json_util.cc +1 -1
- data/src/core/lib/promise/activity.cc +115 -0
- data/src/core/lib/promise/activity.h +499 -0
- data/src/core/lib/promise/context.h +86 -0
- data/src/core/lib/promise/detail/basic_seq.h +407 -0
- data/src/core/lib/promise/detail/promise_factory.h +189 -0
- data/src/core/lib/promise/detail/promise_like.h +85 -0
- data/src/core/lib/promise/detail/status.h +44 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
- data/src/core/lib/promise/loop.h +108 -0
- data/src/core/lib/promise/map.h +88 -0
- data/src/core/lib/promise/poll.h +60 -0
- data/src/core/lib/promise/race.h +84 -0
- data/src/core/lib/promise/seq.h +71 -0
- data/src/core/lib/resource_quota/api.cc +108 -0
- data/src/core/lib/resource_quota/api.h +41 -0
- data/src/core/lib/resource_quota/memory_quota.cc +454 -0
- data/src/core/lib/resource_quota/memory_quota.h +421 -0
- data/src/core/lib/resource_quota/resource_quota.cc +33 -0
- data/src/core/lib/resource_quota/resource_quota.h +58 -0
- data/src/core/lib/resource_quota/thread_quota.cc +43 -0
- data/src/core/lib/resource_quota/thread_quota.h +57 -0
- data/src/core/lib/resource_quota/trace.cc +19 -0
- data/src/core/lib/resource_quota/trace.h +24 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
- data/src/core/lib/security/authorization/evaluate_args.h +2 -1
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
- data/src/core/lib/security/transport/security_handshaker.cc +2 -2
- data/src/core/lib/slice/percent_encoding.cc +30 -86
- data/src/core/lib/slice/percent_encoding.h +5 -11
- data/src/core/lib/slice/slice.cc +7 -7
- data/src/core/lib/slice/slice.h +341 -0
- data/src/core/lib/slice/slice_buffer.cc +4 -0
- data/src/core/lib/slice/slice_intern.cc +1 -1
- data/src/core/lib/slice/slice_refcount.h +5 -1
- data/src/core/lib/slice/slice_refcount_base.h +19 -11
- data/src/core/lib/slice/static_slice.cc +331 -483
- data/src/core/lib/slice/static_slice.h +101 -132
- data/src/core/lib/surface/builtins.cc +1 -1
- data/src/core/lib/surface/call.cc +85 -59
- data/src/core/lib/surface/channel.cc +4 -29
- data/src/core/lib/surface/channel.h +2 -12
- data/src/core/lib/surface/completion_queue.cc +2 -2
- data/src/core/lib/surface/init.cc +0 -1
- data/src/core/lib/surface/lame_client.cc +24 -17
- data/src/core/lib/surface/server.cc +22 -22
- data/src/core/lib/surface/server.h +8 -9
- data/src/core/lib/surface/validate_metadata.cc +2 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/byte_stream.cc +4 -0
- data/src/core/lib/transport/metadata.h +4 -4
- data/src/core/lib/transport/metadata_batch.cc +5 -0
- data/src/core/lib/transport/metadata_batch.h +174 -99
- data/src/core/lib/transport/parsed_metadata.cc +35 -0
- data/src/core/lib/transport/parsed_metadata.h +180 -61
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +529 -614
- data/src/core/lib/transport/static_metadata.h +0 -18
- data/src/core/lib/transport/transport.cc +4 -26
- data/src/core/lib/transport/transport.h +0 -1
- data/src/core/lib/transport/transport_op_string.cc +1 -1
- data/src/core/lib/uri/uri_parser.cc +19 -19
- data/src/core/lib/uri/uri_parser.h +2 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/local_transport_security.cc +15 -15
- data/src/core/tsi/ssl_transport_security.cc +30 -1
- data/src/core/tsi/ssl_transport_security.h +1 -0
- data/src/ruby/ext/grpc/extconf.rb +1 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
- data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
- data/third_party/abseil-cpp/absl/base/config.h +67 -37
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
- data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
- data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
- data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
- data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
- data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
- data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
- data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
- data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
- data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
- data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
- data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
- data/third_party/abseil-cpp/absl/status/status.cc +9 -17
- data/third_party/abseil-cpp/absl/status/status.h +19 -15
- data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
- data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
- data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
- data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
- data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
- data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
- 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 +36 -18
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
- data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
- data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
- data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
- data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
- data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
- data/third_party/abseil-cpp/absl/time/time.h +67 -36
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
- data/third_party/abseil-cpp/absl/types/span.h +3 -3
- data/third_party/boringssl-with-bazel/err_data.c +681 -677
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
- data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
- data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
- data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
- data/third_party/upb/upb/decode.c +309 -178
- data/third_party/upb/upb/decode_fast.c +1 -1
- data/third_party/upb/upb/decode_internal.h +1 -0
- data/third_party/upb/upb/def.c +330 -85
- data/third_party/upb/upb/def.h +45 -14
- data/third_party/upb/upb/def.hpp +17 -4
- data/third_party/upb/upb/encode.c +100 -40
- data/third_party/upb/upb/msg.c +22 -9
- data/third_party/upb/upb/msg_internal.h +90 -8
- data/third_party/upb/upb/reflection.c +98 -58
- data/third_party/upb/upb/reflection.h +6 -2
- data/third_party/upb/upb/text_encode.c +3 -3
- data/third_party/upb/upb/upb.c +8 -0
- metadata +116 -56
- data/src/core/lib/avl/avl.cc +0 -306
- data/src/core/lib/gprpp/match.h +0 -73
- data/src/core/lib/gprpp/overload.h +0 -59
- data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
- data/src/core/lib/iomgr/resource_quota.cc +0 -1106
- data/src/core/lib/iomgr/resource_quota.h +0 -226
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -87,6 +87,17 @@
|
|
87
87
|
//
|
88
88
|
// This probing function guarantees that after N probes, all the groups of the
|
89
89
|
// table will be probed exactly once.
|
90
|
+
//
|
91
|
+
// The control state and slot array are stored contiguously in a shared heap
|
92
|
+
// allocation. The layout of this allocation is: `capacity()` control bytes,
|
93
|
+
// one sentinel control byte, `Group::kWidth - 1` cloned control bytes,
|
94
|
+
// <possible padding>, `capacity()` slots. The sentinel control byte is used in
|
95
|
+
// iteration so we know when we reach the end of the table. The cloned control
|
96
|
+
// bytes at the end of the table are cloned from the beginning of the table so
|
97
|
+
// groups that begin near the end of the table can see a full group. In cases in
|
98
|
+
// which there are more than `capacity()` cloned control bytes, the extra bytes
|
99
|
+
// are `kEmpty`, and these ensure that we always see at least one empty slot and
|
100
|
+
// can stop an unsuccessful search.
|
90
101
|
|
91
102
|
#ifndef ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_
|
92
103
|
#define ABSL_CONTAINER_INTERNAL_RAW_HASH_SET_H_
|
@@ -112,7 +123,6 @@
|
|
112
123
|
#include "absl/container/internal/hashtable_debug_hooks.h"
|
113
124
|
#include "absl/container/internal/hashtablez_sampler.h"
|
114
125
|
#include "absl/container/internal/have_sse.h"
|
115
|
-
#include "absl/container/internal/layout.h"
|
116
126
|
#include "absl/memory/memory.h"
|
117
127
|
#include "absl/meta/type_traits.h"
|
118
128
|
#include "absl/numeric/bits.h"
|
@@ -252,48 +262,53 @@ class BitMask {
|
|
252
262
|
T mask_;
|
253
263
|
};
|
254
264
|
|
255
|
-
using ctrl_t = signed char;
|
256
265
|
using h2_t = uint8_t;
|
257
266
|
|
258
267
|
// The values here are selected for maximum performance. See the static asserts
|
259
|
-
// below for details.
|
260
|
-
|
268
|
+
// below for details. We use an enum class so that when strict aliasing is
|
269
|
+
// enabled, the compiler knows ctrl_t doesn't alias other types.
|
270
|
+
enum class ctrl_t : int8_t {
|
261
271
|
kEmpty = -128, // 0b10000000
|
262
272
|
kDeleted = -2, // 0b11111110
|
263
273
|
kSentinel = -1, // 0b11111111
|
264
274
|
};
|
265
275
|
static_assert(
|
266
|
-
kEmpty &
|
276
|
+
(static_cast<int8_t>(ctrl_t::kEmpty) &
|
277
|
+
static_cast<int8_t>(ctrl_t::kDeleted) &
|
278
|
+
static_cast<int8_t>(ctrl_t::kSentinel) & 0x80) != 0,
|
267
279
|
"Special markers need to have the MSB to make checking for them efficient");
|
268
|
-
static_assert(
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
280
|
+
static_assert(
|
281
|
+
ctrl_t::kEmpty < ctrl_t::kSentinel && ctrl_t::kDeleted < ctrl_t::kSentinel,
|
282
|
+
"ctrl_t::kEmpty and ctrl_t::kDeleted must be smaller than "
|
283
|
+
"ctrl_t::kSentinel to make the SIMD test of IsEmptyOrDeleted() efficient");
|
284
|
+
static_assert(
|
285
|
+
ctrl_t::kSentinel == static_cast<ctrl_t>(-1),
|
286
|
+
"ctrl_t::kSentinel must be -1 to elide loading it from memory into SIMD "
|
287
|
+
"registers (pcmpeqd xmm, xmm)");
|
288
|
+
static_assert(ctrl_t::kEmpty == static_cast<ctrl_t>(-128),
|
289
|
+
"ctrl_t::kEmpty must be -128 to make the SIMD check for its "
|
276
290
|
"existence efficient (psignb xmm, xmm)");
|
277
|
-
static_assert(
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
291
|
+
static_assert(
|
292
|
+
(~static_cast<int8_t>(ctrl_t::kEmpty) &
|
293
|
+
~static_cast<int8_t>(ctrl_t::kDeleted) &
|
294
|
+
static_cast<int8_t>(ctrl_t::kSentinel) & 0x7F) != 0,
|
295
|
+
"ctrl_t::kEmpty and ctrl_t::kDeleted must share an unset bit that is not "
|
296
|
+
"shared by ctrl_t::kSentinel to make the scalar test for "
|
297
|
+
"MatchEmptyOrDeleted() efficient");
|
298
|
+
static_assert(ctrl_t::kDeleted == static_cast<ctrl_t>(-2),
|
299
|
+
"ctrl_t::kDeleted must be -2 to make the implementation of "
|
283
300
|
"ConvertSpecialToEmptyAndFullToDeleted efficient");
|
284
301
|
|
285
302
|
// A single block of empty control bytes for tables without any slots allocated.
|
286
303
|
// This enables removing a branch in the hot path of find().
|
304
|
+
ABSL_DLL extern const ctrl_t kEmptyGroup[16];
|
287
305
|
inline ctrl_t* EmptyGroup() {
|
288
|
-
|
289
|
-
kSentinel, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty,
|
290
|
-
kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty};
|
291
|
-
return const_cast<ctrl_t*>(empty_group);
|
306
|
+
return const_cast<ctrl_t*>(kEmptyGroup);
|
292
307
|
}
|
293
308
|
|
294
309
|
// Mixes a randomly generated per-process seed with `hash` and `ctrl` to
|
295
310
|
// randomize insertion order within groups.
|
296
|
-
bool ShouldInsertBackwards(size_t hash, ctrl_t* ctrl);
|
311
|
+
bool ShouldInsertBackwards(size_t hash, const ctrl_t* ctrl);
|
297
312
|
|
298
313
|
// Returns a hash seed.
|
299
314
|
//
|
@@ -309,12 +324,12 @@ inline size_t HashSeed(const ctrl_t* ctrl) {
|
|
309
324
|
inline size_t H1(size_t hash, const ctrl_t* ctrl) {
|
310
325
|
return (hash >> 7) ^ HashSeed(ctrl);
|
311
326
|
}
|
312
|
-
inline
|
327
|
+
inline h2_t H2(size_t hash) { return hash & 0x7F; }
|
313
328
|
|
314
|
-
inline bool IsEmpty(ctrl_t c) { return c == kEmpty; }
|
315
|
-
inline bool IsFull(ctrl_t c) { return c >= 0; }
|
316
|
-
inline bool IsDeleted(ctrl_t c) { return c == kDeleted; }
|
317
|
-
inline bool IsEmptyOrDeleted(ctrl_t c) { return c < kSentinel; }
|
329
|
+
inline bool IsEmpty(ctrl_t c) { return c == ctrl_t::kEmpty; }
|
330
|
+
inline bool IsFull(ctrl_t c) { return c >= static_cast<ctrl_t>(0); }
|
331
|
+
inline bool IsDeleted(ctrl_t c) { return c == ctrl_t::kDeleted; }
|
332
|
+
inline bool IsEmptyOrDeleted(ctrl_t c) { return c < ctrl_t::kSentinel; }
|
318
333
|
|
319
334
|
#if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
|
320
335
|
|
@@ -351,24 +366,24 @@ struct GroupSse2Impl {
|
|
351
366
|
// Returns a bitmask representing the positions of empty slots.
|
352
367
|
BitMask<uint32_t, kWidth> MatchEmpty() const {
|
353
368
|
#if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSSE3
|
354
|
-
// This only works because kEmpty is -128.
|
369
|
+
// This only works because ctrl_t::kEmpty is -128.
|
355
370
|
return BitMask<uint32_t, kWidth>(
|
356
371
|
_mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl)));
|
357
372
|
#else
|
358
|
-
return Match(static_cast<h2_t>(kEmpty));
|
373
|
+
return Match(static_cast<h2_t>(ctrl_t::kEmpty));
|
359
374
|
#endif
|
360
375
|
}
|
361
376
|
|
362
377
|
// Returns a bitmask representing the positions of empty or deleted slots.
|
363
378
|
BitMask<uint32_t, kWidth> MatchEmptyOrDeleted() const {
|
364
|
-
auto special = _mm_set1_epi8(kSentinel);
|
379
|
+
auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
|
365
380
|
return BitMask<uint32_t, kWidth>(
|
366
381
|
_mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)));
|
367
382
|
}
|
368
383
|
|
369
384
|
// Returns the number of trailing empty or deleted elements in the group.
|
370
385
|
uint32_t CountLeadingEmptyOrDeleted() const {
|
371
|
-
auto special = _mm_set1_epi8(kSentinel);
|
386
|
+
auto special = _mm_set1_epi8(static_cast<int8_t>(ctrl_t::kSentinel));
|
372
387
|
return TrailingZeros(static_cast<uint32_t>(
|
373
388
|
_mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1));
|
374
389
|
}
|
@@ -403,7 +418,7 @@ struct GroupPortableImpl {
|
|
403
418
|
//
|
404
419
|
// Caveat: there are false positives but:
|
405
420
|
// - they only occur if there is a real match
|
406
|
-
// - they never occur on kEmpty, kDeleted, kSentinel
|
421
|
+
// - they never occur on ctrl_t::kEmpty, ctrl_t::kDeleted, ctrl_t::kSentinel
|
407
422
|
// - they will be handled gracefully by subsequent checks in code
|
408
423
|
//
|
409
424
|
// Example:
|
@@ -448,6 +463,10 @@ using Group = GroupSse2Impl;
|
|
448
463
|
using Group = GroupPortableImpl;
|
449
464
|
#endif
|
450
465
|
|
466
|
+
// The number of cloned control bytes that we copy from the beginning to the
|
467
|
+
// end of the control bytes array.
|
468
|
+
constexpr size_t NumClonedBytes() { return Group::kWidth - 1; }
|
469
|
+
|
451
470
|
template <class Policy, class Hash, class Eq, class Alloc>
|
452
471
|
class raw_hash_set;
|
453
472
|
|
@@ -455,8 +474,8 @@ inline bool IsValidCapacity(size_t n) { return ((n + 1) & n) == 0 && n > 0; }
|
|
455
474
|
|
456
475
|
// PRECONDITION:
|
457
476
|
// IsValidCapacity(capacity)
|
458
|
-
// ctrl[capacity] == kSentinel
|
459
|
-
// ctrl[i] != kSentinel for all i < capacity
|
477
|
+
// ctrl[capacity] == ctrl_t::kSentinel
|
478
|
+
// ctrl[i] != ctrl_t::kSentinel for all i < capacity
|
460
479
|
// Applies mapping for every byte in ctrl:
|
461
480
|
// DELETED -> EMPTY
|
462
481
|
// EMPTY -> EMPTY
|
@@ -498,6 +517,22 @@ inline size_t GrowthToLowerboundCapacity(size_t growth) {
|
|
498
517
|
return growth + static_cast<size_t>((static_cast<int64_t>(growth) - 1) / 7);
|
499
518
|
}
|
500
519
|
|
520
|
+
template <class InputIter>
|
521
|
+
size_t SelectBucketCountForIterRange(InputIter first, InputIter last,
|
522
|
+
size_t bucket_count) {
|
523
|
+
if (bucket_count != 0) {
|
524
|
+
return bucket_count;
|
525
|
+
}
|
526
|
+
using InputIterCategory =
|
527
|
+
typename std::iterator_traits<InputIter>::iterator_category;
|
528
|
+
if (std::is_base_of<std::random_access_iterator_tag,
|
529
|
+
InputIterCategory>::value) {
|
530
|
+
return GrowthToLowerboundCapacity(
|
531
|
+
static_cast<size_t>(std::distance(first, last)));
|
532
|
+
}
|
533
|
+
return 0;
|
534
|
+
}
|
535
|
+
|
501
536
|
inline void AssertIsFull(ctrl_t* ctrl) {
|
502
537
|
ABSL_HARDENING_ASSERT((ctrl != nullptr && IsFull(*ctrl)) &&
|
503
538
|
"Invalid operation on iterator. The element might have "
|
@@ -525,27 +560,29 @@ struct FindInfo {
|
|
525
560
|
// This is important to make 1 a valid capacity.
|
526
561
|
//
|
527
562
|
// - In small mode only the first `capacity()` control bytes after the
|
528
|
-
// sentinel are valid. The rest contain dummy kEmpty values that do not
|
563
|
+
// sentinel are valid. The rest contain dummy ctrl_t::kEmpty values that do not
|
529
564
|
// represent a real slot. This is important to take into account on
|
530
565
|
// find_first_non_full(), where we never try ShouldInsertBackwards() for
|
531
566
|
// small tables.
|
532
567
|
inline bool is_small(size_t capacity) { return capacity < Group::kWidth - 1; }
|
533
568
|
|
534
|
-
inline probe_seq<Group::kWidth> probe(ctrl_t* ctrl, size_t hash,
|
569
|
+
inline probe_seq<Group::kWidth> probe(const ctrl_t* ctrl, size_t hash,
|
535
570
|
size_t capacity) {
|
536
571
|
return probe_seq<Group::kWidth>(H1(hash, ctrl), capacity);
|
537
572
|
}
|
538
573
|
|
539
574
|
// Probes the raw_hash_set with the probe sequence for hash and returns the
|
540
575
|
// pointer to the first empty or deleted slot.
|
541
|
-
// NOTE: this function must work with tables having both kEmpty and
|
542
|
-
// in one group. Such tables appears during
|
576
|
+
// NOTE: this function must work with tables having both ctrl_t::kEmpty and
|
577
|
+
// ctrl_t::kDeleted in one group. Such tables appears during
|
578
|
+
// drop_deletes_without_resize.
|
543
579
|
//
|
544
580
|
// This function is very useful when insertions happen and:
|
545
581
|
// - the input is already a set
|
546
582
|
// - there are enough slots
|
547
583
|
// - the element with the hash is not in the table
|
548
|
-
|
584
|
+
template <typename = void>
|
585
|
+
inline FindInfo find_first_non_full(const ctrl_t* ctrl, size_t hash,
|
549
586
|
size_t capacity) {
|
550
587
|
auto seq = probe(ctrl, hash, capacity);
|
551
588
|
while (true) {
|
@@ -564,8 +601,58 @@ inline FindInfo find_first_non_full(ctrl_t* ctrl, size_t hash,
|
|
564
601
|
return {seq.offset(mask.LowestBitSet()), seq.index()};
|
565
602
|
}
|
566
603
|
seq.next();
|
567
|
-
assert(seq.index()
|
604
|
+
assert(seq.index() <= capacity && "full table!");
|
605
|
+
}
|
606
|
+
}
|
607
|
+
|
608
|
+
// Extern template for inline function keep possibility of inlining.
|
609
|
+
// When compiler decided to not inline, no symbols will be added to the
|
610
|
+
// corresponding translation unit.
|
611
|
+
extern template FindInfo find_first_non_full(const ctrl_t*, size_t, size_t);
|
612
|
+
|
613
|
+
// Reset all ctrl bytes back to ctrl_t::kEmpty, except the sentinel.
|
614
|
+
inline void ResetCtrl(size_t capacity, ctrl_t* ctrl, const void* slot,
|
615
|
+
size_t slot_size) {
|
616
|
+
std::memset(ctrl, static_cast<int8_t>(ctrl_t::kEmpty),
|
617
|
+
capacity + 1 + NumClonedBytes());
|
618
|
+
ctrl[capacity] = ctrl_t::kSentinel;
|
619
|
+
SanitizerPoisonMemoryRegion(slot, slot_size * capacity);
|
620
|
+
}
|
621
|
+
|
622
|
+
// Sets the control byte, and if `i < NumClonedBytes()`, set the cloned byte
|
623
|
+
// at the end too.
|
624
|
+
inline void SetCtrl(size_t i, ctrl_t h, size_t capacity, ctrl_t* ctrl,
|
625
|
+
const void* slot, size_t slot_size) {
|
626
|
+
assert(i < capacity);
|
627
|
+
|
628
|
+
auto* slot_i = static_cast<const char*>(slot) + i * slot_size;
|
629
|
+
if (IsFull(h)) {
|
630
|
+
SanitizerUnpoisonMemoryRegion(slot_i, slot_size);
|
631
|
+
} else {
|
632
|
+
SanitizerPoisonMemoryRegion(slot_i, slot_size);
|
568
633
|
}
|
634
|
+
|
635
|
+
ctrl[i] = h;
|
636
|
+
ctrl[((i - NumClonedBytes()) & capacity) + (NumClonedBytes() & capacity)] = h;
|
637
|
+
}
|
638
|
+
|
639
|
+
inline void SetCtrl(size_t i, h2_t h, size_t capacity, ctrl_t* ctrl,
|
640
|
+
const void* slot, size_t slot_size) {
|
641
|
+
SetCtrl(i, static_cast<ctrl_t>(h), capacity, ctrl, slot, slot_size);
|
642
|
+
}
|
643
|
+
|
644
|
+
// The allocated block consists of `capacity + 1 + NumClonedBytes()` control
|
645
|
+
// bytes followed by `capacity` slots, which must be aligned to `slot_align`.
|
646
|
+
// SlotOffset returns the offset of the slots into the allocated block.
|
647
|
+
inline size_t SlotOffset(size_t capacity, size_t slot_align) {
|
648
|
+
assert(IsValidCapacity(capacity));
|
649
|
+
const size_t num_control_bytes = capacity + 1 + NumClonedBytes();
|
650
|
+
return (num_control_bytes + slot_align - 1) & (~slot_align + 1);
|
651
|
+
}
|
652
|
+
|
653
|
+
// Returns the size of the allocated block. See also above comment.
|
654
|
+
inline size_t AllocSize(size_t capacity, size_t slot_size, size_t slot_align) {
|
655
|
+
return SlotOffset(capacity, slot_align) + capacity * slot_size;
|
569
656
|
}
|
570
657
|
|
571
658
|
// Policy: a policy defines how to perform different operations on
|
@@ -624,13 +711,6 @@ class raw_hash_set {
|
|
624
711
|
auto KeyTypeCanBeHashed(const Hash& h, const key_type& k) -> decltype(h(k));
|
625
712
|
auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k));
|
626
713
|
|
627
|
-
using Layout = absl::container_internal::Layout<ctrl_t, slot_type>;
|
628
|
-
|
629
|
-
static Layout MakeLayout(size_t capacity) {
|
630
|
-
assert(IsValidCapacity(capacity));
|
631
|
-
return Layout(capacity + Group::kWidth + 1, capacity);
|
632
|
-
}
|
633
|
-
|
634
714
|
using AllocTraits = absl::allocator_traits<allocator_type>;
|
635
715
|
using SlotAlloc = typename absl::allocator_traits<
|
636
716
|
allocator_type>::template rebind_alloc<slot_type>;
|
@@ -733,7 +813,7 @@ class raw_hash_set {
|
|
733
813
|
ctrl_ += shift;
|
734
814
|
slot_ += shift;
|
735
815
|
}
|
736
|
-
if (ABSL_PREDICT_FALSE(*ctrl_ == kSentinel)) ctrl_ = nullptr;
|
816
|
+
if (ABSL_PREDICT_FALSE(*ctrl_ == ctrl_t::kSentinel)) ctrl_ = nullptr;
|
737
817
|
}
|
738
818
|
|
739
819
|
ctrl_t* ctrl_ = nullptr;
|
@@ -814,7 +894,8 @@ class raw_hash_set {
|
|
814
894
|
raw_hash_set(InputIter first, InputIter last, size_t bucket_count = 0,
|
815
895
|
const hasher& hash = hasher(), const key_equal& eq = key_equal(),
|
816
896
|
const allocator_type& alloc = allocator_type())
|
817
|
-
: raw_hash_set(
|
897
|
+
: raw_hash_set(SelectBucketCountForIterRange(first, last, bucket_count),
|
898
|
+
hash, eq, alloc) {
|
818
899
|
insert(first, last);
|
819
900
|
}
|
820
901
|
|
@@ -902,7 +983,8 @@ class raw_hash_set {
|
|
902
983
|
for (const auto& v : that) {
|
903
984
|
const size_t hash = PolicyTraits::apply(HashElement{hash_ref()}, v);
|
904
985
|
auto target = find_first_non_full(ctrl_, hash, capacity_);
|
905
|
-
|
986
|
+
SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
|
987
|
+
sizeof(slot_type));
|
906
988
|
emplace_at(target.offset, v);
|
907
989
|
infoz().RecordInsert(hash, target.probe_length);
|
908
990
|
}
|
@@ -998,6 +1080,8 @@ class raw_hash_set {
|
|
998
1080
|
// past that we simply deallocate the array.
|
999
1081
|
if (capacity_ > 127) {
|
1000
1082
|
destroy_slots();
|
1083
|
+
|
1084
|
+
infoz().RecordClearedReservation();
|
1001
1085
|
} else if (capacity_) {
|
1002
1086
|
for (size_t i = 0; i != capacity_; ++i) {
|
1003
1087
|
if (IsFull(ctrl_[i])) {
|
@@ -1005,7 +1089,7 @@ class raw_hash_set {
|
|
1005
1089
|
}
|
1006
1090
|
}
|
1007
1091
|
size_ = 0;
|
1008
|
-
|
1092
|
+
ResetCtrl(capacity_, ctrl_, slots_, sizeof(slot_type));
|
1009
1093
|
reset_growth_left();
|
1010
1094
|
}
|
1011
1095
|
assert(empty());
|
@@ -1311,21 +1395,31 @@ class raw_hash_set {
|
|
1311
1395
|
if (n == 0 && size_ == 0) {
|
1312
1396
|
destroy_slots();
|
1313
1397
|
infoz().RecordStorageChanged(0, 0);
|
1398
|
+
infoz().RecordClearedReservation();
|
1314
1399
|
return;
|
1315
1400
|
}
|
1401
|
+
|
1316
1402
|
// bitor is a faster way of doing `max` here. We will round up to the next
|
1317
1403
|
// power-of-2-minus-1, so bitor is good enough.
|
1318
1404
|
auto m = NormalizeCapacity(n | GrowthToLowerboundCapacity(size()));
|
1319
1405
|
// n == 0 unconditionally rehashes as per the standard.
|
1320
1406
|
if (n == 0 || m > capacity_) {
|
1321
1407
|
resize(m);
|
1408
|
+
|
1409
|
+
// This is after resize, to ensure that we have completed the allocation
|
1410
|
+
// and have potentially sampled the hashtable.
|
1411
|
+
infoz().RecordReservation(n);
|
1322
1412
|
}
|
1323
1413
|
}
|
1324
1414
|
|
1325
1415
|
void reserve(size_t n) {
|
1326
|
-
|
1327
|
-
|
1416
|
+
if (n > size() + growth_left()) {
|
1417
|
+
size_t m = GrowthToLowerboundCapacity(n);
|
1328
1418
|
resize(NormalizeCapacity(m));
|
1419
|
+
|
1420
|
+
// This is after resize, to ensure that we have completed the allocation
|
1421
|
+
// and have potentially sampled the hashtable.
|
1422
|
+
infoz().RecordReservation(n);
|
1329
1423
|
}
|
1330
1424
|
}
|
1331
1425
|
|
@@ -1352,6 +1446,7 @@ class raw_hash_set {
|
|
1352
1446
|
void prefetch(const key_arg<K>& key) const {
|
1353
1447
|
(void)key;
|
1354
1448
|
#if defined(__GNUC__)
|
1449
|
+
prefetch_heap_block();
|
1355
1450
|
auto seq = probe(ctrl_, hash_ref()(key), capacity_);
|
1356
1451
|
__builtin_prefetch(static_cast<const void*>(ctrl_ + seq.offset()));
|
1357
1452
|
__builtin_prefetch(static_cast<const void*>(slots_ + seq.offset()));
|
@@ -1378,11 +1473,12 @@ class raw_hash_set {
|
|
1378
1473
|
}
|
1379
1474
|
if (ABSL_PREDICT_TRUE(g.MatchEmpty())) return end();
|
1380
1475
|
seq.next();
|
1381
|
-
assert(seq.index()
|
1476
|
+
assert(seq.index() <= capacity_ && "full table!");
|
1382
1477
|
}
|
1383
1478
|
}
|
1384
1479
|
template <class K = key_type>
|
1385
1480
|
iterator find(const key_arg<K>& key) {
|
1481
|
+
prefetch_heap_block();
|
1386
1482
|
return find(key, hash_ref()(key));
|
1387
1483
|
}
|
1388
1484
|
|
@@ -1392,6 +1488,7 @@ class raw_hash_set {
|
|
1392
1488
|
}
|
1393
1489
|
template <class K = key_type>
|
1394
1490
|
const_iterator find(const key_arg<K>& key) const {
|
1491
|
+
prefetch_heap_block();
|
1395
1492
|
return find(key, hash_ref()(key));
|
1396
1493
|
}
|
1397
1494
|
|
@@ -1526,7 +1623,8 @@ class raw_hash_set {
|
|
1526
1623
|
static_cast<size_t>(empty_after.TrailingZeros() +
|
1527
1624
|
empty_before.LeadingZeros()) < Group::kWidth;
|
1528
1625
|
|
1529
|
-
|
1626
|
+
SetCtrl(index, was_never_full ? ctrl_t::kEmpty : ctrl_t::kDeleted,
|
1627
|
+
capacity_, ctrl_, slots_, sizeof(slot_type));
|
1530
1628
|
growth_left() += was_never_full;
|
1531
1629
|
infoz().RecordErase();
|
1532
1630
|
}
|
@@ -1545,15 +1643,16 @@ class raw_hash_set {
|
|
1545
1643
|
// bound more carefully.
|
1546
1644
|
if (std::is_same<SlotAlloc, std::allocator<slot_type>>::value &&
|
1547
1645
|
slots_ == nullptr) {
|
1548
|
-
infoz() = Sample();
|
1646
|
+
infoz() = Sample(sizeof(slot_type));
|
1549
1647
|
}
|
1550
1648
|
|
1551
|
-
|
1552
|
-
|
1553
|
-
|
1554
|
-
ctrl_ = reinterpret_cast<ctrl_t*>(
|
1555
|
-
slots_ =
|
1556
|
-
|
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));
|
1557
1656
|
reset_growth_left();
|
1558
1657
|
infoz().RecordStorageChanged(size_, capacity_);
|
1559
1658
|
}
|
@@ -1565,10 +1664,12 @@ class raw_hash_set {
|
|
1565
1664
|
PolicyTraits::destroy(&alloc_ref(), slots_ + i);
|
1566
1665
|
}
|
1567
1666
|
}
|
1568
|
-
|
1667
|
+
|
1569
1668
|
// Unpoison before returning the memory to the allocator.
|
1570
1669
|
SanitizerUnpoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_);
|
1571
|
-
Deallocate<
|
1670
|
+
Deallocate<alignof(slot_type)>(
|
1671
|
+
&alloc_ref(), ctrl_,
|
1672
|
+
AllocSize(capacity_, sizeof(slot_type), alignof(slot_type)));
|
1572
1673
|
ctrl_ = EmptyGroup();
|
1573
1674
|
slots_ = nullptr;
|
1574
1675
|
size_ = 0;
|
@@ -1592,16 +1693,16 @@ class raw_hash_set {
|
|
1592
1693
|
auto target = find_first_non_full(ctrl_, hash, capacity_);
|
1593
1694
|
size_t new_i = target.offset;
|
1594
1695
|
total_probe_length += target.probe_length;
|
1595
|
-
|
1696
|
+
SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
|
1596
1697
|
PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, old_slots + i);
|
1597
1698
|
}
|
1598
1699
|
}
|
1599
1700
|
if (old_capacity) {
|
1600
1701
|
SanitizerUnpoisonMemoryRegion(old_slots,
|
1601
1702
|
sizeof(slot_type) * old_capacity);
|
1602
|
-
|
1603
|
-
|
1604
|
-
|
1703
|
+
Deallocate<alignof(slot_type)>(
|
1704
|
+
&alloc_ref(), old_ctrl,
|
1705
|
+
AllocSize(old_capacity, sizeof(slot_type), alignof(slot_type)));
|
1605
1706
|
}
|
1606
1707
|
infoz().RecordRehash(total_probe_length);
|
1607
1708
|
}
|
@@ -1631,35 +1732,35 @@ class raw_hash_set {
|
|
1631
1732
|
slot_type* slot = reinterpret_cast<slot_type*>(&raw);
|
1632
1733
|
for (size_t i = 0; i != capacity_; ++i) {
|
1633
1734
|
if (!IsDeleted(ctrl_[i])) continue;
|
1634
|
-
size_t hash = PolicyTraits::apply(
|
1635
|
-
|
1636
|
-
|
1637
|
-
size_t new_i = target.offset;
|
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;
|
1638
1739
|
total_probe_length += target.probe_length;
|
1639
1740
|
|
1640
1741
|
// Verify if the old and new i fall within the same group wrt the hash.
|
1641
1742
|
// If they do, we don't need to move the object as it falls already in the
|
1642
1743
|
// best probe we can.
|
1643
|
-
const
|
1644
|
-
|
1645
|
-
|
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;
|
1646
1747
|
};
|
1647
1748
|
|
1648
1749
|
// Element doesn't move.
|
1649
1750
|
if (ABSL_PREDICT_TRUE(probe_index(new_i) == probe_index(i))) {
|
1650
|
-
|
1751
|
+
SetCtrl(i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
|
1651
1752
|
continue;
|
1652
1753
|
}
|
1653
1754
|
if (IsEmpty(ctrl_[new_i])) {
|
1654
1755
|
// Transfer element to the empty spot.
|
1655
|
-
//
|
1756
|
+
// SetCtrl poisons/unpoisons the slots so we have to call it at the
|
1656
1757
|
// right time.
|
1657
|
-
|
1758
|
+
SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
|
1658
1759
|
PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, slots_ + i);
|
1659
|
-
|
1760
|
+
SetCtrl(i, ctrl_t::kEmpty, capacity_, ctrl_, slots_, sizeof(slot_type));
|
1660
1761
|
} else {
|
1661
1762
|
assert(IsDeleted(ctrl_[new_i]));
|
1662
|
-
|
1763
|
+
SetCtrl(new_i, H2(hash), capacity_, ctrl_, slots_, sizeof(slot_type));
|
1663
1764
|
// Until we are done rehashing, DELETED marks previously FULL slots.
|
1664
1765
|
// Swap i and new_i elements.
|
1665
1766
|
PolicyTraits::transfer(&alloc_ref(), slot, slots_ + i);
|
@@ -1675,8 +1776,50 @@ class raw_hash_set {
|
|
1675
1776
|
void rehash_and_grow_if_necessary() {
|
1676
1777
|
if (capacity_ == 0) {
|
1677
1778
|
resize(1);
|
1678
|
-
} else if (
|
1779
|
+
} else if (capacity_ > Group::kWidth &&
|
1780
|
+
// Do these calcuations in 64-bit to avoid overflow.
|
1781
|
+
size() * uint64_t{32} <= capacity_ * uint64_t{25}) {
|
1679
1782
|
// Squash DELETED without growing if there is enough capacity.
|
1783
|
+
//
|
1784
|
+
// Rehash in place if the current size is <= 25/32 of capacity_.
|
1785
|
+
// Rationale for such a high factor: 1) drop_deletes_without_resize() is
|
1786
|
+
// faster than resize, and 2) it takes quite a bit of work to add
|
1787
|
+
// tombstones. In the worst case, seems to take approximately 4
|
1788
|
+
// insert/erase pairs to create a single tombstone and so if we are
|
1789
|
+
// rehashing because of tombstones, we can afford to rehash-in-place as
|
1790
|
+
// long as we are reclaiming at least 1/8 the capacity without doing more
|
1791
|
+
// than 2X the work. (Where "work" is defined to be size() for rehashing
|
1792
|
+
// or rehashing in place, and 1 for an insert or erase.) But rehashing in
|
1793
|
+
// place is faster per operation than inserting or even doubling the size
|
1794
|
+
// of the table, so we actually afford to reclaim even less space from a
|
1795
|
+
// resize-in-place. The decision is to rehash in place if we can reclaim
|
1796
|
+
// at about 1/8th of the usable capacity (specifically 3/28 of the
|
1797
|
+
// capacity) which means that the total cost of rehashing will be a small
|
1798
|
+
// fraction of the total work.
|
1799
|
+
//
|
1800
|
+
// Here is output of an experiment using the BM_CacheInSteadyState
|
1801
|
+
// benchmark running the old case (where we rehash-in-place only if we can
|
1802
|
+
// reclaim at least 7/16*capacity_) vs. this code (which rehashes in place
|
1803
|
+
// if we can recover 3/32*capacity_).
|
1804
|
+
//
|
1805
|
+
// Note that although in the worst-case number of rehashes jumped up from
|
1806
|
+
// 15 to 190, but the number of operations per second is almost the same.
|
1807
|
+
//
|
1808
|
+
// Abridged output of running BM_CacheInSteadyState benchmark from
|
1809
|
+
// raw_hash_set_benchmark. N is the number of insert/erase operations.
|
1810
|
+
//
|
1811
|
+
// | OLD (recover >= 7/16 | NEW (recover >= 3/32)
|
1812
|
+
// size | N/s LoadFactor NRehashes | N/s LoadFactor NRehashes
|
1813
|
+
// 448 | 145284 0.44 18 | 140118 0.44 19
|
1814
|
+
// 493 | 152546 0.24 11 | 151417 0.48 28
|
1815
|
+
// 538 | 151439 0.26 11 | 151152 0.53 38
|
1816
|
+
// 583 | 151765 0.28 11 | 150572 0.57 50
|
1817
|
+
// 628 | 150241 0.31 11 | 150853 0.61 66
|
1818
|
+
// 672 | 149602 0.33 12 | 150110 0.66 90
|
1819
|
+
// 717 | 149998 0.35 12 | 149531 0.70 129
|
1820
|
+
// 762 | 149836 0.37 13 | 148559 0.74 190
|
1821
|
+
// 807 | 149736 0.39 14 | 151107 0.39 14
|
1822
|
+
// 852 | 150204 0.42 15 | 151019 0.42 15
|
1680
1823
|
drop_deletes_without_resize();
|
1681
1824
|
} else {
|
1682
1825
|
// Otherwise grow the container.
|
@@ -1696,7 +1839,7 @@ class raw_hash_set {
|
|
1696
1839
|
}
|
1697
1840
|
if (ABSL_PREDICT_TRUE(g.MatchEmpty())) return false;
|
1698
1841
|
seq.next();
|
1699
|
-
assert(seq.index()
|
1842
|
+
assert(seq.index() <= capacity_ && "full table!");
|
1700
1843
|
}
|
1701
1844
|
return false;
|
1702
1845
|
}
|
@@ -1716,6 +1859,7 @@ class raw_hash_set {
|
|
1716
1859
|
protected:
|
1717
1860
|
template <class K>
|
1718
1861
|
std::pair<size_t, bool> find_or_prepare_insert(const K& key) {
|
1862
|
+
prefetch_heap_block();
|
1719
1863
|
auto hash = hash_ref()(key);
|
1720
1864
|
auto seq = probe(ctrl_, hash, capacity_);
|
1721
1865
|
while (true) {
|
@@ -1728,7 +1872,7 @@ class raw_hash_set {
|
|
1728
1872
|
}
|
1729
1873
|
if (ABSL_PREDICT_TRUE(g.MatchEmpty())) break;
|
1730
1874
|
seq.next();
|
1731
|
-
assert(seq.index()
|
1875
|
+
assert(seq.index() <= capacity_ && "full table!");
|
1732
1876
|
}
|
1733
1877
|
return {prepare_insert(hash), true};
|
1734
1878
|
}
|
@@ -1742,7 +1886,8 @@ class raw_hash_set {
|
|
1742
1886
|
}
|
1743
1887
|
++size_;
|
1744
1888
|
growth_left() -= IsEmpty(ctrl_[target.offset]);
|
1745
|
-
|
1889
|
+
SetCtrl(target.offset, H2(hash), capacity_, ctrl_, slots_,
|
1890
|
+
sizeof(slot_type));
|
1746
1891
|
infoz().RecordInsert(hash, target.probe_length);
|
1747
1892
|
return target.offset;
|
1748
1893
|
}
|
@@ -1771,35 +1916,21 @@ class raw_hash_set {
|
|
1771
1916
|
private:
|
1772
1917
|
friend struct RawHashSetTestOnlyAccess;
|
1773
1918
|
|
1774
|
-
// Reset all ctrl bytes back to kEmpty, except the sentinel.
|
1775
|
-
void reset_ctrl() {
|
1776
|
-
std::memset(ctrl_, kEmpty, capacity_ + Group::kWidth);
|
1777
|
-
ctrl_[capacity_] = kSentinel;
|
1778
|
-
SanitizerPoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_);
|
1779
|
-
}
|
1780
|
-
|
1781
1919
|
void reset_growth_left() {
|
1782
1920
|
growth_left() = CapacityToGrowth(capacity()) - size_;
|
1783
1921
|
}
|
1784
1922
|
|
1785
|
-
|
1786
|
-
// the end too.
|
1787
|
-
void set_ctrl(size_t i, ctrl_t h) {
|
1788
|
-
assert(i < capacity_);
|
1789
|
-
|
1790
|
-
if (IsFull(h)) {
|
1791
|
-
SanitizerUnpoisonObject(slots_ + i);
|
1792
|
-
} else {
|
1793
|
-
SanitizerPoisonObject(slots_ + i);
|
1794
|
-
}
|
1923
|
+
size_t& growth_left() { return settings_.template get<0>(); }
|
1795
1924
|
|
1796
|
-
|
1797
|
-
|
1798
|
-
|
1925
|
+
void prefetch_heap_block() const {
|
1926
|
+
// Prefetch the heap-allocated memory region to resolve potential TLB
|
1927
|
+
// misses. This is intended to overlap with execution of calculating the
|
1928
|
+
// hash for a key.
|
1929
|
+
#if defined(__GNUC__)
|
1930
|
+
__builtin_prefetch(static_cast<const void*>(ctrl_), 0, 1);
|
1931
|
+
#endif // __GNUC__
|
1799
1932
|
}
|
1800
1933
|
|
1801
|
-
size_t& growth_left() { return settings_.template get<0>(); }
|
1802
|
-
|
1803
1934
|
HashtablezInfoHandle& infoz() { return settings_.template get<1>(); }
|
1804
1935
|
|
1805
1936
|
hasher& hash_ref() { return settings_.template get<2>(); }
|
@@ -1814,10 +1945,10 @@ class raw_hash_set {
|
|
1814
1945
|
// TODO(alkis): Investigate removing some of these fields:
|
1815
1946
|
// - ctrl/slots can be derived from each other
|
1816
1947
|
// - size can be moved into the slot array
|
1817
|
-
ctrl_t* ctrl_ = EmptyGroup();
|
1818
|
-
slot_type* slots_ = nullptr;
|
1819
|
-
size_t size_ = 0;
|
1820
|
-
size_t capacity_ = 0;
|
1948
|
+
ctrl_t* ctrl_ = EmptyGroup(); // [(capacity + 1 + NumClonedBytes()) * ctrl_t]
|
1949
|
+
slot_type* slots_ = nullptr; // [capacity * slot_type]
|
1950
|
+
size_t size_ = 0; // number of full slots
|
1951
|
+
size_t capacity_ = 0; // total number of slots
|
1821
1952
|
absl::container_internal::CompressedTuple<size_t /* growth_left */,
|
1822
1953
|
HashtablezInfoHandle, hasher,
|
1823
1954
|
key_equal, allocator_type>
|
@@ -1827,11 +1958,12 @@ class raw_hash_set {
|
|
1827
1958
|
|
1828
1959
|
// Erases all elements that satisfy the predicate `pred` from the container `c`.
|
1829
1960
|
template <typename P, typename H, typename E, typename A, typename Predicate>
|
1830
|
-
void EraseIf(Predicate pred, raw_hash_set<P, H, E, A>* c) {
|
1961
|
+
void EraseIf(Predicate& pred, raw_hash_set<P, H, E, A>* c) {
|
1831
1962
|
for (auto it = c->begin(), last = c->end(); it != last;) {
|
1832
|
-
|
1833
|
-
|
1834
|
-
|
1963
|
+
if (pred(*it)) {
|
1964
|
+
c->erase(it++);
|
1965
|
+
} else {
|
1966
|
+
++it;
|
1835
1967
|
}
|
1836
1968
|
}
|
1837
1969
|
}
|
@@ -1866,8 +1998,7 @@ struct HashtableDebugAccess<Set, absl::void_t<typename Set::raw_hash_set>> {
|
|
1866
1998
|
static size_t AllocatedByteSize(const Set& c) {
|
1867
1999
|
size_t capacity = c.capacity_;
|
1868
2000
|
if (capacity == 0) return 0;
|
1869
|
-
|
1870
|
-
size_t m = layout.AllocSize();
|
2001
|
+
size_t m = AllocSize(capacity, sizeof(Slot), alignof(Slot));
|
1871
2002
|
|
1872
2003
|
size_t per_slot = Traits::space_used(static_cast<const Slot*>(nullptr));
|
1873
2004
|
if (per_slot != ~size_t{}) {
|
@@ -1885,8 +2016,8 @@ struct HashtableDebugAccess<Set, absl::void_t<typename Set::raw_hash_set>> {
|
|
1885
2016
|
static size_t LowerBoundAllocatedByteSize(size_t size) {
|
1886
2017
|
size_t capacity = GrowthToLowerboundCapacity(size);
|
1887
2018
|
if (capacity == 0) return 0;
|
1888
|
-
|
1889
|
-
|
2019
|
+
size_t m =
|
2020
|
+
AllocSize(NormalizeCapacity(capacity), sizeof(Slot), alignof(Slot));
|
1890
2021
|
size_t per_slot = Traits::space_used(static_cast<const Slot*>(nullptr));
|
1891
2022
|
if (per_slot != ~size_t{}) {
|
1892
2023
|
m += per_slot * size;
|