grpc 1.47.0 → 1.48.0.pre1
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 +105 -47
- data/include/grpc/compression.h +1 -1
- data/include/grpc/event_engine/event_engine.h +20 -11
- data/include/grpc/event_engine/slice_buffer.h +8 -2
- data/include/grpc/grpc.h +3 -3
- data/include/grpc/impl/codegen/compression_types.h +2 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -1
- data/include/grpc/impl/codegen/gpr_types.h +2 -1
- data/include/grpc/impl/codegen/grpc_types.h +2 -1
- data/include/grpc/impl/codegen/port_platform.h +6 -3
- data/src/core/ext/filters/census/grpc_context.cc +3 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
- data/src/core/ext/filters/client_channel/client_channel.h +19 -4
- data/src/core/ext/filters/client_channel/config_selector.h +1 -1
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
- data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
- data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
- data/src/core/ext/filters/client_channel/subchannel.h +6 -22
- data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
- data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
- data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
- data/src/core/ext/filters/http/client_authority_filter.h +5 -2
- data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
- data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
- data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
- data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
- data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
- data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
- data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
- data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
- data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -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 +94 -0
- data/src/core/ext/xds/certificate_provider_factory.h +6 -1
- data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
- data/src/core/ext/xds/certificate_provider_registry.h +3 -1
- data/src/core/ext/xds/certificate_provider_store.cc +2 -0
- data/src/core/ext/xds/certificate_provider_store.h +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
- data/src/core/ext/xds/upb_utils.h +1 -2
- data/src/core/ext/xds/xds_api.cc +16 -18
- data/src/core/ext/xds/xds_api.h +12 -5
- data/src/core/ext/xds/xds_bootstrap.cc +37 -24
- data/src/core/ext/xds/xds_bootstrap.h +9 -11
- data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
- data/src/core/ext/xds/xds_certificate_provider.h +16 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
- data/src/core/ext/xds/xds_client.cc +71 -22
- data/src/core/ext/xds/xds_client.h +17 -3
- data/src/core/ext/xds/xds_client_stats.cc +3 -4
- data/src/core/ext/xds/xds_client_stats.h +4 -3
- data/src/core/ext/xds/xds_cluster.cc +21 -10
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
- data/src/core/ext/xds/xds_common_types.cc +36 -22
- data/src/core/ext/xds/xds_common_types.h +12 -4
- data/src/core/ext/xds/xds_endpoint.cc +25 -15
- data/src/core/ext/xds/xds_endpoint.h +13 -5
- data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
- data/src/core/ext/xds/xds_http_filters.cc +7 -0
- data/src/core/ext/xds/xds_http_filters.h +3 -3
- data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
- data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
- data/src/core/ext/xds/xds_listener.cc +51 -33
- data/src/core/ext/xds/xds_listener.h +10 -1
- data/src/core/ext/xds/xds_resource_type.h +3 -3
- data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
- data/src/core/ext/xds/xds_route_config.cc +56 -28
- data/src/core/ext/xds/xds_route_config.h +11 -2
- data/src/core/ext/xds/xds_routing.cc +16 -0
- data/src/core/ext/xds/xds_routing.h +7 -2
- data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
- data/src/core/lib/address_utils/parse_address.cc +5 -8
- data/src/core/lib/address_utils/parse_address.h +3 -2
- data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
- data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
- data/src/core/lib/avl/avl.h +3 -3
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/backoff/backoff.h +1 -1
- data/src/core/lib/channel/call_tracer.h +3 -3
- data/src/core/lib/channel/channel_args.h +1 -0
- data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
- data/src/core/lib/channel/channel_fwd.h +26 -0
- data/src/core/lib/channel/channel_stack.cc +4 -4
- data/src/core/lib/channel/channel_stack.h +1 -11
- data/src/core/lib/channel/channel_stack_builder.h +2 -5
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
- data/src/core/lib/channel/channelz.cc +2 -1
- data/src/core/lib/channel/channelz.h +2 -3
- data/src/core/lib/channel/channelz_registry.cc +4 -5
- data/src/core/lib/channel/connected_channel.cc +1 -0
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +11 -5
- data/src/core/lib/channel/promise_based_filter.h +2 -0
- data/src/core/lib/compression/compression.cc +6 -1
- data/src/core/lib/compression/compression_internal.cc +3 -6
- data/src/core/lib/compression/compression_internal.h +3 -2
- data/src/core/lib/compression/message_compress.cc +3 -1
- data/src/core/lib/compression/message_compress.h +2 -3
- data/src/core/lib/debug/stats.cc +9 -9
- data/src/core/lib/debug/stats.h +2 -1
- data/src/core/lib/debug/stats_data.cc +2 -1
- data/src/core/lib/debug/stats_data.h +0 -4
- data/src/core/lib/debug/trace.h +13 -12
- data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
- data/src/core/lib/event_engine/event_engine.cc +24 -19
- data/src/core/lib/event_engine/event_engine_factory.h +2 -2
- data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
- data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
- data/src/core/lib/event_engine/promise.h +69 -0
- data/src/core/lib/gpr/time_posix.cc +6 -9
- data/src/core/lib/gpr/time_windows.cc +10 -7
- data/src/core/lib/gprpp/manual_constructor.h +0 -67
- data/src/core/lib/gprpp/status_helper.cc +44 -30
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +4 -0
- data/src/core/lib/http/format_request.cc +5 -4
- data/src/core/lib/http/format_request.h +1 -1
- data/src/core/lib/http/httpcli.cc +18 -12
- data/src/core/lib/http/httpcli.h +19 -3
- data/src/core/lib/http/httpcli_security_connector.cc +16 -4
- data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
- data/src/core/lib/http/parser.cc +6 -7
- data/src/core/lib/http/parser.h +3 -0
- data/src/core/lib/iomgr/call_combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
- data/src/core/lib/iomgr/error.cc +11 -9
- data/src/core/lib/iomgr/error.h +9 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
- data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
- data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
- data/src/core/lib/iomgr/ev_posix.cc +54 -92
- data/src/core/lib/iomgr/ev_posix.h +5 -3
- data/src/core/lib/iomgr/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/iomgr.cc +7 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
- data/src/core/lib/iomgr/load_file.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/tcp_client.cc +12 -7
- data/src/core/lib/iomgr/tcp_client.h +24 -13
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
- data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
- data/src/core/lib/iomgr/tcp_posix.cc +91 -29
- data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
- data/src/core/lib/iomgr/tcp_windows.cc +5 -5
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
- data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
- data/src/core/lib/iomgr/work_serializer.h +2 -3
- data/src/core/lib/matchers/matchers.cc +6 -3
- data/src/core/lib/matchers/matchers.h +2 -0
- data/src/core/lib/promise/activity.cc +0 -1
- data/src/core/lib/promise/activity.h +7 -13
- data/src/core/lib/promise/loop.h +1 -0
- data/src/core/lib/promise/promise.h +1 -0
- data/src/core/lib/promise/sleep.cc +36 -31
- data/src/core/lib/promise/sleep.h +25 -25
- data/src/core/lib/resolver/resolver.cc +5 -0
- data/src/core/lib/resolver/resolver.h +3 -0
- data/src/core/lib/resolver/resolver_factory.h +5 -2
- data/src/core/lib/resolver/resolver_registry.cc +2 -9
- data/src/core/lib/resolver/resolver_registry.h +12 -1
- data/src/core/lib/resolver/server_address.cc +8 -0
- data/src/core/lib/resolver/server_address.h +9 -2
- data/src/core/lib/resource_quota/memory_quota.cc +18 -60
- data/src/core/lib/resource_quota/memory_quota.h +11 -25
- data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
- data/src/core/lib/security/authorization/evaluate_args.h +6 -3
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
- data/src/core/lib/security/authorization/matchers.cc +9 -1
- data/src/core/lib/security/authorization/matchers.h +7 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
- data/src/core/lib/security/authorization/rbac_policy.h +7 -0
- data/src/core/lib/security/context/security_context.cc +5 -2
- data/src/core/lib/security/context/security_context.h +14 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
- data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
- data/src/core/lib/security/credentials/call_creds_util.h +1 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
- data/src/core/lib/security/credentials/credentials.cc +4 -8
- data/src/core/lib/security/credentials/credentials.h +10 -8
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
- data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
- data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
- data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
- data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
- data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
- data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
- data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
- data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
- data/src/core/lib/security/security_connector/security_connector.cc +20 -18
- data/src/core/lib/security/security_connector/security_connector.h +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
- data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
- data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
- data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
- data/src/core/lib/security/transport/secure_endpoint.h +4 -3
- data/src/core/lib/security/transport/security_handshaker.cc +44 -11
- data/src/core/lib/security/transport/security_handshaker.h +4 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
- data/src/core/lib/security/util/json_util.cc +3 -2
- data/src/core/lib/security/util/json_util.h +0 -2
- data/src/core/lib/service_config/service_config_call_data.h +2 -1
- data/src/core/lib/service_config/service_config_impl.cc +6 -6
- data/src/core/lib/service_config/service_config_impl.h +1 -3
- data/src/core/lib/service_config/service_config_parser.cc +2 -4
- data/src/core/lib/slice/slice_buffer.cc +30 -1
- data/src/core/lib/slice/slice_buffer.h +37 -6
- data/src/core/lib/slice/slice_string_helpers.cc +0 -20
- data/src/core/lib/slice/slice_string_helpers.h +0 -4
- data/src/core/lib/surface/call.cc +53 -115
- data/src/core/lib/surface/call.h +5 -1
- data/src/core/lib/surface/channel.h +2 -0
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +15 -14
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +0 -1
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +14 -8
- data/src/core/lib/surface/server.h +4 -1
- data/src/core/lib/surface/validate_metadata.cc +1 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +13 -7
- data/src/core/lib/transport/handshaker.cc +3 -3
- data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
- data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
- data/src/core/lib/transport/transport.cc +0 -3
- data/src/core/lib/transport/transport.h +20 -14
- data/src/core/lib/transport/transport_fwd.h +20 -0
- data/src/core/lib/transport/transport_impl.h +1 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -9
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
- data/src/core/tsi/fake_transport_security.cc +13 -1
- data/src/core/tsi/fake_transport_security.h +6 -0
- data/src/core/tsi/ssl_transport_security.cc +1 -1
- data/src/core/tsi/transport_security_grpc.cc +3 -2
- data/src/core/tsi/transport_security_grpc.h +5 -2
- data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.clang +1 -0
- data/src/ruby/ext/grpc/ext-export.gcc +1 -0
- data/src/ruby/ext/grpc/extconf.rb +49 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/lib/grpc/errors.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
- data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
- data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
- data/third_party/abseil-cpp/absl/base/casts.h +61 -68
- data/third_party/abseil-cpp/absl/base/config.h +182 -41
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
- 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/invoke.h +54 -0
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
- 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 +0 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
- 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/optimization.h +19 -11
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
- data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
- 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 +8 -3
- 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_powerpc-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
- 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/hash/hash.h +82 -8
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
- data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
- data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
- data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
- 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 +2 -1
- 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 +1 -1
- 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/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/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 +17 -0
- data/third_party/abseil-cpp/absl/status/status.cc +174 -2
- data/third_party/abseil-cpp/absl/status/status.h +22 -12
- data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
- data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
- data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
- data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
- 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 +572 -0
- 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 +123 -88
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
- 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 +54 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -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_info.cc +11 -38
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
- 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.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
- data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
- data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
- 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 +2 -13
- data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
- data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
- 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/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 +75 -40
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
- data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
- data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
- data/third_party/abseil-cpp/absl/time/time.h +16 -12
- data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
- data/third_party/abseil-cpp/absl/types/optional.h +17 -14
- data/third_party/abseil-cpp/absl/types/span.h +2 -1
- metadata +39 -15
- data/src/core/lib/slice/slice_split.cc +0 -103
- data/src/core/lib/slice/slice_split.h +0 -36
- data/src/core/lib/transport/byte_stream.cc +0 -165
- data/src/core/lib/transport/byte_stream.h +0 -170
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -26,9 +26,9 @@
|
|
26
26
|
// support Abseil hashing without requiring you to define a hashing
|
27
27
|
// algorithm.
|
28
28
|
// * `HashState`, a type-erased class which implements the manipulation of the
|
29
|
-
// hash state (H) itself
|
30
|
-
// `combine_contiguous()`, which you can use
|
31
|
-
// hash state when hashing your types.
|
29
|
+
// hash state (H) itself; contains member functions `combine()`,
|
30
|
+
// `combine_contiguous()`, and `combine_unordered()`; and which you can use
|
31
|
+
// to contribute to an existing hash state when hashing your types.
|
32
32
|
//
|
33
33
|
// Unlike `std::hash` or other hashing frameworks, the Abseil hashing framework
|
34
34
|
// provides most of its utility by abstracting away the hash algorithm (and its
|
@@ -40,6 +40,11 @@
|
|
40
40
|
// each process. E.g., `absl::Hash<int>{}(9)` in one process and
|
41
41
|
// `absl::Hash<int>{}(9)` in another process are likely to differ.
|
42
42
|
//
|
43
|
+
// `absl::Hash` may also produce different values from different dynamically
|
44
|
+
// loaded libraries. For this reason, `absl::Hash` values must never cross
|
45
|
+
// boundries in dynamically loaded libraries (including when used in types like
|
46
|
+
// hash containers.)
|
47
|
+
//
|
43
48
|
// `absl::Hash` is intended to strongly mix input bits with a target of passing
|
44
49
|
// an [Avalanche Test](https://en.wikipedia.org/wiki/Avalanche_effect).
|
45
50
|
//
|
@@ -74,7 +79,9 @@
|
|
74
79
|
#define ABSL_HASH_HASH_H_
|
75
80
|
|
76
81
|
#include <tuple>
|
82
|
+
#include <utility>
|
77
83
|
|
84
|
+
#include "absl/functional/function_ref.h"
|
78
85
|
#include "absl/hash/internal/hash.h"
|
79
86
|
|
80
87
|
namespace absl {
|
@@ -107,14 +114,27 @@ ABSL_NAMESPACE_BEGIN
|
|
107
114
|
// * std::string_view (as well as any instance of std::basic_string that
|
108
115
|
// uses char and std::char_traits)
|
109
116
|
// * All the standard sequence containers (provided the elements are hashable)
|
110
|
-
// * All the standard
|
117
|
+
// * All the standard associative containers (provided the elements are
|
111
118
|
// hashable)
|
112
119
|
// * absl types such as the following:
|
113
120
|
// * absl::string_view
|
114
|
-
// * absl::InlinedVector
|
115
|
-
// * absl::FixedArray
|
116
121
|
// * absl::uint128
|
117
122
|
// * absl::Time, absl::Duration, and absl::TimeZone
|
123
|
+
// * absl containers (provided the elements are hashable) such as the
|
124
|
+
// following:
|
125
|
+
// * absl::flat_hash_set, absl::node_hash_set, absl::btree_set
|
126
|
+
// * absl::flat_hash_map, absl::node_hash_map, absl::btree_map
|
127
|
+
// * absl::btree_multiset, absl::btree_multimap
|
128
|
+
// * absl::InlinedVector
|
129
|
+
// * absl::FixedArray
|
130
|
+
//
|
131
|
+
// When absl::Hash is used to hash an unordered container with a custom hash
|
132
|
+
// functor, the elements are hashed using default absl::Hash semantics, not
|
133
|
+
// the custom hash functor. This is consistent with the behavior of
|
134
|
+
// operator==() on unordered containers, which compares elements pairwise with
|
135
|
+
// operator==() rather than the custom equality functor. It is usually a
|
136
|
+
// mistake to use either operator==() or absl::Hash on unordered collections
|
137
|
+
// that use functors incompatible with operator==() equality.
|
118
138
|
//
|
119
139
|
// Note: the list above is not meant to be exhaustive. Additional type support
|
120
140
|
// may be added, in which case the above list will be updated.
|
@@ -153,7 +173,8 @@ ABSL_NAMESPACE_BEGIN
|
|
153
173
|
// that are otherwise difficult to extend using `AbslHashValue()`. (See the
|
154
174
|
// `HashState` class below.)
|
155
175
|
//
|
156
|
-
// The "hash state" concept contains
|
176
|
+
// The "hash state" concept contains three member functions for mixing hash
|
177
|
+
// state:
|
157
178
|
//
|
158
179
|
// * `H::combine(state, values...)`
|
159
180
|
//
|
@@ -187,6 +208,15 @@ ABSL_NAMESPACE_BEGIN
|
|
187
208
|
// (it may perform internal optimizations). If you need this guarantee, use a
|
188
209
|
// loop instead.
|
189
210
|
//
|
211
|
+
// * `H::combine_unordered(state, begin, end)`
|
212
|
+
//
|
213
|
+
// Combines a set of elements denoted by an iterator pair into a hash
|
214
|
+
// state, returning the updated state. Note that the existing hash
|
215
|
+
// state is move-only and must be passed by value.
|
216
|
+
//
|
217
|
+
// Unlike the other two methods, the hashing is order-independent.
|
218
|
+
// This can be used to hash unordered collections.
|
219
|
+
//
|
190
220
|
// -----------------------------------------------------------------------------
|
191
221
|
// Adding Type Support to `absl::Hash`
|
192
222
|
// -----------------------------------------------------------------------------
|
@@ -243,8 +273,9 @@ size_t HashOf(const Types&... values) {
|
|
243
273
|
// classes, virtual functions, etc.). The type erasure adds overhead so it
|
244
274
|
// should be avoided unless necessary.
|
245
275
|
//
|
246
|
-
// Note: This wrapper will only erase calls to
|
276
|
+
// Note: This wrapper will only erase calls to
|
247
277
|
// combine_contiguous(H, const unsigned char*, size_t)
|
278
|
+
// RunCombineUnordered(H, CombinerF)
|
248
279
|
//
|
249
280
|
// All other calls will be handled internally and will not invoke overloads
|
250
281
|
// provided by the wrapped class.
|
@@ -318,6 +349,8 @@ class HashState : public hash_internal::HashStateBase<HashState> {
|
|
318
349
|
private:
|
319
350
|
HashState() = default;
|
320
351
|
|
352
|
+
friend class HashState::HashStateBase;
|
353
|
+
|
321
354
|
template <typename T>
|
322
355
|
static void CombineContiguousImpl(void* p, const unsigned char* first,
|
323
356
|
size_t size) {
|
@@ -329,16 +362,57 @@ class HashState : public hash_internal::HashStateBase<HashState> {
|
|
329
362
|
void Init(T* state) {
|
330
363
|
state_ = state;
|
331
364
|
combine_contiguous_ = &CombineContiguousImpl<T>;
|
365
|
+
run_combine_unordered_ = &RunCombineUnorderedImpl<T>;
|
366
|
+
}
|
367
|
+
|
368
|
+
template <typename HS>
|
369
|
+
struct CombineUnorderedInvoker {
|
370
|
+
template <typename T, typename ConsumerT>
|
371
|
+
void operator()(T inner_state, ConsumerT inner_cb) {
|
372
|
+
f(HashState::Create(&inner_state),
|
373
|
+
[&](HashState& inner_erased) { inner_cb(inner_erased.Real<T>()); });
|
374
|
+
}
|
375
|
+
|
376
|
+
absl::FunctionRef<void(HS, absl::FunctionRef<void(HS&)>)> f;
|
377
|
+
};
|
378
|
+
|
379
|
+
template <typename T>
|
380
|
+
static HashState RunCombineUnorderedImpl(
|
381
|
+
HashState state,
|
382
|
+
absl::FunctionRef<void(HashState, absl::FunctionRef<void(HashState&)>)>
|
383
|
+
f) {
|
384
|
+
// Note that this implementation assumes that inner_state and outer_state
|
385
|
+
// are the same type. This isn't true in the SpyHash case, but SpyHash
|
386
|
+
// types are move-convertible to each other, so this still works.
|
387
|
+
T& real_state = state.Real<T>();
|
388
|
+
real_state = T::RunCombineUnordered(
|
389
|
+
std::move(real_state), CombineUnorderedInvoker<HashState>{f});
|
390
|
+
return state;
|
391
|
+
}
|
392
|
+
|
393
|
+
template <typename CombinerT>
|
394
|
+
static HashState RunCombineUnordered(HashState state, CombinerT combiner) {
|
395
|
+
auto* run = state.run_combine_unordered_;
|
396
|
+
return run(std::move(state), std::ref(combiner));
|
332
397
|
}
|
333
398
|
|
334
399
|
// Do not erase an already erased state.
|
335
400
|
void Init(HashState* state) {
|
336
401
|
state_ = state->state_;
|
337
402
|
combine_contiguous_ = state->combine_contiguous_;
|
403
|
+
run_combine_unordered_ = state->run_combine_unordered_;
|
404
|
+
}
|
405
|
+
|
406
|
+
template <typename T>
|
407
|
+
T& Real() {
|
408
|
+
return *static_cast<T*>(state_);
|
338
409
|
}
|
339
410
|
|
340
411
|
void* state_;
|
341
412
|
void (*combine_contiguous_)(void*, const unsigned char*, size_t);
|
413
|
+
HashState (*run_combine_unordered_)(
|
414
|
+
HashState state,
|
415
|
+
absl::FunctionRef<void(HashState, absl::FunctionRef<void(HashState&)>)>);
|
342
416
|
};
|
343
417
|
|
344
418
|
ABSL_NAMESPACE_END
|
@@ -23,6 +23,7 @@
|
|
23
23
|
#include <array>
|
24
24
|
#include <bitset>
|
25
25
|
#include <cmath>
|
26
|
+
#include <cstddef>
|
26
27
|
#include <cstring>
|
27
28
|
#include <deque>
|
28
29
|
#include <forward_list>
|
@@ -36,6 +37,8 @@
|
|
36
37
|
#include <string>
|
37
38
|
#include <tuple>
|
38
39
|
#include <type_traits>
|
40
|
+
#include <unordered_map>
|
41
|
+
#include <unordered_set>
|
39
42
|
#include <utility>
|
40
43
|
#include <vector>
|
41
44
|
|
@@ -54,6 +57,9 @@
|
|
54
57
|
|
55
58
|
namespace absl {
|
56
59
|
ABSL_NAMESPACE_BEGIN
|
60
|
+
|
61
|
+
class HashState;
|
62
|
+
|
57
63
|
namespace hash_internal {
|
58
64
|
|
59
65
|
// Internal detail: Large buffers are hashed in smaller chunks. This function
|
@@ -115,24 +121,66 @@ class PiecewiseCombiner {
|
|
115
121
|
size_t position_;
|
116
122
|
};
|
117
123
|
|
124
|
+
// is_hashable()
|
125
|
+
//
|
126
|
+
// Trait class which returns true if T is hashable by the absl::Hash framework.
|
127
|
+
// Used for the AbslHashValue implementations for composite types below.
|
128
|
+
template <typename T>
|
129
|
+
struct is_hashable;
|
130
|
+
|
118
131
|
// HashStateBase
|
119
132
|
//
|
120
|
-
//
|
121
|
-
// of
|
122
|
-
//
|
123
|
-
//
|
124
|
-
// the
|
133
|
+
// An internal implementation detail that contains common implementation details
|
134
|
+
// for all of the "hash state objects" objects generated by Abseil. This is not
|
135
|
+
// a public API; users should not create classes that inherit from this.
|
136
|
+
//
|
137
|
+
// A hash state object is the template argument `H` passed to `AbslHashValue`.
|
138
|
+
// It represents an intermediate state in the computation of an unspecified hash
|
139
|
+
// algorithm. `HashStateBase` provides a CRTP style base class for hash state
|
140
|
+
// implementations. Developers adding type support for `absl::Hash` should not
|
141
|
+
// rely on any parts of the state object other than the following member
|
142
|
+
// functions:
|
125
143
|
//
|
126
144
|
// * HashStateBase::combine()
|
127
145
|
// * HashStateBase::combine_contiguous()
|
146
|
+
// * HashStateBase::combine_unordered()
|
128
147
|
//
|
129
|
-
// A derived hash state class of type `H` must provide a
|
148
|
+
// A derived hash state class of type `H` must provide a public member function
|
130
149
|
// with a signature similar to the following:
|
131
150
|
//
|
132
151
|
// `static H combine_contiguous(H state, const unsigned char*, size_t)`.
|
133
152
|
//
|
153
|
+
// It must also provide a private template method named RunCombineUnordered.
|
154
|
+
//
|
155
|
+
// A "consumer" is a 1-arg functor returning void. Its argument is a reference
|
156
|
+
// to an inner hash state object, and it may be called multiple times. When
|
157
|
+
// called, the functor consumes the entropy from the provided state object,
|
158
|
+
// and resets that object to its empty state.
|
159
|
+
//
|
160
|
+
// A "combiner" is a stateless 2-arg functor returning void. Its arguments are
|
161
|
+
// an inner hash state object and an ElementStateConsumer functor. A combiner
|
162
|
+
// uses the provided inner hash state object to hash each element of the
|
163
|
+
// container, passing the inner hash state object to the consumer after hashing
|
164
|
+
// each element.
|
165
|
+
//
|
166
|
+
// Given these definitions, a derived hash state class of type H
|
167
|
+
// must provide a private template method with a signature similar to the
|
168
|
+
// following:
|
169
|
+
//
|
170
|
+
// `template <typename CombinerT>`
|
171
|
+
// `static H RunCombineUnordered(H outer_state, CombinerT combiner)`
|
172
|
+
//
|
173
|
+
// This function is responsible for constructing the inner state object and
|
174
|
+
// providing a consumer to the combiner. It uses side effects of the consumer
|
175
|
+
// and combiner to mix the state of each element in an order-independent manner,
|
176
|
+
// and uses this to return an updated value of `outer_state`.
|
177
|
+
//
|
178
|
+
// This inside-out approach generates efficient object code in the normal case,
|
179
|
+
// but allows us to use stack storage to implement the absl::HashState type
|
180
|
+
// erasure mechanism (avoiding heap allocations while hashing).
|
181
|
+
//
|
134
182
|
// `HashStateBase` will provide a complete implementation for a hash state
|
135
|
-
// object in terms of
|
183
|
+
// object in terms of these two methods.
|
136
184
|
//
|
137
185
|
// Example:
|
138
186
|
//
|
@@ -141,6 +189,10 @@ class PiecewiseCombiner {
|
|
141
189
|
// static H combine_contiguous(H state, const unsigned char*, size_t);
|
142
190
|
// using MyHashState::HashStateBase::combine;
|
143
191
|
// using MyHashState::HashStateBase::combine_contiguous;
|
192
|
+
// using MyHashState::HashStateBase::combine_unordered;
|
193
|
+
// private:
|
194
|
+
// template <typename CombinerT>
|
195
|
+
// static H RunCombineUnordered(H state, CombinerT combiner);
|
144
196
|
// };
|
145
197
|
template <typename H>
|
146
198
|
class HashStateBase {
|
@@ -181,7 +233,30 @@ class HashStateBase {
|
|
181
233
|
template <typename T>
|
182
234
|
static H combine_contiguous(H state, const T* data, size_t size);
|
183
235
|
|
236
|
+
template <typename I>
|
237
|
+
static H combine_unordered(H state, I begin, I end);
|
238
|
+
|
184
239
|
using AbslInternalPiecewiseCombiner = PiecewiseCombiner;
|
240
|
+
|
241
|
+
template <typename T>
|
242
|
+
using is_hashable = absl::hash_internal::is_hashable<T>;
|
243
|
+
|
244
|
+
private:
|
245
|
+
// Common implementation of the iteration step of a "combiner", as described
|
246
|
+
// above.
|
247
|
+
template <typename I>
|
248
|
+
struct CombineUnorderedCallback {
|
249
|
+
I begin;
|
250
|
+
I end;
|
251
|
+
|
252
|
+
template <typename InnerH, typename ElementStateConsumer>
|
253
|
+
void operator()(InnerH inner_state, ElementStateConsumer cb) {
|
254
|
+
for (; begin != end; ++begin) {
|
255
|
+
inner_state = H::combine(std::move(inner_state), *begin);
|
256
|
+
cb(inner_state);
|
257
|
+
}
|
258
|
+
}
|
259
|
+
};
|
185
260
|
};
|
186
261
|
|
187
262
|
// is_uniquely_represented
|
@@ -346,17 +421,43 @@ H AbslHashValue(H hash_state, std::nullptr_t) {
|
|
346
421
|
return H::combine(std::move(hash_state), static_cast<void*>(nullptr));
|
347
422
|
}
|
348
423
|
|
424
|
+
// AbslHashValue() for hashing pointers-to-member
|
425
|
+
template <typename H, typename T, typename C>
|
426
|
+
H AbslHashValue(H hash_state, T C::* ptr) {
|
427
|
+
auto salient_ptm_size = [](std::size_t n) -> std::size_t {
|
428
|
+
#if defined(_MSC_VER)
|
429
|
+
// Pointers-to-member-function on MSVC consist of one pointer plus 0, 1, 2,
|
430
|
+
// or 3 ints. In 64-bit mode, they are 8-byte aligned and thus can contain
|
431
|
+
// padding (namely when they have 1 or 3 ints). The value below is a lower
|
432
|
+
// bound on the number of salient, non-padding bytes that we use for
|
433
|
+
// hashing.
|
434
|
+
if (alignof(T C::*) == alignof(int)) {
|
435
|
+
// No padding when all subobjects have the same size as the total
|
436
|
+
// alignment. This happens in 32-bit mode.
|
437
|
+
return n;
|
438
|
+
} else {
|
439
|
+
// Padding for 1 int (size 16) or 3 ints (size 24).
|
440
|
+
// With 2 ints, the size is 16 with no padding, which we pessimize.
|
441
|
+
return n == 24 ? 20 : n == 16 ? 12 : n;
|
442
|
+
}
|
443
|
+
#else
|
444
|
+
// On other platforms, we assume that pointers-to-members do not have
|
445
|
+
// padding.
|
446
|
+
#ifdef __cpp_lib_has_unique_object_representations
|
447
|
+
static_assert(std::has_unique_object_representations_v<T C::*>);
|
448
|
+
#endif // __cpp_lib_has_unique_object_representations
|
449
|
+
return n;
|
450
|
+
#endif
|
451
|
+
};
|
452
|
+
return H::combine_contiguous(std::move(hash_state),
|
453
|
+
reinterpret_cast<unsigned char*>(&ptr),
|
454
|
+
salient_ptm_size(sizeof ptr));
|
455
|
+
}
|
456
|
+
|
349
457
|
// -----------------------------------------------------------------------------
|
350
458
|
// AbslHashValue for Composite Types
|
351
459
|
// -----------------------------------------------------------------------------
|
352
460
|
|
353
|
-
// is_hashable()
|
354
|
-
//
|
355
|
-
// Trait class which returns true if T is hashable by the absl::Hash framework.
|
356
|
-
// Used for the AbslHashValue implementations for composite types below.
|
357
|
-
template <typename T>
|
358
|
-
struct is_hashable;
|
359
|
-
|
360
461
|
// AbslHashValue() for hashing pairs
|
361
462
|
template <typename H, typename T1, typename T2>
|
362
463
|
typename std::enable_if<is_hashable<T1>::value && is_hashable<T2>::value,
|
@@ -502,10 +603,11 @@ AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
|
|
502
603
|
vector.size());
|
503
604
|
}
|
504
605
|
|
606
|
+
// AbslHashValue special cases for hashing std::vector<bool>
|
607
|
+
|
505
608
|
#if defined(ABSL_IS_BIG_ENDIAN) && \
|
506
609
|
(defined(__GLIBCXX__) || defined(__GLIBCPP__))
|
507
|
-
|
508
|
-
//
|
610
|
+
|
509
611
|
// std::hash in libstdc++ does not work correctly with vector<bool> on Big
|
510
612
|
// Endian platforms therefore we need to implement a custom AbslHashValue for
|
511
613
|
// it. More details on the bug:
|
@@ -521,6 +623,22 @@ AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
|
|
521
623
|
}
|
522
624
|
return H::combine(combiner.finalize(std::move(hash_state)), vector.size());
|
523
625
|
}
|
626
|
+
#else
|
627
|
+
// When not working around the libstdc++ bug above, we still have to contend
|
628
|
+
// with the fact that std::hash<vector<bool>> is often poor quality, hashing
|
629
|
+
// directly on the internal words and on no other state. On these platforms,
|
630
|
+
// vector<bool>{1, 1} and vector<bool>{1, 1, 0} hash to the same value.
|
631
|
+
//
|
632
|
+
// Mixing in the size (as we do in our other vector<> implementations) on top
|
633
|
+
// of the library-provided hash implementation avoids this QOI issue.
|
634
|
+
template <typename H, typename T, typename Allocator>
|
635
|
+
typename std::enable_if<is_hashable<T>::value && std::is_same<T, bool>::value,
|
636
|
+
H>::type
|
637
|
+
AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
|
638
|
+
return H::combine(std::move(hash_state),
|
639
|
+
std::hash<std::vector<T, Allocator>>{}(vector),
|
640
|
+
vector.size());
|
641
|
+
}
|
524
642
|
#endif
|
525
643
|
|
526
644
|
// -----------------------------------------------------------------------------
|
@@ -572,6 +690,55 @@ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
|
|
572
690
|
return H::combine(std::move(hash_state), set.size());
|
573
691
|
}
|
574
692
|
|
693
|
+
// -----------------------------------------------------------------------------
|
694
|
+
// AbslHashValue for Unordered Associative Containers
|
695
|
+
// -----------------------------------------------------------------------------
|
696
|
+
|
697
|
+
// AbslHashValue for hashing std::unordered_set
|
698
|
+
template <typename H, typename Key, typename Hash, typename KeyEqual,
|
699
|
+
typename Alloc>
|
700
|
+
typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
|
701
|
+
H hash_state, const std::unordered_set<Key, Hash, KeyEqual, Alloc>& s) {
|
702
|
+
return H::combine(
|
703
|
+
H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
|
704
|
+
s.size());
|
705
|
+
}
|
706
|
+
|
707
|
+
// AbslHashValue for hashing std::unordered_multiset
|
708
|
+
template <typename H, typename Key, typename Hash, typename KeyEqual,
|
709
|
+
typename Alloc>
|
710
|
+
typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
|
711
|
+
H hash_state,
|
712
|
+
const std::unordered_multiset<Key, Hash, KeyEqual, Alloc>& s) {
|
713
|
+
return H::combine(
|
714
|
+
H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
|
715
|
+
s.size());
|
716
|
+
}
|
717
|
+
|
718
|
+
// AbslHashValue for hashing std::unordered_set
|
719
|
+
template <typename H, typename Key, typename T, typename Hash,
|
720
|
+
typename KeyEqual, typename Alloc>
|
721
|
+
typename std::enable_if<is_hashable<Key>::value && is_hashable<T>::value,
|
722
|
+
H>::type
|
723
|
+
AbslHashValue(H hash_state,
|
724
|
+
const std::unordered_map<Key, T, Hash, KeyEqual, Alloc>& s) {
|
725
|
+
return H::combine(
|
726
|
+
H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
|
727
|
+
s.size());
|
728
|
+
}
|
729
|
+
|
730
|
+
// AbslHashValue for hashing std::unordered_multiset
|
731
|
+
template <typename H, typename Key, typename T, typename Hash,
|
732
|
+
typename KeyEqual, typename Alloc>
|
733
|
+
typename std::enable_if<is_hashable<Key>::value && is_hashable<T>::value,
|
734
|
+
H>::type
|
735
|
+
AbslHashValue(H hash_state,
|
736
|
+
const std::unordered_multimap<Key, T, Hash, KeyEqual, Alloc>& s) {
|
737
|
+
return H::combine(
|
738
|
+
H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
|
739
|
+
s.size());
|
740
|
+
}
|
741
|
+
|
575
742
|
// -----------------------------------------------------------------------------
|
576
743
|
// AbslHashValue for Wrapper Types
|
577
744
|
// -----------------------------------------------------------------------------
|
@@ -815,6 +982,31 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
|
|
815
982
|
// move-only ensures that there is only one non-moved-from object.
|
816
983
|
MixingHashState() : state_(Seed()) {}
|
817
984
|
|
985
|
+
friend class MixingHashState::HashStateBase;
|
986
|
+
|
987
|
+
template <typename CombinerT>
|
988
|
+
static MixingHashState RunCombineUnordered(MixingHashState state,
|
989
|
+
CombinerT combiner) {
|
990
|
+
uint64_t unordered_state = 0;
|
991
|
+
combiner(MixingHashState{}, [&](MixingHashState& inner_state) {
|
992
|
+
// Add the hash state of the element to the running total, but mix the
|
993
|
+
// carry bit back into the low bit. This in intended to avoid losing
|
994
|
+
// entropy to overflow, especially when unordered_multisets contain
|
995
|
+
// multiple copies of the same value.
|
996
|
+
auto element_state = inner_state.state_;
|
997
|
+
unordered_state += element_state;
|
998
|
+
if (unordered_state < element_state) {
|
999
|
+
++unordered_state;
|
1000
|
+
}
|
1001
|
+
inner_state = MixingHashState{};
|
1002
|
+
});
|
1003
|
+
return MixingHashState::combine(std::move(state), unordered_state);
|
1004
|
+
}
|
1005
|
+
|
1006
|
+
// Allow the HashState type-erasure implementation to invoke
|
1007
|
+
// RunCombinedUnordered() directly.
|
1008
|
+
friend class absl::HashState;
|
1009
|
+
|
818
1010
|
// Workaround for MSVC bug.
|
819
1011
|
// We make the type copyable to fix the calling convention, even though we
|
820
1012
|
// never actually copy it. Keep it private to not affect the public API of the
|
@@ -898,15 +1090,10 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
|
|
898
1090
|
}
|
899
1091
|
|
900
1092
|
ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Mix(uint64_t state, uint64_t v) {
|
901
|
-
|
902
|
-
//
|
903
|
-
// requires a sequence of two instructions to calculate the upper and lower
|
904
|
-
// halves of the result.
|
905
|
-
using MultType = uint64_t;
|
906
|
-
#else
|
1093
|
+
// Though the 128-bit product on AArch64 needs two instructions, it is
|
1094
|
+
// still a good balance between speed and hash quality.
|
907
1095
|
using MultType =
|
908
1096
|
absl::conditional_t<sizeof(size_t) == 4, uint64_t, uint128>;
|
909
|
-
#endif
|
910
1097
|
// We do the addition in 64-bit space to make sure the 128-bit
|
911
1098
|
// multiplication is fast. If we were to do it as MultType the compiler has
|
912
1099
|
// to assume that the high word is non-zero and needs to perform 2
|
@@ -1049,6 +1236,14 @@ H HashStateBase<H>::combine_contiguous(H state, const T* data, size_t size) {
|
|
1049
1236
|
return hash_internal::hash_range_or_bytes(std::move(state), data, size);
|
1050
1237
|
}
|
1051
1238
|
|
1239
|
+
// HashStateBase::combine_unordered()
|
1240
|
+
template <typename H>
|
1241
|
+
template <typename I>
|
1242
|
+
H HashStateBase<H>::combine_unordered(H state, I begin, I end) {
|
1243
|
+
return H::RunCombineUnordered(std::move(state),
|
1244
|
+
CombineUnorderedCallback<I>{begin, end});
|
1245
|
+
}
|
1246
|
+
|
1052
1247
|
// HashStateBase::PiecewiseCombiner::add_buffer()
|
1053
1248
|
template <typename H>
|
1054
1249
|
H PiecewiseCombiner::add_buffer(H state, const unsigned char* data,
|
@@ -133,7 +133,8 @@ template <class T>
|
|
133
133
|
ABSL_INTERNAL_CONSTEXPR_CLZ inline
|
134
134
|
typename std::enable_if<std::is_unsigned<T>::value, T>::type
|
135
135
|
bit_width(T x) noexcept {
|
136
|
-
return std::numeric_limits<T>::digits -
|
136
|
+
return std::numeric_limits<T>::digits -
|
137
|
+
static_cast<unsigned int>(countl_zero(x));
|
137
138
|
}
|
138
139
|
|
139
140
|
// Returns: If x == 0, 0; otherwise the maximal value y such that
|
@@ -42,11 +42,11 @@ namespace {
|
|
42
42
|
// Returns: 2
|
43
43
|
inline ABSL_ATTRIBUTE_ALWAYS_INLINE int Fls128(uint128 n) {
|
44
44
|
if (uint64_t hi = Uint128High64(n)) {
|
45
|
-
|
45
|
+
ABSL_ASSUME(hi != 0);
|
46
46
|
return 127 - countl_zero(hi);
|
47
47
|
}
|
48
48
|
const uint64_t low = Uint128Low64(n);
|
49
|
-
|
49
|
+
ABSL_ASSUME(low != 0);
|
50
50
|
return 63 - countl_zero(low);
|
51
51
|
}
|
52
52
|
|
@@ -332,6 +332,7 @@ std::ostream& operator<<(std::ostream& os, int128 v) {
|
|
332
332
|
ABSL_NAMESPACE_END
|
333
333
|
} // namespace absl
|
334
334
|
|
335
|
+
#ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
|
335
336
|
namespace std {
|
336
337
|
constexpr bool numeric_limits<absl::uint128>::is_specialized;
|
337
338
|
constexpr bool numeric_limits<absl::uint128>::is_signed;
|
@@ -381,3 +382,4 @@ constexpr int numeric_limits<absl::int128>::max_exponent10;
|
|
381
382
|
constexpr bool numeric_limits<absl::int128>::traps;
|
382
383
|
constexpr bool numeric_limits<absl::int128>::tinyness_before;
|
383
384
|
} // namespace std
|
385
|
+
#endif
|
@@ -44,7 +44,7 @@
|
|
44
44
|
// builtin type. We need to make sure not to define operator wchar_t()
|
45
45
|
// alongside operator unsigned short() in these instances.
|
46
46
|
#define ABSL_INTERNAL_WCHAR_T __wchar_t
|
47
|
-
#if defined(_M_X64)
|
47
|
+
#if defined(_M_X64) && !defined(_M_ARM64EC)
|
48
48
|
#include <intrin.h>
|
49
49
|
#pragma intrinsic(_umul128)
|
50
50
|
#endif // defined(_M_X64)
|
@@ -980,7 +980,7 @@ inline uint128 operator*(uint128 lhs, uint128 rhs) {
|
|
980
980
|
// can be used for uint128 storage.
|
981
981
|
return static_cast<unsigned __int128>(lhs) *
|
982
982
|
static_cast<unsigned __int128>(rhs);
|
983
|
-
#elif defined(_MSC_VER) && defined(_M_X64)
|
983
|
+
#elif defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
|
984
984
|
uint64_t carry;
|
985
985
|
uint64_t low = _umul128(Uint128Low64(lhs), Uint128Low64(rhs), &carry);
|
986
986
|
return MakeUint128(Uint128Low64(lhs) * Uint128High64(rhs) +
|
@@ -46,6 +46,7 @@ struct Sample {
|
|
46
46
|
absl::Mutex init_mu;
|
47
47
|
T* next = nullptr;
|
48
48
|
T* dead ABSL_GUARDED_BY(init_mu) = nullptr;
|
49
|
+
int64_t weight; // How many sampling events were required to sample this one.
|
49
50
|
};
|
50
51
|
|
51
52
|
// Holds samples and their associated stack traces with a soft limit of
|
@@ -59,7 +60,8 @@ class SampleRecorder {
|
|
59
60
|
~SampleRecorder();
|
60
61
|
|
61
62
|
// Registers for sampling. Returns an opaque registration info.
|
62
|
-
|
63
|
+
template <typename... Targs>
|
64
|
+
T* Register(Targs&&... args);
|
63
65
|
|
64
66
|
// Unregisters the sample.
|
65
67
|
void Unregister(T* sample);
|
@@ -75,12 +77,14 @@ class SampleRecorder {
|
|
75
77
|
// samples that have been dropped.
|
76
78
|
int64_t Iterate(const std::function<void(const T& stack)>& f);
|
77
79
|
|
80
|
+
int32_t GetMaxSamples() const;
|
78
81
|
void SetMaxSamples(int32_t max);
|
79
82
|
|
80
83
|
private:
|
81
84
|
void PushNew(T* sample);
|
82
85
|
void PushDead(T* sample);
|
83
|
-
|
86
|
+
template <typename... Targs>
|
87
|
+
T* PopDead(Targs... args);
|
84
88
|
|
85
89
|
std::atomic<size_t> dropped_samples_;
|
86
90
|
std::atomic<size_t> size_estimate_;
|
@@ -162,7 +166,8 @@ void SampleRecorder<T>::PushDead(T* sample) {
|
|
162
166
|
}
|
163
167
|
|
164
168
|
template <typename T>
|
165
|
-
|
169
|
+
template <typename... Targs>
|
170
|
+
T* SampleRecorder<T>::PopDead(Targs... args) {
|
166
171
|
absl::MutexLock graveyard_lock(&graveyard_.init_mu);
|
167
172
|
|
168
173
|
// The list is circular, so eventually it collapses down to
|
@@ -174,12 +179,13 @@ T* SampleRecorder<T>::PopDead() {
|
|
174
179
|
absl::MutexLock sample_lock(&sample->init_mu);
|
175
180
|
graveyard_.dead = sample->dead;
|
176
181
|
sample->dead = nullptr;
|
177
|
-
sample->PrepareForSampling();
|
182
|
+
sample->PrepareForSampling(std::forward<Targs>(args)...);
|
178
183
|
return sample;
|
179
184
|
}
|
180
185
|
|
181
186
|
template <typename T>
|
182
|
-
|
187
|
+
template <typename... Targs>
|
188
|
+
T* SampleRecorder<T>::Register(Targs&&... args) {
|
183
189
|
int64_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed);
|
184
190
|
if (size > max_samples_.load(std::memory_order_relaxed)) {
|
185
191
|
size_estimate_.fetch_sub(1, std::memory_order_relaxed);
|
@@ -187,10 +193,14 @@ T* SampleRecorder<T>::Register() {
|
|
187
193
|
return nullptr;
|
188
194
|
}
|
189
195
|
|
190
|
-
T* sample = PopDead();
|
196
|
+
T* sample = PopDead(args...);
|
191
197
|
if (sample == nullptr) {
|
192
198
|
// Resurrection failed. Hire a new warlock.
|
193
199
|
sample = new T();
|
200
|
+
{
|
201
|
+
absl::MutexLock sample_lock(&sample->init_mu);
|
202
|
+
sample->PrepareForSampling(std::forward<Targs>(args)...);
|
203
|
+
}
|
194
204
|
PushNew(sample);
|
195
205
|
}
|
196
206
|
|
@@ -223,6 +233,11 @@ void SampleRecorder<T>::SetMaxSamples(int32_t max) {
|
|
223
233
|
max_samples_.store(max, std::memory_order_release);
|
224
234
|
}
|
225
235
|
|
236
|
+
template <typename T>
|
237
|
+
int32_t SampleRecorder<T>::GetMaxSamples() const {
|
238
|
+
return max_samples_.load(std::memory_order_acquire);
|
239
|
+
}
|
240
|
+
|
226
241
|
} // namespace profiling_internal
|
227
242
|
ABSL_NAMESPACE_END
|
228
243
|
} // namespace absl
|
@@ -138,16 +138,16 @@ bool bernoulli_distribution::Generate(double p,
|
|
138
138
|
// 64 bits.
|
139
139
|
//
|
140
140
|
// Second, `c` is constructed by first casting explicitly to a signed
|
141
|
-
// integer and then
|
141
|
+
// integer and then casting explicitly to an unsigned integer of the same
|
142
142
|
// size. This is done because the hardware conversion instructions produce
|
143
143
|
// signed integers from double; if taken as a uint64_t the conversion would
|
144
144
|
// be wrong for doubles greater than 2^63 (not relevant in this use-case).
|
145
145
|
// If converted directly to an unsigned integer, the compiler would end up
|
146
146
|
// emitting code to handle such large values that are not relevant due to
|
147
147
|
// the known bounds on `c`. To avoid these extra instructions this
|
148
|
-
// implementation converts first to the signed type and then
|
149
|
-
//
|
150
|
-
const uint64_t c = static_cast<int64_t>(p * kP32);
|
148
|
+
// implementation converts first to the signed type and then convert to
|
149
|
+
// unsigned (which is a no-op).
|
150
|
+
const uint64_t c = static_cast<uint64_t>(static_cast<int64_t>(p * kP32));
|
151
151
|
const uint32_t v = fast_u32(g);
|
152
152
|
// FAST PATH: this path fails with probability 1/2^32. Note that simply
|
153
153
|
// returning v <= c would approximate P very well (up to an absolute error
|