grpc 1.84.0 → 1.85.0.pre1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +40 -27
- data/include/grpc/event_engine/memory_allocator.h +1 -0
- data/include/grpc/grpc.h +3 -0
- data/include/grpc/grpc_security_constants.h +2 -0
- data/include/grpc/impl/channel_arg_names.h +4 -0
- data/src/core/call/call_filters.h +10 -10
- data/src/core/{lib/security/authorization → call}/evaluate_args.cc +22 -1
- data/src/core/{lib/security/authorization → call}/evaluate_args.h +19 -5
- data/src/core/call/filter_fusion.h +15 -15
- data/src/core/call/interception_chain.h +3 -3
- data/src/core/call/metadata_batch.cc +1 -0
- data/src/core/call/metadata_batch.h +45 -33
- data/src/core/call/parsed_metadata.h +3 -3
- data/src/core/call/request_buffer.cc +6 -6
- data/src/core/call/request_buffer.h +1 -1
- data/src/core/channelz/channel_trace.cc +5 -5
- data/src/core/channelz/channel_trace.h +1 -1
- data/src/core/channelz/channelz.cc +9 -9
- data/src/core/channelz/channelz.h +12 -12
- data/src/core/channelz/channelz_registry.cc +10 -10
- data/src/core/channelz/ztrace_collector.h +5 -5
- data/src/core/client_channel/client_channel.cc +4 -4
- data/src/core/client_channel/client_channel_filter.cc +14 -14
- data/src/core/client_channel/global_subchannel_pool.cc +4 -4
- data/src/core/client_channel/subchannel.cc +24 -23
- data/src/core/client_channel/subchannel_stream_client.cc +5 -5
- data/src/core/credentials/call/external/aws_external_account_credentials.cc +7 -7
- data/src/core/credentials/call/external/aws_request_signer.cc +16 -0
- data/src/core/credentials/call/external/external_account_credentials.cc +4 -4
- data/src/core/credentials/call/regional_access_boundary_fetcher.cc +9 -9
- data/src/core/credentials/call/token_fetcher/token_fetcher_credentials.cc +4 -4
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +3 -3
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +9 -9
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +1 -1
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +6 -6
- data/src/core/credentials/transport/tls/grpc_tls_certificate_verifier.cc +3 -3
- data/src/core/credentials/transport/tls/grpc_tls_crl_provider.cc +4 -4
- data/src/core/credentials/transport/tls/ssl_utils.cc +10 -0
- data/src/core/credentials/transport/tls/tls_security_connector.cc +10 -10
- data/src/core/credentials/transport/tls/tls_security_connector.h +6 -6
- data/src/core/credentials/transport/tls/tls_utils.h +9 -0
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +2 -2
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +1 -1
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +15 -0
- data/src/core/ext/filters/rbac/rbac_filter.h +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +5 -5
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +30 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +5 -11
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +14 -11
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -4
- data/src/core/ext/transport/chttp2/transport/frame.h +9 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +12 -9
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -2
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +16 -18
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +2 -1
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.cc +277 -189
- data/src/core/ext/transport/chttp2/transport/http2_server_transport.h +40 -17
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +12 -24
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +3 -29
- data/src/core/ext/transport/chttp2/transport/internal.h +2 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/read_context.h +96 -3
- data/src/core/ext/transport/chttp2/transport/reclaimer.cc +32 -0
- data/src/core/ext/transport/chttp2/transport/reclaimer.h +64 -0
- data/src/core/ext/transport/chttp2/transport/security_frame.h +8 -8
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +17 -9
- data/src/core/ext/transport/chttp2/transport/write_cycle.h +23 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +5 -5
- data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb.h +137 -73
- data/src/core/ext/upb-gen/grpc/channelz/v1/channelz.upb_minitable.c +45 -25
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb.h +6 -6
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.c +4 -4
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/altscontext.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb.h +46 -26
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.c +17 -14
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/handshaker.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.c +3 -3
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/gcp/transport_security_common.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/grpc/health/v1/health.upb.h +329 -0
- data/src/core/ext/upb-gen/grpc/health/v1/health.upb_minitable.c +128 -0
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/health/v1/health.upb_minitable.h +8 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.c +3 -3
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lb/v1/load_balancer.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb.h +185 -23
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.c +20 -12
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls.upb_minitable.h +5 -5
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb.h +58 -42
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.c +17 -12
- data/src/core/ext/upb-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upb_minitable.h +5 -5
- data/src/core/ext/upbdefs-gen/grpc/channelz/v1/channelz.upbdefs.c +567 -549
- data/src/core/ext/upbdefs-gen/grpc/lookup/v1/rls_config.upbdefs.c +182 -0
- data/src/core/ext/upbdefs-gen/{src/proto/grpc → grpc}/lookup/v1/rls_config.upbdefs.h +14 -14
- data/src/core/filter/ext_proc/ext_proc_filter.cc +1603 -46
- data/src/core/filter/ext_proc/ext_proc_filter.h +55 -22
- data/src/core/filter/ext_proc/ext_proc_messages.cc +106 -51
- data/src/core/filter/ext_proc/ext_proc_messages.h +36 -9
- data/src/core/handshaker/handshaker.cc +4 -4
- data/src/core/handshaker/http_connect/http_connect_client_handshaker.cc +3 -3
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +10 -10
- data/src/core/handshaker/security/secure_endpoint.cc +13 -13
- data/src/core/handshaker/security/security_handshaker.cc +6 -6
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +4 -4
- data/src/core/lib/channel/channel_args.cc +20 -0
- data/src/core/lib/channel/channel_args.h +17 -17
- data/src/core/lib/channel/promise_based_filter.cc +2 -2
- data/src/core/lib/channel/promise_based_filter.h +66 -27
- data/src/core/lib/debug/trace_flags.cc +2 -0
- data/src/core/lib/debug/trace_flags.h +1 -0
- data/src/core/lib/event_engine/ares_resolver.cc +14 -14
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +7 -7
- data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +4 -4
- data/src/core/lib/event_engine/default_event_engine.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +9 -9
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +16 -14
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +6 -6
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +3 -3
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +7 -7
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +17 -17
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/timer.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +5 -5
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +3 -3
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +1 -1
- data/src/core/lib/event_engine/thread_pool/thread_count.cc +1 -1
- data/src/core/lib/event_engine/thread_pool/thread_count.h +3 -3
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +50 -21
- data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +3 -3
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +3 -3
- data/src/core/lib/event_engine/windows/windows_engine.cc +15 -15
- data/src/core/lib/event_engine/windows/windows_listener.cc +6 -6
- data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +6 -6
- data/src/core/lib/experiments/experiments.cc +48 -0
- data/src/core/lib/experiments/experiments.h +24 -0
- data/src/core/lib/iomgr/buffer_list.cc +3 -3
- data/src/core/lib/iomgr/buffer_list.h +1 -1
- data/src/core/lib/iomgr/combiner.cc +0 -1
- data/src/core/lib/iomgr/ev_apple.cc +4 -4
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_posix.cc +7 -7
- data/src/core/lib/promise/activity.cc +1 -1
- data/src/core/lib/promise/activity.h +1 -1
- data/src/core/lib/promise/arena_promise.h +7 -7
- data/src/core/lib/promise/detail/promise_factory.h +8 -8
- data/src/core/lib/promise/detail/promise_like.h +4 -4
- data/src/core/lib/promise/inter_activity_latch.h +6 -6
- data/src/core/lib/promise/inter_activity_pipe.h +1 -1
- data/src/core/lib/promise/observable.h +3 -3
- data/src/core/lib/promise/party.cc +1 -1
- data/src/core/lib/promise/try_seq.h +2 -2
- data/src/core/lib/resource_quota/arena.h +3 -3
- data/src/core/lib/resource_quota/memory_quota.cc +16 -16
- data/src/core/lib/resource_quota/memory_quota.h +1 -1
- data/src/core/lib/resource_quota/thread_quota.cc +3 -3
- data/src/core/lib/security/authorization/audit_logging.cc +5 -5
- data/src/core/lib/security/authorization/authorization_engine.h +1 -1
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +1 -1
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -1
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
- data/src/core/lib/security/authorization/matchers.h +1 -1
- data/src/core/lib/surface/call.cc +8 -7
- data/src/core/lib/surface/call.h +3 -3
- data/src/core/lib/surface/call_utils.h +4 -0
- data/src/core/lib/surface/channel.cc +1 -1
- data/src/core/lib/surface/channel.h +1 -1
- data/src/core/lib/surface/channel_init.cc +1 -1
- data/src/core/lib/surface/init.cc +7 -7
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/legacy_channel.cc +2 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/transport_framing_endpoint_extension.h +3 -3
- data/src/core/load_balancing/autosharding/autosharding.cc +931 -0
- data/src/core/load_balancing/autosharding/autosharding.h +78 -0
- data/src/core/load_balancing/grpclb/grpclb_client_stats.cc +2 -2
- data/src/core/load_balancing/grpclb/load_balancer_api.cc +1 -1
- data/src/core/load_balancing/grpclb/load_balancer_api.h +3 -1
- data/src/core/load_balancing/health_check_client.cc +7 -7
- data/src/core/load_balancing/lb_policy.cc +1 -1
- data/src/core/load_balancing/oob_backend_metric.cc +5 -5
- data/src/core/load_balancing/outlier_detection/outlier_detection.cc +2 -2
- data/src/core/load_balancing/ring_hash/ring_hash.cc +109 -37
- data/src/core/load_balancing/rls/rls.cc +23 -17
- data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +10 -10
- data/src/core/load_balancing/xds/cds.cc +6 -5
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +2 -2
- data/src/core/load_balancing/xds/xds_override_host.cc +10 -10
- data/src/core/mitigation_engine/mitigation_engine.h +28 -4
- data/src/core/plugin_registry/grpc_plugin_registry.cc +2 -0
- data/src/core/resolver/dns/dns_resolver.cc +7 -7
- data/src/core/resolver/fake/fake_resolver.cc +5 -5
- data/src/core/resolver/google_c2p/google_c2p_resolver.cc +38 -30
- data/src/core/server/server.cc +30 -30
- data/src/core/server/server.h +4 -3
- data/src/core/server/server_config_selector_filter.cc +3 -3
- data/src/core/server/xds_server_config_fetcher_legacy.cc +15 -15
- data/src/core/telemetry/default_tcp_tracer.cc +1 -1
- data/src/core/telemetry/instrument.cc +30 -16
- data/src/core/telemetry/instrument.h +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +4 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +2 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +5 -5
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +3 -3
- data/src/core/tsi/ssl_transport_security.cc +46 -13
- data/src/core/tsi/ssl_transport_security.h +7 -0
- data/src/core/tsi/ssl_transport_security_utils.cc +16 -6
- data/src/core/util/event_log.cc +3 -3
- data/src/core/util/http_client/httpcli.cc +5 -5
- data/src/core/util/http_client/httpcli.h +1 -1
- data/src/core/util/json/json_object_loader.cc +7 -0
- data/src/core/util/json/json_object_loader.h +17 -2
- data/src/core/util/latent_see.cc +123 -36
- data/src/core/util/latent_see.h +14 -1
- data/src/core/util/mpscq.cc +1 -1
- data/src/core/util/notification.h +4 -4
- data/src/core/util/sync.h +20 -6
- data/src/core/util/table.h +20 -22
- data/src/core/util/work_serializer.cc +2 -2
- data/src/core/xds/grpc/blackboard.cc +4 -3
- data/src/core/xds/grpc/certificate_provider_store.cc +2 -2
- data/src/core/xds/grpc/streaming_call_promise_wrapper.cc +181 -0
- data/src/core/xds/grpc/streaming_call_promise_wrapper.h +213 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc_builder.cc +2 -2
- data/src/core/xds/grpc/xds_client_grpc.cc +8 -8
- data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
- data/src/core/xds/grpc/xds_endpoint.cc +1 -1
- data/src/core/xds/grpc/xds_endpoint_parser.cc +11 -0
- data/src/core/xds/grpc/xds_grpc_service_parser.cc +12 -10
- data/src/core/xds/grpc/xds_http_ext_proc_filter.cc +17 -14
- data/src/core/xds/grpc/xds_matcher.h +2 -2
- data/src/core/xds/grpc/xds_transport_grpc.cc +125 -85
- data/src/core/xds/grpc/xds_transport_grpc.h +19 -4
- data/src/core/xds/xds_client/lrs_client.cc +22 -19
- data/src/core/xds/xds_client/xds_client.cc +19 -16
- data/src/core/xds/xds_client/xds_transport.h +49 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +1 -1
- data/third_party/abseil-cpp/absl/algorithm/algorithm.h +34 -2
- data/third_party/abseil-cpp/absl/algorithm/container.h +345 -147
- data/third_party/abseil-cpp/absl/base/attributes.h +67 -44
- data/third_party/abseil-cpp/absl/base/call_once.h +1 -0
- data/third_party/abseil-cpp/absl/base/casts.cc +61 -0
- data/third_party/abseil-cpp/absl/base/casts.h +135 -2
- data/third_party/abseil-cpp/absl/base/config.h +63 -41
- data/third_party/abseil-cpp/absl/base/fast_type_id.h +30 -2
- data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +1 -1
- data/third_party/abseil-cpp/absl/base/internal/hardening.h +136 -0
- data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +6 -2
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +39 -4
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +6 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +77 -15
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +3 -4
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +26 -24
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +74 -29
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -11
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +52 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +5 -1
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +5 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock_config.h +1 -1
- data/third_party/abseil-cpp/absl/base/macros.h +76 -37
- data/third_party/abseil-cpp/absl/base/nullability.h +5 -5
- data/third_party/abseil-cpp/absl/base/optimization.h +4 -5
- data/third_party/abseil-cpp/absl/base/options.h +46 -18
- data/third_party/abseil-cpp/absl/base/policy_checks.h +5 -5
- data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.cc → throw_delegate.cc} +9 -7
- data/third_party/abseil-cpp/absl/base/{internal/throw_delegate.h → throw_delegate.h} +4 -14
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +7 -2
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -2
- data/third_party/abseil-cpp/absl/container/btree_map.h +60 -10
- data/third_party/abseil-cpp/absl/container/btree_set.h +61 -15
- data/third_party/abseil-cpp/absl/container/fixed_array.h +19 -21
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +49 -27
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +50 -26
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +42 -36
- data/third_party/abseil-cpp/absl/container/internal/btree.h +32 -24
- data/third_party/abseil-cpp/absl/container/internal/btree_container.h +30 -22
- data/third_party/abseil-cpp/absl/container/internal/common.h +57 -5
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +40 -36
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +119 -39
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +14 -2
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +14 -22
- data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +52 -52
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +7 -7
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +7 -7
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +32 -40
- data/third_party/abseil-cpp/absl/container/internal/layout.h +13 -13
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +95 -72
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +633 -365
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1016 -749
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +0 -1
- data/third_party/abseil-cpp/absl/container/node_hash_map.h +58 -35
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.cc +23 -6
- data/third_party/abseil-cpp/absl/crc/internal/cpu_detect.h +7 -1
- data/third_party/abseil-cpp/absl/crc/internal/crc.cc +4 -6
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +41 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_internal.h +0 -16
- data/third_party/abseil-cpp/absl/crc/internal/crc_memcpy_x86_arm_combined.cc +5 -0
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +304 -188
- data/third_party/abseil-cpp/absl/crc/internal/non_temporal_arm_intrinsics.h +4 -2
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +2 -2
- data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.h +8 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +4 -4
- data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.cc +15 -1
- data/third_party/abseil-cpp/absl/debugging/internal/examine_stack.h +7 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +12 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +6 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +13 -11
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +14 -7
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +6 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +14 -8
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +48 -38
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +4 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +63 -118
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +7 -47
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +20 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +83 -149
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +4 -17
- data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +4 -4
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +2 -4
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +8 -6
- data/third_party/abseil-cpp/absl/flags/declare.h +9 -0
- data/third_party/abseil-cpp/absl/flags/flag.h +2 -1
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +1 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +19 -18
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +33 -34
- data/third_party/abseil-cpp/absl/flags/internal/program_name.cc +2 -2
- data/third_party/abseil-cpp/absl/flags/marshalling.cc +1 -16
- data/third_party/abseil-cpp/absl/flags/marshalling.h +2 -28
- data/third_party/abseil-cpp/absl/flags/reflection.cc +11 -7
- data/third_party/abseil-cpp/absl/flags/usage_config.cc +2 -2
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +22 -19
- data/third_party/abseil-cpp/absl/functional/bind_front.h +7 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +125 -20
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +43 -31
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +4 -4
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +44 -6
- data/third_party/abseil-cpp/absl/hash/hash.h +1 -1
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +39 -51
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +379 -14
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +457 -353
- data/third_party/abseil-cpp/absl/log/absl_vlog_is_on.h +0 -2
- data/third_party/abseil-cpp/absl/log/internal/check_impl.h +2 -1
- data/third_party/abseil-cpp/absl/log/internal/check_op.cc +4 -0
- data/third_party/abseil-cpp/absl/log/internal/check_op.h +128 -50
- data/third_party/abseil-cpp/absl/log/internal/conditions.h +38 -35
- data/third_party/abseil-cpp/absl/log/internal/log_impl.h +108 -110
- data/third_party/abseil-cpp/absl/log/internal/log_message.cc +10 -6
- data/third_party/abseil-cpp/absl/log/internal/log_message.h +19 -1
- data/third_party/abseil-cpp/absl/log/internal/log_sink_set.cc +4 -4
- data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -1
- data/third_party/abseil-cpp/absl/log/internal/proto.cc +13 -0
- data/third_party/abseil-cpp/absl/log/internal/strip.h +30 -31
- data/third_party/abseil-cpp/absl/log/internal/structured_proto.cc +5 -5
- data/third_party/abseil-cpp/absl/log/internal/structured_proto.h +6 -5
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.cc +30 -30
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +0 -1
- data/third_party/abseil-cpp/absl/log/log.h +2 -2
- data/third_party/abseil-cpp/absl/log/log_entry.cc +263 -0
- data/third_party/abseil-cpp/absl/log/log_entry.h +2 -0
- data/third_party/abseil-cpp/absl/log/vlog_is_on.h +0 -2
- data/third_party/abseil-cpp/absl/memory/memory.h +55 -5
- data/third_party/abseil-cpp/absl/meta/type_traits.h +161 -56
- data/third_party/abseil-cpp/absl/numeric/int128.h +41 -21
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +16 -22
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +5 -7
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +32 -4
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +9 -9
- data/third_party/abseil-cpp/absl/random/beta_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +26 -53
- data/third_party/abseil-cpp/absl/random/discrete_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/distributions.h +17 -17
- data/third_party/abseil-cpp/absl/random/exponential_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +8 -21
- data/third_party/abseil-cpp/absl/random/internal/entropy_pool.cc +2 -2
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +6 -6
- data/third_party/abseil-cpp/absl/random/internal/platform.h +0 -13
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -6
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +6 -5
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +5 -31
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +2 -1
- data/third_party/abseil-cpp/absl/random/internal/traits.h +21 -0
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +23 -23
- data/third_party/abseil-cpp/absl/random/mocking_access.h +74 -0
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +63 -18
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +30 -4
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +225 -63
- data/third_party/abseil-cpp/absl/status/status.cc +66 -70
- data/third_party/abseil-cpp/absl/status/status.h +254 -23
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +3 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +117 -137
- data/third_party/abseil-cpp/absl/strings/ascii.h +10 -6
- data/third_party/abseil-cpp/absl/strings/cord.cc +41 -17
- data/third_party/abseil-cpp/absl/strings/cord.h +26 -17
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +4 -2
- data/third_party/abseil-cpp/absl/strings/escaping.cc +305 -125
- data/third_party/abseil-cpp/absl/strings/escaping.h +12 -2
- data/third_party/abseil-cpp/absl/strings/internal/append_and_overwrite.h +93 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +27 -21
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +11 -19
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.cc +6 -0
- data/third_party/abseil-cpp/absl/strings/internal/damerau_levenshtein_distance.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +0 -141
- data/third_party/abseil-cpp/absl/strings/internal/escaping.h +2 -24
- data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +31 -36
- data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +39 -39
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -22
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +2 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +2 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +921 -231
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +18 -16
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +16 -12
- data/third_party/abseil-cpp/absl/strings/internal/stringify_sink.h +12 -0
- data/third_party/abseil-cpp/absl/strings/numbers.cc +477 -8
- data/third_party/abseil-cpp/absl/strings/numbers.h +29 -12
- data/third_party/abseil-cpp/absl/strings/resize_and_overwrite.h +198 -0
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +96 -91
- data/third_party/abseil-cpp/absl/strings/str_cat.h +53 -13
- data/third_party/abseil-cpp/absl/strings/str_split.h +14 -9
- data/third_party/abseil-cpp/absl/strings/string_view.h +10 -716
- data/third_party/abseil-cpp/absl/strings/substitute.cc +24 -24
- data/third_party/abseil-cpp/absl/strings/substitute.h +2 -2
- data/third_party/abseil-cpp/absl/synchronization/barrier.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +2 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +24 -3
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +30 -33
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +5 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +41 -29
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +199 -94
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +5 -5
- data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
- data/third_party/abseil-cpp/absl/time/clock.cc +29 -30
- data/third_party/abseil-cpp/absl/time/clock.h +3 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +2 -2
- data/third_party/abseil-cpp/absl/time/format.cc +3 -10
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +12 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +131 -91
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +6 -103
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.cc +185 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_name_win.h +37 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +10 -15
- data/third_party/abseil-cpp/absl/time/time.cc +4 -4
- data/third_party/abseil-cpp/absl/time/time.h +14 -13
- data/third_party/abseil-cpp/absl/types/compare.h +64 -63
- data/third_party/abseil-cpp/absl/types/internal/span.h +6 -6
- data/third_party/abseil-cpp/absl/types/optional.h +31 -4
- data/third_party/abseil-cpp/absl/types/optional_ref.h +295 -0
- data/third_party/{boringssl-with-bazel/crypto/x509/x_val.cc → abseil-cpp/absl/types/source_location.cc} +4 -14
- data/third_party/abseil-cpp/absl/types/source_location.h +172 -0
- data/third_party/abseil-cpp/absl/types/span.h +67 -38
- data/third_party/abseil-cpp/absl/types/variant.h +75 -18
- data/third_party/abseil-cpp/absl/utility/utility.h +112 -16
- data/third_party/boringssl-with-bazel/crypto/aes/aes.cc +3 -0
- data/third_party/boringssl-with-bazel/crypto/armv8_feature_parsing.h +67 -0
- data/third_party/boringssl-with-bazel/crypto/asn1/a_bitstr.cc +143 -105
- data/third_party/boringssl-with-bazel/crypto/asn1/a_bool.cc +5 -8
- data/third_party/boringssl-with-bazel/crypto/asn1/a_d2i_fp.cc +3 -3
- data/third_party/boringssl-with-bazel/crypto/asn1/a_dup.cc +6 -6
- data/third_party/boringssl-with-bazel/crypto/asn1/a_gentm.cc +33 -12
- data/third_party/boringssl-with-bazel/crypto/asn1/a_i2d_fp.cc +7 -6
- data/third_party/boringssl-with-bazel/crypto/asn1/a_int.cc +80 -52
- data/third_party/boringssl-with-bazel/crypto/asn1/a_mbstr.cc +7 -4
- data/third_party/boringssl-with-bazel/crypto/asn1/a_object.cc +70 -72
- data/third_party/boringssl-with-bazel/crypto/asn1/a_strex.cc +38 -42
- data/third_party/boringssl-with-bazel/crypto/asn1/a_strnid.cc +41 -39
- data/third_party/boringssl-with-bazel/crypto/asn1/a_time.cc +59 -35
- data/third_party/boringssl-with-bazel/crypto/asn1/a_type.cc +275 -15
- data/third_party/boringssl-with-bazel/crypto/asn1/a_utctm.cc +32 -13
- data/third_party/boringssl-with-bazel/crypto/asn1/asn1_lib.cc +128 -30
- data/third_party/boringssl-with-bazel/crypto/asn1/asn_pack.cc +10 -10
- data/third_party/boringssl-with-bazel/crypto/asn1/f_int.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/asn1/f_string.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/asn1/internal.h +261 -115
- data/third_party/boringssl-with-bazel/crypto/asn1/posix_time.cc +8 -5
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_dec.cc +373 -725
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_enc.cc +211 -526
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_fre.cc +22 -19
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_new.cc +26 -24
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_typ.cc +19 -5
- data/third_party/boringssl-with-bazel/crypto/asn1/tasn_utl.cc +47 -51
- data/third_party/boringssl-with-bazel/crypto/base64/base64.cc +14 -15
- data/third_party/boringssl-with-bazel/crypto/bcm_support.h +7 -29
- data/third_party/boringssl-with-bazel/crypto/bio/bio.cc +234 -176
- data/third_party/boringssl-with-bazel/crypto/bio/bio_mem.cc +72 -86
- data/third_party/boringssl-with-bazel/crypto/bio/connect.cc +153 -199
- data/third_party/boringssl-with-bazel/crypto/bio/errno.cc +3 -1
- data/third_party/boringssl-with-bazel/crypto/bio/fd.cc +56 -55
- data/third_party/boringssl-with-bazel/crypto/bio/file.cc +70 -78
- data/third_party/boringssl-with-bazel/crypto/bio/hexdump.cc +6 -4
- data/third_party/boringssl-with-bazel/crypto/bio/internal.h +69 -17
- data/third_party/boringssl-with-bazel/crypto/bio/pair.cc +117 -136
- data/third_party/boringssl-with-bazel/crypto/bio/printf.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/bio/socket.cc +116 -50
- data/third_party/boringssl-with-bazel/crypto/bio/socket_helper.cc +53 -5
- data/third_party/boringssl-with-bazel/crypto/blake2/blake2.cc +9 -5
- data/third_party/boringssl-with-bazel/crypto/bn/bn_asn1.cc +2 -2
- data/third_party/boringssl-with-bazel/crypto/bn/convert.cc +56 -70
- data/third_party/boringssl-with-bazel/crypto/bn/div.cc +102 -0
- data/third_party/boringssl-with-bazel/crypto/bn/exponentiation.cc +26 -42
- data/third_party/boringssl-with-bazel/crypto/bn/sqrt.cc +93 -0
- data/third_party/boringssl-with-bazel/crypto/buf/buf.cc +6 -5
- data/third_party/boringssl-with-bazel/crypto/bytestring/asn1_compat.cc +6 -5
- data/third_party/boringssl-with-bazel/crypto/bytestring/ber.cc +22 -20
- data/third_party/boringssl-with-bazel/crypto/bytestring/cbb.cc +119 -59
- data/third_party/boringssl-with-bazel/crypto/bytestring/cbs.cc +115 -31
- data/third_party/boringssl-with-bazel/crypto/bytestring/internal.h +79 -24
- data/third_party/boringssl-with-bazel/crypto/bytestring/unicode.cc +2 -2
- data/third_party/boringssl-with-bazel/crypto/chacha/chacha.cc +5 -3
- data/third_party/boringssl-with-bazel/crypto/chacha/internal.h +23 -22
- data/third_party/boringssl-with-bazel/crypto/cipher/derive_key.cc +14 -18
- data/third_party/boringssl-with-bazel/crypto/cipher/e_aesctrhmac.cc +73 -58
- data/third_party/boringssl-with-bazel/crypto/cipher/e_aeseax.cc +132 -70
- data/third_party/boringssl-with-bazel/crypto/cipher/e_aesgcmsiv.cc +390 -249
- data/third_party/boringssl-with-bazel/crypto/cipher/e_chacha20poly1305.cc +200 -137
- data/third_party/boringssl-with-bazel/crypto/cipher/e_des.cc +45 -29
- data/third_party/boringssl-with-bazel/crypto/cipher/e_null.cc +9 -5
- data/third_party/boringssl-with-bazel/crypto/cipher/e_rc2.cc +43 -28
- data/third_party/boringssl-with-bazel/crypto/cipher/e_rc4.cc +7 -5
- data/third_party/boringssl-with-bazel/crypto/cipher/e_tls.cc +250 -237
- data/third_party/boringssl-with-bazel/crypto/cipher/get_cipher.cc +12 -12
- data/third_party/boringssl-with-bazel/crypto/cipher/internal.h +59 -59
- data/third_party/boringssl-with-bazel/crypto/cipher/tls_cbc.cc +111 -111
- data/third_party/boringssl-with-bazel/crypto/cms/cms.cc +48 -42
- data/third_party/boringssl-with-bazel/crypto/conf/conf.cc +69 -63
- data/third_party/boringssl-with-bazel/crypto/conf/internal.h +11 -12
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_apple.cc +8 -5
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_fuchsia.cc +6 -1
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_linux.cc +7 -1
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_openbsd.cc +7 -21
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_sysreg.cc +15 -41
- data/third_party/boringssl-with-bazel/crypto/cpu_aarch64_win.cc +16 -3
- data/third_party/boringssl-with-bazel/crypto/cpu_arm_freebsd.cc +4 -2
- data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.cc +54 -31
- data/third_party/boringssl-with-bazel/crypto/cpu_arm_linux.h +79 -101
- data/third_party/boringssl-with-bazel/crypto/cpu_intel.cc +51 -45
- data/third_party/boringssl-with-bazel/crypto/crypto.cc +26 -55
- data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519.cc +28 -25
- data/third_party/boringssl-with-bazel/crypto/curve25519/curve25519_tables.h +6 -6
- data/third_party/boringssl-with-bazel/crypto/curve25519/internal.h +14 -15
- data/third_party/boringssl-with-bazel/crypto/curve25519/spake25519.cc +23 -20
- data/third_party/boringssl-with-bazel/crypto/des/des.cc +27 -19
- data/third_party/boringssl-with-bazel/crypto/des/internal.h +4 -9
- data/third_party/boringssl-with-bazel/crypto/dh/dh_asn1.cc +34 -49
- data/third_party/boringssl-with-bazel/crypto/dh/params.cc +44 -41
- data/third_party/boringssl-with-bazel/crypto/digest/digest_extra.cc +87 -40
- data/third_party/boringssl-with-bazel/crypto/dsa/dsa.cc +237 -260
- data/third_party/boringssl-with-bazel/crypto/dsa/dsa_asn1.cc +100 -173
- data/third_party/boringssl-with-bazel/crypto/dsa/internal.h +23 -21
- data/third_party/boringssl-with-bazel/crypto/ec/ec_asn1.cc +181 -209
- data/third_party/boringssl-with-bazel/crypto/ec/ec_derive.cc +26 -28
- data/third_party/boringssl-with-bazel/crypto/ec/hash_to_curve.cc +265 -174
- data/third_party/boringssl-with-bazel/crypto/ec/internal.h +54 -18
- data/third_party/boringssl-with-bazel/crypto/ecdh/ecdh.cc +7 -5
- data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_asn1.cc +50 -70
- data/third_party/boringssl-with-bazel/crypto/ecdsa/ecdsa_p1363.cc +54 -0
- data/third_party/boringssl-with-bazel/crypto/engine/engine.cc +7 -7
- data/third_party/boringssl-with-bazel/crypto/err/err.cc +116 -105
- data/third_party/boringssl-with-bazel/crypto/err/internal.h +8 -21
- data/third_party/boringssl-with-bazel/crypto/evp/evp.cc +238 -166
- data/third_party/boringssl-with-bazel/crypto/evp/evp_asn1.cc +202 -234
- data/third_party/boringssl-with-bazel/crypto/evp/evp_ctx.cc +260 -159
- data/third_party/boringssl-with-bazel/crypto/evp/evp_kem.cc +82 -0
- data/third_party/boringssl-with-bazel/crypto/evp/internal.h +292 -137
- data/third_party/boringssl-with-bazel/crypto/evp/p_dh.cc +198 -25
- data/third_party/boringssl-with-bazel/crypto/evp/p_dsa.cc +333 -0
- data/third_party/boringssl-with-bazel/crypto/evp/p_ec.cc +427 -42
- data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519.cc +270 -14
- data/third_party/boringssl-with-bazel/crypto/evp/p_hkdf.cc +70 -102
- data/third_party/boringssl-with-bazel/crypto/evp/p_mldsa.cc +549 -0
- data/third_party/boringssl-with-bazel/crypto/evp/p_mlkem.cc +485 -0
- data/third_party/boringssl-with-bazel/crypto/evp/p_rsa.cc +666 -158
- data/third_party/boringssl-with-bazel/crypto/evp/p_x25519.cc +290 -28
- data/third_party/boringssl-with-bazel/crypto/evp/p_xwing.cc +273 -0
- data/third_party/boringssl-with-bazel/crypto/evp/pbkdf.cc +14 -7
- data/third_party/boringssl-with-bazel/crypto/evp/print.cc +34 -89
- data/third_party/boringssl-with-bazel/crypto/evp/scrypt.cc +23 -21
- data/third_party/boringssl-with-bazel/crypto/evp/sign.cc +23 -42
- data/third_party/boringssl-with-bazel/crypto/ex_data.cc +40 -41
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes.cc.inc +34 -28
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/aes_nohw.cc.inc +119 -121
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cbc.cc.inc +16 -14
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/cfb.cc.inc +12 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ctr.cc.inc +7 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm.cc.inc +39 -29
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/gcm_nohw.cc.inc +15 -13
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/internal.h +193 -177
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/key_wrap.cc.inc +5 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/mode_wrappers.cc.inc +7 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/aes/ofb.cc.inc +7 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm.cc +24 -19
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bcm_interface.h +512 -384
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/add.cc.inc +7 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/asm/x86_64-gcc.cc.inc +63 -44
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bn.cc.inc +40 -37
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/bytes.cc.inc +27 -22
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/cmp.cc.inc +9 -7
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/ctx.cc.inc +62 -126
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div.cc.inc +92 -167
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/div_extra.cc.inc +15 -12
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/exponentiation.cc.inc +96 -93
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd.cc.inc +73 -92
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/gcd_extra.cc.inc +59 -71
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/generic.cc.inc +54 -57
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/internal.h +333 -255
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/jacobi.cc.inc +12 -19
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery.cc.inc +80 -95
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/montgomery_inv.cc.inc +53 -96
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/mul.cc.inc +58 -419
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/prime.cc.inc +164 -213
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/random.cc.inc +27 -26
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.cc.inc +12 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/rsaz_exp.h +47 -49
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/shift.cc.inc +14 -17
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/bn/sqrt.cc.inc +19 -108
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/aead.cc.inc +427 -105
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/cipher.cc.inc +412 -212
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aes.cc.inc +230 -225
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/e_aesccm.cc.inc +115 -84
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cipher/internal.h +374 -27
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/cmac/cmac.cc.inc +28 -23
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/delocate.h +36 -40
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/check.cc.inc +68 -78
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/dh.cc.inc +154 -196
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/dh/internal.h +24 -24
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digest.cc.inc +40 -69
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/digests.cc.inc +13 -7
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/internal.h +13 -11
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digest/md32_common.h +86 -81
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/digestsign/digestsign.cc.inc +38 -34
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec.cc.inc +187 -196
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_key.cc.inc +196 -154
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/ec_montgomery.cc.inc +65 -125
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/felem.cc.inc +85 -22
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/internal.h +281 -287
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/oct.cc.inc +23 -22
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256.cc.inc +514 -573
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256_internal.h +193 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/scalar.cc.inc +44 -39
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple.cc.inc +58 -90
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/simple_mul.cc.inc +39 -34
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/util.cc.inc +6 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/wnaf.cc.inc +23 -20
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdh/ecdh.cc.inc +6 -3
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/ecdsa.cc.inc +47 -37
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ecdsa/internal.h +5 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/internal.h +38 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/jitter.cc.inc +463 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/entropy/sha512.cc.inc +329 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/hkdf/hkdf.cc.inc +8 -6
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/hmac/hmac.cc.inc +19 -16
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/internal.h +41 -15
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/keccak/keccak.cc.inc +172 -44
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/fips_known_values.inc +5 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mldsa/mldsa.cc.inc +1632 -766
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/fips_known_values.inc +5 -5
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/mlkem/mlkem.cc.inc +740 -436
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/android_entropy_client.cc.inc +82 -0
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/ctrdrbg.cc.inc +240 -53
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/internal.h +41 -26
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rand/rand.cc.inc +221 -218
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/internal.h +64 -67
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/padding.cc.inc +49 -57
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa.cc.inc +247 -234
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/rsa_impl.cc.inc +392 -692
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/fips.cc.inc +10 -10
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/self_check/self_check.cc.inc +479 -449
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/internal.h +34 -11
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/service_indicator/service_indicator.cc.inc +46 -43
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/internal.h +61 -70
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha1.cc.inc +27 -13
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha256.cc.inc +46 -30
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/sha/sha512.cc.inc +47 -47
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/address.h +98 -73
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.cc.inc +108 -98
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/fors.h +14 -24
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.cc.inc +94 -91
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/merkle.h +19 -31
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/params.h +156 -56
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/slhdsa.cc.inc +318 -132
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.cc.inc +234 -81
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/thash.h +20 -34
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.cc.inc +97 -96
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/slhdsa/wots.h +10 -20
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/internal.h +2 -16
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/tls/kdf.cc.inc +26 -26
- data/third_party/boringssl-with-bazel/crypto/fuzzer_mode.cc +5 -5
- data/third_party/boringssl-with-bazel/crypto/hpke/hpke.cc +461 -97
- data/third_party/boringssl-with-bazel/crypto/hrss/hrss.cc +153 -149
- data/third_party/boringssl-with-bazel/crypto/hrss/internal.h +9 -13
- data/third_party/boringssl-with-bazel/crypto/internal.h +531 -394
- data/third_party/boringssl-with-bazel/crypto/kyber/internal.h +117 -12
- data/third_party/boringssl-with-bazel/crypto/kyber/kyber.cc +59 -58
- data/third_party/boringssl-with-bazel/crypto/lhash/internal.h +38 -37
- data/third_party/boringssl-with-bazel/crypto/lhash/lhash.cc +68 -65
- data/third_party/boringssl-with-bazel/crypto/md4/md4.cc +19 -6
- data/third_party/boringssl-with-bazel/crypto/md5/internal.h +6 -9
- data/third_party/boringssl-with-bazel/crypto/md5/md5.cc +18 -6
- data/third_party/boringssl-with-bazel/crypto/mem.cc +61 -65
- data/third_party/boringssl-with-bazel/crypto/mem_internal.h +671 -0
- data/third_party/boringssl-with-bazel/crypto/mldsa/mldsa.cc +238 -32
- data/third_party/boringssl-with-bazel/crypto/mlkem/mlkem.cc +21 -65
- data/third_party/boringssl-with-bazel/crypto/obj/obj.cc +132 -157
- data/third_party/boringssl-with-bazel/crypto/obj/obj_dat.h +79 -1
- data/third_party/boringssl-with-bazel/crypto/obj/obj_xref.cc +14 -11
- data/third_party/boringssl-with-bazel/crypto/params_internal.h +30 -0
- data/third_party/boringssl-with-bazel/crypto/pem/internal.h +20 -15
- data/third_party/boringssl-with-bazel/crypto/pem/pem_all.cc +20 -19
- data/third_party/boringssl-with-bazel/crypto/pem/pem_info.cc +72 -76
- data/third_party/boringssl-with-bazel/crypto/pem/pem_lib.cc +215 -217
- data/third_party/boringssl-with-bazel/crypto/pem/pem_oth.cc +6 -6
- data/third_party/boringssl-with-bazel/crypto/pem/pem_pk8.cc +13 -13
- data/third_party/boringssl-with-bazel/crypto/pem/pem_pkey.cc +11 -11
- data/third_party/boringssl-with-bazel/crypto/pkcs7/internal.h +12 -17
- data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7.cc +29 -27
- data/third_party/boringssl-with-bazel/crypto/pkcs7/pkcs7_x509.cc +55 -49
- data/third_party/boringssl-with-bazel/crypto/pkcs8/internal.h +21 -26
- data/third_party/boringssl-with-bazel/crypto/pkcs8/p5_pbev2.cc +33 -31
- data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8.cc +73 -81
- data/third_party/boringssl-with-bazel/crypto/pkcs8/pkcs8_x509.cc +139 -138
- data/third_party/boringssl-with-bazel/crypto/poly1305/internal.h +3 -7
- data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305.cc +5 -4
- data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_arm.cc +43 -47
- data/third_party/boringssl-with-bazel/crypto/poly1305/poly1305_vec.cc +29 -26
- data/third_party/boringssl-with-bazel/crypto/pool/internal.h +64 -20
- data/third_party/boringssl-with-bazel/crypto/pool/pool.cc +177 -157
- data/third_party/boringssl-with-bazel/crypto/rand/deterministic.cc +9 -16
- data/third_party/boringssl-with-bazel/crypto/rand/fork_detect.cc +70 -42
- data/third_party/boringssl-with-bazel/crypto/rand/forkunsafe.cc +7 -7
- data/third_party/boringssl-with-bazel/crypto/rand/getentropy.cc +6 -13
- data/third_party/boringssl-with-bazel/crypto/rand/internal.h +16 -4
- data/third_party/boringssl-with-bazel/crypto/rand/ios.cc +4 -11
- data/third_party/boringssl-with-bazel/crypto/rand/rand.cc +11 -9
- data/third_party/boringssl-with-bazel/crypto/rand/trusty.cc +4 -11
- data/third_party/boringssl-with-bazel/crypto/rand/urandom.cc +16 -195
- data/third_party/boringssl-with-bazel/crypto/rand/windows.cc +12 -19
- data/third_party/boringssl-with-bazel/crypto/refcount.cc +7 -17
- data/third_party/boringssl-with-bazel/crypto/rsa/internal.h +22 -7
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_asn1.cc +199 -78
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_crypt.cc +49 -50
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_extra.cc +11 -0
- data/third_party/boringssl-with-bazel/crypto/rsa/rsa_print.cc +4 -6
- data/third_party/boringssl-with-bazel/crypto/sha/sha1.cc +3 -0
- data/third_party/boringssl-with-bazel/crypto/sha/sha256.cc +3 -1
- data/third_party/boringssl-with-bazel/crypto/sha/sha512.cc +6 -4
- data/third_party/boringssl-with-bazel/crypto/siphash/siphash.cc +2 -0
- data/third_party/boringssl-with-bazel/crypto/slhdsa/slhdsa.cc +43 -6
- data/third_party/boringssl-with-bazel/crypto/spake2plus/internal.h +31 -31
- data/third_party/boringssl-with-bazel/crypto/spake2plus/spake2plus.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/stack/stack.cc +89 -130
- data/third_party/boringssl-with-bazel/crypto/thread.cc +14 -14
- data/third_party/boringssl-with-bazel/crypto/thread_none.cc +10 -13
- data/third_party/boringssl-with-bazel/crypto/thread_pthread.cc +22 -35
- data/third_party/boringssl-with-bazel/crypto/thread_win.cc +29 -40
- data/third_party/boringssl-with-bazel/crypto/trust_token/internal.h +81 -88
- data/third_party/boringssl-with-bazel/crypto/trust_token/pmbtoken.cc +160 -144
- data/third_party/boringssl-with-bazel/crypto/trust_token/trust_token.cc +96 -80
- data/third_party/boringssl-with-bazel/crypto/trust_token/voprf.cc +90 -87
- data/third_party/boringssl-with-bazel/crypto/x509/a_digest.cc +5 -5
- data/third_party/boringssl-with-bazel/crypto/x509/a_sign.cc +51 -48
- data/third_party/boringssl-with-bazel/crypto/x509/a_verify.cc +30 -34
- data/third_party/boringssl-with-bazel/crypto/x509/algorithm.cc +47 -16
- data/third_party/boringssl-with-bazel/crypto/x509/asn1_gen.cc +41 -43
- data/third_party/boringssl-with-bazel/crypto/x509/by_dir.cc +183 -237
- data/third_party/boringssl-with-bazel/crypto/x509/by_file.cc +29 -30
- data/third_party/boringssl-with-bazel/crypto/x509/internal.h +276 -180
- data/third_party/boringssl-with-bazel/crypto/x509/name_print.cc +15 -13
- data/third_party/boringssl-with-bazel/crypto/x509/policy.cc +415 -525
- data/third_party/boringssl-with-bazel/crypto/x509/rsa_pss.cc +94 -271
- data/third_party/boringssl-with-bazel/crypto/x509/t_crl.cc +11 -8
- data/third_party/boringssl-with-bazel/crypto/x509/t_req.cc +26 -23
- data/third_party/boringssl-with-bazel/crypto/x509/t_x509.cc +26 -22
- data/third_party/boringssl-with-bazel/crypto/x509/t_x509a.cc +3 -1
- data/third_party/boringssl-with-bazel/crypto/x509/v3_akey.cc +69 -76
- data/third_party/boringssl-with-bazel/crypto/x509/v3_akeya.cc +2 -2
- data/third_party/boringssl-with-bazel/crypto/x509/v3_alt.cc +112 -69
- data/third_party/boringssl-with-bazel/crypto/x509/v3_bcons.cc +15 -14
- data/third_party/boringssl-with-bazel/crypto/x509/v3_bitst.cc +16 -18
- data/third_party/boringssl-with-bazel/crypto/x509/v3_conf.cc +62 -67
- data/third_party/boringssl-with-bazel/crypto/x509/v3_cpols.cc +143 -170
- data/third_party/boringssl-with-bazel/crypto/x509/v3_crld.cc +121 -165
- data/third_party/boringssl-with-bazel/crypto/x509/v3_enum.cc +13 -12
- data/third_party/boringssl-with-bazel/crypto/x509/v3_extku.cc +17 -34
- data/third_party/boringssl-with-bazel/crypto/x509/v3_genn.cc +20 -10
- data/third_party/boringssl-with-bazel/crypto/x509/v3_ia5.cc +22 -18
- data/third_party/boringssl-with-bazel/crypto/x509/v3_info.cc +45 -47
- data/third_party/boringssl-with-bazel/crypto/x509/v3_int.cc +35 -33
- data/third_party/boringssl-with-bazel/crypto/x509/v3_lib.cc +106 -61
- data/third_party/boringssl-with-bazel/crypto/x509/v3_ncons.cc +642 -358
- data/third_party/boringssl-with-bazel/crypto/x509/v3_ocsp.cc +25 -22
- data/third_party/boringssl-with-bazel/crypto/x509/v3_pcons.cc +15 -14
- data/third_party/boringssl-with-bazel/crypto/x509/v3_pmaps.cc +16 -15
- data/third_party/boringssl-with-bazel/crypto/x509/v3_prn.cc +6 -6
- data/third_party/boringssl-with-bazel/crypto/x509/v3_purp.cc +150 -137
- data/third_party/boringssl-with-bazel/crypto/x509/v3_skey.cc +23 -26
- data/third_party/boringssl-with-bazel/crypto/x509/v3_utl.cc +151 -178
- data/third_party/boringssl-with-bazel/crypto/x509/x509.cc +1 -1
- data/third_party/boringssl-with-bazel/crypto/x509/x509_att.cc +32 -30
- data/third_party/boringssl-with-bazel/crypto/x509/x509_cmp.cc +95 -88
- data/third_party/boringssl-with-bazel/crypto/x509/x509_d2.cc +9 -9
- data/third_party/boringssl-with-bazel/crypto/x509/x509_def.cc +6 -8
- data/third_party/boringssl-with-bazel/crypto/x509/x509_ext.cc +46 -24
- data/third_party/boringssl-with-bazel/crypto/x509/x509_lu.cc +211 -195
- data/third_party/boringssl-with-bazel/crypto/x509/x509_obj.cc +20 -16
- data/third_party/boringssl-with-bazel/crypto/x509/x509_req.cc +37 -46
- data/third_party/boringssl-with-bazel/crypto/x509/x509_set.cc +62 -90
- data/third_party/boringssl-with-bazel/crypto/x509/x509_trs.cc +18 -13
- data/third_party/boringssl-with-bazel/crypto/x509/x509_v3.cc +33 -33
- data/third_party/boringssl-with-bazel/crypto/x509/x509_vfy.cc +109 -110
- data/third_party/boringssl-with-bazel/crypto/x509/x509_vpm.cc +56 -47
- data/third_party/boringssl-with-bazel/crypto/x509/x509cset.cc +27 -40
- data/third_party/boringssl-with-bazel/crypto/x509/x509name.cc +77 -67
- data/third_party/boringssl-with-bazel/crypto/x509/x509rset.cc +5 -17
- data/third_party/boringssl-with-bazel/crypto/x509/x509spki.cc +13 -13
- data/third_party/boringssl-with-bazel/crypto/x509/x_algor.cc +131 -24
- data/third_party/boringssl-with-bazel/crypto/x509/x_all.cc +72 -39
- data/third_party/boringssl-with-bazel/crypto/x509/x_attrib.cc +10 -4
- data/third_party/boringssl-with-bazel/crypto/x509/x_crl.cc +77 -44
- data/third_party/boringssl-with-bazel/crypto/x509/x_exten.cc +6 -0
- data/third_party/boringssl-with-bazel/crypto/x509/x_name.cc +311 -383
- data/third_party/boringssl-with-bazel/crypto/x509/x_pubkey.cc +129 -82
- data/third_party/boringssl-with-bazel/crypto/x509/x_req.cc +11 -6
- data/third_party/boringssl-with-bazel/crypto/x509/x_sig.cc +4 -4
- data/third_party/boringssl-with-bazel/crypto/x509/x_spki.cc +11 -1
- data/third_party/boringssl-with-bazel/crypto/x509/x_x509.cc +285 -280
- data/third_party/boringssl-with-bazel/crypto/x509/x_x509a.cc +60 -60
- data/third_party/boringssl-with-bazel/crypto/xwing/xwing.cc +257 -0
- data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_64_win_asm.inc +301 -0
- data/third_party/boringssl-with-bazel/gen/boringssl_prefix_symbols_internal_x86_win_asm.inc +301 -0
- data/third_party/boringssl-with-bazel/gen/crypto/err_data.cc +526 -500
- data/third_party/boringssl-with-bazel/include/openssl/aead.h +286 -114
- data/third_party/boringssl-with-bazel/include/openssl/aes.h +43 -43
- data/third_party/boringssl-with-bazel/include/openssl/asm_base.h +29 -16
- data/third_party/boringssl-with-bazel/include/openssl/asn1.h +641 -631
- data/third_party/boringssl-with-bazel/include/openssl/asn1t.h +7 -9
- data/third_party/boringssl-with-bazel/include/openssl/base.h +34 -54
- data/third_party/boringssl-with-bazel/include/openssl/base64.h +30 -30
- data/third_party/boringssl-with-bazel/include/openssl/bio.h +373 -316
- data/third_party/boringssl-with-bazel/include/openssl/blake2.h +15 -11
- data/third_party/boringssl-with-bazel/include/openssl/blowfish.h +10 -3
- data/third_party/boringssl-with-bazel/include/openssl/bn.h +298 -306
- data/third_party/boringssl-with-bazel/include/openssl/buf.h +14 -14
- data/third_party/boringssl-with-bazel/include/openssl/bytestring.h +272 -207
- data/third_party/boringssl-with-bazel/include/openssl/cast.h +45 -8
- data/third_party/boringssl-with-bazel/include/openssl/chacha.h +3 -3
- data/third_party/boringssl-with-bazel/include/openssl/cipher.h +334 -152
- data/third_party/boringssl-with-bazel/include/openssl/cmac.h +13 -13
- data/third_party/boringssl-with-bazel/include/openssl/cms.h +35 -34
- data/third_party/boringssl-with-bazel/include/openssl/conf.h +15 -14
- data/third_party/boringssl-with-bazel/include/openssl/crypto.h +15 -13
- data/third_party/boringssl-with-bazel/include/openssl/ctrdrbg.h +49 -15
- data/third_party/boringssl-with-bazel/include/openssl/curve25519.h +24 -24
- data/third_party/boringssl-with-bazel/include/openssl/des.h +22 -16
- data/third_party/boringssl-with-bazel/include/openssl/dh.h +95 -95
- data/third_party/boringssl-with-bazel/include/openssl/digest.h +140 -71
- data/third_party/boringssl-with-bazel/include/openssl/dsa.h +101 -101
- data/third_party/boringssl-with-bazel/include/openssl/ec.h +143 -119
- data/third_party/boringssl-with-bazel/include/openssl/ec_key.h +97 -97
- data/third_party/boringssl-with-bazel/include/openssl/ecdh.h +9 -9
- data/third_party/boringssl-with-bazel/include/openssl/ecdsa.h +89 -46
- data/third_party/boringssl-with-bazel/include/openssl/engine.h +5 -5
- data/third_party/boringssl-with-bazel/include/openssl/err.h +73 -71
- data/third_party/boringssl-with-bazel/include/openssl/evp.h +824 -344
- data/third_party/boringssl-with-bazel/include/openssl/evp_errors.h +9 -2
- data/third_party/boringssl-with-bazel/include/openssl/ex_data.h +27 -32
- data/third_party/boringssl-with-bazel/include/openssl/hkdf.h +6 -6
- data/third_party/boringssl-with-bazel/include/openssl/hmac.h +31 -31
- data/third_party/boringssl-with-bazel/include/openssl/hpke.h +133 -117
- data/third_party/boringssl-with-bazel/include/openssl/hrss.h +14 -8
- data/third_party/boringssl-with-bazel/include/openssl/kdf.h +20 -19
- data/third_party/boringssl-with-bazel/include/openssl/lhash.h +4 -25
- data/third_party/boringssl-with-bazel/include/openssl/md4.h +14 -7
- data/third_party/boringssl-with-bazel/include/openssl/md5.h +7 -7
- data/third_party/boringssl-with-bazel/include/openssl/mem.h +38 -38
- data/third_party/boringssl-with-bazel/include/openssl/mldsa.h +380 -24
- data/third_party/boringssl-with-bazel/include/openssl/mlkem.h +43 -43
- data/third_party/boringssl-with-bazel/include/openssl/nid.h +1297 -2
- data/third_party/boringssl-with-bazel/include/openssl/obj.h +49 -49
- data/third_party/boringssl-with-bazel/include/openssl/opensslconf.h +30 -0
- data/third_party/boringssl-with-bazel/include/openssl/params.h +42 -0
- data/third_party/boringssl-with-bazel/include/openssl/pem.h +39 -30
- data/third_party/boringssl-with-bazel/include/openssl/pkcs7.h +40 -40
- data/third_party/boringssl-with-bazel/include/openssl/pkcs8.h +69 -63
- data/third_party/boringssl-with-bazel/include/openssl/poly1305.h +8 -5
- data/third_party/boringssl-with-bazel/include/openssl/pool.h +54 -25
- data/third_party/boringssl-with-bazel/include/openssl/posix_time.h +6 -6
- data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols.h +7866 -0
- data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_S.h +585 -0
- data/third_party/boringssl-with-bazel/include/openssl/prefix_symbols_internal_c.h +305 -0
- data/third_party/boringssl-with-bazel/include/openssl/rand.h +18 -18
- data/third_party/boringssl-with-bazel/include/openssl/rc4.h +4 -4
- data/third_party/boringssl-with-bazel/include/openssl/ripemd.h +15 -10
- data/third_party/boringssl-with-bazel/include/openssl/rsa.h +272 -235
- data/third_party/boringssl-with-bazel/include/openssl/service_indicator.h +4 -81
- data/third_party/boringssl-with-bazel/include/openssl/sha.h +43 -166
- data/third_party/boringssl-with-bazel/include/openssl/sha2.h +201 -0
- data/third_party/boringssl-with-bazel/include/openssl/slhdsa.h +100 -48
- data/third_party/boringssl-with-bazel/include/openssl/span.h +190 -75
- data/third_party/boringssl-with-bazel/include/openssl/ssl.h +2168 -1567
- data/third_party/boringssl-with-bazel/include/openssl/ssl3.h +11 -69
- data/third_party/boringssl-with-bazel/include/openssl/stack.h +135 -80
- data/third_party/boringssl-with-bazel/include/openssl/target.h +13 -1
- data/third_party/boringssl-with-bazel/include/openssl/thread.h +0 -10
- data/third_party/boringssl-with-bazel/include/openssl/tls1.h +31 -310
- data/third_party/boringssl-with-bazel/include/openssl/tls_prf.h +47 -0
- data/third_party/boringssl-with-bazel/include/openssl/trust_token.h +97 -92
- data/third_party/boringssl-with-bazel/include/openssl/type_check.h +1 -1
- data/third_party/boringssl-with-bazel/include/openssl/x509.h +1805 -1857
- data/third_party/boringssl-with-bazel/include/openssl/x509v3.h +1 -1
- data/third_party/boringssl-with-bazel/include/openssl/xwing.h +115 -0
- data/third_party/boringssl-with-bazel/ssl/bio_ssl.cc +24 -19
- data/third_party/boringssl-with-bazel/ssl/d1_both.cc +59 -57
- data/third_party/boringssl-with-bazel/ssl/d1_lib.cc +53 -42
- data/third_party/boringssl-with-bazel/ssl/d1_pkt.cc +4 -4
- data/third_party/boringssl-with-bazel/ssl/d1_srtp.cc +2 -2
- data/third_party/boringssl-with-bazel/ssl/dtls_method.cc +10 -10
- data/third_party/boringssl-with-bazel/ssl/dtls_record.cc +6 -6
- data/third_party/boringssl-with-bazel/ssl/encrypted_client_hello.cc +61 -71
- data/third_party/boringssl-with-bazel/ssl/extensions.cc +967 -366
- data/third_party/boringssl-with-bazel/ssl/handoff.cc +77 -38
- data/third_party/boringssl-with-bazel/ssl/handshake.cc +63 -30
- data/third_party/boringssl-with-bazel/ssl/handshake_client.cc +129 -85
- data/third_party/boringssl-with-bazel/ssl/handshake_server.cc +116 -68
- data/third_party/boringssl-with-bazel/ssl/internal.h +983 -1207
- data/third_party/boringssl-with-bazel/ssl/s3_both.cc +34 -29
- data/third_party/boringssl-with-bazel/ssl/s3_lib.cc +4 -3
- data/third_party/boringssl-with-bazel/ssl/s3_pkt.cc +12 -12
- data/third_party/boringssl-with-bazel/ssl/ssl_aead_ctx.cc +5 -5
- data/third_party/boringssl-with-bazel/ssl/ssl_asn1.cc +114 -59
- data/third_party/boringssl-with-bazel/ssl/ssl_buffer.cc +17 -18
- data/third_party/boringssl-with-bazel/ssl/ssl_cert.cc +99 -61
- data/third_party/boringssl-with-bazel/ssl/ssl_cipher.cc +143 -134
- data/third_party/boringssl-with-bazel/ssl/ssl_credential.cc +188 -90
- data/third_party/boringssl-with-bazel/ssl/ssl_file.cc +132 -225
- data/third_party/boringssl-with-bazel/ssl/ssl_key_share.cc +79 -7
- data/third_party/boringssl-with-bazel/ssl/ssl_lib.cc +698 -302
- data/third_party/boringssl-with-bazel/ssl/ssl_privkey.cc +102 -45
- data/third_party/boringssl-with-bazel/ssl/ssl_session.cc +117 -102
- data/third_party/boringssl-with-bazel/ssl/ssl_transcript.cc +3 -3
- data/third_party/boringssl-with-bazel/ssl/ssl_versions.cc +24 -24
- data/third_party/boringssl-with-bazel/ssl/ssl_x509.cc +184 -170
- data/third_party/boringssl-with-bazel/ssl/t1_enc.cc +12 -10
- data/third_party/boringssl-with-bazel/ssl/tls13_both.cc +86 -54
- data/third_party/boringssl-with-bazel/ssl/tls13_client.cc +176 -90
- data/third_party/boringssl-with-bazel/ssl/tls13_enc.cc +166 -112
- data/third_party/boringssl-with-bazel/ssl/tls13_server.cc +188 -97
- data/third_party/boringssl-with-bazel/ssl/tls_method.cc +23 -23
- data/third_party/boringssl-with-bazel/ssl/tls_record.cc +17 -14
- data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_bareminimum.c.inc +47 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/bedrock_unverified_platform.c.inc +137 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/curve25519_64_adx.h +37 -33
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_64.h +4 -93
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_64_msvc.h +4 -69
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_32.br.c.inc +71 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_field_64.br.c.inc +84 -0
- data/third_party/boringssl-with-bazel/third_party/fiat/p256_point.br.c.inc +166 -0
- metadata +77 -52
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +0 -240
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +0 -56
- data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb.h +0 -157
- data/src/core/ext/upb-gen/src/proto/grpc/health/v1/health.upb_minitable.c +0 -72
- data/src/core/ext/upbdefs-gen/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +0 -181
- data/third_party/abseil-cpp/absl/base/internal/identity.h +0 -39
- data/third_party/abseil-cpp/absl/base/internal/nullability_deprecated.h +0 -106
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +0 -105
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +0 -50
- data/third_party/abseil-cpp/absl/strings/string_view.cc +0 -257
- data/third_party/boringssl-with-bazel/crypto/evp/p_dh_asn1.cc +0 -142
- data/third_party/boringssl-with-bazel/crypto/evp/p_dsa_asn1.cc +0 -279
- data/third_party/boringssl-with-bazel/crypto/evp/p_ec_asn1.cc +0 -286
- data/third_party/boringssl-with-bazel/crypto/evp/p_ed25519_asn1.cc +0 -225
- data/third_party/boringssl-with-bazel/crypto/evp/p_rsa_asn1.cc +0 -198
- data/third_party/boringssl-with-bazel/crypto/evp/p_x25519_asn1.cc +0 -237
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p224-64.cc.inc +0 -1163
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.cc.inc +0 -741
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/ec/p256-nistz.h +0 -207
- data/third_party/boringssl-with-bazel/crypto/fipsmodule/rsa/blinding.cc.inc +0 -147
- data/third_party/boringssl-with-bazel/crypto/rand/getrandom_fillin.h +0 -64
- data/third_party/boringssl-with-bazel/crypto/rand/passive.cc +0 -178
- data/third_party/boringssl-with-bazel/crypto/x509/ext_dat.h +0 -92
- data/third_party/boringssl-with-bazel/include/openssl/bcm_public.h +0 -82
- data/third_party/boringssl-with-bazel/include/openssl/experimental/kyber.h +0 -146
|
@@ -19,6 +19,9 @@
|
|
|
19
19
|
#include <cstddef>
|
|
20
20
|
#include <cstdint>
|
|
21
21
|
#include <cstring>
|
|
22
|
+
#include <memory>
|
|
23
|
+
#include <tuple>
|
|
24
|
+
#include <utility>
|
|
22
25
|
|
|
23
26
|
#include "absl/base/attributes.h"
|
|
24
27
|
#include "absl/base/config.h"
|
|
@@ -40,32 +43,13 @@ namespace container_internal {
|
|
|
40
43
|
// Represents a control byte corresponding to a full slot with arbitrary hash.
|
|
41
44
|
constexpr ctrl_t ZeroCtrlT() { return static_cast<ctrl_t>(0); }
|
|
42
45
|
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
//
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(),
|
|
51
|
-
ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(),
|
|
52
|
-
ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(), ZeroCtrlT(),
|
|
53
|
-
ctrl_t::kSentinel, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
|
|
54
|
-
ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
|
|
55
|
-
ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
|
|
56
|
-
ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty};
|
|
57
|
-
|
|
58
|
-
// We need one full byte followed by a sentinel byte for iterator::operator++ to
|
|
59
|
-
// work. We have a full group after kSentinel to be safe (in case operator++ is
|
|
60
|
-
// changed to read a full group).
|
|
61
|
-
ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[17] = {
|
|
62
|
-
ZeroCtrlT(), ctrl_t::kSentinel, ZeroCtrlT(), ctrl_t::kEmpty,
|
|
63
|
-
ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
|
|
64
|
-
ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
|
|
65
|
-
ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
|
|
66
|
-
ctrl_t::kEmpty};
|
|
67
|
-
static_assert(NumControlBytes(SooCapacity()) <= 17,
|
|
68
|
-
"kSooControl capacity too small");
|
|
46
|
+
// A single control byte for default-constructed iterators. We leave it
|
|
47
|
+
// uninitialized because reading this memory is a bug.
|
|
48
|
+
ABSL_DLL ctrl_t kDefaultIterControl;
|
|
49
|
+
|
|
50
|
+
// We need one full byte followed by a sentinel byte for iterator::operator++.
|
|
51
|
+
ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[2] = {ZeroCtrlT(),
|
|
52
|
+
ctrl_t::kSentinel};
|
|
69
53
|
|
|
70
54
|
namespace {
|
|
71
55
|
|
|
@@ -78,14 +62,15 @@ namespace {
|
|
|
78
62
|
assert((CONDITION) && "Try enabling sanitizers.")
|
|
79
63
|
#endif
|
|
80
64
|
|
|
81
|
-
[[
|
|
82
|
-
|
|
65
|
+
void ValidateMaxSize([[maybe_unused]] size_t size,
|
|
66
|
+
[[maybe_unused]] size_t key_size,
|
|
67
|
+
[[maybe_unused]] size_t slot_size) {
|
|
68
|
+
ABSL_SWISSTABLE_ASSERT(size <= MaxValidSize(key_size, slot_size));
|
|
83
69
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
70
|
+
void ValidateMaxCapacity(size_t capacity, size_t key_size, size_t slot_size) {
|
|
71
|
+
if (capacity <= 1) return;
|
|
72
|
+
ValidateMaxSize(CapacityToGrowth(PreviousCapacity(capacity)), key_size,
|
|
73
|
+
slot_size);
|
|
89
74
|
}
|
|
90
75
|
|
|
91
76
|
// Returns "random" seed.
|
|
@@ -100,14 +85,14 @@ inline size_t RandomSeed() {
|
|
|
100
85
|
return value ^ static_cast<size_t>(reinterpret_cast<uintptr_t>(&counter));
|
|
101
86
|
}
|
|
102
87
|
|
|
103
|
-
bool ShouldRehashForBugDetection(
|
|
88
|
+
bool ShouldRehashForBugDetection(size_t capacity) {
|
|
104
89
|
// Note: we can't use the abseil-random library because abseil-random
|
|
105
90
|
// depends on swisstable. We want to return true with probability
|
|
106
91
|
// `min(1, RehashProbabilityConstant() / capacity())`. In order to do this,
|
|
107
92
|
// we probe based on a random hash and see if the offset is less than
|
|
108
93
|
// RehashProbabilityConstant().
|
|
109
|
-
return probe(
|
|
110
|
-
|
|
94
|
+
return probe(HashtableCapacity(capacity), absl::HashOf(RandomSeed()))
|
|
95
|
+
.offset() < RehashProbabilityConstant();
|
|
111
96
|
}
|
|
112
97
|
|
|
113
98
|
// Find a non-deterministic hash for single group table.
|
|
@@ -118,6 +103,21 @@ size_t SingleGroupTableH1(size_t hash, PerTableSeed seed) {
|
|
|
118
103
|
return hash ^ seed.seed();
|
|
119
104
|
}
|
|
120
105
|
|
|
106
|
+
// Returns the offset of the new element after resize from capacity 1 to 3.
|
|
107
|
+
size_t Resize1To3NewOffset(size_t hash, PerTableSeed seed) {
|
|
108
|
+
// After resize from capacity 1 to 3, we always have exactly the slot with
|
|
109
|
+
// index 1 occupied, so we need to insert either at index 0 or index 2.
|
|
110
|
+
static_assert(SooSlotIndex() == 1);
|
|
111
|
+
return SingleGroupTableH1(hash, seed) & 2;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Returns the address of the ith slot in slots where each slot occupies
|
|
115
|
+
// slot_size.
|
|
116
|
+
inline void* SlotAddress(void* slot_array, size_t slot, size_t slot_size) {
|
|
117
|
+
return static_cast<void*>(static_cast<char*>(slot_array) +
|
|
118
|
+
(slot * slot_size));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
121
|
// Returns the address of the slot `i` iterations after `slot` assuming each
|
|
122
122
|
// slot has the specified size.
|
|
123
123
|
inline void* NextSlot(void* slot, size_t slot_size, size_t i = 1) {
|
|
@@ -133,6 +133,16 @@ inline void* PrevSlot(void* slot, size_t slot_size) {
|
|
|
133
133
|
|
|
134
134
|
} // namespace
|
|
135
135
|
|
|
136
|
+
// Must be defined out-of-line to avoid MSVC error C2482 on some platforms,
|
|
137
|
+
// which is caused by non-constexpr initialization.
|
|
138
|
+
uint16_t NextHashTableSeed() {
|
|
139
|
+
static_assert(PerTableSeed::kBitCount <= 16);
|
|
140
|
+
thread_local uint16_t seed =
|
|
141
|
+
static_cast<uint16_t>(reinterpret_cast<uintptr_t>(&seed));
|
|
142
|
+
seed += uint16_t{0xad53};
|
|
143
|
+
return seed;
|
|
144
|
+
}
|
|
145
|
+
|
|
136
146
|
GenerationType* EmptyGeneration() {
|
|
137
147
|
if (SwisstableGenerationsEnabled()) {
|
|
138
148
|
constexpr size_t kNumEmptyGenerations = 1024;
|
|
@@ -144,66 +154,98 @@ GenerationType* EmptyGeneration() {
|
|
|
144
154
|
}
|
|
145
155
|
|
|
146
156
|
bool CommonFieldsGenerationInfoEnabled::
|
|
147
|
-
should_rehash_for_bug_detection_on_insert(
|
|
148
|
-
size_t capacity) const {
|
|
157
|
+
should_rehash_for_bug_detection_on_insert(size_t capacity) const {
|
|
149
158
|
if (reserved_growth_ == kReservedGrowthJustRanOut) return true;
|
|
150
159
|
if (reserved_growth_ > 0) return false;
|
|
151
|
-
return ShouldRehashForBugDetection(
|
|
160
|
+
return ShouldRehashForBugDetection(capacity);
|
|
152
161
|
}
|
|
153
162
|
|
|
154
163
|
bool CommonFieldsGenerationInfoEnabled::should_rehash_for_bug_detection_on_move(
|
|
155
|
-
|
|
156
|
-
return ShouldRehashForBugDetection(
|
|
164
|
+
size_t capacity) const {
|
|
165
|
+
return ShouldRehashForBugDetection(capacity);
|
|
157
166
|
}
|
|
158
167
|
|
|
159
168
|
namespace {
|
|
160
169
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
170
|
+
// Probes an array of control bits using a probe sequence,
|
|
171
|
+
// and returns the mask corresponding to the first group with a deleted or empty
|
|
172
|
+
// slot.
|
|
173
|
+
inline Group::NonIterableBitMaskType probe_till_first_non_full_group(
|
|
174
|
+
const ctrl_t* ctrl, probe_seq<Group::kWidth>& seq,
|
|
175
|
+
[[maybe_unused]] size_t capacity) {
|
|
167
176
|
while (true) {
|
|
168
177
|
GroupFullEmptyOrDeleted g{ctrl + seq.offset()};
|
|
169
178
|
auto mask = g.MaskEmptyOrDeleted();
|
|
170
179
|
if (mask) {
|
|
171
|
-
return
|
|
180
|
+
return mask;
|
|
172
181
|
}
|
|
173
182
|
seq.next();
|
|
174
183
|
ABSL_SWISSTABLE_ASSERT(seq.index() <= capacity && "full table!");
|
|
175
184
|
}
|
|
176
185
|
}
|
|
177
186
|
|
|
178
|
-
|
|
179
|
-
|
|
187
|
+
FindInfo find_first_non_full_from_h1(const ctrl_t* ctrl, size_t h1,
|
|
188
|
+
HashtableCapacity capacity) {
|
|
189
|
+
auto seq = probe_h1(capacity, h1);
|
|
190
|
+
if (IsEmptyOrDeleted(ctrl[seq.offset()])) {
|
|
191
|
+
return {seq.offset(), /*probe_length=*/0};
|
|
192
|
+
}
|
|
193
|
+
auto mask = probe_till_first_non_full_group(ctrl, seq, capacity.capacity());
|
|
194
|
+
return {seq.offset(mask.LowestBitSet()), seq.index()};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Probes an array of control bits using a probe sequence derived from `hash`,
|
|
198
|
+
// and returns the offset corresponding to the first deleted or empty slot.
|
|
199
|
+
//
|
|
200
|
+
// Behavior when the entire table is full is undefined.
|
|
201
|
+
//
|
|
202
|
+
// NOTE: this function must work with tables having both empty and deleted
|
|
203
|
+
// slots in the same group. Such tables appear during `erase()`.
|
|
204
|
+
FindInfo find_first_non_full(const CommonFields& common, size_t hash) {
|
|
205
|
+
return find_first_non_full_from_h1(common.control(), H1(hash),
|
|
206
|
+
common.capacity_impl());
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Same as `find_first_non_full`, but returns the mask corresponding to the
|
|
210
|
+
// first group with a deleted or empty slot.
|
|
211
|
+
std::pair<FindInfo, Group::NonIterableBitMaskType> find_first_non_full_group(
|
|
212
|
+
const CommonFields& common, size_t hash) {
|
|
213
|
+
auto seq = probe(common, hash);
|
|
214
|
+
auto mask =
|
|
215
|
+
probe_till_first_non_full_group(common.control(), seq, common.capacity());
|
|
216
|
+
return {{seq.offset(), seq.index()}, mask};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Whether a table fits in half a group. A half-group table fits entirely into a
|
|
220
|
+
// probing group, i.e., has a capacity < `Group::kWidth`.
|
|
180
221
|
//
|
|
181
|
-
// In
|
|
222
|
+
// In half-group mode we are able to use the whole capacity. The extra control
|
|
182
223
|
// bytes give us at least one "empty" control byte to stop the iteration.
|
|
183
224
|
// This is important to make 1 a valid capacity.
|
|
184
225
|
//
|
|
185
|
-
// In
|
|
226
|
+
// In half-group mode only the first `capacity` control bytes after the sentinel
|
|
186
227
|
// are valid. The rest contain dummy ctrl_t::kEmpty values that do not
|
|
187
228
|
// represent a real slot.
|
|
188
|
-
constexpr bool
|
|
229
|
+
constexpr bool is_half_group(size_t capacity) {
|
|
189
230
|
return capacity < Group::kWidth - 1;
|
|
190
231
|
}
|
|
191
232
|
|
|
192
233
|
template <class Fn>
|
|
193
234
|
void IterateOverFullSlotsImpl(const CommonFields& c, size_t slot_size, Fn cb) {
|
|
194
235
|
const size_t cap = c.capacity();
|
|
236
|
+
ABSL_SWISSTABLE_ASSERT(!IsSmallCapacity(cap));
|
|
195
237
|
const ctrl_t* ctrl = c.control();
|
|
196
238
|
void* slot = c.slot_array();
|
|
197
|
-
if (
|
|
198
|
-
// Mirrored/cloned control bytes in
|
|
239
|
+
if (is_half_group(cap)) {
|
|
240
|
+
// Mirrored/cloned control bytes in half-group table are also located in the
|
|
199
241
|
// first group (starting from position 0). We are taking group from position
|
|
200
242
|
// `capacity` in order to avoid duplicates.
|
|
201
243
|
|
|
202
|
-
//
|
|
244
|
+
// Half-group tables capacity fits into portable group, where
|
|
203
245
|
// GroupPortableImpl::MaskFull is more efficient for the
|
|
204
246
|
// capacity <= GroupPortableImpl::kWidth.
|
|
205
247
|
ABSL_SWISSTABLE_ASSERT(cap <= GroupPortableImpl::kWidth &&
|
|
206
|
-
"unexpectedly large
|
|
248
|
+
"unexpectedly large half-group capacity");
|
|
207
249
|
static_assert(Group::kWidth >= GroupPortableImpl::kWidth,
|
|
208
250
|
"unexpected group width");
|
|
209
251
|
// Group starts from kSentinel slot, so indices in the mask will
|
|
@@ -250,11 +292,6 @@ void ConvertDeletedToEmptyAndFullToDeleted(ctrl_t* ctrl, size_t capacity) {
|
|
|
250
292
|
ctrl[capacity] = ctrl_t::kSentinel;
|
|
251
293
|
}
|
|
252
294
|
|
|
253
|
-
FindInfo find_first_non_full(const CommonFields& common, size_t hash) {
|
|
254
|
-
return find_first_non_full_from_h1(common.control(), H1(hash, common.seed()),
|
|
255
|
-
common.capacity());
|
|
256
|
-
}
|
|
257
|
-
|
|
258
295
|
void IterateOverFullSlots(const CommonFields& c, size_t slot_size,
|
|
259
296
|
absl::FunctionRef<void(const ctrl_t*, void*)> cb) {
|
|
260
297
|
IterateOverFullSlotsImpl(c, slot_size, cb);
|
|
@@ -300,6 +337,69 @@ void PrepareInsertCommon(CommonFields& common) {
|
|
|
300
337
|
common.maybe_increment_generation_on_insert();
|
|
301
338
|
}
|
|
302
339
|
|
|
340
|
+
// Sets sanitizer poisoning for slot corresponding to control byte being set.
|
|
341
|
+
inline void DoSanitizeOnSetCtrl(const CommonFields& c, size_t i, ctrl_t h,
|
|
342
|
+
size_t slot_size) {
|
|
343
|
+
ABSL_SWISSTABLE_ASSERT(i < c.capacity());
|
|
344
|
+
auto* slot_i = static_cast<const char*>(c.slot_array()) + i * slot_size;
|
|
345
|
+
if (IsFull(h)) {
|
|
346
|
+
SanitizerUnpoisonMemoryRegion(slot_i, slot_size);
|
|
347
|
+
} else {
|
|
348
|
+
SanitizerPoisonMemoryRegion(slot_i, slot_size);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Sets `ctrl[i]` to `h`.
|
|
353
|
+
//
|
|
354
|
+
// Unlike setting it directly, this function will perform bounds checks and
|
|
355
|
+
// mirror the value to the cloned tail if necessary.
|
|
356
|
+
inline void SetCtrl(const CommonFields& c, size_t i, ctrl_t h,
|
|
357
|
+
size_t slot_size) {
|
|
358
|
+
ABSL_SWISSTABLE_ASSERT(!c.is_small());
|
|
359
|
+
DoSanitizeOnSetCtrl(c, i, h, slot_size);
|
|
360
|
+
ctrl_t* ctrl = c.control();
|
|
361
|
+
ctrl[i] = h;
|
|
362
|
+
ctrl[((i - NumClonedBytes()) & c.capacity()) +
|
|
363
|
+
(NumClonedBytes() & c.capacity())] = h;
|
|
364
|
+
}
|
|
365
|
+
// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`.
|
|
366
|
+
inline void SetCtrl(const CommonFields& c, size_t i, h2_t h, size_t slot_size) {
|
|
367
|
+
SetCtrl(c, i, static_cast<ctrl_t>(h), slot_size);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Like SetCtrl, but in a single group table, we can save some operations when
|
|
371
|
+
// setting the cloned control byte.
|
|
372
|
+
inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, ctrl_t h,
|
|
373
|
+
size_t slot_size) {
|
|
374
|
+
ABSL_SWISSTABLE_ASSERT(!c.is_small());
|
|
375
|
+
ABSL_SWISSTABLE_ASSERT(is_single_group(c.capacity()));
|
|
376
|
+
DoSanitizeOnSetCtrl(c, i, h, slot_size);
|
|
377
|
+
ctrl_t* ctrl = c.control();
|
|
378
|
+
ctrl[i] = h;
|
|
379
|
+
ctrl[i + c.capacity() + 1] = h;
|
|
380
|
+
}
|
|
381
|
+
// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`.
|
|
382
|
+
inline void SetCtrlInSingleGroupTable(const CommonFields& c, size_t i, h2_t h,
|
|
383
|
+
size_t slot_size) {
|
|
384
|
+
SetCtrlInSingleGroupTable(c, i, static_cast<ctrl_t>(h), slot_size);
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Like SetCtrl, but in a table with capacity >= Group::kWidth - 1,
|
|
388
|
+
// we can save some operations when setting the cloned control byte.
|
|
389
|
+
inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, ctrl_t h,
|
|
390
|
+
size_t slot_size) {
|
|
391
|
+
ABSL_SWISSTABLE_ASSERT(c.capacity() >= Group::kWidth - 1);
|
|
392
|
+
DoSanitizeOnSetCtrl(c, i, h, slot_size);
|
|
393
|
+
ctrl_t* ctrl = c.control();
|
|
394
|
+
ctrl[i] = h;
|
|
395
|
+
ctrl[((i - NumClonedBytes()) & c.capacity()) + NumClonedBytes()] = h;
|
|
396
|
+
}
|
|
397
|
+
// Overload for setting to an occupied `h2_t` rather than a special `ctrl_t`.
|
|
398
|
+
inline void SetCtrlInLargeTable(const CommonFields& c, size_t i, h2_t h,
|
|
399
|
+
size_t slot_size) {
|
|
400
|
+
SetCtrlInLargeTable(c, i, static_cast<ctrl_t>(h), slot_size);
|
|
401
|
+
}
|
|
402
|
+
|
|
303
403
|
size_t DropDeletesWithoutResizeAndPrepareInsert(
|
|
304
404
|
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
305
405
|
size_t new_hash) {
|
|
@@ -347,7 +447,7 @@ size_t DropDeletesWithoutResizeAndPrepareInsert(
|
|
|
347
447
|
continue;
|
|
348
448
|
}
|
|
349
449
|
if (!IsDeleted(ctrl[i])) continue;
|
|
350
|
-
const size_t hash = (*hasher)(hash_fn, slot_ptr);
|
|
450
|
+
const size_t hash = (*hasher)(hash_fn, slot_ptr, common.seed().seed());
|
|
351
451
|
const FindInfo target = find_first_non_full(common, hash);
|
|
352
452
|
const size_t new_i = target.offset;
|
|
353
453
|
total_probe_length += target.probe_length;
|
|
@@ -405,12 +505,12 @@ size_t DropDeletesWithoutResizeAndPrepareInsert(
|
|
|
405
505
|
ResetGrowthLeft(common);
|
|
406
506
|
FindInfo find_info = find_first_non_full(common, new_hash);
|
|
407
507
|
SetCtrlInLargeTable(common, find_info.offset, H2(new_hash), slot_size);
|
|
408
|
-
common.infoz().
|
|
508
|
+
common.infoz().RecordInsertMiss(new_hash, find_info.probe_length);
|
|
409
509
|
common.infoz().RecordRehash(total_probe_length);
|
|
410
510
|
return find_info.offset;
|
|
411
511
|
}
|
|
412
512
|
|
|
413
|
-
|
|
513
|
+
bool WasNeverFull(CommonFields& c, size_t index) {
|
|
414
514
|
if (is_single_group(c.capacity())) {
|
|
415
515
|
return true;
|
|
416
516
|
}
|
|
@@ -434,6 +534,7 @@ void ResetCtrl(CommonFields& common, size_t slot_size) {
|
|
|
434
534
|
ctrl_t* ctrl = common.control();
|
|
435
535
|
static constexpr size_t kTwoGroupCapacity = 2 * Group::kWidth - 1;
|
|
436
536
|
if (ABSL_PREDICT_TRUE(capacity <= kTwoGroupCapacity)) {
|
|
537
|
+
if (IsSmallCapacity(capacity)) return;
|
|
437
538
|
std::memset(ctrl, static_cast<int8_t>(ctrl_t::kEmpty), Group::kWidth);
|
|
438
539
|
std::memset(ctrl + capacity, static_cast<int8_t>(ctrl_t::kEmpty),
|
|
439
540
|
Group::kWidth);
|
|
@@ -449,38 +550,11 @@ void ResetCtrl(CommonFields& common, size_t slot_size) {
|
|
|
449
550
|
SanitizerPoisonMemoryRegion(common.slot_array(), slot_size * capacity);
|
|
450
551
|
}
|
|
451
552
|
|
|
452
|
-
// Initializes control bytes for
|
|
453
|
-
//
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
static_cast<uint8_t>(ctrl_t::kEmpty) ^
|
|
458
|
-
static_cast<uint8_t>(ctrl_t::kSentinel);
|
|
459
|
-
static constexpr uint64_t kEmpty64 = static_cast<uint8_t>(ctrl_t::kEmpty);
|
|
460
|
-
// The first 8 bytes, where present slot positions are replaced with 0.
|
|
461
|
-
static constexpr uint64_t kFirstCtrlBytesWithZeroes =
|
|
462
|
-
k8EmptyBytes ^ kEmpty64 ^ (kEmptyXorSentinel << 8) ^ (kEmpty64 << 16);
|
|
463
|
-
|
|
464
|
-
// Fill the original 0th and mirrored 2nd bytes with the hash.
|
|
465
|
-
// Result will look like:
|
|
466
|
-
// HSHEEEEE
|
|
467
|
-
// Where H = h2, E = kEmpty, S = kSentinel.
|
|
468
|
-
const uint64_t first_ctrl_bytes =
|
|
469
|
-
(h2 | kFirstCtrlBytesWithZeroes) | (h2 << 16);
|
|
470
|
-
// Fill last bytes with kEmpty.
|
|
471
|
-
std::memset(new_ctrl + 1, static_cast<int8_t>(ctrl_t::kEmpty), Group::kWidth);
|
|
472
|
-
// Overwrite the first 3 bytes with HSH. Other bytes will not be changed.
|
|
473
|
-
absl::little_endian::Store64(new_ctrl, first_ctrl_bytes);
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
// Initializes control bytes for growing after SOO to the next capacity.
|
|
477
|
-
// `soo_ctrl` is placed in the position `SooSlotIndex()`.
|
|
478
|
-
// `new_hash` is placed in the position `new_offset`.
|
|
479
|
-
// The table must be non-empty SOO.
|
|
480
|
-
ABSL_ATTRIBUTE_ALWAYS_INLINE inline void
|
|
481
|
-
InitializeThreeElementsControlBytesAfterSoo(ctrl_t soo_ctrl, size_t new_hash,
|
|
482
|
-
size_t new_offset,
|
|
483
|
-
ctrl_t* new_ctrl) {
|
|
553
|
+
// Initializes control bytes for growing from capacity 1 to 3.
|
|
554
|
+
// `orig_h2` is placed in the position `SooSlotIndex()`.
|
|
555
|
+
// `new_h2` is placed in the position `new_offset`.
|
|
556
|
+
ABSL_ATTRIBUTE_ALWAYS_INLINE inline void InitializeThreeElementsControlBytes(
|
|
557
|
+
h2_t orig_h2, h2_t new_h2, size_t new_offset, ctrl_t* new_ctrl) {
|
|
484
558
|
static constexpr size_t kNewCapacity = NextCapacity(SooCapacity());
|
|
485
559
|
static_assert(kNewCapacity == 3);
|
|
486
560
|
static_assert(is_single_group(kNewCapacity));
|
|
@@ -501,9 +575,9 @@ InitializeThreeElementsControlBytesAfterSoo(ctrl_t soo_ctrl, size_t new_hash,
|
|
|
501
575
|
(kEmptyXorSentinel << (8 * kNewCapacity)) ^
|
|
502
576
|
(kEmpty64 << (8 * kMirroredSooSlotIndex));
|
|
503
577
|
|
|
504
|
-
const uint64_t soo_h2 = static_cast<uint64_t>(
|
|
505
|
-
const uint64_t new_h2_xor_empty =
|
|
506
|
-
|
|
578
|
+
const uint64_t soo_h2 = static_cast<uint64_t>(orig_h2);
|
|
579
|
+
const uint64_t new_h2_xor_empty =
|
|
580
|
+
static_cast<uint64_t>(new_h2 ^ static_cast<uint8_t>(ctrl_t::kEmpty));
|
|
507
581
|
// Fill the original and mirrored bytes for SOO slot.
|
|
508
582
|
// Result will look like:
|
|
509
583
|
// EHESEHEE
|
|
@@ -542,13 +616,44 @@ InitializeThreeElementsControlBytesAfterSoo(ctrl_t soo_ctrl, size_t new_hash,
|
|
|
542
616
|
// new_ctrl after 2nd store = EHNSEHNEEEE
|
|
543
617
|
}
|
|
544
618
|
|
|
619
|
+
// ClearBackingArrayNoReuse clears the backing array and sets the common
|
|
620
|
+
// fields to the default values for empty non-allocated tables.
|
|
621
|
+
// REQUIRES: c.capacity > policy.soo_capacity.
|
|
622
|
+
void ClearBackingArrayNoReuse(CommonFields& c,
|
|
623
|
+
const PolicyFunctions& __restrict policy,
|
|
624
|
+
void* alloc) {
|
|
625
|
+
ABSL_SWISSTABLE_ASSERT(c.capacity() > policy.soo_capacity());
|
|
626
|
+
// We need to record infoz before calling dealloc, which will unregister
|
|
627
|
+
// infoz.
|
|
628
|
+
c.infoz().RecordClearedReservation();
|
|
629
|
+
c.infoz().RecordStorageChanged(0, policy.soo_capacity());
|
|
630
|
+
c.infoz().Unregister();
|
|
631
|
+
(*policy.dealloc)(alloc, c.capacity(), c.control(), policy.slot_size,
|
|
632
|
+
policy.slot_align, c.has_infoz());
|
|
633
|
+
c = policy.soo_enabled ? CommonFields{soo_tag_t{}}
|
|
634
|
+
: CommonFields{non_soo_tag_t{}};
|
|
635
|
+
}
|
|
636
|
+
|
|
545
637
|
} // namespace
|
|
546
638
|
|
|
547
|
-
void
|
|
548
|
-
ABSL_SWISSTABLE_ASSERT(
|
|
549
|
-
|
|
639
|
+
void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size) {
|
|
640
|
+
ABSL_SWISSTABLE_ASSERT(c.is_small());
|
|
641
|
+
if (soo_enabled) {
|
|
642
|
+
c.set_empty_soo();
|
|
643
|
+
return;
|
|
644
|
+
}
|
|
550
645
|
c.decrement_size();
|
|
551
646
|
c.infoz().RecordErase();
|
|
647
|
+
SanitizerPoisonMemoryRegion(c.slot_array(), slot_size);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
void EraseMetaOnlyLarge(CommonFields& c, const ctrl_t* ctrl, size_t slot_size) {
|
|
651
|
+
ABSL_SWISSTABLE_ASSERT(!c.is_small());
|
|
652
|
+
ABSL_SWISSTABLE_ASSERT(IsFull(*ctrl) && "erasing a dangling iterator");
|
|
653
|
+
c.decrement_size();
|
|
654
|
+
c.infoz().RecordErase();
|
|
655
|
+
|
|
656
|
+
size_t index = static_cast<size_t>(ctrl - c.control());
|
|
552
657
|
|
|
553
658
|
if (WasNeverFull(c, index)) {
|
|
554
659
|
SetCtrl(c, index, ctrl_t::kEmpty, slot_size);
|
|
@@ -562,22 +667,15 @@ void EraseMetaOnly(CommonFields& c, size_t index, size_t slot_size) {
|
|
|
562
667
|
|
|
563
668
|
void ClearBackingArray(CommonFields& c,
|
|
564
669
|
const PolicyFunctions& __restrict policy, void* alloc,
|
|
565
|
-
bool reuse
|
|
670
|
+
bool reuse) {
|
|
671
|
+
ABSL_SWISSTABLE_ASSERT(c.capacity() > MaxSmallCapacity());
|
|
566
672
|
if (reuse) {
|
|
567
673
|
c.set_size_to_zero();
|
|
568
|
-
ABSL_SWISSTABLE_ASSERT(!soo_enabled || c.capacity() > SooCapacity());
|
|
569
674
|
ResetCtrl(c, policy.slot_size);
|
|
570
675
|
ResetGrowthLeft(c);
|
|
571
676
|
c.infoz().RecordStorageChanged(0, c.capacity());
|
|
572
677
|
} else {
|
|
573
|
-
|
|
574
|
-
// infoz.
|
|
575
|
-
c.infoz().RecordClearedReservation();
|
|
576
|
-
c.infoz().RecordStorageChanged(0, soo_enabled ? SooCapacity() : 0);
|
|
577
|
-
c.infoz().Unregister();
|
|
578
|
-
(*policy.dealloc)(alloc, c.capacity(), c.control(), policy.slot_size,
|
|
579
|
-
policy.slot_align, c.has_infoz());
|
|
580
|
-
c = soo_enabled ? CommonFields{soo_tag_t{}} : CommonFields{non_soo_tag_t{}};
|
|
678
|
+
ClearBackingArrayNoReuse(c, policy, alloc);
|
|
581
679
|
}
|
|
582
680
|
}
|
|
583
681
|
|
|
@@ -599,15 +697,25 @@ size_t FindNewPositionsAndTransferSlots(
|
|
|
599
697
|
void* new_slots = common.slot_array();
|
|
600
698
|
const void* hash_fn = policy.hash_fn(common);
|
|
601
699
|
const size_t slot_size = policy.slot_size;
|
|
700
|
+
const size_t seed = common.seed().seed();
|
|
602
701
|
|
|
603
702
|
const auto insert_slot = [&](void* slot) {
|
|
604
|
-
size_t hash = policy.hash_slot(hash_fn, slot);
|
|
605
|
-
|
|
606
|
-
|
|
703
|
+
size_t hash = policy.hash_slot(hash_fn, slot, seed);
|
|
704
|
+
FindInfo target;
|
|
705
|
+
if (common.is_small()) {
|
|
706
|
+
target = FindInfo{0, 0};
|
|
707
|
+
} else {
|
|
708
|
+
target = find_first_non_full(common, hash);
|
|
709
|
+
SetCtrl(common, target.offset, H2(hash), slot_size);
|
|
710
|
+
}
|
|
607
711
|
policy.transfer_n(&common, SlotAddress(new_slots, target.offset, slot_size),
|
|
608
712
|
slot, 1);
|
|
609
713
|
return target.probe_length;
|
|
610
714
|
};
|
|
715
|
+
if (IsSmallCapacity(old_capacity)) {
|
|
716
|
+
if (common.size() == 1) insert_slot(old_slots);
|
|
717
|
+
return 0;
|
|
718
|
+
}
|
|
611
719
|
size_t total_probe_length = 0;
|
|
612
720
|
for (size_t i = 0; i < old_capacity; ++i) {
|
|
613
721
|
if (IsFull(old_ctrl[i])) {
|
|
@@ -618,6 +726,75 @@ size_t FindNewPositionsAndTransferSlots(
|
|
|
618
726
|
return total_probe_length;
|
|
619
727
|
}
|
|
620
728
|
|
|
729
|
+
void ReportGrowthToInfozImpl(CommonFields& common, HashtablezInfoHandle infoz,
|
|
730
|
+
size_t hash, size_t total_probe_length,
|
|
731
|
+
size_t distance_from_desired) {
|
|
732
|
+
ABSL_SWISSTABLE_ASSERT(infoz.IsSampled());
|
|
733
|
+
infoz.RecordStorageChanged(common.size() - 1, common.capacity());
|
|
734
|
+
infoz.RecordRehash(total_probe_length);
|
|
735
|
+
infoz.RecordInsertMiss(hash, distance_from_desired);
|
|
736
|
+
common.set_has_infoz();
|
|
737
|
+
// TODO(b/413062340): we could potentially store infoz in place of the
|
|
738
|
+
// control pointer for the capacity 1 case.
|
|
739
|
+
common.set_infoz(infoz);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// Specialization to avoid passing two 0s from hot function.
|
|
743
|
+
ABSL_ATTRIBUTE_NOINLINE void ReportSingleGroupTableGrowthToInfoz(
|
|
744
|
+
CommonFields& common, HashtablezInfoHandle infoz, size_t hash) {
|
|
745
|
+
ReportGrowthToInfozImpl(common, infoz, hash, /*total_probe_length=*/0,
|
|
746
|
+
/*distance_from_desired=*/0);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
ABSL_ATTRIBUTE_NOINLINE void ReportGrowthToInfoz(CommonFields& common,
|
|
750
|
+
HashtablezInfoHandle infoz,
|
|
751
|
+
size_t hash,
|
|
752
|
+
size_t total_probe_length,
|
|
753
|
+
size_t distance_from_desired) {
|
|
754
|
+
ReportGrowthToInfozImpl(common, infoz, hash, total_probe_length,
|
|
755
|
+
distance_from_desired);
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
ABSL_ATTRIBUTE_NOINLINE void ReportResizeToInfoz(CommonFields& common,
|
|
759
|
+
HashtablezInfoHandle infoz,
|
|
760
|
+
size_t total_probe_length) {
|
|
761
|
+
ABSL_SWISSTABLE_ASSERT(infoz.IsSampled());
|
|
762
|
+
infoz.RecordStorageChanged(common.size(), common.capacity());
|
|
763
|
+
infoz.RecordRehash(total_probe_length);
|
|
764
|
+
common.set_has_infoz();
|
|
765
|
+
common.set_infoz(infoz);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
struct BackingArrayPtrs {
|
|
769
|
+
ctrl_t* ctrl;
|
|
770
|
+
void* slots;
|
|
771
|
+
};
|
|
772
|
+
|
|
773
|
+
BackingArrayPtrs AllocBackingArray(CommonFields& common,
|
|
774
|
+
const PolicyFunctions& __restrict policy,
|
|
775
|
+
size_t new_capacity, bool has_infoz,
|
|
776
|
+
void* alloc) {
|
|
777
|
+
RawHashSetLayout layout(new_capacity, policy.slot_size, policy.slot_align,
|
|
778
|
+
has_infoz);
|
|
779
|
+
// Perform a direct call in the common case to allow for profile-guided
|
|
780
|
+
// heap optimization (PGHO) to understand which allocation function is used.
|
|
781
|
+
constexpr size_t kDefaultAlignment = BackingArrayAlignment(alignof(size_t));
|
|
782
|
+
char* mem = static_cast<char*>(
|
|
783
|
+
ABSL_PREDICT_TRUE(
|
|
784
|
+
policy.alloc ==
|
|
785
|
+
(&AllocateBackingArray<kDefaultAlignment, std::allocator<char>>))
|
|
786
|
+
? AllocateBackingArray<kDefaultAlignment, std::allocator<char>>(
|
|
787
|
+
alloc, layout.alloc_size())
|
|
788
|
+
: policy.alloc(alloc, layout.alloc_size()));
|
|
789
|
+
const GenerationType old_generation = common.generation();
|
|
790
|
+
common.set_generation_ptr(
|
|
791
|
+
reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
|
|
792
|
+
common.set_generation(NextGeneration(old_generation));
|
|
793
|
+
|
|
794
|
+
return {reinterpret_cast<ctrl_t*>(mem + layout.control_offset()),
|
|
795
|
+
mem + layout.slot_offset()};
|
|
796
|
+
}
|
|
797
|
+
|
|
621
798
|
template <ResizeNonSooMode kMode>
|
|
622
799
|
void ResizeNonSooImpl(CommonFields& common,
|
|
623
800
|
const PolicyFunctions& __restrict policy,
|
|
@@ -625,26 +802,25 @@ void ResizeNonSooImpl(CommonFields& common,
|
|
|
625
802
|
ABSL_SWISSTABLE_ASSERT(IsValidCapacity(new_capacity));
|
|
626
803
|
ABSL_SWISSTABLE_ASSERT(new_capacity > policy.soo_capacity());
|
|
627
804
|
|
|
628
|
-
const size_t old_capacity = common.capacity();
|
|
629
|
-
[[maybe_unused]] ctrl_t* old_ctrl
|
|
630
|
-
[[maybe_unused]] void* old_slots
|
|
805
|
+
[[maybe_unused]] const size_t old_capacity = common.capacity();
|
|
806
|
+
[[maybe_unused]] ctrl_t* old_ctrl;
|
|
807
|
+
[[maybe_unused]] void* old_slots;
|
|
808
|
+
if constexpr (kMode == ResizeNonSooMode::kGuaranteedAllocated) {
|
|
809
|
+
old_ctrl = common.control();
|
|
810
|
+
old_slots = common.slot_array();
|
|
811
|
+
}
|
|
631
812
|
|
|
632
813
|
const size_t slot_size = policy.slot_size;
|
|
633
|
-
const size_t slot_align = policy.slot_align;
|
|
814
|
+
[[maybe_unused]] const size_t slot_align = policy.slot_align;
|
|
634
815
|
const bool has_infoz = infoz.IsSampled();
|
|
635
|
-
|
|
636
|
-
common.set_capacity(new_capacity);
|
|
637
|
-
RawHashSetLayout layout(new_capacity, slot_size, slot_align, has_infoz);
|
|
638
816
|
void* alloc = policy.get_char_alloc(common);
|
|
639
|
-
char* mem = static_cast<char*>(policy.alloc(alloc, layout.alloc_size()));
|
|
640
|
-
const GenerationType old_generation = common.generation();
|
|
641
|
-
common.set_generation_ptr(
|
|
642
|
-
reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
|
|
643
|
-
common.set_generation(NextGeneration(old_generation));
|
|
644
817
|
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
818
|
+
common.set_capacity(new_capacity);
|
|
819
|
+
const auto [new_ctrl, new_slots] =
|
|
820
|
+
AllocBackingArray(common, policy, new_capacity, has_infoz, alloc);
|
|
821
|
+
common.set_control(new_ctrl);
|
|
822
|
+
common.set_slots(new_slots);
|
|
823
|
+
common.generate_new_seed(has_infoz);
|
|
648
824
|
|
|
649
825
|
size_t total_probe_length = 0;
|
|
650
826
|
ResetCtrl(common, slot_size);
|
|
@@ -657,18 +833,19 @@ void ResizeNonSooImpl(CommonFields& common,
|
|
|
657
833
|
common, policy, old_ctrl, old_slots, old_capacity);
|
|
658
834
|
(*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align,
|
|
659
835
|
has_infoz);
|
|
660
|
-
|
|
661
|
-
|
|
836
|
+
if (HasGrowthInfoForCapacity(new_capacity)) {
|
|
837
|
+
ResetGrowthLeft(GetGrowthInfoFromControl(new_ctrl), new_capacity,
|
|
838
|
+
common.size());
|
|
839
|
+
}
|
|
662
840
|
} else {
|
|
663
|
-
|
|
664
|
-
|
|
841
|
+
if (HasGrowthInfoForCapacity(new_capacity)) {
|
|
842
|
+
GetGrowthInfoFromControl(new_ctrl).InitGrowthLeftNoDeleted(
|
|
843
|
+
CapacityToGrowth(new_capacity));
|
|
844
|
+
}
|
|
665
845
|
}
|
|
666
846
|
|
|
667
|
-
if (has_infoz) {
|
|
668
|
-
common
|
|
669
|
-
infoz.RecordStorageChanged(common.size(), new_capacity);
|
|
670
|
-
infoz.RecordRehash(total_probe_length);
|
|
671
|
-
common.set_infoz(infoz);
|
|
847
|
+
if (ABSL_PREDICT_FALSE(has_infoz)) {
|
|
848
|
+
ReportResizeToInfoz(common, infoz, total_probe_length);
|
|
672
849
|
}
|
|
673
850
|
}
|
|
674
851
|
|
|
@@ -697,23 +874,26 @@ void ResizeEmptyNonAllocatedTableImpl(CommonFields& common,
|
|
|
697
874
|
// It is rare to resize an SOO table with one element to a large size.
|
|
698
875
|
// Requires: `c` contains SOO data.
|
|
699
876
|
void InsertOldSooSlotAndInitializeControlBytes(
|
|
700
|
-
CommonFields& c, const PolicyFunctions& __restrict policy,
|
|
701
|
-
|
|
877
|
+
CommonFields& c, const PolicyFunctions& __restrict policy, ctrl_t* new_ctrl,
|
|
878
|
+
void* new_slots, bool has_infoz) {
|
|
702
879
|
ABSL_SWISSTABLE_ASSERT(c.size() == policy.soo_capacity());
|
|
703
880
|
ABSL_SWISSTABLE_ASSERT(policy.soo_enabled);
|
|
704
881
|
size_t new_capacity = c.capacity();
|
|
705
882
|
|
|
706
|
-
c.generate_new_seed();
|
|
707
|
-
|
|
883
|
+
c.generate_new_seed(has_infoz);
|
|
884
|
+
|
|
885
|
+
const size_t soo_slot_hash =
|
|
886
|
+
policy.hash_slot(policy.hash_fn(c), c.soo_data(), c.seed().seed());
|
|
887
|
+
size_t offset = probe(c.capacity_impl(), soo_slot_hash).offset();
|
|
708
888
|
offset = offset == new_capacity ? 0 : offset;
|
|
709
889
|
SanitizerPoisonMemoryRegion(new_slots, policy.slot_size * new_capacity);
|
|
710
890
|
void* target_slot = SlotAddress(new_slots, offset, policy.slot_size);
|
|
711
891
|
SanitizerUnpoisonMemoryRegion(target_slot, policy.slot_size);
|
|
712
892
|
policy.transfer_n(&c, target_slot, c.soo_data(), 1);
|
|
713
|
-
c.set_control
|
|
893
|
+
c.set_control(new_ctrl);
|
|
714
894
|
c.set_slots(new_slots);
|
|
715
895
|
ResetCtrl(c, policy.slot_size);
|
|
716
|
-
SetCtrl(c, offset, H2(
|
|
896
|
+
SetCtrl(c, offset, H2(soo_slot_hash), policy.slot_size);
|
|
717
897
|
}
|
|
718
898
|
|
|
719
899
|
enum class ResizeFullSooTableSamplingMode {
|
|
@@ -739,9 +919,10 @@ void ResizeFullSooTable(CommonFields& common,
|
|
|
739
919
|
ResizeFullSooTableSamplingMode sampling_mode) {
|
|
740
920
|
AssertFullSoo(common, policy);
|
|
741
921
|
const size_t slot_size = policy.slot_size;
|
|
742
|
-
|
|
922
|
+
void* alloc = policy.get_char_alloc(common);
|
|
743
923
|
|
|
744
924
|
HashtablezInfoHandle infoz;
|
|
925
|
+
bool has_infoz = false;
|
|
745
926
|
if (sampling_mode ==
|
|
746
927
|
ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled) {
|
|
747
928
|
if (ABSL_PREDICT_FALSE(policy.is_hashtablez_eligible)) {
|
|
@@ -749,33 +930,19 @@ void ResizeFullSooTable(CommonFields& common,
|
|
|
749
930
|
policy.soo_capacity());
|
|
750
931
|
}
|
|
751
932
|
|
|
752
|
-
if (!infoz.IsSampled())
|
|
753
|
-
|
|
754
|
-
}
|
|
933
|
+
if (!infoz.IsSampled()) return;
|
|
934
|
+
has_infoz = true;
|
|
755
935
|
}
|
|
756
936
|
|
|
757
|
-
const bool has_infoz = infoz.IsSampled();
|
|
758
|
-
|
|
759
937
|
common.set_capacity(new_capacity);
|
|
760
938
|
|
|
761
|
-
RawHashSetLayout layout(new_capacity, slot_size, slot_align, has_infoz);
|
|
762
|
-
void* alloc = policy.get_char_alloc(common);
|
|
763
|
-
char* mem = static_cast<char*>(policy.alloc(alloc, layout.alloc_size()));
|
|
764
|
-
const GenerationType old_generation = common.generation();
|
|
765
|
-
common.set_generation_ptr(
|
|
766
|
-
reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
|
|
767
|
-
common.set_generation(NextGeneration(old_generation));
|
|
768
|
-
|
|
769
939
|
// We do not set control and slots in CommonFields yet to avoid overriding
|
|
770
940
|
// SOO data.
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
const size_t soo_slot_hash =
|
|
775
|
-
policy.hash_slot(policy.hash_fn(common), common.soo_data());
|
|
941
|
+
const auto [new_ctrl, new_slots] =
|
|
942
|
+
AllocBackingArray(common, policy, new_capacity, has_infoz, alloc);
|
|
776
943
|
|
|
777
|
-
InsertOldSooSlotAndInitializeControlBytes(common, policy,
|
|
778
|
-
|
|
944
|
+
InsertOldSooSlotAndInitializeControlBytes(common, policy, new_ctrl, new_slots,
|
|
945
|
+
has_infoz);
|
|
779
946
|
ResetGrowthLeft(common);
|
|
780
947
|
if (has_infoz) {
|
|
781
948
|
common.set_has_infoz();
|
|
@@ -853,7 +1020,7 @@ void GrowIntoSingleGroupShuffleControlBytes(ctrl_t* __restrict old_ctrl,
|
|
|
853
1020
|
return;
|
|
854
1021
|
}
|
|
855
1022
|
|
|
856
|
-
ABSL_SWISSTABLE_ASSERT(Group::kWidth == 16);
|
|
1023
|
+
ABSL_SWISSTABLE_ASSERT(Group::kWidth == 16); // NOLINT(misc-static-assert)
|
|
857
1024
|
|
|
858
1025
|
// Fill the second half of the main control bytes with kEmpty.
|
|
859
1026
|
// For small capacity that may write into mirrored control bytes.
|
|
@@ -920,7 +1087,7 @@ template <typename ProbedItem>
|
|
|
920
1087
|
ABSL_ATTRIBUTE_NOINLINE size_t DecodeAndInsertImpl(
|
|
921
1088
|
CommonFields& c, const PolicyFunctions& __restrict policy,
|
|
922
1089
|
const ProbedItem* start, const ProbedItem* end, void* old_slots) {
|
|
923
|
-
const
|
|
1090
|
+
const HashtableCapacity new_capacity = c.capacity_impl();
|
|
924
1091
|
|
|
925
1092
|
void* new_slots = c.slot_array();
|
|
926
1093
|
ctrl_t* new_ctrl = c.control();
|
|
@@ -935,8 +1102,8 @@ ABSL_ATTRIBUTE_NOINLINE size_t DecodeAndInsertImpl(
|
|
|
935
1102
|
total_probe_length += target.probe_length;
|
|
936
1103
|
const size_t old_index = static_cast<size_t>(start->source_offset);
|
|
937
1104
|
const size_t new_i = target.offset;
|
|
938
|
-
ABSL_SWISSTABLE_ASSERT(old_index < new_capacity / 2);
|
|
939
|
-
ABSL_SWISSTABLE_ASSERT(new_i < new_capacity);
|
|
1105
|
+
ABSL_SWISSTABLE_ASSERT(old_index < new_capacity.capacity() / 2);
|
|
1106
|
+
ABSL_SWISSTABLE_ASSERT(new_i < new_capacity.capacity());
|
|
940
1107
|
ABSL_SWISSTABLE_ASSERT(IsEmpty(new_ctrl[new_i]));
|
|
941
1108
|
void* src_slot = SlotAddress(old_slots, old_index, slot_size);
|
|
942
1109
|
void* dst_slot = SlotAddress(new_slots, new_i, slot_size);
|
|
@@ -965,12 +1132,13 @@ ABSL_ATTRIBUTE_NOINLINE size_t ProcessProbedMarkedElements(
|
|
|
965
1132
|
const void* hash_fn = policy.hash_fn(c);
|
|
966
1133
|
auto hash_slot = policy.hash_slot;
|
|
967
1134
|
auto transfer_n = policy.transfer_n;
|
|
1135
|
+
const size_t seed = c.seed().seed();
|
|
968
1136
|
for (size_t old_index = start; old_index < old_capacity; ++old_index) {
|
|
969
1137
|
if (old_ctrl[old_index] != ctrl_t::kSentinel) {
|
|
970
1138
|
continue;
|
|
971
1139
|
}
|
|
972
1140
|
void* src_slot = SlotAddress(old_slots, old_index, slot_size);
|
|
973
|
-
const size_t hash = hash_slot(hash_fn, src_slot);
|
|
1141
|
+
const size_t hash = hash_slot(hash_fn, src_slot, seed);
|
|
974
1142
|
const FindInfo target = find_first_non_full(c, hash);
|
|
975
1143
|
total_probe_length += target.probe_length;
|
|
976
1144
|
const size_t new_i = target.offset;
|
|
@@ -1062,7 +1230,8 @@ class ProbedItemEncoder {
|
|
|
1062
1230
|
|
|
1063
1231
|
ProbedItem* OverflowBufferStart() const {
|
|
1064
1232
|
// We reuse GrowthInfo memory as well.
|
|
1065
|
-
return AlignToNextItem(control_ - ControlOffset(/*has_infoz=*/false
|
|
1233
|
+
return AlignToNextItem(control_ - ControlOffset(/*has_infoz=*/false,
|
|
1234
|
+
/*has_growth_info=*/true));
|
|
1066
1235
|
}
|
|
1067
1236
|
|
|
1068
1237
|
// Encodes item when previously allocated buffer is full.
|
|
@@ -1224,6 +1393,79 @@ size_t GrowToNextCapacityDispatch(CommonFields& common,
|
|
|
1224
1393
|
}
|
|
1225
1394
|
}
|
|
1226
1395
|
|
|
1396
|
+
void IncrementSmallSizeNonSoo(CommonFields& common,
|
|
1397
|
+
const PolicyFunctions& __restrict policy) {
|
|
1398
|
+
ABSL_SWISSTABLE_ASSERT(common.is_small());
|
|
1399
|
+
common.increment_size();
|
|
1400
|
+
SanitizerUnpoisonMemoryRegion(common.slot_array(), policy.slot_size);
|
|
1401
|
+
}
|
|
1402
|
+
|
|
1403
|
+
void IncrementSmallSize(CommonFields& common,
|
|
1404
|
+
const PolicyFunctions& __restrict policy) {
|
|
1405
|
+
ABSL_SWISSTABLE_ASSERT(common.is_small());
|
|
1406
|
+
if (policy.soo_enabled) {
|
|
1407
|
+
common.set_full_soo();
|
|
1408
|
+
} else {
|
|
1409
|
+
IncrementSmallSizeNonSoo(common, policy);
|
|
1410
|
+
}
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
std::pair<ctrl_t*, void*> Grow1To3AndPrepareInsert(
|
|
1414
|
+
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1415
|
+
absl::FunctionRef<size_t(size_t)> get_hash) {
|
|
1416
|
+
// TODO(b/413062340): Refactor to reuse more code with
|
|
1417
|
+
// GrowSooTableToNextCapacityAndPrepareInsert.
|
|
1418
|
+
ABSL_SWISSTABLE_ASSERT(common.capacity() == 1);
|
|
1419
|
+
ABSL_SWISSTABLE_ASSERT(!common.empty());
|
|
1420
|
+
ABSL_SWISSTABLE_ASSERT(!policy.soo_enabled);
|
|
1421
|
+
constexpr size_t kOldCapacity = 1;
|
|
1422
|
+
constexpr size_t kNewCapacity = NextCapacity(kOldCapacity);
|
|
1423
|
+
ctrl_t* old_ctrl = common.control();
|
|
1424
|
+
void* old_slots = common.slot_array();
|
|
1425
|
+
|
|
1426
|
+
const size_t slot_size = policy.slot_size;
|
|
1427
|
+
const size_t slot_align = policy.slot_align;
|
|
1428
|
+
void* alloc = policy.get_char_alloc(common);
|
|
1429
|
+
HashtablezInfoHandle infoz = common.infoz();
|
|
1430
|
+
const bool has_infoz = infoz.IsSampled();
|
|
1431
|
+
common.set_capacity(kNewCapacity);
|
|
1432
|
+
|
|
1433
|
+
const auto [new_ctrl, new_slots] =
|
|
1434
|
+
AllocBackingArray(common, policy, kNewCapacity, has_infoz, alloc);
|
|
1435
|
+
common.set_control(new_ctrl);
|
|
1436
|
+
common.set_slots(new_slots);
|
|
1437
|
+
SanitizerPoisonMemoryRegion(new_slots, kNewCapacity * slot_size);
|
|
1438
|
+
|
|
1439
|
+
if (ABSL_PREDICT_TRUE(!has_infoz)) {
|
|
1440
|
+
// When we're sampled, we already have a seed.
|
|
1441
|
+
common.generate_new_seed(/*has_infoz=*/false);
|
|
1442
|
+
}
|
|
1443
|
+
const size_t new_hash = get_hash(common.seed().seed());
|
|
1444
|
+
h2_t new_h2 = H2(new_hash);
|
|
1445
|
+
size_t orig_hash =
|
|
1446
|
+
policy.hash_slot(policy.hash_fn(common), old_slots, common.seed().seed());
|
|
1447
|
+
size_t offset = Resize1To3NewOffset(new_hash, common.seed());
|
|
1448
|
+
InitializeThreeElementsControlBytes(H2(orig_hash), new_h2, offset, new_ctrl);
|
|
1449
|
+
|
|
1450
|
+
void* old_element_target = NextSlot(new_slots, slot_size);
|
|
1451
|
+
SanitizerUnpoisonMemoryRegion(old_element_target, slot_size);
|
|
1452
|
+
policy.transfer_n(&common, old_element_target, old_slots, 1);
|
|
1453
|
+
|
|
1454
|
+
void* new_element_target_slot = SlotAddress(new_slots, offset, slot_size);
|
|
1455
|
+
SanitizerUnpoisonMemoryRegion(new_element_target_slot, slot_size);
|
|
1456
|
+
|
|
1457
|
+
policy.dealloc(alloc, kOldCapacity, old_ctrl, slot_size, slot_align,
|
|
1458
|
+
has_infoz);
|
|
1459
|
+
PrepareInsertCommon(common);
|
|
1460
|
+
ABSL_SWISSTABLE_ASSERT(common.size() == 2);
|
|
1461
|
+
GetGrowthInfoFromControl(new_ctrl).InitGrowthLeftNoDeleted(kNewCapacity - 2);
|
|
1462
|
+
|
|
1463
|
+
if (ABSL_PREDICT_FALSE(has_infoz)) {
|
|
1464
|
+
ReportSingleGroupTableGrowthToInfoz(common, infoz, new_hash);
|
|
1465
|
+
}
|
|
1466
|
+
return {new_ctrl + offset, new_element_target_slot};
|
|
1467
|
+
}
|
|
1468
|
+
|
|
1227
1469
|
// Grows to next capacity and prepares insert for the given new_hash.
|
|
1228
1470
|
// Returns the offset of the new element.
|
|
1229
1471
|
size_t GrowToNextCapacityAndPrepareInsert(
|
|
@@ -1231,98 +1473,120 @@ size_t GrowToNextCapacityAndPrepareInsert(
|
|
|
1231
1473
|
size_t new_hash) {
|
|
1232
1474
|
ABSL_SWISSTABLE_ASSERT(common.growth_left() == 0);
|
|
1233
1475
|
const size_t old_capacity = common.capacity();
|
|
1234
|
-
ABSL_SWISSTABLE_ASSERT(old_capacity
|
|
1235
|
-
|
|
1476
|
+
ABSL_SWISSTABLE_ASSERT(old_capacity > policy.soo_capacity());
|
|
1477
|
+
ABSL_SWISSTABLE_ASSERT(!IsSmallCapacity(old_capacity));
|
|
1236
1478
|
|
|
1237
1479
|
const size_t new_capacity = NextCapacity(old_capacity);
|
|
1238
|
-
ABSL_SWISSTABLE_ASSERT(IsValidCapacity(new_capacity));
|
|
1239
|
-
ABSL_SWISSTABLE_ASSERT(new_capacity > policy.soo_capacity());
|
|
1240
|
-
|
|
1241
1480
|
ctrl_t* old_ctrl = common.control();
|
|
1242
1481
|
void* old_slots = common.slot_array();
|
|
1243
1482
|
|
|
1244
1483
|
common.set_capacity(new_capacity);
|
|
1245
1484
|
const size_t slot_size = policy.slot_size;
|
|
1246
1485
|
const size_t slot_align = policy.slot_align;
|
|
1247
|
-
HashtablezInfoHandle infoz;
|
|
1248
|
-
if (old_capacity > 0) {
|
|
1249
|
-
infoz = common.infoz();
|
|
1250
|
-
} else {
|
|
1251
|
-
const bool should_sample =
|
|
1252
|
-
policy.is_hashtablez_eligible && ShouldSampleNextTable();
|
|
1253
|
-
if (ABSL_PREDICT_FALSE(should_sample)) {
|
|
1254
|
-
infoz = ForcedTrySample(slot_size, policy.key_size, policy.value_size,
|
|
1255
|
-
policy.soo_capacity());
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
const bool has_infoz = infoz.IsSampled();
|
|
1259
|
-
|
|
1260
|
-
RawHashSetLayout layout(new_capacity, slot_size, slot_align, has_infoz);
|
|
1261
1486
|
void* alloc = policy.get_char_alloc(common);
|
|
1262
|
-
|
|
1263
|
-
const
|
|
1264
|
-
common.set_generation_ptr(
|
|
1265
|
-
reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
|
|
1266
|
-
common.set_generation(NextGeneration(old_generation));
|
|
1487
|
+
HashtablezInfoHandle infoz = common.infoz();
|
|
1488
|
+
const bool has_infoz = infoz.IsSampled();
|
|
1267
1489
|
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
common.set_control
|
|
1490
|
+
const auto [new_ctrl, new_slots] =
|
|
1491
|
+
AllocBackingArray(common, policy, new_capacity, has_infoz, alloc);
|
|
1492
|
+
common.set_control(new_ctrl);
|
|
1271
1493
|
common.set_slots(new_slots);
|
|
1272
1494
|
SanitizerPoisonMemoryRegion(new_slots, new_capacity * slot_size);
|
|
1273
1495
|
|
|
1274
1496
|
h2_t new_h2 = H2(new_hash);
|
|
1275
1497
|
size_t total_probe_length = 0;
|
|
1276
1498
|
FindInfo find_info;
|
|
1277
|
-
if (
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1499
|
+
if (ABSL_PREDICT_TRUE(is_single_group(new_capacity))) {
|
|
1500
|
+
size_t offset;
|
|
1501
|
+
GrowIntoSingleGroupShuffleControlBytes(old_ctrl, old_capacity, new_ctrl,
|
|
1502
|
+
new_capacity);
|
|
1503
|
+
// We put the new element either at the beginning or at the end of the
|
|
1504
|
+
// table with approximately equal probability.
|
|
1505
|
+
offset =
|
|
1506
|
+
SingleGroupTableH1(new_hash, common.seed()) & 1 ? 0 : new_capacity - 1;
|
|
1507
|
+
|
|
1508
|
+
ABSL_SWISSTABLE_ASSERT(IsEmpty(new_ctrl[offset]));
|
|
1509
|
+
SetCtrlInSingleGroupTable(common, offset, new_h2, policy.slot_size);
|
|
1510
|
+
find_info = FindInfo{offset, 0};
|
|
1511
|
+
// Single group tables have all slots full on resize. So we can transfer
|
|
1512
|
+
// all slots without checking the control bytes.
|
|
1513
|
+
ABSL_SWISSTABLE_ASSERT(common.size() == old_capacity);
|
|
1514
|
+
void* target = NextSlot(new_slots, slot_size);
|
|
1515
|
+
SanitizerUnpoisonMemoryRegion(target, old_capacity * slot_size);
|
|
1516
|
+
policy.transfer_n(&common, target, old_slots, old_capacity);
|
|
1283
1517
|
} else {
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
// all slots without checking the control bytes.
|
|
1289
|
-
ABSL_SWISSTABLE_ASSERT(common.size() == old_capacity);
|
|
1290
|
-
auto* target = NextSlot(new_slots, slot_size);
|
|
1291
|
-
SanitizerUnpoisonMemoryRegion(target, old_capacity * slot_size);
|
|
1292
|
-
policy.transfer_n(&common, target, old_slots, old_capacity);
|
|
1293
|
-
// We put the new element either at the beginning or at the end of the
|
|
1294
|
-
// table with approximately equal probability.
|
|
1295
|
-
size_t offset = SingleGroupTableH1(new_hash, common.seed()) & 1
|
|
1296
|
-
? 0
|
|
1297
|
-
: new_capacity - 1;
|
|
1298
|
-
|
|
1299
|
-
ABSL_SWISSTABLE_ASSERT(IsEmpty(new_ctrl[offset]));
|
|
1300
|
-
SetCtrlInSingleGroupTable(common, offset, new_h2, policy.slot_size);
|
|
1301
|
-
find_info = FindInfo{offset, 0};
|
|
1302
|
-
} else {
|
|
1303
|
-
total_probe_length =
|
|
1304
|
-
GrowToNextCapacityDispatch(common, policy, old_ctrl, old_slots);
|
|
1305
|
-
find_info = find_first_non_full(common, new_hash);
|
|
1306
|
-
SetCtrlInLargeTable(common, find_info.offset, new_h2, policy.slot_size);
|
|
1307
|
-
}
|
|
1308
|
-
ABSL_SWISSTABLE_ASSERT(old_capacity > policy.soo_capacity());
|
|
1309
|
-
(*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align,
|
|
1310
|
-
has_infoz);
|
|
1518
|
+
total_probe_length =
|
|
1519
|
+
GrowToNextCapacityDispatch(common, policy, old_ctrl, old_slots);
|
|
1520
|
+
find_info = find_first_non_full(common, new_hash);
|
|
1521
|
+
SetCtrlInLargeTable(common, find_info.offset, new_h2, policy.slot_size);
|
|
1311
1522
|
}
|
|
1523
|
+
ABSL_SWISSTABLE_ASSERT(old_capacity > policy.soo_capacity());
|
|
1524
|
+
(*policy.dealloc)(alloc, old_capacity, old_ctrl, slot_size, slot_align,
|
|
1525
|
+
has_infoz);
|
|
1312
1526
|
PrepareInsertCommon(common);
|
|
1313
1527
|
ResetGrowthLeft(GetGrowthInfoFromControl(new_ctrl), new_capacity,
|
|
1314
1528
|
common.size());
|
|
1315
1529
|
|
|
1316
1530
|
if (ABSL_PREDICT_FALSE(has_infoz)) {
|
|
1317
|
-
common
|
|
1318
|
-
|
|
1319
|
-
infoz.RecordRehash(total_probe_length);
|
|
1320
|
-
infoz.RecordInsert(new_hash, find_info.probe_length);
|
|
1321
|
-
common.set_infoz(infoz);
|
|
1531
|
+
ReportGrowthToInfoz(common, infoz, new_hash, total_probe_length,
|
|
1532
|
+
find_info.probe_length);
|
|
1322
1533
|
}
|
|
1323
1534
|
return find_info.offset;
|
|
1324
1535
|
}
|
|
1325
1536
|
|
|
1537
|
+
} // namespace
|
|
1538
|
+
|
|
1539
|
+
std::pair<ctrl_t*, void*> PrepareInsertSmallNonSoo(
|
|
1540
|
+
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1541
|
+
absl::FunctionRef<size_t(size_t)> get_hash) {
|
|
1542
|
+
ABSL_SWISSTABLE_ASSERT(common.is_small());
|
|
1543
|
+
ABSL_SWISSTABLE_ASSERT(!policy.soo_enabled);
|
|
1544
|
+
if (common.capacity() == 1) {
|
|
1545
|
+
if (common.empty()) {
|
|
1546
|
+
IncrementSmallSizeNonSoo(common, policy);
|
|
1547
|
+
if (common.has_infoz()) {
|
|
1548
|
+
common.infoz().RecordInsertMiss(get_hash(common.seed().seed()),
|
|
1549
|
+
/*distance_from_desired=*/0);
|
|
1550
|
+
}
|
|
1551
|
+
return {SooControl(), common.slot_array()};
|
|
1552
|
+
} else {
|
|
1553
|
+
return Grow1To3AndPrepareInsert(common, policy, get_hash);
|
|
1554
|
+
}
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1557
|
+
// Growing from 0 to 1 capacity.
|
|
1558
|
+
ABSL_SWISSTABLE_ASSERT(common.capacity() == 0);
|
|
1559
|
+
constexpr size_t kNewCapacity = 1;
|
|
1560
|
+
|
|
1561
|
+
common.set_capacity(kNewCapacity);
|
|
1562
|
+
HashtablezInfoHandle infoz;
|
|
1563
|
+
const bool should_sample =
|
|
1564
|
+
policy.is_hashtablez_eligible && ShouldSampleNextTable();
|
|
1565
|
+
if (ABSL_PREDICT_FALSE(should_sample)) {
|
|
1566
|
+
infoz = ForcedTrySample(policy.slot_size, policy.key_size,
|
|
1567
|
+
policy.value_size, policy.soo_capacity());
|
|
1568
|
+
}
|
|
1569
|
+
const bool has_infoz = infoz.IsSampled();
|
|
1570
|
+
void* alloc = policy.get_char_alloc(common);
|
|
1571
|
+
|
|
1572
|
+
const auto [new_ctrl, new_slots] =
|
|
1573
|
+
AllocBackingArray(common, policy, kNewCapacity, has_infoz, alloc);
|
|
1574
|
+
common.set_control(new_ctrl);
|
|
1575
|
+
common.set_slots(new_slots);
|
|
1576
|
+
|
|
1577
|
+
static_assert(NextCapacity(0) == 1);
|
|
1578
|
+
PrepareInsertCommon(common);
|
|
1579
|
+
|
|
1580
|
+
if (ABSL_PREDICT_FALSE(has_infoz)) {
|
|
1581
|
+
common.generate_new_seed(/*has_infoz=*/true);
|
|
1582
|
+
ReportSingleGroupTableGrowthToInfoz(common, infoz,
|
|
1583
|
+
get_hash(common.seed().seed()));
|
|
1584
|
+
}
|
|
1585
|
+
return {SooControl(), new_slots};
|
|
1586
|
+
}
|
|
1587
|
+
|
|
1588
|
+
namespace {
|
|
1589
|
+
|
|
1326
1590
|
// Called whenever the table needs to vacate empty slots either by removing
|
|
1327
1591
|
// tombstones via rehash or growth to next capacity.
|
|
1328
1592
|
ABSL_ATTRIBUTE_NOINLINE
|
|
@@ -1382,11 +1646,11 @@ size_t RehashOrGrowToNextCapacityAndPrepareInsert(
|
|
|
1382
1646
|
}
|
|
1383
1647
|
}
|
|
1384
1648
|
|
|
1385
|
-
// Slow path for
|
|
1649
|
+
// Slow path for PrepareInsertLarge that is called when the table has deleted
|
|
1386
1650
|
// slots or need to be resized or rehashed.
|
|
1387
|
-
size_t
|
|
1388
|
-
|
|
1389
|
-
|
|
1651
|
+
size_t PrepareInsertLargeSlow(CommonFields& common,
|
|
1652
|
+
const PolicyFunctions& __restrict policy,
|
|
1653
|
+
size_t hash) {
|
|
1390
1654
|
const GrowthInfo growth_info = common.growth_info();
|
|
1391
1655
|
ABSL_SWISSTABLE_ASSERT(!growth_info.HasNoDeletedAndGrowthLeft());
|
|
1392
1656
|
if (ABSL_PREDICT_TRUE(growth_info.HasNoGrowthLeftAndNoDeleted())) {
|
|
@@ -1404,7 +1668,7 @@ size_t PrepareInsertNonSooSlow(CommonFields& common,
|
|
|
1404
1668
|
PrepareInsertCommon(common);
|
|
1405
1669
|
common.growth_info().OverwriteControlAsFull(common.control()[target.offset]);
|
|
1406
1670
|
SetCtrlInLargeTable(common, target.offset, H2(hash), policy.slot_size);
|
|
1407
|
-
common.infoz().
|
|
1671
|
+
common.infoz().RecordInsertMiss(hash, target.probe_length);
|
|
1408
1672
|
return target.offset;
|
|
1409
1673
|
}
|
|
1410
1674
|
|
|
@@ -1417,14 +1681,15 @@ size_t PrepareInsertNonSooSlow(CommonFields& common,
|
|
|
1417
1681
|
ABSL_ATTRIBUTE_NOINLINE size_t
|
|
1418
1682
|
GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert(
|
|
1419
1683
|
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1420
|
-
size_t
|
|
1684
|
+
absl::FunctionRef<size_t(size_t)> get_hash) {
|
|
1421
1685
|
ResizeEmptyNonAllocatedTableImpl(common, policy, NextCapacity(SooCapacity()),
|
|
1422
1686
|
/*force_infoz=*/true);
|
|
1423
1687
|
PrepareInsertCommon(common);
|
|
1424
1688
|
common.growth_info().OverwriteEmptyAsFull();
|
|
1689
|
+
const size_t new_hash = get_hash(common.seed().seed());
|
|
1425
1690
|
SetCtrlInSingleGroupTable(common, SooSlotIndex(), H2(new_hash),
|
|
1426
1691
|
policy.slot_size);
|
|
1427
|
-
common.infoz().
|
|
1692
|
+
common.infoz().RecordInsertMiss(new_hash, /*distance_from_desired=*/0);
|
|
1428
1693
|
return SooSlotIndex();
|
|
1429
1694
|
}
|
|
1430
1695
|
|
|
@@ -1437,7 +1702,7 @@ GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert(
|
|
|
1437
1702
|
void ReserveEmptyNonAllocatedTableToFitNewSize(
|
|
1438
1703
|
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1439
1704
|
size_t new_size) {
|
|
1440
|
-
ValidateMaxSize(new_size, policy.slot_size);
|
|
1705
|
+
ValidateMaxSize(new_size, policy.key_size, policy.slot_size);
|
|
1441
1706
|
ABSL_ASSUME(new_size > 0);
|
|
1442
1707
|
ResizeEmptyNonAllocatedTableImpl(common, policy, SizeToCapacity(new_size),
|
|
1443
1708
|
/*force_infoz=*/false);
|
|
@@ -1456,7 +1721,7 @@ ABSL_ATTRIBUTE_NOINLINE void ReserveAllocatedTable(
|
|
|
1456
1721
|
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1457
1722
|
size_t new_size) {
|
|
1458
1723
|
const size_t cap = common.capacity();
|
|
1459
|
-
ValidateMaxSize(new_size, policy.slot_size);
|
|
1724
|
+
ValidateMaxSize(new_size, policy.key_size, policy.slot_size);
|
|
1460
1725
|
ABSL_ASSUME(new_size > 0);
|
|
1461
1726
|
const size_t new_capacity = SizeToCapacity(new_size);
|
|
1462
1727
|
if (cap == policy.soo_capacity()) {
|
|
@@ -1471,6 +1736,17 @@ ABSL_ATTRIBUTE_NOINLINE void ReserveAllocatedTable(
|
|
|
1471
1736
|
common.infoz().RecordReservation(new_size);
|
|
1472
1737
|
}
|
|
1473
1738
|
|
|
1739
|
+
// As `ResizeFullSooTableToNextCapacity`, except that we also force the SOO
|
|
1740
|
+
// table to be sampled. SOO tables need to switch from SOO to heap in order to
|
|
1741
|
+
// store the infoz. No-op if sampling is disabled or not possible.
|
|
1742
|
+
void GrowFullSooTableToNextCapacityForceSampling(
|
|
1743
|
+
CommonFields& common, const PolicyFunctions& __restrict policy) {
|
|
1744
|
+
AssertFullSoo(common, policy);
|
|
1745
|
+
ResizeFullSooTable(
|
|
1746
|
+
common, policy, NextCapacity(SooCapacity()),
|
|
1747
|
+
ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled);
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1474
1750
|
} // namespace
|
|
1475
1751
|
|
|
1476
1752
|
void* GetRefForEmptyClass(CommonFields& common) {
|
|
@@ -1492,7 +1768,7 @@ void ReserveEmptyNonAllocatedTableToFitBucketCount(
|
|
|
1492
1768
|
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1493
1769
|
size_t bucket_count) {
|
|
1494
1770
|
size_t new_capacity = NormalizeCapacity(bucket_count);
|
|
1495
|
-
|
|
1771
|
+
ValidateMaxCapacity(new_capacity, policy.key_size, policy.slot_size);
|
|
1496
1772
|
ResizeEmptyNonAllocatedTableImpl(common, policy, new_capacity,
|
|
1497
1773
|
/*force_infoz=*/false);
|
|
1498
1774
|
}
|
|
@@ -1501,46 +1777,38 @@ void ReserveEmptyNonAllocatedTableToFitBucketCount(
|
|
|
1501
1777
|
template <size_t SooSlotMemcpySize, bool TransferUsesMemcpy>
|
|
1502
1778
|
size_t GrowSooTableToNextCapacityAndPrepareInsert(
|
|
1503
1779
|
CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1504
|
-
size_t
|
|
1780
|
+
absl::FunctionRef<size_t(size_t)> get_hash, bool force_sampling) {
|
|
1505
1781
|
AssertSoo(common, policy);
|
|
1506
|
-
if (ABSL_PREDICT_FALSE(
|
|
1782
|
+
if (ABSL_PREDICT_FALSE(force_sampling)) {
|
|
1507
1783
|
// The table is empty, it is only used for forced sampling of SOO tables.
|
|
1508
1784
|
return GrowEmptySooTableToNextCapacityForceSamplingAndPrepareInsert(
|
|
1509
|
-
common, policy,
|
|
1785
|
+
common, policy, get_hash);
|
|
1510
1786
|
}
|
|
1511
1787
|
ABSL_SWISSTABLE_ASSERT(common.size() == policy.soo_capacity());
|
|
1512
1788
|
static constexpr size_t kNewCapacity = NextCapacity(SooCapacity());
|
|
1513
1789
|
const size_t slot_size = policy.slot_size;
|
|
1514
|
-
|
|
1790
|
+
void* alloc = policy.get_char_alloc(common);
|
|
1515
1791
|
common.set_capacity(kNewCapacity);
|
|
1516
1792
|
|
|
1517
1793
|
// Since the table is not empty, it will not be sampled.
|
|
1518
1794
|
// The decision to sample was already made during the first insertion.
|
|
1519
|
-
|
|
1520
|
-
/*has_infoz=*/false);
|
|
1521
|
-
void* alloc = policy.get_char_alloc(common);
|
|
1522
|
-
char* mem = static_cast<char*>(policy.alloc(alloc, layout.alloc_size()));
|
|
1523
|
-
const GenerationType old_generation = common.generation();
|
|
1524
|
-
common.set_generation_ptr(
|
|
1525
|
-
reinterpret_cast<GenerationType*>(mem + layout.generation_offset()));
|
|
1526
|
-
common.set_generation(NextGeneration(old_generation));
|
|
1527
|
-
|
|
1795
|
+
//
|
|
1528
1796
|
// We do not set control and slots in CommonFields yet to avoid overriding
|
|
1529
1797
|
// SOO data.
|
|
1530
|
-
|
|
1531
|
-
|
|
1798
|
+
const auto [new_ctrl, new_slots] = AllocBackingArray(
|
|
1799
|
+
common, policy, kNewCapacity, /*has_infoz=*/false, alloc);
|
|
1532
1800
|
|
|
1533
1801
|
PrepareInsertCommon(common);
|
|
1534
1802
|
ABSL_SWISSTABLE_ASSERT(common.size() == 2);
|
|
1535
1803
|
GetGrowthInfoFromControl(new_ctrl).InitGrowthLeftNoDeleted(kNewCapacity - 2);
|
|
1536
|
-
common.generate_new_seed();
|
|
1804
|
+
common.generate_new_seed(/*has_infoz=*/false);
|
|
1805
|
+
const h2_t soo_slot_h2 = H2(policy.hash_slot(
|
|
1806
|
+
policy.hash_fn(common), common.soo_data(), common.seed().seed()));
|
|
1807
|
+
const size_t new_hash = get_hash(common.seed().seed());
|
|
1537
1808
|
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
const size_t offset = SingleGroupTableH1(new_hash, common.seed()) & 2;
|
|
1542
|
-
InitializeThreeElementsControlBytesAfterSoo(soo_slot_ctrl, new_hash, offset,
|
|
1543
|
-
new_ctrl);
|
|
1809
|
+
const size_t offset = Resize1To3NewOffset(new_hash, common.seed());
|
|
1810
|
+
InitializeThreeElementsControlBytes(soo_slot_h2, H2(new_hash), offset,
|
|
1811
|
+
new_ctrl);
|
|
1544
1812
|
|
|
1545
1813
|
SanitizerPoisonMemoryRegion(new_slots, slot_size * kNewCapacity);
|
|
1546
1814
|
void* target_slot = SlotAddress(new_slots, SooSlotIndex(), slot_size);
|
|
@@ -1562,31 +1830,23 @@ size_t GrowSooTableToNextCapacityAndPrepareInsert(
|
|
|
1562
1830
|
static_assert(SooSlotMemcpySize == 0);
|
|
1563
1831
|
policy.transfer_n(&common, target_slot, common.soo_data(), 1);
|
|
1564
1832
|
}
|
|
1565
|
-
|
|
1566
|
-
common.set_control</*kGenerateSeed=*/false>(new_ctrl);
|
|
1833
|
+
common.set_control(new_ctrl);
|
|
1567
1834
|
common.set_slots(new_slots);
|
|
1568
1835
|
|
|
1569
|
-
|
|
1836
|
+
// Full SOO table couldn't be sampled. If SOO table is sampled, it would
|
|
1837
|
+
// have been resized to the next capacity.
|
|
1838
|
+
ABSL_SWISSTABLE_ASSERT(!common.infoz().IsSampled());
|
|
1570
1839
|
SanitizerUnpoisonMemoryRegion(SlotAddress(new_slots, offset, slot_size),
|
|
1571
1840
|
slot_size);
|
|
1572
1841
|
return offset;
|
|
1573
1842
|
}
|
|
1574
1843
|
|
|
1575
|
-
void GrowFullSooTableToNextCapacityForceSampling(
|
|
1576
|
-
CommonFields& common, const PolicyFunctions& __restrict policy) {
|
|
1577
|
-
AssertFullSoo(common, policy);
|
|
1578
|
-
ResizeFullSooTable(
|
|
1579
|
-
common, policy, NextCapacity(SooCapacity()),
|
|
1580
|
-
ResizeFullSooTableSamplingMode::kForceSampleNoResizeIfUnsampled);
|
|
1581
|
-
}
|
|
1582
|
-
|
|
1583
1844
|
void Rehash(CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
1584
1845
|
size_t n) {
|
|
1585
1846
|
const size_t cap = common.capacity();
|
|
1586
1847
|
|
|
1587
1848
|
auto clear_backing_array = [&]() {
|
|
1588
|
-
|
|
1589
|
-
/*reuse=*/false, policy.soo_enabled);
|
|
1849
|
+
ClearBackingArrayNoReuse(common, policy, policy.get_char_alloc(common));
|
|
1590
1850
|
};
|
|
1591
1851
|
|
|
1592
1852
|
const size_t slot_size = policy.slot_size;
|
|
@@ -1612,7 +1872,7 @@ void Rehash(CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
|
1612
1872
|
}
|
|
1613
1873
|
ABSL_SWISSTABLE_ASSERT(slot_size <= sizeof(HeapOrSoo));
|
|
1614
1874
|
ABSL_SWISSTABLE_ASSERT(policy.slot_align <= alignof(HeapOrSoo));
|
|
1615
|
-
HeapOrSoo tmp_slot
|
|
1875
|
+
HeapOrSoo tmp_slot;
|
|
1616
1876
|
size_t begin_offset = FindFirstFullSlot(0, cap, common.control());
|
|
1617
1877
|
policy.transfer_n(
|
|
1618
1878
|
&common, &tmp_slot,
|
|
@@ -1624,11 +1884,11 @@ void Rehash(CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
|
1624
1884
|
}
|
|
1625
1885
|
}
|
|
1626
1886
|
|
|
1627
|
-
ValidateMaxSize(n, policy.slot_size);
|
|
1628
1887
|
// bitor is a faster way of doing `max` here. We will round up to the next
|
|
1629
1888
|
// power-of-2-minus-1, so bitor is good enough.
|
|
1630
1889
|
const size_t new_capacity =
|
|
1631
1890
|
NormalizeCapacity(n | SizeToCapacity(common.size()));
|
|
1891
|
+
ValidateMaxCapacity(new_capacity, policy.key_size, policy.slot_size);
|
|
1632
1892
|
// n == 0 unconditionally rehashes as per the standard.
|
|
1633
1893
|
if (n == 0 || new_capacity > cap) {
|
|
1634
1894
|
if (cap == policy.soo_capacity()) {
|
|
@@ -1655,19 +1915,22 @@ void Copy(CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
|
1655
1915
|
ABSL_SWISSTABLE_ASSERT(size > 0);
|
|
1656
1916
|
const size_t soo_capacity = policy.soo_capacity();
|
|
1657
1917
|
const size_t slot_size = policy.slot_size;
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1918
|
+
const bool soo_enabled = policy.soo_enabled;
|
|
1919
|
+
if (size == 1) {
|
|
1920
|
+
if (!soo_enabled) ReserveTableToFitNewSize(common, policy, 1);
|
|
1921
|
+
IncrementSmallSize(common, policy);
|
|
1922
|
+
const size_t other_capacity = other.capacity();
|
|
1661
1923
|
const void* other_slot =
|
|
1662
|
-
other.
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
copy_fn(common.soo_data(), other_slot);
|
|
1669
|
-
|
|
1670
|
-
if (policy.is_hashtablez_eligible &&
|
|
1924
|
+
other_capacity <= soo_capacity ? other.soo_data()
|
|
1925
|
+
: other.is_small()
|
|
1926
|
+
? other.slot_array()
|
|
1927
|
+
: SlotAddress(other.slot_array(),
|
|
1928
|
+
FindFirstFullSlot(0, other_capacity, other.control()),
|
|
1929
|
+
slot_size);
|
|
1930
|
+
copy_fn(soo_enabled ? common.soo_data() : common.slot_array(), other_slot);
|
|
1931
|
+
|
|
1932
|
+
if (soo_enabled && policy.is_hashtablez_eligible &&
|
|
1933
|
+
ShouldSampleNextTable()) {
|
|
1671
1934
|
GrowFullSooTableToNextCapacityForceSampling(common, policy);
|
|
1672
1935
|
}
|
|
1673
1936
|
return;
|
|
@@ -1678,47 +1941,22 @@ void Copy(CommonFields& common, const PolicyFunctions& __restrict policy,
|
|
|
1678
1941
|
ABSL_SWISSTABLE_ASSERT(other.capacity() > soo_capacity);
|
|
1679
1942
|
const size_t cap = common.capacity();
|
|
1680
1943
|
ABSL_SWISSTABLE_ASSERT(cap > soo_capacity);
|
|
1681
|
-
// Note about single group tables:
|
|
1682
|
-
// 1. It is correct to have any order of elements.
|
|
1683
|
-
// 2. Order has to be non deterministic.
|
|
1684
|
-
// 3. We are assigning elements with arbitrary `shift` starting from
|
|
1685
|
-
// `capacity + shift` position.
|
|
1686
|
-
// 4. `shift` must be coprime with `capacity + 1` in order to be able to use
|
|
1687
|
-
// modular arithmetic to traverse all positions, instead of cycling
|
|
1688
|
-
// through a subset of positions. Odd numbers are coprime with any
|
|
1689
|
-
// `capacity + 1` (2^N).
|
|
1690
1944
|
size_t offset = cap;
|
|
1691
|
-
const size_t shift = is_single_group(cap) ? (common.seed().seed() | 1) : 0;
|
|
1692
1945
|
const void* hash_fn = policy.hash_fn(common);
|
|
1693
1946
|
auto hasher = policy.hash_slot;
|
|
1947
|
+
const size_t seed = common.seed().seed();
|
|
1694
1948
|
IterateOverFullSlotsImpl(
|
|
1695
|
-
other, slot_size, [&](const ctrl_t
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
offset = target.offset;
|
|
1704
|
-
} else {
|
|
1705
|
-
// Small tables case. Next position is computed via shift.
|
|
1706
|
-
offset = (offset + shift) & cap;
|
|
1707
|
-
}
|
|
1708
|
-
const h2_t h2 = static_cast<h2_t>(*that_ctrl);
|
|
1709
|
-
// We rely on the hash not changing for small tables.
|
|
1710
|
-
ABSL_SWISSTABLE_ASSERT(
|
|
1711
|
-
H2((*hasher)(hash_fn, that_slot)) == h2 &&
|
|
1712
|
-
"hash function value changed unexpectedly during the copy");
|
|
1713
|
-
SetCtrl(common, offset, h2, slot_size);
|
|
1949
|
+
other, slot_size, [&](const ctrl_t*, void* that_slot) {
|
|
1950
|
+
// The table is guaranteed to be empty, so we can do faster than
|
|
1951
|
+
// a full `insert`.
|
|
1952
|
+
const size_t hash = (*hasher)(hash_fn, that_slot, seed);
|
|
1953
|
+
FindInfo target = find_first_non_full(common, hash);
|
|
1954
|
+
infoz.RecordInsertMiss(hash, target.probe_length);
|
|
1955
|
+
offset = target.offset;
|
|
1956
|
+
SetCtrl(common, offset, H2(hash), slot_size);
|
|
1714
1957
|
copy_fn(SlotAddress(common.slot_array(), offset, slot_size), that_slot);
|
|
1715
1958
|
common.maybe_increment_generation_on_insert();
|
|
1716
1959
|
});
|
|
1717
|
-
if (shift != 0) {
|
|
1718
|
-
// On small table copy we do not record individual inserts.
|
|
1719
|
-
// RecordInsert requires hash, but it is unknown for small tables.
|
|
1720
|
-
infoz.RecordStorageChanged(size, cap);
|
|
1721
|
-
}
|
|
1722
1960
|
common.increment_size(size);
|
|
1723
1961
|
common.growth_info().OverwriteManyEmptyAsFull(size);
|
|
1724
1962
|
}
|
|
@@ -1737,41 +1975,62 @@ void ReserveTableToFitNewSize(CommonFields& common,
|
|
|
1737
1975
|
ABSL_SWISSTABLE_ASSERT(!common.empty() || cap > policy.soo_capacity());
|
|
1738
1976
|
ABSL_SWISSTABLE_ASSERT(cap > 0);
|
|
1739
1977
|
const size_t max_size_before_growth =
|
|
1740
|
-
cap
|
|
1741
|
-
: common.size() + common.growth_left();
|
|
1978
|
+
IsSmallCapacity(cap) ? cap : common.size() + common.growth_left();
|
|
1742
1979
|
if (new_size <= max_size_before_growth) {
|
|
1743
1980
|
return;
|
|
1744
1981
|
}
|
|
1745
1982
|
ReserveAllocatedTable(common, policy, new_size);
|
|
1746
1983
|
}
|
|
1747
1984
|
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
if (rehash_for_bug_detection) {
|
|
1756
|
-
// Move to a different heap allocation in order to detect bugs.
|
|
1757
|
-
const size_t cap = common.capacity();
|
|
1758
|
-
ResizeAllocatedTableWithSeedChange(
|
|
1759
|
-
common, policy, common.growth_left() > 0 ? cap : NextCapacity(cap));
|
|
1760
|
-
target = find_first_non_full(common, hash);
|
|
1761
|
-
}
|
|
1762
|
-
|
|
1985
|
+
namespace {
|
|
1986
|
+
size_t PrepareInsertLargeImpl(CommonFields& common,
|
|
1987
|
+
const PolicyFunctions& __restrict policy,
|
|
1988
|
+
size_t hash,
|
|
1989
|
+
Group::NonIterableBitMaskType mask_empty,
|
|
1990
|
+
FindInfo target_group) {
|
|
1991
|
+
ABSL_SWISSTABLE_ASSERT(!common.is_small());
|
|
1763
1992
|
const GrowthInfo growth_info = common.growth_info();
|
|
1764
1993
|
// When there are no deleted slots in the table
|
|
1765
1994
|
// and growth_left is positive, we can insert at the first
|
|
1766
1995
|
// empty slot in the probe sequence (target).
|
|
1767
1996
|
if (ABSL_PREDICT_FALSE(!growth_info.HasNoDeletedAndGrowthLeft())) {
|
|
1768
|
-
return
|
|
1997
|
+
return PrepareInsertLargeSlow(common, policy, hash);
|
|
1769
1998
|
}
|
|
1770
1999
|
PrepareInsertCommon(common);
|
|
1771
2000
|
common.growth_info().OverwriteEmptyAsFull();
|
|
1772
|
-
|
|
1773
|
-
common.
|
|
1774
|
-
|
|
2001
|
+
target_group.offset += mask_empty.LowestBitSet();
|
|
2002
|
+
target_group.offset &= common.capacity();
|
|
2003
|
+
SetCtrl(common, target_group.offset, H2(hash), policy.slot_size);
|
|
2004
|
+
common.infoz().RecordInsertMiss(hash, target_group.probe_length);
|
|
2005
|
+
return target_group.offset;
|
|
2006
|
+
}
|
|
2007
|
+
} // namespace
|
|
2008
|
+
|
|
2009
|
+
size_t PrepareInsertLarge(CommonFields& common,
|
|
2010
|
+
const PolicyFunctions& __restrict policy, size_t hash,
|
|
2011
|
+
Group::NonIterableBitMaskType mask_empty,
|
|
2012
|
+
FindInfo target_group) {
|
|
2013
|
+
// NOLINTNEXTLINE(misc-static-assert)
|
|
2014
|
+
ABSL_SWISSTABLE_ASSERT(!SwisstableGenerationsEnabled());
|
|
2015
|
+
return PrepareInsertLargeImpl(common, policy, hash, mask_empty, target_group);
|
|
2016
|
+
}
|
|
2017
|
+
|
|
2018
|
+
size_t PrepareInsertLargeGenerationsEnabled(
|
|
2019
|
+
CommonFields& common, const PolicyFunctions& policy, size_t hash,
|
|
2020
|
+
Group::NonIterableBitMaskType mask_empty, FindInfo target_group,
|
|
2021
|
+
absl::FunctionRef<size_t(size_t)> recompute_hash) {
|
|
2022
|
+
// NOLINTNEXTLINE(misc-static-assert)
|
|
2023
|
+
ABSL_SWISSTABLE_ASSERT(SwisstableGenerationsEnabled());
|
|
2024
|
+
if (common.should_rehash_for_bug_detection_on_insert()) {
|
|
2025
|
+
// Move to a different heap allocation in order to detect bugs.
|
|
2026
|
+
const size_t cap = common.capacity();
|
|
2027
|
+
ResizeAllocatedTableWithSeedChange(
|
|
2028
|
+
common, policy, common.growth_left() > 0 ? cap : NextCapacity(cap));
|
|
2029
|
+
hash = recompute_hash(common.seed().seed());
|
|
2030
|
+
std::tie(target_group, mask_empty) =
|
|
2031
|
+
find_first_non_full_group(common, hash);
|
|
2032
|
+
}
|
|
2033
|
+
return PrepareInsertLargeImpl(common, policy, hash, mask_empty, target_group);
|
|
1775
2034
|
}
|
|
1776
2035
|
|
|
1777
2036
|
namespace {
|
|
@@ -1808,35 +2067,44 @@ template size_t TryFindNewIndexWithoutProbing(size_t h1, size_t old_index,
|
|
|
1808
2067
|
// We need to instantiate ALL possible template combinations because we define
|
|
1809
2068
|
// the function in the cc file.
|
|
1810
2069
|
template size_t GrowSooTableToNextCapacityAndPrepareInsert<0, false>(
|
|
1811
|
-
CommonFields&, const PolicyFunctions&, size_t
|
|
2070
|
+
CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
|
|
2071
|
+
bool);
|
|
1812
2072
|
template size_t GrowSooTableToNextCapacityAndPrepareInsert<
|
|
1813
|
-
OptimalMemcpySizeForSooSlotTransfer(1), true>(
|
|
1814
|
-
|
|
1815
|
-
|
|
2073
|
+
OptimalMemcpySizeForSooSlotTransfer(1), true>(
|
|
2074
|
+
CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
|
|
2075
|
+
bool);
|
|
1816
2076
|
|
|
1817
2077
|
static_assert(VerifyOptimalMemcpySizeForSooSlotTransferRange(2, 3));
|
|
1818
2078
|
template size_t GrowSooTableToNextCapacityAndPrepareInsert<
|
|
1819
|
-
OptimalMemcpySizeForSooSlotTransfer(3), true>(
|
|
1820
|
-
|
|
1821
|
-
|
|
2079
|
+
OptimalMemcpySizeForSooSlotTransfer(3), true>(
|
|
2080
|
+
CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
|
|
2081
|
+
bool);
|
|
1822
2082
|
|
|
1823
2083
|
static_assert(VerifyOptimalMemcpySizeForSooSlotTransferRange(4, 8));
|
|
1824
2084
|
template size_t GrowSooTableToNextCapacityAndPrepareInsert<
|
|
1825
|
-
OptimalMemcpySizeForSooSlotTransfer(8), true>(
|
|
1826
|
-
|
|
1827
|
-
|
|
2085
|
+
OptimalMemcpySizeForSooSlotTransfer(8), true>(
|
|
2086
|
+
CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
|
|
2087
|
+
bool);
|
|
1828
2088
|
|
|
1829
2089
|
#if UINTPTR_MAX == UINT32_MAX
|
|
1830
2090
|
static_assert(MaxSooSlotSize() == 8);
|
|
1831
2091
|
#else
|
|
1832
2092
|
static_assert(VerifyOptimalMemcpySizeForSooSlotTransferRange(9, 16));
|
|
1833
2093
|
template size_t GrowSooTableToNextCapacityAndPrepareInsert<
|
|
1834
|
-
OptimalMemcpySizeForSooSlotTransfer(16), true>(
|
|
1835
|
-
|
|
1836
|
-
|
|
2094
|
+
OptimalMemcpySizeForSooSlotTransfer(16), true>(
|
|
2095
|
+
CommonFields&, const PolicyFunctions&, absl::FunctionRef<size_t(size_t)>,
|
|
2096
|
+
bool);
|
|
1837
2097
|
static_assert(MaxSooSlotSize() == 16);
|
|
1838
2098
|
#endif
|
|
1839
2099
|
|
|
2100
|
+
template void* AllocateBackingArray<BackingArrayAlignment(alignof(size_t)),
|
|
2101
|
+
std::allocator<char>>(void* alloc,
|
|
2102
|
+
size_t n);
|
|
2103
|
+
template void DeallocateBackingArray<BackingArrayAlignment(alignof(size_t)),
|
|
2104
|
+
std::allocator<char>>(
|
|
2105
|
+
void* alloc, size_t capacity, ctrl_t* ctrl, size_t slot_size,
|
|
2106
|
+
size_t slot_align, bool had_infoz);
|
|
2107
|
+
|
|
1840
2108
|
} // namespace container_internal
|
|
1841
2109
|
ABSL_NAMESPACE_END
|
|
1842
2110
|
} // namespace absl
|