grpc 1.37.1 → 1.38.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 +64 -58
- data/include/grpc/event_engine/README.md +38 -0
- data/include/grpc/event_engine/channel_args.h +28 -0
- data/include/grpc/event_engine/event_engine.h +336 -0
- data/include/grpc/event_engine/port.h +39 -0
- data/include/grpc/event_engine/slice_allocator.h +81 -0
- data/include/grpc/grpc.h +2 -2
- data/include/grpc/grpc_security_constants.h +14 -0
- data/include/grpc/impl/codegen/grpc_types.h +11 -0
- data/include/grpc/impl/codegen/port_platform.h +5 -0
- data/include/grpc/module.modulemap +14 -14
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
- data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
- data/src/core/ext/filters/client_channel/client_channel.h +489 -55
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
- 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 +9 -10
- data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
- data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
- data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
- data/src/core/ext/filters/client_channel/resolver.h +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
- data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
- data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
- data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
- data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
- data/src/core/ext/filters/client_channel/server_address.cc +1 -1
- data/src/core/ext/filters/client_channel/service_config.cc +15 -14
- data/src/core/ext/filters/client_channel/service_config.h +7 -6
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
- data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
- data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
- data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
- data/src/core/ext/filters/client_channel/subchannel.h +7 -6
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
- data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
- data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
- data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
- data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
- data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
- data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
- data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
- data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
- data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
- data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
- data/src/core/ext/xds/certificate_provider_factory.h +1 -1
- data/src/core/ext/xds/certificate_provider_store.h +3 -3
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
- data/src/core/ext/xds/xds_api.cc +101 -93
- data/src/core/ext/xds/xds_api.h +6 -6
- data/src/core/ext/xds/xds_bootstrap.cc +97 -159
- data/src/core/ext/xds/xds_bootstrap.h +19 -24
- data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
- data/src/core/ext/xds/xds_certificate_provider.h +4 -4
- data/src/core/ext/xds/xds_channel_args.h +5 -2
- data/src/core/ext/xds/xds_client.cc +310 -178
- data/src/core/ext/xds/xds_client.h +41 -27
- data/src/core/ext/xds/xds_client_stats.h +3 -2
- data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
- data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
- data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
- data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
- data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
- data/src/core/lib/channel/channel_stack.cc +10 -9
- data/src/core/lib/channel/channel_stack.h +10 -9
- data/src/core/lib/channel/channel_stack_builder.cc +2 -2
- data/src/core/lib/channel/channel_stack_builder.h +1 -1
- data/src/core/lib/channel/channelz.cc +21 -13
- data/src/core/lib/channel/connected_channel.cc +4 -4
- data/src/core/lib/channel/handshaker.cc +7 -6
- data/src/core/lib/channel/handshaker.h +5 -5
- data/src/core/lib/event_engine/slice_allocator.cc +59 -0
- data/src/core/lib/event_engine/sockaddr.cc +38 -0
- data/src/core/lib/gprpp/ref_counted.h +28 -14
- data/src/core/lib/gprpp/status_helper.cc +407 -0
- data/src/core/lib/gprpp/status_helper.h +180 -0
- data/src/core/lib/http/httpcli.cc +11 -11
- data/src/core/lib/http/httpcli_security_connector.cc +11 -7
- data/src/core/lib/http/parser.cc +16 -16
- data/src/core/lib/http/parser.h +4 -4
- data/src/core/lib/iomgr/buffer_list.cc +7 -9
- data/src/core/lib/iomgr/buffer_list.h +4 -5
- data/src/core/lib/iomgr/call_combiner.cc +15 -12
- data/src/core/lib/iomgr/call_combiner.h +12 -14
- data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
- data/src/core/lib/iomgr/cfstream_handle.h +1 -1
- data/src/core/lib/iomgr/closure.h +7 -6
- data/src/core/lib/iomgr/combiner.cc +14 -12
- data/src/core/lib/iomgr/combiner.h +2 -2
- data/src/core/lib/iomgr/endpoint.cc +1 -1
- data/src/core/lib/iomgr/endpoint.h +2 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
- data/src/core/lib/iomgr/error.cc +167 -61
- data/src/core/lib/iomgr/error.h +217 -106
- data/src/core/lib/iomgr/error_cfstream.cc +3 -2
- data/src/core/lib/iomgr/error_cfstream.h +2 -2
- data/src/core/lib/iomgr/error_internal.h +5 -1
- data/src/core/lib/iomgr/ev_apple.cc +5 -5
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
- data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
- data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
- data/src/core/lib/iomgr/ev_posix.cc +9 -8
- data/src/core/lib/iomgr/ev_posix.h +9 -9
- data/src/core/lib/iomgr/exec_ctx.cc +4 -4
- data/src/core/lib/iomgr/exec_ctx.h +1 -1
- data/src/core/lib/iomgr/executor.cc +8 -8
- data/src/core/lib/iomgr/executor.h +2 -2
- data/src/core/lib/iomgr/iomgr.cc +1 -1
- data/src/core/lib/iomgr/iomgr.h +1 -1
- data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
- data/src/core/lib/iomgr/iomgr_internal.h +3 -3
- data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
- data/src/core/lib/iomgr/load_file.cc +4 -4
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +5 -5
- data/src/core/lib/iomgr/lockfree_event.h +1 -1
- data/src/core/lib/iomgr/pollset.cc +5 -5
- data/src/core/lib/iomgr/pollset.h +9 -9
- data/src/core/lib/iomgr/pollset_custom.cc +5 -5
- data/src/core/lib/iomgr/pollset_windows.cc +5 -5
- data/src/core/lib/iomgr/port.h +1 -1
- data/src/core/lib/iomgr/python_util.h +1 -1
- data/src/core/lib/iomgr/resolve_address.cc +3 -3
- data/src/core/lib/iomgr/resolve_address.h +6 -6
- data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
- data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
- data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
- data/src/core/lib/iomgr/resource_quota.cc +11 -10
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
- data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
- data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
- data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
- data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
- data/src/core/lib/iomgr/tcp_custom.cc +14 -16
- data/src/core/lib/iomgr/tcp_custom.h +13 -12
- data/src/core/lib/iomgr/tcp_posix.cc +36 -34
- data/src/core/lib/iomgr/tcp_server.cc +6 -6
- data/src/core/lib/iomgr/tcp_server.h +12 -11
- data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
- data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
- data/src/core/lib/iomgr/tcp_uv.cc +25 -23
- data/src/core/lib/iomgr/tcp_windows.cc +13 -13
- data/src/core/lib/iomgr/tcp_windows.h +2 -2
- data/src/core/lib/iomgr/timer_custom.cc +2 -1
- data/src/core/lib/iomgr/timer_custom.h +1 -1
- data/src/core/lib/iomgr/timer_generic.cc +6 -6
- data/src/core/lib/iomgr/udp_server.cc +21 -20
- data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
- data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
- data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
- data/src/core/lib/iomgr/work_serializer.h +17 -1
- data/src/core/lib/json/json.h +1 -1
- data/src/core/lib/json/json_reader.cc +4 -4
- data/src/core/lib/matchers/matchers.cc +39 -39
- data/src/core/lib/matchers/matchers.h +28 -28
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.h +2 -2
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
- data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
- data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
- data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
- data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
- data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
- data/src/core/lib/security/security_connector/security_connector.h +9 -4
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
- data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
- data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
- data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
- data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
- data/src/core/lib/security/transport/security_handshaker.cc +33 -32
- data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
- data/src/core/lib/security/transport/tsi_error.cc +2 -1
- data/src/core/lib/security/transport/tsi_error.h +2 -1
- data/src/core/lib/security/util/json_util.cc +2 -2
- data/src/core/lib/security/util/json_util.h +1 -1
- data/src/core/lib/surface/call.cc +46 -45
- data/src/core/lib/surface/call.h +2 -2
- data/src/core/lib/surface/channel.cc +6 -6
- data/src/core/lib/surface/channel.h +3 -2
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/completion_queue.cc +46 -47
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/lame_client.cc +11 -11
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +28 -22
- data/src/core/lib/surface/server.h +16 -15
- data/src/core/lib/surface/validate_metadata.cc +7 -7
- data/src/core/lib/surface/validate_metadata.h +3 -2
- data/src/core/lib/surface/version.cc +4 -2
- data/src/core/lib/transport/byte_stream.cc +5 -5
- data/src/core/lib/transport/byte_stream.h +8 -8
- data/src/core/lib/transport/connectivity_state.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +19 -8
- data/src/core/lib/transport/error_utils.h +11 -5
- data/src/core/lib/transport/metadata_batch.cc +37 -37
- data/src/core/lib/transport/metadata_batch.h +19 -18
- data/src/core/lib/transport/transport.cc +4 -3
- data/src/core/lib/transport/transport.h +4 -4
- data/src/core/lib/transport/transport_op_string.cc +5 -5
- data/src/core/tsi/alts/crypt/gsec.h +4 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
- data/src/core/tsi/ssl_transport_security.cc +32 -14
- data/src/core/tsi/ssl_transport_security.h +3 -4
- data/src/ruby/bin/math_services_pb.rb +1 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
- data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
- data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
- data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
- data/third_party/abseil-cpp/absl/base/config.h +37 -9
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
- data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
- data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
- data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
- data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
- data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
- data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
- data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
- data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
- data/third_party/abseil-cpp/absl/base/macros.h +11 -0
- data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/base/port.h +0 -1
- data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
- data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
- data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
- data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
- data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
- data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
- data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
- data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
- data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
- data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
- data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
- data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
- data/third_party/abseil-cpp/absl/status/status.cc +29 -22
- data/third_party/abseil-cpp/absl/status/status.h +81 -20
- data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
- data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
- data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
- data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
- data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
- data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
- data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
- data/third_party/abseil-cpp/absl/strings/match.h +16 -6
- data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
- data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
- data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
- data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
- data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
- data/third_party/abseil-cpp/absl/time/clock.h +2 -2
- data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
- data/third_party/abseil-cpp/absl/time/time.cc +4 -3
- data/third_party/abseil-cpp/absl/time/time.h +26 -24
- data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
- data/third_party/abseil-cpp/absl/types/variant.h +9 -4
- data/third_party/boringssl-with-bazel/err_data.c +477 -461
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
- data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
- data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
- data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
- data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
- data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
- data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
- data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
- data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
- data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
- data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
- data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
- data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
- data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
- data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
- data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
- data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
- data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
- data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
- metadata +68 -45
- data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
- data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
- data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
- data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -246,8 +246,8 @@ constexpr int DigitMagnitude<16>() {
|
|
246
246
|
// ConsumeDigits does not protect against overflow on *out; max_digits must
|
247
247
|
// be chosen with respect to type T to avoid the possibility of overflow.
|
248
248
|
template <int base, typename T>
|
249
|
-
|
250
|
-
|
249
|
+
int ConsumeDigits(const char* begin, const char* end, int max_digits, T* out,
|
250
|
+
bool* dropped_nonzero_digit) {
|
251
251
|
if (base == 10) {
|
252
252
|
assert(max_digits <= std::numeric_limits<T>::digits10);
|
253
253
|
} else if (base == 16) {
|
@@ -282,7 +282,7 @@ std::size_t ConsumeDigits(const char* begin, const char* end, int max_digits,
|
|
282
282
|
*dropped_nonzero_digit = true;
|
283
283
|
}
|
284
284
|
*out = accumulator;
|
285
|
-
return begin - original_begin;
|
285
|
+
return static_cast<int>(begin - original_begin);
|
286
286
|
}
|
287
287
|
|
288
288
|
// Returns true if `v` is one of the chars allowed inside parentheses following
|
@@ -372,7 +372,7 @@ strings_internal::ParsedFloat ParseFloat(const char* begin, const char* end,
|
|
372
372
|
|
373
373
|
int exponent_adjustment = 0;
|
374
374
|
bool mantissa_is_inexact = false;
|
375
|
-
|
375
|
+
int pre_decimal_digits = ConsumeDigits<base>(
|
376
376
|
begin, end, MantissaDigitsMax<base>(), &mantissa, &mantissa_is_inexact);
|
377
377
|
begin += pre_decimal_digits;
|
378
378
|
int digits_left;
|
@@ -398,14 +398,14 @@ strings_internal::ParsedFloat ParseFloat(const char* begin, const char* end,
|
|
398
398
|
while (begin < end && *begin == '0') {
|
399
399
|
++begin;
|
400
400
|
}
|
401
|
-
|
401
|
+
int zeros_skipped = static_cast<int>(begin - begin_zeros);
|
402
402
|
if (zeros_skipped >= DigitLimit<base>()) {
|
403
403
|
// refuse to parse pathological inputs
|
404
404
|
return result;
|
405
405
|
}
|
406
406
|
exponent_adjustment -= static_cast<int>(zeros_skipped);
|
407
407
|
}
|
408
|
-
|
408
|
+
int post_decimal_digits = ConsumeDigits<base>(
|
409
409
|
begin, end, digits_left, &mantissa, &mantissa_is_inexact);
|
410
410
|
begin += post_decimal_digits;
|
411
411
|
|
@@ -0,0 +1,83 @@
|
|
1
|
+
// Copyright 2020 The Abseil Authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
#include "absl/strings/internal/cord_internal.h"
|
15
|
+
|
16
|
+
#include <atomic>
|
17
|
+
#include <cassert>
|
18
|
+
#include <memory>
|
19
|
+
|
20
|
+
#include "absl/container/inlined_vector.h"
|
21
|
+
#include "absl/strings/internal/cord_rep_flat.h"
|
22
|
+
#include "absl/strings/internal/cord_rep_ring.h"
|
23
|
+
|
24
|
+
namespace absl {
|
25
|
+
ABSL_NAMESPACE_BEGIN
|
26
|
+
namespace cord_internal {
|
27
|
+
|
28
|
+
ABSL_CONST_INIT std::atomic<bool> cord_ring_buffer_enabled(
|
29
|
+
kCordEnableRingBufferDefault);
|
30
|
+
ABSL_CONST_INIT std::atomic<bool> shallow_subcords_enabled(
|
31
|
+
kCordShallowSubcordsDefault);
|
32
|
+
|
33
|
+
void CordRep::Destroy(CordRep* rep) {
|
34
|
+
assert(rep != nullptr);
|
35
|
+
|
36
|
+
absl::InlinedVector<CordRep*, Constants::kInlinedVectorSize> pending;
|
37
|
+
while (true) {
|
38
|
+
assert(!rep->refcount.IsImmortal());
|
39
|
+
if (rep->tag == CONCAT) {
|
40
|
+
CordRepConcat* rep_concat = rep->concat();
|
41
|
+
CordRep* right = rep_concat->right;
|
42
|
+
if (!right->refcount.Decrement()) {
|
43
|
+
pending.push_back(right);
|
44
|
+
}
|
45
|
+
CordRep* left = rep_concat->left;
|
46
|
+
delete rep_concat;
|
47
|
+
rep = nullptr;
|
48
|
+
if (!left->refcount.Decrement()) {
|
49
|
+
rep = left;
|
50
|
+
continue;
|
51
|
+
}
|
52
|
+
} else if (rep->tag == RING) {
|
53
|
+
CordRepRing::Destroy(rep->ring());
|
54
|
+
rep = nullptr;
|
55
|
+
} else if (rep->tag == EXTERNAL) {
|
56
|
+
CordRepExternal::Delete(rep);
|
57
|
+
rep = nullptr;
|
58
|
+
} else if (rep->tag == SUBSTRING) {
|
59
|
+
CordRepSubstring* rep_substring = rep->substring();
|
60
|
+
CordRep* child = rep_substring->child;
|
61
|
+
delete rep_substring;
|
62
|
+
rep = nullptr;
|
63
|
+
if (!child->refcount.Decrement()) {
|
64
|
+
rep = child;
|
65
|
+
continue;
|
66
|
+
}
|
67
|
+
} else {
|
68
|
+
CordRepFlat::Delete(rep);
|
69
|
+
rep = nullptr;
|
70
|
+
}
|
71
|
+
|
72
|
+
if (!pending.empty()) {
|
73
|
+
rep = pending.back();
|
74
|
+
pending.pop_back();
|
75
|
+
} else {
|
76
|
+
break;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
} // namespace cord_internal
|
82
|
+
ABSL_NAMESPACE_END
|
83
|
+
} // namespace absl
|
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright
|
1
|
+
// Copyright 2021 The Abseil Authors.
|
2
2
|
//
|
3
3
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
// you may not use this file except in compliance with the License.
|
@@ -21,7 +21,10 @@
|
|
21
21
|
#include <cstdint>
|
22
22
|
#include <type_traits>
|
23
23
|
|
24
|
+
#include "absl/base/config.h"
|
25
|
+
#include "absl/base/internal/endian.h"
|
24
26
|
#include "absl/base/internal/invoke.h"
|
27
|
+
#include "absl/base/optimization.h"
|
25
28
|
#include "absl/container/internal/compressed_tuple.h"
|
26
29
|
#include "absl/meta/type_traits.h"
|
27
30
|
#include "absl/strings/string_view.h"
|
@@ -30,17 +33,55 @@ namespace absl {
|
|
30
33
|
ABSL_NAMESPACE_BEGIN
|
31
34
|
namespace cord_internal {
|
32
35
|
|
36
|
+
class CordzInfo;
|
37
|
+
|
38
|
+
// Default feature enable states for cord ring buffers
|
39
|
+
enum CordFeatureDefaults {
|
40
|
+
kCordEnableRingBufferDefault = false,
|
41
|
+
kCordShallowSubcordsDefault = false
|
42
|
+
};
|
43
|
+
|
44
|
+
extern std::atomic<bool> cord_ring_buffer_enabled;
|
45
|
+
extern std::atomic<bool> shallow_subcords_enabled;
|
46
|
+
|
47
|
+
inline void enable_cord_ring_buffer(bool enable) {
|
48
|
+
cord_ring_buffer_enabled.store(enable, std::memory_order_relaxed);
|
49
|
+
}
|
50
|
+
|
51
|
+
inline void enable_shallow_subcords(bool enable) {
|
52
|
+
shallow_subcords_enabled.store(enable, std::memory_order_relaxed);
|
53
|
+
}
|
54
|
+
|
55
|
+
enum Constants {
|
56
|
+
// The inlined size to use with absl::InlinedVector.
|
57
|
+
//
|
58
|
+
// Note: The InlinedVectors in this file (and in cord.h) do not need to use
|
59
|
+
// the same value for their inlined size. The fact that they do is historical.
|
60
|
+
// It may be desirable for each to use a different inlined size optimized for
|
61
|
+
// that InlinedVector's usage.
|
62
|
+
//
|
63
|
+
// TODO(jgm): Benchmark to see if there's a more optimal value than 47 for
|
64
|
+
// the inlined vector size (47 exists for backward compatibility).
|
65
|
+
kInlinedVectorSize = 47,
|
66
|
+
|
67
|
+
// Prefer copying blocks of at most this size, otherwise reference count.
|
68
|
+
kMaxBytesToCopy = 511
|
69
|
+
};
|
70
|
+
|
33
71
|
// Wraps std::atomic for reference counting.
|
34
72
|
class Refcount {
|
35
73
|
public:
|
36
|
-
Refcount() : count_{
|
37
|
-
|
74
|
+
constexpr Refcount() : count_{kRefIncrement} {}
|
75
|
+
struct Immortal {};
|
76
|
+
explicit constexpr Refcount(Immortal) : count_(kImmortalTag) {}
|
38
77
|
|
39
|
-
// Increments the reference count
|
40
|
-
inline void Increment() {
|
78
|
+
// Increments the reference count. Imposes no memory ordering.
|
79
|
+
inline void Increment() {
|
80
|
+
count_.fetch_add(kRefIncrement, std::memory_order_relaxed);
|
81
|
+
}
|
41
82
|
|
42
83
|
// Asserts that the current refcount is greater than 0. If the refcount is
|
43
|
-
// greater than 1, decrements the reference count
|
84
|
+
// greater than 1, decrements the reference count.
|
44
85
|
//
|
45
86
|
// Returns false if there are no references outstanding; true otherwise.
|
46
87
|
// Inserts barriers to ensure that state written before this method returns
|
@@ -48,19 +89,24 @@ class Refcount {
|
|
48
89
|
// false.
|
49
90
|
inline bool Decrement() {
|
50
91
|
int32_t refcount = count_.load(std::memory_order_acquire);
|
51
|
-
assert(refcount > 0);
|
52
|
-
return refcount !=
|
92
|
+
assert(refcount > 0 || refcount & kImmortalTag);
|
93
|
+
return refcount != kRefIncrement &&
|
94
|
+
count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel) !=
|
95
|
+
kRefIncrement;
|
53
96
|
}
|
54
97
|
|
55
98
|
// Same as Decrement but expect that refcount is greater than 1.
|
56
99
|
inline bool DecrementExpectHighRefcount() {
|
57
|
-
int32_t refcount =
|
58
|
-
|
59
|
-
|
100
|
+
int32_t refcount =
|
101
|
+
count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel);
|
102
|
+
assert(refcount > 0 || refcount & kImmortalTag);
|
103
|
+
return refcount != kRefIncrement;
|
60
104
|
}
|
61
105
|
|
62
106
|
// Returns the current reference count using acquire semantics.
|
63
|
-
inline int32_t Get() const {
|
107
|
+
inline int32_t Get() const {
|
108
|
+
return count_.load(std::memory_order_acquire) >> kImmortalShift;
|
109
|
+
}
|
64
110
|
|
65
111
|
// Returns whether the atomic integer is 1.
|
66
112
|
// If the reference count is used in the conventional way, a
|
@@ -70,9 +116,27 @@ class Refcount {
|
|
70
116
|
// performs the memory barrier needed for the owning thread
|
71
117
|
// to act on the object, knowing that it has exclusive access to the
|
72
118
|
// object.
|
73
|
-
inline bool IsOne() {
|
119
|
+
inline bool IsOne() {
|
120
|
+
return count_.load(std::memory_order_acquire) == kRefIncrement;
|
121
|
+
}
|
122
|
+
|
123
|
+
bool IsImmortal() const {
|
124
|
+
return (count_.load(std::memory_order_relaxed) & kImmortalTag) != 0;
|
125
|
+
}
|
74
126
|
|
75
127
|
private:
|
128
|
+
// We reserve the bottom bit to tag a reference count as immortal.
|
129
|
+
// By making it `1` we ensure that we never reach `0` when adding/subtracting
|
130
|
+
// `2`, thus it never looks as if it should be destroyed.
|
131
|
+
// These are used for the StringConstant constructor where we do not increase
|
132
|
+
// the refcount at construction time (due to constinit requirements) but we
|
133
|
+
// will still decrease it at destruction time to avoid branching on Unref.
|
134
|
+
enum {
|
135
|
+
kImmortalShift = 1,
|
136
|
+
kRefIncrement = 1 << kImmortalShift,
|
137
|
+
kImmortalTag = kRefIncrement - 1
|
138
|
+
};
|
139
|
+
|
76
140
|
std::atomic<int32_t> count_;
|
77
141
|
};
|
78
142
|
|
@@ -82,10 +146,33 @@ class Refcount {
|
|
82
146
|
// functions in the base class.
|
83
147
|
|
84
148
|
struct CordRepConcat;
|
85
|
-
struct CordRepSubstring;
|
86
149
|
struct CordRepExternal;
|
150
|
+
struct CordRepFlat;
|
151
|
+
struct CordRepSubstring;
|
152
|
+
class CordRepRing;
|
153
|
+
|
154
|
+
// Various representations that we allow
|
155
|
+
enum CordRepKind {
|
156
|
+
CONCAT = 0,
|
157
|
+
EXTERNAL = 1,
|
158
|
+
SUBSTRING = 2,
|
159
|
+
RING = 3,
|
160
|
+
|
161
|
+
// We have different tags for different sized flat arrays,
|
162
|
+
// starting with FLAT, and limited to MAX_FLAT_TAG. The 224 value is based on
|
163
|
+
// the current 'size to tag' encoding of 8 / 32 bytes. If a new tag is needed
|
164
|
+
// in the future, then 'FLAT' and 'MAX_FLAT_TAG' should be adjusted as well
|
165
|
+
// as the Tag <---> Size logic so that FLAT stil represents the minimum flat
|
166
|
+
// allocation size. (32 bytes as of now).
|
167
|
+
FLAT = 4,
|
168
|
+
MAX_FLAT_TAG = 224
|
169
|
+
};
|
87
170
|
|
88
171
|
struct CordRep {
|
172
|
+
CordRep() = default;
|
173
|
+
constexpr CordRep(Refcount::Immortal immortal, size_t l)
|
174
|
+
: length(l), refcount(immortal), tag(EXTERNAL), storage{} {}
|
175
|
+
|
89
176
|
// The following three fields have to be less than 32 bytes since
|
90
177
|
// that is the smallest supported flat node size.
|
91
178
|
size_t length;
|
@@ -93,22 +180,40 @@ struct CordRep {
|
|
93
180
|
// If tag < FLAT, it represents CordRepKind and indicates the type of node.
|
94
181
|
// Otherwise, the node type is CordRepFlat and the tag is the encoded size.
|
95
182
|
uint8_t tag;
|
96
|
-
char
|
183
|
+
char storage[1]; // Starting point for flat array: MUST BE LAST FIELD
|
97
184
|
|
185
|
+
inline CordRepRing* ring();
|
186
|
+
inline const CordRepRing* ring() const;
|
98
187
|
inline CordRepConcat* concat();
|
99
188
|
inline const CordRepConcat* concat() const;
|
100
189
|
inline CordRepSubstring* substring();
|
101
190
|
inline const CordRepSubstring* substring() const;
|
102
191
|
inline CordRepExternal* external();
|
103
192
|
inline const CordRepExternal* external() const;
|
193
|
+
inline CordRepFlat* flat();
|
194
|
+
inline const CordRepFlat* flat() const;
|
195
|
+
|
196
|
+
// --------------------------------------------------------------------
|
197
|
+
// Memory management
|
198
|
+
|
199
|
+
// Destroys the provided `rep`.
|
200
|
+
static void Destroy(CordRep* rep);
|
201
|
+
|
202
|
+
// Increments the reference count of `rep`.
|
203
|
+
// Requires `rep` to be a non-null pointer value.
|
204
|
+
static inline CordRep* Ref(CordRep* rep);
|
205
|
+
|
206
|
+
// Decrements the reference count of `rep`. Destroys rep if count reaches
|
207
|
+
// zero. Requires `rep` to be a non-null pointer value.
|
208
|
+
static inline void Unref(CordRep* rep);
|
104
209
|
};
|
105
210
|
|
106
211
|
struct CordRepConcat : public CordRep {
|
107
212
|
CordRep* left;
|
108
213
|
CordRep* right;
|
109
214
|
|
110
|
-
uint8_t depth() const { return static_cast<uint8_t>(
|
111
|
-
void set_depth(uint8_t depth) {
|
215
|
+
uint8_t depth() const { return static_cast<uint8_t>(storage[0]); }
|
216
|
+
void set_depth(uint8_t depth) { storage[0] = static_cast<char>(depth); }
|
112
217
|
};
|
113
218
|
|
114
219
|
struct CordRepSubstring : public CordRep {
|
@@ -124,9 +229,19 @@ using ExternalReleaserInvoker = void (*)(CordRepExternal*);
|
|
124
229
|
// External CordReps are allocated together with a type erased releaser. The
|
125
230
|
// releaser is stored in the memory directly following the CordRepExternal.
|
126
231
|
struct CordRepExternal : public CordRep {
|
232
|
+
CordRepExternal() = default;
|
233
|
+
explicit constexpr CordRepExternal(absl::string_view str)
|
234
|
+
: CordRep(Refcount::Immortal{}, str.size()),
|
235
|
+
base(str.data()),
|
236
|
+
releaser_invoker(nullptr) {}
|
237
|
+
|
127
238
|
const char* base;
|
128
239
|
// Pointer to function that knows how to call and destroy the releaser.
|
129
240
|
ExternalReleaserInvoker releaser_invoker;
|
241
|
+
|
242
|
+
// Deletes (releases) the external rep.
|
243
|
+
// Requires rep != nullptr and rep->tag == EXTERNAL
|
244
|
+
static void Delete(CordRep* rep);
|
130
245
|
};
|
131
246
|
|
132
247
|
struct Rank1 {};
|
@@ -167,7 +282,262 @@ struct CordRepExternalImpl
|
|
167
282
|
}
|
168
283
|
};
|
169
284
|
|
285
|
+
inline void CordRepExternal::Delete(CordRep* rep) {
|
286
|
+
assert(rep != nullptr && rep->tag == EXTERNAL);
|
287
|
+
auto* rep_external = static_cast<CordRepExternal*>(rep);
|
288
|
+
assert(rep_external->releaser_invoker != nullptr);
|
289
|
+
rep_external->releaser_invoker(rep_external);
|
290
|
+
}
|
291
|
+
|
292
|
+
template <typename Str>
|
293
|
+
struct ConstInitExternalStorage {
|
294
|
+
ABSL_CONST_INIT static CordRepExternal value;
|
295
|
+
};
|
296
|
+
|
297
|
+
template <typename Str>
|
298
|
+
CordRepExternal ConstInitExternalStorage<Str>::value(Str::value);
|
299
|
+
|
300
|
+
enum {
|
301
|
+
kMaxInline = 15,
|
302
|
+
};
|
303
|
+
|
304
|
+
constexpr char GetOrNull(absl::string_view data, size_t pos) {
|
305
|
+
return pos < data.size() ? data[pos] : '\0';
|
306
|
+
}
|
307
|
+
|
308
|
+
// We store cordz_info as 64 bit pointer value in big endian format. This
|
309
|
+
// guarantees that the least significant byte of cordz_info matches the last
|
310
|
+
// byte of the inline data representation in as_chars_, which holds the inlined
|
311
|
+
// size or the 'is_tree' bit.
|
312
|
+
using cordz_info_t = int64_t;
|
313
|
+
|
314
|
+
// Assert that the `cordz_info` pointer value perfectly overlaps the last half
|
315
|
+
// of `as_chars_` and can hold a pointer value.
|
316
|
+
static_assert(sizeof(cordz_info_t) * 2 == kMaxInline + 1, "");
|
317
|
+
static_assert(sizeof(cordz_info_t) >= sizeof(intptr_t), "");
|
318
|
+
|
319
|
+
// BigEndianByte() creates a big endian representation of 'value', i.e.: a big
|
320
|
+
// endian value where the last byte in the host's representation holds 'value`,
|
321
|
+
// with all other bytes being 0.
|
322
|
+
static constexpr cordz_info_t BigEndianByte(unsigned char value) {
|
323
|
+
#if defined(ABSL_IS_BIG_ENDIAN)
|
324
|
+
return value;
|
325
|
+
#else
|
326
|
+
return static_cast<cordz_info_t>(value) << ((sizeof(cordz_info_t) - 1) * 8);
|
327
|
+
#endif
|
328
|
+
}
|
329
|
+
|
330
|
+
class InlineData {
|
331
|
+
public:
|
332
|
+
// kNullCordzInfo holds the big endian representation of intptr_t(1)
|
333
|
+
// This is the 'null' / initial value of 'cordz_info'. The null value
|
334
|
+
// is specifically big endian 1 as with 64-bit pointers, the last
|
335
|
+
// byte of cordz_info overlaps with the last byte holding the tag.
|
336
|
+
static constexpr cordz_info_t kNullCordzInfo = BigEndianByte(1);
|
337
|
+
|
338
|
+
// kFakeCordzInfo holds a 'fake', non-null cordz-info value we use to
|
339
|
+
// emulate the previous 'kProfiled' tag logic in 'set_profiled' until
|
340
|
+
// cord code is changed to store cordz_info values in InlineData.
|
341
|
+
static constexpr cordz_info_t kFakeCordzInfo = BigEndianByte(9);
|
342
|
+
|
343
|
+
constexpr InlineData() : as_chars_{0} {}
|
344
|
+
explicit constexpr InlineData(CordRep* rep) : as_tree_(rep) {}
|
345
|
+
explicit constexpr InlineData(absl::string_view chars)
|
346
|
+
: as_chars_{
|
347
|
+
GetOrNull(chars, 0), GetOrNull(chars, 1),
|
348
|
+
GetOrNull(chars, 2), GetOrNull(chars, 3),
|
349
|
+
GetOrNull(chars, 4), GetOrNull(chars, 5),
|
350
|
+
GetOrNull(chars, 6), GetOrNull(chars, 7),
|
351
|
+
GetOrNull(chars, 8), GetOrNull(chars, 9),
|
352
|
+
GetOrNull(chars, 10), GetOrNull(chars, 11),
|
353
|
+
GetOrNull(chars, 12), GetOrNull(chars, 13),
|
354
|
+
GetOrNull(chars, 14), static_cast<char>((chars.size() << 1))} {}
|
355
|
+
|
356
|
+
// Returns true if the current instance is empty.
|
357
|
+
// The 'empty value' is an inlined data value of zero length.
|
358
|
+
bool is_empty() const { return tag() == 0; }
|
359
|
+
|
360
|
+
// Returns true if the current instance holds a tree value.
|
361
|
+
bool is_tree() const { return (tag() & 1) != 0; }
|
362
|
+
|
363
|
+
// Returns true if the current instance holds a cordz_info value.
|
364
|
+
// Requires the current instance to hold a tree value.
|
365
|
+
bool is_profiled() const {
|
366
|
+
assert(is_tree());
|
367
|
+
return as_tree_.cordz_info != kNullCordzInfo;
|
368
|
+
}
|
369
|
+
|
370
|
+
// Returns the cordz_info sampling instance for this instance, or nullptr
|
371
|
+
// if the current instance is not sampled and does not have CordzInfo data.
|
372
|
+
// Requires the current instance to hold a tree value.
|
373
|
+
CordzInfo* cordz_info() const {
|
374
|
+
assert(is_tree());
|
375
|
+
intptr_t info =
|
376
|
+
static_cast<intptr_t>(absl::big_endian::ToHost64(as_tree_.cordz_info));
|
377
|
+
assert(info & 1);
|
378
|
+
return reinterpret_cast<CordzInfo*>(info - 1);
|
379
|
+
}
|
380
|
+
|
381
|
+
// Sets the current cordz_info sampling instance for this instance, or nullptr
|
382
|
+
// if the current instance is not sampled and does not have CordzInfo data.
|
383
|
+
// Requires the current instance to hold a tree value.
|
384
|
+
void set_cordz_info(CordzInfo* cordz_info) {
|
385
|
+
assert(is_tree());
|
386
|
+
intptr_t info = reinterpret_cast<intptr_t>(cordz_info) | 1;
|
387
|
+
as_tree_.cordz_info = absl::big_endian::FromHost64(info);
|
388
|
+
}
|
389
|
+
|
390
|
+
// Resets the current cordz_info to null / empty.
|
391
|
+
void clear_cordz_info() {
|
392
|
+
assert(is_tree());
|
393
|
+
as_tree_.cordz_info = kNullCordzInfo;
|
394
|
+
}
|
395
|
+
|
396
|
+
// Returns a read only pointer to the character data inside this instance.
|
397
|
+
// Requires the current instance to hold inline data.
|
398
|
+
const char* as_chars() const {
|
399
|
+
assert(!is_tree());
|
400
|
+
return as_chars_;
|
401
|
+
}
|
402
|
+
|
403
|
+
// Returns a mutable pointer to the character data inside this instance.
|
404
|
+
// Should be used for 'write only' operations setting an inlined value.
|
405
|
+
// Applications can set the value of inlined data either before or after
|
406
|
+
// setting the inlined size, i.e., both of the below are valid:
|
407
|
+
//
|
408
|
+
// // Set inlined data and inline size
|
409
|
+
// memcpy(data_.as_chars(), data, size);
|
410
|
+
// data_.set_inline_size(size);
|
411
|
+
//
|
412
|
+
// // Set inlined size and inline data
|
413
|
+
// data_.set_inline_size(size);
|
414
|
+
// memcpy(data_.as_chars(), data, size);
|
415
|
+
//
|
416
|
+
// It's an error to read from the returned pointer without a preceding write
|
417
|
+
// if the current instance does not hold inline data, i.e.: is_tree() == true.
|
418
|
+
char* as_chars() { return as_chars_; }
|
419
|
+
|
420
|
+
// Returns the tree value of this value.
|
421
|
+
// Requires the current instance to hold a tree value.
|
422
|
+
CordRep* as_tree() const {
|
423
|
+
assert(is_tree());
|
424
|
+
return as_tree_.rep;
|
425
|
+
}
|
426
|
+
|
427
|
+
// Initialize this instance to holding the tree value `rep`,
|
428
|
+
// initializing the cordz_info to null, i.e.: 'not profiled'.
|
429
|
+
void make_tree(CordRep* rep) {
|
430
|
+
as_tree_.rep = rep;
|
431
|
+
as_tree_.cordz_info = kNullCordzInfo;
|
432
|
+
}
|
433
|
+
|
434
|
+
// Set the tree value of this instance to 'rep`.
|
435
|
+
// Requires the current instance to already hold a tree value.
|
436
|
+
// Does not affect the value of cordz_info.
|
437
|
+
void set_tree(CordRep* rep) {
|
438
|
+
assert(is_tree());
|
439
|
+
as_tree_.rep = rep;
|
440
|
+
}
|
441
|
+
|
442
|
+
// Returns the size of the inlined character data inside this instance.
|
443
|
+
// Requires the current instance to hold inline data.
|
444
|
+
size_t inline_size() const {
|
445
|
+
assert(!is_tree());
|
446
|
+
return tag() >> 1;
|
447
|
+
}
|
448
|
+
|
449
|
+
// Sets the size of the inlined character data inside this instance.
|
450
|
+
// Requires `size` to be <= kMaxInline.
|
451
|
+
// See the documentation on 'as_chars()' for more information and examples.
|
452
|
+
void set_inline_size(size_t size) {
|
453
|
+
ABSL_ASSERT(size <= kMaxInline);
|
454
|
+
tag() = static_cast<char>(size << 1);
|
455
|
+
}
|
456
|
+
|
457
|
+
// Sets or unsets the 'is_profiled' state of this instance.
|
458
|
+
// Requires the current instance to hold a tree value.
|
459
|
+
void set_profiled(bool profiled) {
|
460
|
+
assert(is_tree());
|
461
|
+
as_tree_.cordz_info = profiled ? kFakeCordzInfo : kNullCordzInfo;
|
462
|
+
}
|
463
|
+
|
464
|
+
private:
|
465
|
+
// See cordz_info_t for forced alignment and size of `cordz_info` details.
|
466
|
+
struct AsTree {
|
467
|
+
explicit constexpr AsTree(absl::cord_internal::CordRep* tree)
|
468
|
+
: rep(tree), cordz_info(kNullCordzInfo) {}
|
469
|
+
// This union uses up extra space so that whether rep is 32 or 64 bits,
|
470
|
+
// cordz_info will still start at the eighth byte, and the last
|
471
|
+
// byte of cordz_info will still be the last byte of InlineData.
|
472
|
+
union {
|
473
|
+
absl::cord_internal::CordRep* rep;
|
474
|
+
cordz_info_t unused_aligner;
|
475
|
+
};
|
476
|
+
cordz_info_t cordz_info;
|
477
|
+
};
|
478
|
+
|
479
|
+
char& tag() { return reinterpret_cast<char*>(this)[kMaxInline]; }
|
480
|
+
char tag() const { return reinterpret_cast<const char*>(this)[kMaxInline]; }
|
481
|
+
|
482
|
+
// If the data has length <= kMaxInline, we store it in `as_chars_`, and
|
483
|
+
// store the size in the last char of `as_chars_` shifted left + 1.
|
484
|
+
// Else we store it in a tree and store a pointer to that tree in
|
485
|
+
// `as_tree_.rep` and store a tag in `tagged_size`.
|
486
|
+
union {
|
487
|
+
char as_chars_[kMaxInline + 1];
|
488
|
+
AsTree as_tree_;
|
489
|
+
};
|
490
|
+
};
|
491
|
+
|
492
|
+
static_assert(sizeof(InlineData) == kMaxInline + 1, "");
|
493
|
+
|
494
|
+
inline CordRepConcat* CordRep::concat() {
|
495
|
+
assert(tag == CONCAT);
|
496
|
+
return static_cast<CordRepConcat*>(this);
|
497
|
+
}
|
498
|
+
|
499
|
+
inline const CordRepConcat* CordRep::concat() const {
|
500
|
+
assert(tag == CONCAT);
|
501
|
+
return static_cast<const CordRepConcat*>(this);
|
502
|
+
}
|
503
|
+
|
504
|
+
inline CordRepSubstring* CordRep::substring() {
|
505
|
+
assert(tag == SUBSTRING);
|
506
|
+
return static_cast<CordRepSubstring*>(this);
|
507
|
+
}
|
508
|
+
|
509
|
+
inline const CordRepSubstring* CordRep::substring() const {
|
510
|
+
assert(tag == SUBSTRING);
|
511
|
+
return static_cast<const CordRepSubstring*>(this);
|
512
|
+
}
|
513
|
+
|
514
|
+
inline CordRepExternal* CordRep::external() {
|
515
|
+
assert(tag == EXTERNAL);
|
516
|
+
return static_cast<CordRepExternal*>(this);
|
517
|
+
}
|
518
|
+
|
519
|
+
inline const CordRepExternal* CordRep::external() const {
|
520
|
+
assert(tag == EXTERNAL);
|
521
|
+
return static_cast<const CordRepExternal*>(this);
|
522
|
+
}
|
523
|
+
|
524
|
+
inline CordRep* CordRep::Ref(CordRep* rep) {
|
525
|
+
assert(rep != nullptr);
|
526
|
+
rep->refcount.Increment();
|
527
|
+
return rep;
|
528
|
+
}
|
529
|
+
|
530
|
+
inline void CordRep::Unref(CordRep* rep) {
|
531
|
+
assert(rep != nullptr);
|
532
|
+
// Expect refcount to be 0. Avoiding the cost of an atomic decrement should
|
533
|
+
// typically outweigh the cost of an extra branch checking for ref == 1.
|
534
|
+
if (ABSL_PREDICT_FALSE(!rep->refcount.DecrementExpectHighRefcount())) {
|
535
|
+
Destroy(rep);
|
536
|
+
}
|
537
|
+
}
|
538
|
+
|
170
539
|
} // namespace cord_internal
|
540
|
+
|
171
541
|
ABSL_NAMESPACE_END
|
172
542
|
} // namespace absl
|
173
543
|
#endif // ABSL_STRINGS_INTERNAL_CORD_INTERNAL_H_
|