grpc 1.47.0 → 1.48.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +105 -47
- data/include/grpc/compression.h +1 -1
- data/include/grpc/event_engine/event_engine.h +20 -11
- data/include/grpc/event_engine/slice_buffer.h +8 -2
- data/include/grpc/grpc.h +3 -3
- data/include/grpc/impl/codegen/compression_types.h +2 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -1
- data/include/grpc/impl/codegen/gpr_types.h +2 -1
- data/include/grpc/impl/codegen/grpc_types.h +2 -1
- data/include/grpc/impl/codegen/port_platform.h +6 -3
- data/src/core/ext/filters/census/grpc_context.cc +3 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
- data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
- data/src/core/ext/filters/client_channel/client_channel.h +19 -4
- data/src/core/ext/filters/client_channel/config_selector.h +1 -1
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
- data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
- data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
- data/src/core/ext/filters/client_channel/subchannel.h +6 -22
- data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
- data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
- data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
- data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
- data/src/core/ext/filters/http/client_authority_filter.h +5 -2
- data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
- data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
- data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
- data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
- data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
- data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
- data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
- data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
- data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
- data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
- data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
- data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
- data/src/core/ext/xds/certificate_provider_factory.h +6 -1
- data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
- data/src/core/ext/xds/certificate_provider_registry.h +3 -1
- data/src/core/ext/xds/certificate_provider_store.cc +2 -0
- data/src/core/ext/xds/certificate_provider_store.h +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
- data/src/core/ext/xds/upb_utils.h +1 -2
- data/src/core/ext/xds/xds_api.cc +16 -18
- data/src/core/ext/xds/xds_api.h +12 -5
- data/src/core/ext/xds/xds_bootstrap.cc +37 -24
- data/src/core/ext/xds/xds_bootstrap.h +9 -11
- data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
- data/src/core/ext/xds/xds_certificate_provider.h +16 -1
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
- data/src/core/ext/xds/xds_client.cc +71 -22
- data/src/core/ext/xds/xds_client.h +17 -3
- data/src/core/ext/xds/xds_client_stats.cc +3 -4
- data/src/core/ext/xds/xds_client_stats.h +4 -3
- data/src/core/ext/xds/xds_cluster.cc +21 -10
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
- data/src/core/ext/xds/xds_common_types.cc +36 -22
- data/src/core/ext/xds/xds_common_types.h +12 -4
- data/src/core/ext/xds/xds_endpoint.cc +25 -15
- data/src/core/ext/xds/xds_endpoint.h +13 -5
- data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
- data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
- data/src/core/ext/xds/xds_http_filters.cc +7 -0
- data/src/core/ext/xds/xds_http_filters.h +3 -3
- data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
- data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
- data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
- data/src/core/ext/xds/xds_listener.cc +51 -33
- data/src/core/ext/xds/xds_listener.h +10 -1
- data/src/core/ext/xds/xds_resource_type.h +3 -3
- data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
- data/src/core/ext/xds/xds_route_config.cc +56 -28
- data/src/core/ext/xds/xds_route_config.h +11 -2
- data/src/core/ext/xds/xds_routing.cc +16 -0
- data/src/core/ext/xds/xds_routing.h +7 -2
- data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
- data/src/core/lib/address_utils/parse_address.cc +5 -8
- data/src/core/lib/address_utils/parse_address.h +3 -2
- data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
- data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
- data/src/core/lib/avl/avl.h +3 -3
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/backoff/backoff.h +1 -1
- data/src/core/lib/channel/call_tracer.h +3 -3
- data/src/core/lib/channel/channel_args.h +1 -0
- data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
- data/src/core/lib/channel/channel_fwd.h +26 -0
- data/src/core/lib/channel/channel_stack.cc +4 -4
- data/src/core/lib/channel/channel_stack.h +1 -11
- data/src/core/lib/channel/channel_stack_builder.h +2 -5
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
- data/src/core/lib/channel/channelz.cc +2 -1
- data/src/core/lib/channel/channelz.h +2 -3
- data/src/core/lib/channel/channelz_registry.cc +4 -5
- data/src/core/lib/channel/connected_channel.cc +1 -0
- data/src/core/lib/channel/connected_channel.h +1 -0
- data/src/core/lib/channel/promise_based_filter.cc +11 -5
- data/src/core/lib/channel/promise_based_filter.h +2 -0
- data/src/core/lib/compression/compression.cc +6 -1
- data/src/core/lib/compression/compression_internal.cc +3 -6
- data/src/core/lib/compression/compression_internal.h +3 -2
- data/src/core/lib/compression/message_compress.cc +3 -1
- data/src/core/lib/compression/message_compress.h +2 -3
- data/src/core/lib/debug/stats.cc +9 -9
- data/src/core/lib/debug/stats.h +2 -1
- data/src/core/lib/debug/stats_data.cc +2 -1
- data/src/core/lib/debug/stats_data.h +0 -4
- data/src/core/lib/debug/trace.h +13 -12
- data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
- data/src/core/lib/event_engine/event_engine.cc +24 -19
- data/src/core/lib/event_engine/event_engine_factory.h +2 -2
- data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
- data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
- data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
- data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
- data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
- data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
- data/src/core/lib/event_engine/promise.h +69 -0
- data/src/core/lib/gpr/time_posix.cc +6 -9
- data/src/core/lib/gpr/time_windows.cc +10 -7
- data/src/core/lib/gprpp/manual_constructor.h +0 -67
- data/src/core/lib/gprpp/status_helper.cc +44 -30
- data/src/core/lib/gprpp/time.cc +8 -0
- data/src/core/lib/gprpp/time.h +4 -0
- data/src/core/lib/http/format_request.cc +5 -4
- data/src/core/lib/http/format_request.h +1 -1
- data/src/core/lib/http/httpcli.cc +18 -12
- data/src/core/lib/http/httpcli.h +19 -3
- data/src/core/lib/http/httpcli_security_connector.cc +16 -4
- data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
- data/src/core/lib/http/parser.cc +6 -7
- data/src/core/lib/http/parser.h +3 -0
- data/src/core/lib/iomgr/call_combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
- data/src/core/lib/iomgr/error.cc +11 -9
- data/src/core/lib/iomgr/error.h +9 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
- data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
- data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
- data/src/core/lib/iomgr/ev_posix.cc +54 -92
- data/src/core/lib/iomgr/ev_posix.h +5 -3
- data/src/core/lib/iomgr/fork_posix.cc +1 -1
- data/src/core/lib/iomgr/iomgr.cc +7 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
- data/src/core/lib/iomgr/load_file.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
- data/src/core/lib/iomgr/tcp_client.cc +12 -7
- data/src/core/lib/iomgr/tcp_client.h +24 -13
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
- data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
- data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
- data/src/core/lib/iomgr/tcp_posix.cc +91 -29
- data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
- data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
- data/src/core/lib/iomgr/tcp_windows.cc +5 -5
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
- data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
- data/src/core/lib/iomgr/work_serializer.h +2 -3
- data/src/core/lib/matchers/matchers.cc +6 -3
- data/src/core/lib/matchers/matchers.h +2 -0
- data/src/core/lib/promise/activity.cc +0 -1
- data/src/core/lib/promise/activity.h +7 -13
- data/src/core/lib/promise/loop.h +1 -0
- data/src/core/lib/promise/promise.h +1 -0
- data/src/core/lib/promise/sleep.cc +36 -31
- data/src/core/lib/promise/sleep.h +25 -25
- data/src/core/lib/resolver/resolver.cc +5 -0
- data/src/core/lib/resolver/resolver.h +3 -0
- data/src/core/lib/resolver/resolver_factory.h +5 -2
- data/src/core/lib/resolver/resolver_registry.cc +2 -9
- data/src/core/lib/resolver/resolver_registry.h +12 -1
- data/src/core/lib/resolver/server_address.cc +8 -0
- data/src/core/lib/resolver/server_address.h +9 -2
- data/src/core/lib/resource_quota/memory_quota.cc +18 -60
- data/src/core/lib/resource_quota/memory_quota.h +11 -25
- data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
- data/src/core/lib/security/authorization/evaluate_args.h +6 -3
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
- data/src/core/lib/security/authorization/matchers.cc +9 -1
- data/src/core/lib/security/authorization/matchers.h +7 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
- data/src/core/lib/security/authorization/rbac_policy.h +7 -0
- data/src/core/lib/security/context/security_context.cc +5 -2
- data/src/core/lib/security/context/security_context.h +14 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
- data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
- data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
- data/src/core/lib/security/credentials/call_creds_util.h +1 -0
- data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
- data/src/core/lib/security/credentials/credentials.cc +4 -8
- data/src/core/lib/security/credentials/credentials.h +10 -8
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
- data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
- data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
- data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
- data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
- data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
- data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
- data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
- data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
- data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
- data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
- data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
- data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
- data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
- data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
- data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
- data/src/core/lib/security/security_connector/security_connector.cc +20 -18
- data/src/core/lib/security/security_connector/security_connector.h +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
- data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
- data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
- data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
- data/src/core/lib/security/transport/secure_endpoint.h +4 -3
- data/src/core/lib/security/transport/security_handshaker.cc +44 -11
- data/src/core/lib/security/transport/security_handshaker.h +4 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
- data/src/core/lib/security/util/json_util.cc +3 -2
- data/src/core/lib/security/util/json_util.h +0 -2
- data/src/core/lib/service_config/service_config_call_data.h +2 -1
- data/src/core/lib/service_config/service_config_impl.cc +6 -6
- data/src/core/lib/service_config/service_config_impl.h +1 -3
- data/src/core/lib/service_config/service_config_parser.cc +2 -4
- data/src/core/lib/slice/slice_buffer.cc +30 -1
- data/src/core/lib/slice/slice_buffer.h +37 -6
- data/src/core/lib/slice/slice_string_helpers.cc +0 -20
- data/src/core/lib/slice/slice_string_helpers.h +0 -4
- data/src/core/lib/surface/call.cc +53 -115
- data/src/core/lib/surface/call.h +5 -1
- data/src/core/lib/surface/channel.h +2 -0
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +15 -14
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +0 -1
- data/src/core/lib/surface/lame_client.cc +1 -1
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +14 -8
- data/src/core/lib/surface/server.h +4 -1
- data/src/core/lib/surface/validate_metadata.cc +1 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +13 -7
- data/src/core/lib/transport/handshaker.cc +3 -3
- data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
- data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
- data/src/core/lib/transport/transport.cc +0 -3
- data/src/core/lib/transport/transport.h +20 -14
- data/src/core/lib/transport/transport_fwd.h +20 -0
- data/src/core/lib/transport/transport_impl.h +1 -0
- data/src/core/lib/transport/transport_op_string.cc +9 -9
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
- data/src/core/tsi/fake_transport_security.cc +13 -1
- data/src/core/tsi/fake_transport_security.h +6 -0
- data/src/core/tsi/ssl_transport_security.cc +1 -1
- data/src/core/tsi/transport_security_grpc.cc +3 -2
- data/src/core/tsi/transport_security_grpc.h +5 -2
- data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
- data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
- data/src/ruby/ext/grpc/ext-export.clang +1 -0
- data/src/ruby/ext/grpc/ext-export.gcc +1 -0
- data/src/ruby/ext/grpc/extconf.rb +49 -18
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/lib/grpc/errors.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
- data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
- data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
- data/third_party/abseil-cpp/absl/base/casts.h +61 -68
- data/third_party/abseil-cpp/absl/base/config.h +182 -41
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
- data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
- data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
- data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
- data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
- data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
- data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
- data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
- data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
- data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
- data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
- data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
- data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
- data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
- data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
- data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
- data/third_party/abseil-cpp/absl/status/status.cc +174 -2
- data/third_party/abseil-cpp/absl/status/status.h +22 -12
- data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
- data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
- data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
- data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
- data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
- data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
- data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
- data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
- data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
- data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
- data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
- data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
- data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
- data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
- data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
- data/third_party/abseil-cpp/absl/time/time.h +16 -12
- data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
- data/third_party/abseil-cpp/absl/types/optional.h +17 -14
- data/third_party/abseil-cpp/absl/types/span.h +2 -1
- metadata +39 -15
- data/src/core/lib/slice/slice_split.cc +0 -103
- data/src/core/lib/slice/slice_split.h +0 -36
- data/src/core/lib/transport/byte_stream.cc +0 -165
- data/src/core/lib/transport/byte_stream.h +0 -170
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -22,6 +22,7 @@
|
|
22
22
|
#include "absl/base/attributes.h"
|
23
23
|
#include "absl/base/config.h"
|
24
24
|
#include "absl/base/internal/raw_logging.h"
|
25
|
+
#include "absl/strings/internal/cord_data_edge.h"
|
25
26
|
#include "absl/strings/internal/cord_internal.h"
|
26
27
|
#include "absl/strings/internal/cord_rep_consume.h"
|
27
28
|
#include "absl/strings/internal/cord_rep_flat.h"
|
@@ -32,7 +33,9 @@ namespace absl {
|
|
32
33
|
ABSL_NAMESPACE_BEGIN
|
33
34
|
namespace cord_internal {
|
34
35
|
|
35
|
-
|
36
|
+
#ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
|
37
|
+
constexpr size_t CordRepBtree::kMaxCapacity;
|
38
|
+
#endif
|
36
39
|
|
37
40
|
namespace {
|
38
41
|
|
@@ -69,7 +72,7 @@ void DumpAll(const CordRep* rep, bool include_contents, std::ostream& stream,
|
|
69
72
|
// indentation and prefix / labels keeps us within roughly 80-100 wide.
|
70
73
|
constexpr size_t kMaxDataLength = 60;
|
71
74
|
stream << ", data = \""
|
72
|
-
<<
|
75
|
+
<< EdgeData(r).substr(0, kMaxDataLength)
|
73
76
|
<< (r->length > kMaxDataLength ? "\"..." : "\"");
|
74
77
|
}
|
75
78
|
stream << '\n';
|
@@ -119,6 +122,7 @@ CordRepSubstring* CreateSubstring(CordRep* rep, size_t offset, size_t n) {
|
|
119
122
|
rep = CordRep::Ref(substring->child);
|
120
123
|
CordRep::Unref(substring);
|
121
124
|
}
|
125
|
+
assert(rep->IsExternal() || rep->IsFlat());
|
122
126
|
CordRepSubstring* substring = new CordRepSubstring();
|
123
127
|
substring->length = n;
|
124
128
|
substring->tag = SUBSTRING;
|
@@ -149,7 +153,7 @@ inline CordRep* MakeSubstring(CordRep* rep, size_t offset) {
|
|
149
153
|
CordRep* ResizeEdge(CordRep* edge, size_t length, bool is_mutable) {
|
150
154
|
assert(length > 0);
|
151
155
|
assert(length <= edge->length);
|
152
|
-
assert(
|
156
|
+
assert(IsDataEdge(edge));
|
153
157
|
if (length >= edge->length) return edge;
|
154
158
|
|
155
159
|
if (is_mutable && (edge->tag >= FLAT || edge->tag == SUBSTRING)) {
|
@@ -190,24 +194,29 @@ inline void FastUnref(R* r, Fn&& fn) {
|
|
190
194
|
}
|
191
195
|
}
|
192
196
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
+
|
198
|
+
void DeleteSubstring(CordRepSubstring* substring) {
|
199
|
+
CordRep* rep = substring->child;
|
200
|
+
if (!rep->refcount.Decrement()) {
|
197
201
|
if (rep->tag >= FLAT) {
|
198
202
|
CordRepFlat::Delete(rep->flat());
|
199
|
-
|
200
|
-
|
201
|
-
if (rep->tag == EXTERNAL) {
|
203
|
+
} else {
|
204
|
+
assert(rep->tag == EXTERNAL);
|
202
205
|
CordRepExternal::Delete(rep->external());
|
203
|
-
return;
|
204
206
|
}
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
207
|
+
}
|
208
|
+
delete substring;
|
209
|
+
}
|
210
|
+
|
211
|
+
// Deletes a leaf node data edge. Requires `IsDataEdge(rep)`.
|
212
|
+
void DeleteLeafEdge(CordRep* rep) {
|
213
|
+
assert(IsDataEdge(rep));
|
214
|
+
if (rep->tag >= FLAT) {
|
215
|
+
CordRepFlat::Delete(rep->flat());
|
216
|
+
} else if (rep->tag == EXTERNAL) {
|
217
|
+
CordRepExternal::Delete(rep->external());
|
218
|
+
} else {
|
219
|
+
DeleteSubstring(rep->substring());
|
211
220
|
}
|
212
221
|
}
|
213
222
|
|
@@ -216,8 +225,8 @@ void DeleteLeafEdge(CordRep* rep) {
|
|
216
225
|
// propagate node changes up the stack.
|
217
226
|
template <EdgeType edge_type>
|
218
227
|
struct StackOperations {
|
219
|
-
// Returns true if the node at 'depth' is
|
220
|
-
// of one
|
228
|
+
// Returns true if the node at 'depth' is not shared, i.e. has a refcount
|
229
|
+
// of one and all of its parent nodes have a refcount of one.
|
221
230
|
inline bool owned(int depth) const { return depth < share_depth; }
|
222
231
|
|
223
232
|
// Returns the node at 'depth'.
|
@@ -228,11 +237,11 @@ struct StackOperations {
|
|
228
237
|
inline CordRepBtree* BuildStack(CordRepBtree* tree, int depth) {
|
229
238
|
assert(depth <= tree->height());
|
230
239
|
int current_depth = 0;
|
231
|
-
while (current_depth < depth && tree->refcount.
|
240
|
+
while (current_depth < depth && tree->refcount.IsOne()) {
|
232
241
|
stack[current_depth++] = tree;
|
233
242
|
tree = tree->Edge(edge_type)->btree();
|
234
243
|
}
|
235
|
-
share_depth = current_depth + (tree->refcount.
|
244
|
+
share_depth = current_depth + (tree->refcount.IsOne() ? 1 : 0);
|
236
245
|
while (current_depth < depth) {
|
237
246
|
stack[current_depth++] = tree;
|
238
247
|
tree = tree->Edge(edge_type)->btree();
|
@@ -241,17 +250,17 @@ struct StackOperations {
|
|
241
250
|
}
|
242
251
|
|
243
252
|
// Builds a stack with the invariant that all nodes are private owned / not
|
244
|
-
// shared
|
245
|
-
//
|
253
|
+
// shared. This is used in iterative updates where a previous propagation
|
254
|
+
// guaranteed all nodes are owned / private.
|
246
255
|
inline void BuildOwnedStack(CordRepBtree* tree, int height) {
|
247
256
|
assert(height <= CordRepBtree::kMaxHeight);
|
248
257
|
int depth = 0;
|
249
258
|
while (depth < height) {
|
250
|
-
assert(tree->refcount.
|
259
|
+
assert(tree->refcount.IsOne());
|
251
260
|
stack[depth++] = tree;
|
252
261
|
tree = tree->Edge(edge_type)->btree();
|
253
262
|
}
|
254
|
-
assert(tree->refcount.
|
263
|
+
assert(tree->refcount.IsOne());
|
255
264
|
share_depth = depth + 1;
|
256
265
|
}
|
257
266
|
|
@@ -336,12 +345,12 @@ struct StackOperations {
|
|
336
345
|
return Unwind</*propagate=*/true>(tree, depth, length, result);
|
337
346
|
}
|
338
347
|
|
339
|
-
// `share_depth` contains the depth at which the nodes in the stack
|
340
|
-
//
|
341
|
-
//
|
342
|
-
//
|
343
|
-
//
|
344
|
-
//
|
348
|
+
// `share_depth` contains the depth at which the nodes in the stack become
|
349
|
+
// shared. I.e., if the top most level is shared (i.e.: `!refcount.IsOne()`),
|
350
|
+
// then `share_depth` is 0. If the 2nd node is shared (and implicitly all
|
351
|
+
// nodes below that) then `share_depth` is 1, etc. A `share_depth` greater
|
352
|
+
// than the depth of the stack indicates that none of the nodes in the stack
|
353
|
+
// are shared.
|
345
354
|
int share_depth;
|
346
355
|
|
347
356
|
NodeStack stack;
|
@@ -372,19 +381,37 @@ void CordRepBtree::Dump(const CordRep* rep, std::ostream& stream) {
|
|
372
381
|
Dump(rep, absl::string_view(), false, stream);
|
373
382
|
}
|
374
383
|
|
375
|
-
|
376
|
-
|
377
|
-
|
384
|
+
template <size_t size>
|
385
|
+
static void DestroyTree(CordRepBtree* tree) {
|
386
|
+
for (CordRep* node : tree->Edges()) {
|
387
|
+
if (node->refcount.Decrement()) continue;
|
388
|
+
for (CordRep* edge : node->btree()->Edges()) {
|
389
|
+
if (edge->refcount.Decrement()) continue;
|
390
|
+
if (size == 1) {
|
391
|
+
DeleteLeafEdge(edge);
|
392
|
+
} else {
|
393
|
+
CordRepBtree::Destroy(edge->btree());
|
394
|
+
}
|
395
|
+
}
|
396
|
+
CordRepBtree::Delete(node->btree());
|
378
397
|
}
|
379
|
-
Delete(tree);
|
398
|
+
CordRepBtree::Delete(tree);
|
380
399
|
}
|
381
400
|
|
382
|
-
void CordRepBtree::
|
383
|
-
|
384
|
-
|
385
|
-
|
401
|
+
void CordRepBtree::Destroy(CordRepBtree* tree) {
|
402
|
+
switch (tree->height()) {
|
403
|
+
case 0:
|
404
|
+
for (CordRep* edge : tree->Edges()) {
|
405
|
+
if (!edge->refcount.Decrement()) {
|
406
|
+
DeleteLeafEdge(edge);
|
407
|
+
}
|
408
|
+
}
|
409
|
+
return CordRepBtree::Delete(tree);
|
410
|
+
case 1:
|
411
|
+
return DestroyTree<1>(tree);
|
412
|
+
default:
|
413
|
+
return DestroyTree<2>(tree);
|
386
414
|
}
|
387
|
-
Delete(tree);
|
388
415
|
}
|
389
416
|
|
390
417
|
bool CordRepBtree::IsValid(const CordRepBtree* tree, bool shallow) {
|
@@ -773,7 +800,7 @@ CopyResult CordRepBtree::CopyPrefix(size_t n, bool allow_folding) {
|
|
773
800
|
|
774
801
|
CordRep* CordRepBtree::ExtractFront(CordRepBtree* tree) {
|
775
802
|
CordRep* front = tree->Edge(tree->begin());
|
776
|
-
if (tree->refcount.
|
803
|
+
if (tree->refcount.IsOne()) {
|
777
804
|
Unref(tree->Edges(tree->begin() + 1, tree->end()));
|
778
805
|
CordRepBtree::Delete(tree);
|
779
806
|
} else {
|
@@ -786,7 +813,7 @@ CordRep* CordRepBtree::ExtractFront(CordRepBtree* tree) {
|
|
786
813
|
CordRepBtree* CordRepBtree::ConsumeBeginTo(CordRepBtree* tree, size_t end,
|
787
814
|
size_t new_length) {
|
788
815
|
assert(end <= tree->end());
|
789
|
-
if (tree->refcount.
|
816
|
+
if (tree->refcount.IsOne()) {
|
790
817
|
Unref(tree->Edges(end, tree->end()));
|
791
818
|
tree->set_end(end);
|
792
819
|
tree->length = new_length;
|
@@ -813,13 +840,13 @@ CordRep* CordRepBtree::RemoveSuffix(CordRepBtree* tree, size_t n) {
|
|
813
840
|
|
814
841
|
size_t length = len - n;
|
815
842
|
int height = tree->height();
|
816
|
-
bool is_mutable = tree->refcount.
|
843
|
+
bool is_mutable = tree->refcount.IsOne();
|
817
844
|
|
818
845
|
// Extract all top nodes which are reduced to size = 1
|
819
846
|
Position pos = tree->IndexOfLength(length);
|
820
847
|
while (pos.index == tree->begin()) {
|
821
848
|
CordRep* edge = ExtractFront(tree);
|
822
|
-
is_mutable &= edge->refcount.
|
849
|
+
is_mutable &= edge->refcount.IsOne();
|
823
850
|
if (height-- == 0) return ResizeEdge(edge, length, is_mutable);
|
824
851
|
tree = edge->btree();
|
825
852
|
pos = tree->IndexOfLength(length);
|
@@ -835,8 +862,8 @@ CordRep* CordRepBtree::RemoveSuffix(CordRepBtree* tree, size_t n) {
|
|
835
862
|
length = pos.n;
|
836
863
|
while (length != edge->length) {
|
837
864
|
// ConsumeBeginTo guarantees `tree` is a clean, privately owned copy.
|
838
|
-
assert(tree->refcount.
|
839
|
-
const bool edge_is_mutable = edge->refcount.
|
865
|
+
assert(tree->refcount.IsOne());
|
866
|
+
const bool edge_is_mutable = edge->refcount.IsOne();
|
840
867
|
|
841
868
|
if (height-- == 0) {
|
842
869
|
tree->edges_[pos.index] = ResizeEdge(edge, length, edge_is_mutable);
|
@@ -973,7 +1000,7 @@ char CordRepBtree::GetCharacter(size_t offset) const {
|
|
973
1000
|
Span<char> CordRepBtree::GetAppendBufferSlow(size_t size) {
|
974
1001
|
// The inlined version in `GetAppendBuffer()` deals with all heights <= 3.
|
975
1002
|
assert(height() >= 4);
|
976
|
-
assert(refcount.
|
1003
|
+
assert(refcount.IsOne());
|
977
1004
|
|
978
1005
|
// Build a stack of nodes we may potentially need to update if we find a
|
979
1006
|
// non-shared FLAT with capacity at the leaf level.
|
@@ -982,13 +1009,13 @@ Span<char> CordRepBtree::GetAppendBufferSlow(size_t size) {
|
|
982
1009
|
CordRepBtree* stack[kMaxDepth];
|
983
1010
|
for (int i = 0; i < depth; ++i) {
|
984
1011
|
node = node->Edge(kBack)->btree();
|
985
|
-
if (!node->refcount.
|
1012
|
+
if (!node->refcount.IsOne()) return {};
|
986
1013
|
stack[i] = node;
|
987
1014
|
}
|
988
1015
|
|
989
1016
|
// Must be a privately owned, mutable flat.
|
990
1017
|
CordRep* const edge = node->Edge(kBack);
|
991
|
-
if (!edge->refcount.
|
1018
|
+
if (!edge->refcount.IsOne() || edge->tag < FLAT) return {};
|
992
1019
|
|
993
1020
|
// Must have capacity.
|
994
1021
|
const size_t avail = edge->flat()->Capacity() - edge->length;
|
@@ -1123,6 +1150,79 @@ CordRepBtree* CordRepBtree::Rebuild(CordRepBtree* tree) {
|
|
1123
1150
|
return nullptr;
|
1124
1151
|
}
|
1125
1152
|
|
1153
|
+
CordRepBtree::ExtractResult CordRepBtree::ExtractAppendBuffer(
|
1154
|
+
CordRepBtree* tree, size_t extra_capacity) {
|
1155
|
+
int depth = 0;
|
1156
|
+
NodeStack stack;
|
1157
|
+
|
1158
|
+
// Set up default 'no success' result which is {tree, nullptr}.
|
1159
|
+
ExtractResult result;
|
1160
|
+
result.tree = tree;
|
1161
|
+
result.extracted = nullptr;
|
1162
|
+
|
1163
|
+
// Dive down the right side of the tree, making sure no edges are shared.
|
1164
|
+
while (tree->height() > 0) {
|
1165
|
+
if (!tree->refcount.IsOne()) return result;
|
1166
|
+
stack[depth++] = tree;
|
1167
|
+
tree = tree->Edge(kBack)->btree();
|
1168
|
+
}
|
1169
|
+
if (!tree->refcount.IsOne()) return result;
|
1170
|
+
|
1171
|
+
// Validate we ended on a non shared flat.
|
1172
|
+
CordRep* rep = tree->Edge(kBack);
|
1173
|
+
if (!(rep->IsFlat() && rep->refcount.IsOne())) return result;
|
1174
|
+
|
1175
|
+
// Verify it has at least the requested extra capacity.
|
1176
|
+
CordRepFlat* flat = rep->flat();
|
1177
|
+
const size_t length = flat->length;
|
1178
|
+
const size_t avail = flat->Capacity() - flat->length;
|
1179
|
+
if (extra_capacity > avail) return result;
|
1180
|
+
|
1181
|
+
// Set the extracted flat in the result.
|
1182
|
+
result.extracted = flat;
|
1183
|
+
|
1184
|
+
// Cascading delete all nodes that become empty.
|
1185
|
+
while (tree->size() == 1) {
|
1186
|
+
CordRepBtree::Delete(tree);
|
1187
|
+
if (--depth < 0) {
|
1188
|
+
// We consumed the entire tree: return nullptr for new tree.
|
1189
|
+
result.tree = nullptr;
|
1190
|
+
return result;
|
1191
|
+
}
|
1192
|
+
rep = tree;
|
1193
|
+
tree = stack[depth];
|
1194
|
+
}
|
1195
|
+
|
1196
|
+
// Remove the edge or cascaded up parent node.
|
1197
|
+
tree->set_end(tree->end() - 1);
|
1198
|
+
tree->length -= length;
|
1199
|
+
|
1200
|
+
// Adjust lengths up the tree.
|
1201
|
+
while (depth > 0) {
|
1202
|
+
tree = stack[--depth];
|
1203
|
+
tree->length -= length;
|
1204
|
+
}
|
1205
|
+
|
1206
|
+
// Remove unnecessary top nodes with size = 1. This may iterate all the way
|
1207
|
+
// down to the leaf node in which case we simply return the remaining last
|
1208
|
+
// edge in that node and the extracted flat.
|
1209
|
+
while (tree->size() == 1) {
|
1210
|
+
int height = tree->height();
|
1211
|
+
rep = tree->Edge(kBack);
|
1212
|
+
Delete(tree);
|
1213
|
+
if (height == 0) {
|
1214
|
+
// We consumed the leaf: return the sole data edge as the new tree.
|
1215
|
+
result.tree = rep;
|
1216
|
+
return result;
|
1217
|
+
}
|
1218
|
+
tree = rep->btree();
|
1219
|
+
}
|
1220
|
+
|
1221
|
+
// Done: return the (new) top level node and extracted flat.
|
1222
|
+
result.tree = tree;
|
1223
|
+
return result;
|
1224
|
+
}
|
1225
|
+
|
1126
1226
|
} // namespace cord_internal
|
1127
1227
|
ABSL_NAMESPACE_END
|
1128
1228
|
} // namespace absl
|
@@ -22,6 +22,7 @@
|
|
22
22
|
#include "absl/base/config.h"
|
23
23
|
#include "absl/base/internal/raw_logging.h"
|
24
24
|
#include "absl/base/optimization.h"
|
25
|
+
#include "absl/strings/internal/cord_data_edge.h"
|
25
26
|
#include "absl/strings/internal/cord_internal.h"
|
26
27
|
#include "absl/strings/internal/cord_rep_flat.h"
|
27
28
|
#include "absl/strings/string_view.h"
|
@@ -163,6 +164,9 @@ class CordRepBtree : public CordRep {
|
|
163
164
|
// typically after a ref_count.Decrement() on the last reference count.
|
164
165
|
static void Destroy(CordRepBtree* tree);
|
165
166
|
|
167
|
+
// Destruction
|
168
|
+
static void Delete(CordRepBtree* tree) { delete tree; }
|
169
|
+
|
166
170
|
// Use CordRep::Unref() as we overload for absl::Span<CordRep* const>.
|
167
171
|
using CordRep::Unref;
|
168
172
|
|
@@ -240,11 +244,41 @@ class CordRepBtree : public CordRep {
|
|
240
244
|
// length of the flat node and involved tree nodes have been increased by
|
241
245
|
// `span.length()`. The caller is responsible for immediately assigning values
|
242
246
|
// to all uninitialized data reference by the returned span.
|
243
|
-
// Requires `this->refcount.
|
244
|
-
//
|
245
|
-
//
|
247
|
+
// Requires `this->refcount.IsOne()`: this function forces the caller to do
|
248
|
+
// this fast path check on the top level node, as this is the most commonly
|
249
|
+
// shared node of a cord tree.
|
246
250
|
Span<char> GetAppendBuffer(size_t size);
|
247
251
|
|
252
|
+
// Extracts the right-most data edge from this tree iff:
|
253
|
+
// - the tree and all internal edges to the right-most node are not shared.
|
254
|
+
// - the right-most node is a FLAT node and not shared.
|
255
|
+
// - the right-most node has at least the desired extra capacity.
|
256
|
+
//
|
257
|
+
// Returns {tree, nullptr} if any of the above conditions are not met.
|
258
|
+
// This method effectively removes data from the tree. The intent of this
|
259
|
+
// method is to allow applications appending small string data to use
|
260
|
+
// pre-existing capacity, and add the modified rep back to the tree.
|
261
|
+
//
|
262
|
+
// Simplified such code would look similar to this:
|
263
|
+
// void MyTreeBuilder::Append(string_view data) {
|
264
|
+
// ExtractResult result = CordRepBtree::ExtractAppendBuffer(tree_, 1);
|
265
|
+
// if (CordRep* rep = result.extracted) {
|
266
|
+
// size_t available = rep->Capacity() - rep->length;
|
267
|
+
// size_t n = std::min(data.size(), n);
|
268
|
+
// memcpy(rep->Data(), data.data(), n);
|
269
|
+
// rep->length += n;
|
270
|
+
// data.remove_prefix(n);
|
271
|
+
// if (!result.tree->IsBtree()) {
|
272
|
+
// tree_ = CordRepBtree::Create(result.tree);
|
273
|
+
// }
|
274
|
+
// tree_ = CordRepBtree::Append(tree_, rep);
|
275
|
+
// }
|
276
|
+
// ...
|
277
|
+
// // Remaining edge in `result.tree`.
|
278
|
+
// }
|
279
|
+
static ExtractResult ExtractAppendBuffer(CordRepBtree* tree,
|
280
|
+
size_t extra_capacity = 1);
|
281
|
+
|
248
282
|
// Returns the `height` of the tree. The height of a tree is limited to
|
249
283
|
// kMaxHeight. `height` is implemented as an `int` as in some places we
|
250
284
|
// use negative (-1) values for 'data edges'.
|
@@ -277,13 +311,6 @@ class CordRepBtree : public CordRep {
|
|
277
311
|
// Requires this instance to be a leaf node, and `index` to be valid index.
|
278
312
|
inline absl::string_view Data(size_t index) const;
|
279
313
|
|
280
|
-
static const char* EdgeDataPtr(const CordRep* r);
|
281
|
-
static absl::string_view EdgeData(const CordRep* r);
|
282
|
-
|
283
|
-
// Returns true if the provided rep is a FLAT, EXTERNAL or a SUBSTRING node
|
284
|
-
// holding a FLAT or EXTERNAL child rep.
|
285
|
-
static bool IsDataEdge(const CordRep* rep);
|
286
|
-
|
287
314
|
// Diagnostics: returns true if `tree` is valid and internally consistent.
|
288
315
|
// If `shallow` is false, then the provided top level node and all child nodes
|
289
316
|
// below it are recursively checked. If `shallow` is true, only the provided
|
@@ -410,12 +437,6 @@ class CordRepBtree : public CordRep {
|
|
410
437
|
// Requires `offset` < length.
|
411
438
|
Position IndexBeyond(size_t offset) const;
|
412
439
|
|
413
|
-
// Destruction
|
414
|
-
static void DestroyLeaf(CordRepBtree* tree, size_t begin, size_t end);
|
415
|
-
static void DestroyNonLeaf(CordRepBtree* tree, size_t begin, size_t end);
|
416
|
-
static void DestroyTree(CordRepBtree* tree, size_t begin, size_t end);
|
417
|
-
static void Delete(CordRepBtree* tree) { delete tree; }
|
418
|
-
|
419
440
|
// Creates a new leaf node containing as much data as possible from `data`.
|
420
441
|
// The data is added either forwards or reversed depending on `edge_type`.
|
421
442
|
// Callers must check the length of the returned node to determine if all data
|
@@ -604,34 +625,11 @@ inline absl::Span<CordRep* const> CordRepBtree::Edges(size_t begin,
|
|
604
625
|
return {edges_ + begin, static_cast<size_t>(end - begin)};
|
605
626
|
}
|
606
627
|
|
607
|
-
inline const char* CordRepBtree::EdgeDataPtr(const CordRep* r) {
|
608
|
-
assert(IsDataEdge(r));
|
609
|
-
size_t offset = 0;
|
610
|
-
if (r->tag == SUBSTRING) {
|
611
|
-
offset = r->substring()->start;
|
612
|
-
r = r->substring()->child;
|
613
|
-
}
|
614
|
-
return (r->tag >= FLAT ? r->flat()->Data() : r->external()->base) + offset;
|
615
|
-
}
|
616
|
-
|
617
|
-
inline absl::string_view CordRepBtree::EdgeData(const CordRep* r) {
|
618
|
-
return absl::string_view(EdgeDataPtr(r), r->length);
|
619
|
-
}
|
620
|
-
|
621
628
|
inline absl::string_view CordRepBtree::Data(size_t index) const {
|
622
629
|
assert(height() == 0);
|
623
630
|
return EdgeData(Edge(index));
|
624
631
|
}
|
625
632
|
|
626
|
-
inline bool CordRepBtree::IsDataEdge(const CordRep* rep) {
|
627
|
-
// The fast path is that `rep` is an EXTERNAL or FLAT node, making the below
|
628
|
-
// if a single, well predicted branch. We then repeat the FLAT or EXTERNAL
|
629
|
-
// check in the slow path the SUBSTRING check to optimize for the hot path.
|
630
|
-
if (rep->tag == EXTERNAL || rep->tag >= FLAT) return true;
|
631
|
-
if (rep->tag == SUBSTRING) rep = rep->substring()->child;
|
632
|
-
return rep->tag == EXTERNAL || rep->tag >= FLAT;
|
633
|
-
}
|
634
|
-
|
635
633
|
inline CordRepBtree* CordRepBtree::New(int height) {
|
636
634
|
CordRepBtree* tree = new CordRepBtree;
|
637
635
|
tree->length = 0;
|
@@ -659,19 +657,6 @@ inline CordRepBtree* CordRepBtree::New(CordRepBtree* front,
|
|
659
657
|
return tree;
|
660
658
|
}
|
661
659
|
|
662
|
-
inline void CordRepBtree::DestroyTree(CordRepBtree* tree, size_t begin,
|
663
|
-
size_t end) {
|
664
|
-
if (tree->height() == 0) {
|
665
|
-
DestroyLeaf(tree, begin, end);
|
666
|
-
} else {
|
667
|
-
DestroyNonLeaf(tree, begin, end);
|
668
|
-
}
|
669
|
-
}
|
670
|
-
|
671
|
-
inline void CordRepBtree::Destroy(CordRepBtree* tree) {
|
672
|
-
DestroyTree(tree, tree->begin(), tree->end());
|
673
|
-
}
|
674
|
-
|
675
660
|
inline void CordRepBtree::Unref(absl::Span<CordRep* const> edges) {
|
676
661
|
for (CordRep* edge : edges) {
|
677
662
|
if (ABSL_PREDICT_FALSE(!edge->refcount.Decrement())) {
|
@@ -731,7 +716,7 @@ inline void CordRepBtree::AlignBegin() {
|
|
731
716
|
// size, and then do overlapping load/store of up to 4 pointers (inlined as
|
732
717
|
// XMM, YMM or ZMM load/store) and up to 2 pointers (XMM / YMM), which is a)
|
733
718
|
// compact and b) not clobbering any registers.
|
734
|
-
|
719
|
+
ABSL_ASSUME(new_end <= kMaxCapacity);
|
735
720
|
#ifdef __clang__
|
736
721
|
#pragma unroll 1
|
737
722
|
#endif
|
@@ -749,7 +734,7 @@ inline void CordRepBtree::AlignEnd() {
|
|
749
734
|
const size_t new_end = end() + delta;
|
750
735
|
set_begin(new_begin);
|
751
736
|
set_end(new_end);
|
752
|
-
|
737
|
+
ABSL_ASSUME(new_end <= kMaxCapacity);
|
753
738
|
#ifdef __clang__
|
754
739
|
#pragma unroll 1
|
755
740
|
#endif
|
@@ -849,7 +834,7 @@ inline CordRepBtree* CordRepBtree::Create(CordRep* rep) {
|
|
849
834
|
}
|
850
835
|
|
851
836
|
inline Span<char> CordRepBtree::GetAppendBuffer(size_t size) {
|
852
|
-
assert(refcount.
|
837
|
+
assert(refcount.IsOne());
|
853
838
|
CordRepBtree* tree = this;
|
854
839
|
const int height = this->height();
|
855
840
|
CordRepBtree* n1 = tree;
|
@@ -858,21 +843,21 @@ inline Span<char> CordRepBtree::GetAppendBuffer(size_t size) {
|
|
858
843
|
switch (height) {
|
859
844
|
case 3:
|
860
845
|
tree = tree->Edge(kBack)->btree();
|
861
|
-
if (!tree->refcount.
|
846
|
+
if (!tree->refcount.IsOne()) return {};
|
862
847
|
n2 = tree;
|
863
848
|
ABSL_FALLTHROUGH_INTENDED;
|
864
849
|
case 2:
|
865
850
|
tree = tree->Edge(kBack)->btree();
|
866
|
-
if (!tree->refcount.
|
851
|
+
if (!tree->refcount.IsOne()) return {};
|
867
852
|
n1 = tree;
|
868
853
|
ABSL_FALLTHROUGH_INTENDED;
|
869
854
|
case 1:
|
870
855
|
tree = tree->Edge(kBack)->btree();
|
871
|
-
if (!tree->refcount.
|
856
|
+
if (!tree->refcount.IsOne()) return {};
|
872
857
|
ABSL_FALLTHROUGH_INTENDED;
|
873
858
|
case 0:
|
874
859
|
CordRep* edge = tree->Edge(kBack);
|
875
|
-
if (!edge->refcount.
|
860
|
+
if (!edge->refcount.IsOne()) return {};
|
876
861
|
if (edge->tag < FLAT) return {};
|
877
862
|
size_t avail = edge->flat()->Capacity() - edge->length;
|
878
863
|
if (avail == 0) return {};
|
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
#include <cassert>
|
18
18
|
|
19
|
+
#include "absl/strings/internal/cord_data_edge.h"
|
19
20
|
#include "absl/strings/internal/cord_internal.h"
|
20
21
|
#include "absl/strings/internal/cord_rep_btree.h"
|
21
22
|
|
@@ -39,7 +40,7 @@ inline CordRep* Substring(CordRep* rep, size_t offset, size_t n) {
|
|
39
40
|
assert(n <= rep->length);
|
40
41
|
assert(offset < rep->length);
|
41
42
|
assert(offset <= rep->length - n);
|
42
|
-
assert(
|
43
|
+
assert(IsDataEdge(rep));
|
43
44
|
|
44
45
|
if (n == 0) return nullptr;
|
45
46
|
if (n == rep->length) return CordRep::Ref(rep);
|
@@ -49,6 +50,7 @@ inline CordRep* Substring(CordRep* rep, size_t offset, size_t n) {
|
|
49
50
|
rep = rep->substring()->child;
|
50
51
|
}
|
51
52
|
|
53
|
+
assert(rep->IsExternal() || rep->IsFlat());
|
52
54
|
CordRepSubstring* substring = new CordRepSubstring();
|
53
55
|
substring->length = n;
|
54
56
|
substring->tag = SUBSTRING;
|
@@ -143,8 +143,8 @@ class CordRepBtreeNavigator {
|
|
143
143
|
// `index_` and `node_` contain the navigation state as the 'path' to the
|
144
144
|
// current data edge which is at `node_[0]->Edge(index_[0])`. The contents
|
145
145
|
// of these are undefined until the instance is initialized (`height_ >= 0`).
|
146
|
-
uint8_t index_[CordRepBtree::
|
147
|
-
CordRepBtree* node_[CordRepBtree::
|
146
|
+
uint8_t index_[CordRepBtree::kMaxDepth];
|
147
|
+
CordRepBtree* node_[CordRepBtree::kMaxDepth];
|
148
148
|
};
|
149
149
|
|
150
150
|
// Returns true if this instance is not empty.
|
@@ -173,6 +173,7 @@ template <CordRepBtree::EdgeType edge_type>
|
|
173
173
|
inline CordRep* CordRepBtreeNavigator::Init(CordRepBtree* tree) {
|
174
174
|
assert(tree != nullptr);
|
175
175
|
assert(tree->size() > 0);
|
176
|
+
assert(tree->height() <= CordRepBtree::kMaxHeight);
|
176
177
|
int height = height_ = tree->height();
|
177
178
|
size_t index = tree->index(edge_type);
|
178
179
|
node_[height] = tree;
|
@@ -206,6 +207,7 @@ inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::Seek(
|
|
206
207
|
inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::InitOffset(
|
207
208
|
CordRepBtree* tree, size_t offset) {
|
208
209
|
assert(tree != nullptr);
|
210
|
+
assert(tree->height() <= CordRepBtree::kMaxHeight);
|
209
211
|
if (ABSL_PREDICT_FALSE(offset >= tree->length)) return {nullptr, 0};
|
210
212
|
height_ = tree->height();
|
211
213
|
node_[height_] = tree;
|
@@ -17,6 +17,7 @@
|
|
17
17
|
#include <cassert>
|
18
18
|
|
19
19
|
#include "absl/base/config.h"
|
20
|
+
#include "absl/strings/internal/cord_data_edge.h"
|
20
21
|
#include "absl/strings/internal/cord_internal.h"
|
21
22
|
#include "absl/strings/internal/cord_rep_btree.h"
|
22
23
|
#include "absl/strings/internal/cord_rep_btree_navigator.h"
|
@@ -44,7 +45,7 @@ absl::string_view CordRepBtreeReader::Read(size_t n, size_t chunk_size,
|
|
44
45
|
// can directly return the substring into the current data edge as the next
|
45
46
|
// chunk. We can easily establish from the above code that `navigator_.Next()`
|
46
47
|
// has not been called as that requires `chunk_size` to be zero.
|
47
|
-
if (n < chunk_size) return
|
48
|
+
if (n < chunk_size) return EdgeData(edge).substr(result.n);
|
48
49
|
|
49
50
|
// The amount of data taken from the last edge is `chunk_size` and `result.n`
|
50
51
|
// contains the offset into the current edge trailing the read data (which can
|
@@ -60,7 +61,7 @@ absl::string_view CordRepBtreeReader::Read(size_t n, size_t chunk_size,
|
|
60
61
|
// We did not read all data, return remaining data from current edge.
|
61
62
|
edge = navigator_.Current();
|
62
63
|
remaining_ -= consumed_by_read + edge->length;
|
63
|
-
return
|
64
|
+
return EdgeData(edge).substr(result.n);
|
64
65
|
}
|
65
66
|
|
66
67
|
} // namespace cord_internal
|
@@ -18,6 +18,7 @@
|
|
18
18
|
#include <cassert>
|
19
19
|
|
20
20
|
#include "absl/base/config.h"
|
21
|
+
#include "absl/strings/internal/cord_data_edge.h"
|
21
22
|
#include "absl/strings/internal/cord_internal.h"
|
22
23
|
#include "absl/strings/internal/cord_rep_btree.h"
|
23
24
|
#include "absl/strings/internal/cord_rep_btree_navigator.h"
|
@@ -167,7 +168,7 @@ inline absl::string_view CordRepBtreeReader::Init(CordRepBtree* tree) {
|
|
167
168
|
assert(tree != nullptr);
|
168
169
|
const CordRep* edge = navigator_.InitFirst(tree);
|
169
170
|
remaining_ = tree->length - edge->length;
|
170
|
-
return
|
171
|
+
return EdgeData(edge);
|
171
172
|
}
|
172
173
|
|
173
174
|
inline absl::string_view CordRepBtreeReader::Next() {
|
@@ -175,7 +176,7 @@ inline absl::string_view CordRepBtreeReader::Next() {
|
|
175
176
|
const CordRep* edge = navigator_.Next();
|
176
177
|
assert(edge != nullptr);
|
177
178
|
remaining_ -= edge->length;
|
178
|
-
return
|
179
|
+
return EdgeData(edge);
|
179
180
|
}
|
180
181
|
|
181
182
|
inline absl::string_view CordRepBtreeReader::Skip(size_t skip) {
|
@@ -190,7 +191,7 @@ inline absl::string_view CordRepBtreeReader::Skip(size_t skip) {
|
|
190
191
|
// The combined length of all edges skipped before `pos.edge` is `skip -
|
191
192
|
// pos.offset`, all of which are 'consumed', as well as the current edge.
|
192
193
|
remaining_ -= skip - pos.offset + pos.edge->length;
|
193
|
-
return
|
194
|
+
return EdgeData(pos.edge).substr(pos.offset);
|
194
195
|
}
|
195
196
|
|
196
197
|
inline absl::string_view CordRepBtreeReader::Seek(size_t offset) {
|
@@ -199,7 +200,7 @@ inline absl::string_view CordRepBtreeReader::Seek(size_t offset) {
|
|
199
200
|
remaining_ = 0;
|
200
201
|
return {};
|
201
202
|
}
|
202
|
-
absl::string_view chunk =
|
203
|
+
absl::string_view chunk = EdgeData(pos.edge).substr(pos.offset);
|
203
204
|
remaining_ = length() - offset - chunk.length();
|
204
205
|
return chunk;
|
205
206
|
}
|