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
@@ -38,7 +38,7 @@ ABSL_CONST_INIT static base_internal::ThreadIdentity* thread_identity_freelist;
|
|
38
38
|
|
39
39
|
// A per-thread destructor for reclaiming associated ThreadIdentity objects.
|
40
40
|
// Since we must preserve their storage we cache them for re-use.
|
41
|
-
void ReclaimThreadIdentity(void* v) {
|
41
|
+
static void ReclaimThreadIdentity(void* v) {
|
42
42
|
base_internal::ThreadIdentity* identity =
|
43
43
|
static_cast<base_internal::ThreadIdentity*>(v);
|
44
44
|
|
@@ -48,8 +48,6 @@ void ReclaimThreadIdentity(void* v) {
|
|
48
48
|
base_internal::LowLevelAlloc::Free(identity->per_thread_synch.all_locks);
|
49
49
|
}
|
50
50
|
|
51
|
-
PerThreadSem::Destroy(identity);
|
52
|
-
|
53
51
|
// We must explicitly clear the current thread's identity:
|
54
52
|
// (a) Subsequent (unrelated) per-thread destructors may require an identity.
|
55
53
|
// We must guarantee a new identity is used in this case (this instructor
|
@@ -71,7 +69,12 @@ static intptr_t RoundUp(intptr_t addr, intptr_t align) {
|
|
71
69
|
return (addr + align - 1) & ~(align - 1);
|
72
70
|
}
|
73
71
|
|
74
|
-
|
72
|
+
void OneTimeInitThreadIdentity(base_internal::ThreadIdentity* identity) {
|
73
|
+
PerThreadSem::Init(identity);
|
74
|
+
}
|
75
|
+
|
76
|
+
static void ResetThreadIdentityBetweenReuse(
|
77
|
+
base_internal::ThreadIdentity* identity) {
|
75
78
|
base_internal::PerThreadSynch* pts = &identity->per_thread_synch;
|
76
79
|
pts->next = nullptr;
|
77
80
|
pts->skip = nullptr;
|
@@ -116,8 +119,9 @@ static base_internal::ThreadIdentity* NewThreadIdentity() {
|
|
116
119
|
identity = reinterpret_cast<base_internal::ThreadIdentity*>(
|
117
120
|
RoundUp(reinterpret_cast<intptr_t>(allocation),
|
118
121
|
base_internal::PerThreadSynch::kAlignment));
|
122
|
+
OneTimeInitThreadIdentity(identity);
|
119
123
|
}
|
120
|
-
|
124
|
+
ResetThreadIdentityBetweenReuse(identity);
|
121
125
|
|
122
126
|
return identity;
|
123
127
|
}
|
@@ -127,7 +131,6 @@ static base_internal::ThreadIdentity* NewThreadIdentity() {
|
|
127
131
|
// REQUIRES: CurrentThreadIdentity(false) == nullptr
|
128
132
|
base_internal::ThreadIdentity* CreateThreadIdentity() {
|
129
133
|
base_internal::ThreadIdentity* identity = NewThreadIdentity();
|
130
|
-
PerThreadSem::Init(identity);
|
131
134
|
// Associate the value with the current thread, and attach our destructor.
|
132
135
|
base_internal::SetCurrentThreadIdentity(identity, ReclaimThreadIdentity);
|
133
136
|
return identity;
|
@@ -36,10 +36,6 @@ namespace synchronization_internal {
|
|
36
36
|
// For private use only.
|
37
37
|
base_internal::ThreadIdentity* CreateThreadIdentity();
|
38
38
|
|
39
|
-
// A per-thread destructor for reclaiming associated ThreadIdentity objects.
|
40
|
-
// For private use only.
|
41
|
-
void ReclaimThreadIdentity(void* v);
|
42
|
-
|
43
39
|
// Returns the ThreadIdentity object representing the calling thread; guaranteed
|
44
40
|
// to be unique for its lifetime. The returned object will remain valid for the
|
45
41
|
// program's lifetime; although it may be re-assigned to a subsequent thread.
|
@@ -47,10 +47,6 @@ void PerThreadSem::Init(base_internal::ThreadIdentity *identity) {
|
|
47
47
|
identity->is_idle.store(false, std::memory_order_relaxed);
|
48
48
|
}
|
49
49
|
|
50
|
-
void PerThreadSem::Destroy(base_internal::ThreadIdentity *identity) {
|
51
|
-
Waiter::GetWaiter(identity)->~Waiter();
|
52
|
-
}
|
53
|
-
|
54
50
|
void PerThreadSem::Tick(base_internal::ThreadIdentity *identity) {
|
55
51
|
const int ticker =
|
56
52
|
identity->ticker.fetch_add(1, std::memory_order_relaxed) + 1;
|
@@ -66,10 +66,6 @@ class PerThreadSem {
|
|
66
66
|
// REQUIRES: May only be called by ThreadIdentity.
|
67
67
|
static void Init(base_internal::ThreadIdentity* identity);
|
68
68
|
|
69
|
-
// Destroy the PerThreadSem associated with "identity".
|
70
|
-
// REQUIRES: May only be called by ThreadIdentity.
|
71
|
-
static void Destroy(base_internal::ThreadIdentity* identity);
|
72
|
-
|
73
69
|
// Increments "identity"'s count.
|
74
70
|
static inline void Post(base_internal::ThreadIdentity* identity);
|
75
71
|
|
@@ -81,8 +77,7 @@ class PerThreadSem {
|
|
81
77
|
// Permitted callers.
|
82
78
|
friend class PerThreadSemTest;
|
83
79
|
friend class absl::Mutex;
|
84
|
-
friend absl::base_internal::ThreadIdentity*
|
85
|
-
friend void ReclaimThreadIdentity(void* v);
|
80
|
+
friend void OneTimeInitThreadIdentity(absl::base_internal::ThreadIdentity*);
|
86
81
|
};
|
87
82
|
|
88
83
|
} // namespace synchronization_internal
|
@@ -71,8 +71,6 @@ Waiter::Waiter() {
|
|
71
71
|
futex_.store(0, std::memory_order_relaxed);
|
72
72
|
}
|
73
73
|
|
74
|
-
Waiter::~Waiter() = default;
|
75
|
-
|
76
74
|
bool Waiter::Wait(KernelTimeout t) {
|
77
75
|
// Loop until we can atomically decrement futex from a positive
|
78
76
|
// value, waiting on a futex while we believe it is zero.
|
@@ -161,18 +159,6 @@ Waiter::Waiter() {
|
|
161
159
|
wakeup_count_ = 0;
|
162
160
|
}
|
163
161
|
|
164
|
-
Waiter::~Waiter() {
|
165
|
-
const int err = pthread_mutex_destroy(&mu_);
|
166
|
-
if (err != 0) {
|
167
|
-
ABSL_RAW_LOG(FATAL, "pthread_mutex_destroy failed: %d", err);
|
168
|
-
}
|
169
|
-
|
170
|
-
const int err2 = pthread_cond_destroy(&cv_);
|
171
|
-
if (err2 != 0) {
|
172
|
-
ABSL_RAW_LOG(FATAL, "pthread_cond_destroy failed: %d", err2);
|
173
|
-
}
|
174
|
-
}
|
175
|
-
|
176
162
|
bool Waiter::Wait(KernelTimeout t) {
|
177
163
|
struct timespec abs_timeout;
|
178
164
|
if (t.has_timeout()) {
|
@@ -240,12 +226,6 @@ Waiter::Waiter() {
|
|
240
226
|
wakeups_.store(0, std::memory_order_relaxed);
|
241
227
|
}
|
242
228
|
|
243
|
-
Waiter::~Waiter() {
|
244
|
-
if (sem_destroy(&sem_) != 0) {
|
245
|
-
ABSL_RAW_LOG(FATAL, "sem_destroy failed with errno %d\n", errno);
|
246
|
-
}
|
247
|
-
}
|
248
|
-
|
249
229
|
bool Waiter::Wait(KernelTimeout t) {
|
250
230
|
struct timespec abs_timeout;
|
251
231
|
if (t.has_timeout()) {
|
@@ -363,11 +343,6 @@ Waiter::Waiter() {
|
|
363
343
|
wakeup_count_ = 0;
|
364
344
|
}
|
365
345
|
|
366
|
-
// SRW locks and condition variables do not need to be explicitly destroyed.
|
367
|
-
// https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-initializesrwlock
|
368
|
-
// https://stackoverflow.com/questions/28975958/why-does-windows-have-no-deleteconditionvariable-function-to-go-together-with
|
369
|
-
Waiter::~Waiter() = default;
|
370
|
-
|
371
346
|
bool Waiter::Wait(KernelTimeout t) {
|
372
347
|
SRWLOCK *mu = WinHelper::GetLock(this);
|
373
348
|
CONDITION_VARIABLE *cv = WinHelper::GetCond(this);
|
@@ -71,9 +71,6 @@ class Waiter {
|
|
71
71
|
Waiter(const Waiter&) = delete;
|
72
72
|
Waiter& operator=(const Waiter&) = delete;
|
73
73
|
|
74
|
-
// Destroy any data to track waits.
|
75
|
-
~Waiter();
|
76
|
-
|
77
74
|
// Blocks the calling thread until a matching call to `Post()` or
|
78
75
|
// `t` has passed. Returns `true` if woken (`Post()` called),
|
79
76
|
// `false` on timeout.
|
@@ -106,6 +103,12 @@ class Waiter {
|
|
106
103
|
#endif
|
107
104
|
|
108
105
|
private:
|
106
|
+
// The destructor must not be called since Mutex/CondVar
|
107
|
+
// can use PerThreadSem/Waiter after the thread exits.
|
108
|
+
// Waiter objects are embedded in ThreadIdentity objects,
|
109
|
+
// which are reused via a freelist and are never destroyed.
|
110
|
+
~Waiter() = delete;
|
111
|
+
|
109
112
|
#if ABSL_WAITER_MODE == ABSL_WAITER_MODE_FUTEX
|
110
113
|
// Futexes are defined by specification to be 32-bits.
|
111
114
|
// Thus std::atomic<int32_t> must be just an int32_t with lockfree methods.
|
@@ -136,8 +139,11 @@ class Waiter {
|
|
136
139
|
// REQUIRES: WinHelper::GetLock(this) must be held.
|
137
140
|
void InternalCondVarPoke();
|
138
141
|
|
139
|
-
// We can't include Windows.h in our headers, so we use aligned
|
142
|
+
// We can't include Windows.h in our headers, so we use aligned character
|
140
143
|
// buffers to define the storage of SRWLOCK and CONDITION_VARIABLE.
|
144
|
+
// SRW locks and condition variables do not need to be explicitly destroyed.
|
145
|
+
// https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-initializesrwlock
|
146
|
+
// https://stackoverflow.com/questions/28975958/why-does-windows-have-no-deleteconditionvariable-function-to-go-together-with
|
141
147
|
alignas(void*) unsigned char mu_storage_[sizeof(void*)];
|
142
148
|
alignas(void*) unsigned char cv_storage_[sizeof(void*)];
|
143
149
|
int waiter_count_;
|
@@ -109,7 +109,7 @@ static inline bool EvalConditionAnnotated(const Condition *cond, Mutex *mu,
|
|
109
109
|
bool locking, bool trylock,
|
110
110
|
bool read_lock);
|
111
111
|
|
112
|
-
void RegisterMutexProfiler(void (*fn)(int64_t
|
112
|
+
void RegisterMutexProfiler(void (*fn)(int64_t wait_cycles)) {
|
113
113
|
submit_profile_data.Store(fn);
|
114
114
|
}
|
115
115
|
|
@@ -1744,23 +1744,33 @@ ABSL_XRAY_LOG_ARGS(1) void Mutex::ReaderUnlock() {
|
|
1744
1744
|
ABSL_TSAN_MUTEX_POST_UNLOCK(this, __tsan_mutex_read_lock);
|
1745
1745
|
}
|
1746
1746
|
|
1747
|
-
//
|
1748
|
-
//
|
1749
|
-
|
1750
|
-
|
1751
|
-
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1747
|
+
// Clears the designated waker flag in the mutex if this thread has blocked, and
|
1748
|
+
// therefore may be the designated waker.
|
1749
|
+
static intptr_t ClearDesignatedWakerMask(int flag) {
|
1750
|
+
assert(flag >= 0);
|
1751
|
+
assert(flag <= 1);
|
1752
|
+
switch (flag) {
|
1753
|
+
case 0: // not blocked
|
1754
|
+
return ~static_cast<intptr_t>(0);
|
1755
|
+
case 1: // blocked; turn off the designated waker bit
|
1756
|
+
return ~static_cast<intptr_t>(kMuDesig);
|
1757
|
+
}
|
1758
|
+
ABSL_INTERNAL_UNREACHABLE;
|
1759
|
+
}
|
1755
1760
|
|
1756
|
-
//
|
1757
|
-
//
|
1758
|
-
|
1759
|
-
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1763
|
-
|
1761
|
+
// Conditionally ignores the existence of waiting writers if a reader that has
|
1762
|
+
// already blocked once wakes up.
|
1763
|
+
static intptr_t IgnoreWaitingWritersMask(int flag) {
|
1764
|
+
assert(flag >= 0);
|
1765
|
+
assert(flag <= 1);
|
1766
|
+
switch (flag) {
|
1767
|
+
case 0: // not blocked
|
1768
|
+
return ~static_cast<intptr_t>(0);
|
1769
|
+
case 1: // blocked; pretend there are no waiting writers
|
1770
|
+
return ~static_cast<intptr_t>(kMuWrWait);
|
1771
|
+
}
|
1772
|
+
ABSL_INTERNAL_UNREACHABLE;
|
1773
|
+
}
|
1764
1774
|
|
1765
1775
|
// Internal version of LockWhen(). See LockSlowWithDeadline()
|
1766
1776
|
ABSL_ATTRIBUTE_NOINLINE void Mutex::LockSlow(MuHow how, const Condition *cond,
|
@@ -1852,8 +1862,10 @@ bool Mutex::LockSlowWithDeadline(MuHow how, const Condition *cond,
|
|
1852
1862
|
bool unlock = false;
|
1853
1863
|
if ((v & how->fast_need_zero) == 0 && // try fast acquire
|
1854
1864
|
mu_.compare_exchange_strong(
|
1855
|
-
v,
|
1856
|
-
|
1865
|
+
v,
|
1866
|
+
(how->fast_or |
|
1867
|
+
(v & ClearDesignatedWakerMask(flags & kMuHasBlocked))) +
|
1868
|
+
how->fast_add,
|
1857
1869
|
std::memory_order_acquire, std::memory_order_relaxed)) {
|
1858
1870
|
if (cond == nullptr ||
|
1859
1871
|
EvalConditionAnnotated(cond, this, true, false, how == kShared)) {
|
@@ -1927,9 +1939,10 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
|
|
1927
1939
|
CheckForMutexCorruption(v, "Lock");
|
1928
1940
|
if ((v & waitp->how->slow_need_zero) == 0) {
|
1929
1941
|
if (mu_.compare_exchange_strong(
|
1930
|
-
v,
|
1931
|
-
|
1932
|
-
|
1942
|
+
v,
|
1943
|
+
(waitp->how->fast_or |
|
1944
|
+
(v & ClearDesignatedWakerMask(flags & kMuHasBlocked))) +
|
1945
|
+
waitp->how->fast_add,
|
1933
1946
|
std::memory_order_acquire, std::memory_order_relaxed)) {
|
1934
1947
|
if (waitp->cond == nullptr ||
|
1935
1948
|
EvalConditionAnnotated(waitp->cond, this, true, false,
|
@@ -1946,8 +1959,9 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
|
|
1946
1959
|
if ((v & (kMuSpin|kMuWait)) == 0) { // no waiters
|
1947
1960
|
// This thread tries to become the one and only waiter.
|
1948
1961
|
PerThreadSynch *new_h = Enqueue(nullptr, waitp, v, flags);
|
1949
|
-
intptr_t nv =
|
1950
|
-
|
1962
|
+
intptr_t nv =
|
1963
|
+
(v & ClearDesignatedWakerMask(flags & kMuHasBlocked) & kMuLow) |
|
1964
|
+
kMuWait;
|
1951
1965
|
ABSL_RAW_CHECK(new_h != nullptr, "Enqueue to empty list failed");
|
1952
1966
|
if (waitp->how == kExclusive && (v & kMuReader) != 0) {
|
1953
1967
|
nv |= kMuWrWait;
|
@@ -1961,12 +1975,13 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
|
|
1961
1975
|
waitp->thread->waitp = nullptr;
|
1962
1976
|
}
|
1963
1977
|
} else if ((v & waitp->how->slow_inc_need_zero &
|
1964
|
-
|
1978
|
+
IgnoreWaitingWritersMask(flags & kMuHasBlocked)) == 0) {
|
1965
1979
|
// This is a reader that needs to increment the reader count,
|
1966
1980
|
// but the count is currently held in the last waiter.
|
1967
1981
|
if (mu_.compare_exchange_strong(
|
1968
|
-
v,
|
1969
|
-
|
1982
|
+
v,
|
1983
|
+
(v & ClearDesignatedWakerMask(flags & kMuHasBlocked)) |
|
1984
|
+
kMuSpin | kMuReader,
|
1970
1985
|
std::memory_order_acquire, std::memory_order_relaxed)) {
|
1971
1986
|
PerThreadSynch *h = GetPerThreadSynch(v);
|
1972
1987
|
h->readers += kMuOne; // inc reader count in waiter
|
@@ -1987,8 +2002,9 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
|
|
1987
2002
|
}
|
1988
2003
|
} else if ((v & kMuSpin) == 0 && // attempt to queue ourselves
|
1989
2004
|
mu_.compare_exchange_strong(
|
1990
|
-
v,
|
1991
|
-
|
2005
|
+
v,
|
2006
|
+
(v & ClearDesignatedWakerMask(flags & kMuHasBlocked)) |
|
2007
|
+
kMuSpin | kMuWait,
|
1992
2008
|
std::memory_order_acquire, std::memory_order_relaxed)) {
|
1993
2009
|
PerThreadSynch *h = GetPerThreadSynch(v);
|
1994
2010
|
PerThreadSynch *new_h = Enqueue(h, waitp, v, flags);
|
@@ -2315,19 +2331,21 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) {
|
|
2315
2331
|
} // end of for(;;)-loop
|
2316
2332
|
|
2317
2333
|
if (wake_list != kPerThreadSynchNull) {
|
2318
|
-
int64_t
|
2319
|
-
|
2334
|
+
int64_t wait_cycles = 0;
|
2335
|
+
int64_t now = base_internal::CycleClock::Now();
|
2320
2336
|
do {
|
2337
|
+
// Sample lock contention events only if the waiter was trying to acquire
|
2338
|
+
// the lock, not waiting on a condition variable or Condition.
|
2339
|
+
if (!wake_list->cond_waiter) {
|
2340
|
+
wait_cycles += (now - wake_list->waitp->contention_start_cycles);
|
2341
|
+
wake_list->waitp->contention_start_cycles = now;
|
2342
|
+
}
|
2321
2343
|
wake_list = Wakeup(wake_list); // wake waiters
|
2322
2344
|
} while (wake_list != kPerThreadSynchNull);
|
2323
|
-
if (
|
2324
|
-
// Sample lock contention events only if the (first) waiter was trying to
|
2325
|
-
// acquire the lock, not waiting on a condition variable or Condition.
|
2326
|
-
int64_t wait_cycles =
|
2327
|
-
base_internal::CycleClock::Now() - enqueue_timestamp;
|
2345
|
+
if (wait_cycles > 0) {
|
2328
2346
|
mutex_tracer("slow release", this, wait_cycles);
|
2329
2347
|
ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
|
2330
|
-
submit_profile_data(
|
2348
|
+
submit_profile_data(wait_cycles);
|
2331
2349
|
ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
|
2332
2350
|
}
|
2333
2351
|
}
|
@@ -2492,9 +2510,9 @@ void CondVar::Remove(PerThreadSynch *s) {
|
|
2492
2510
|
// before calling Mutex::UnlockSlow(), the Mutex code might be re-entered (via
|
2493
2511
|
// the logging code, or via a Condition function) and might potentially attempt
|
2494
2512
|
// to block this thread. That would be a problem if the thread were already on
|
2495
|
-
// a
|
2496
|
-
//
|
2497
|
-
//
|
2513
|
+
// a condition variable waiter queue. Thus, we use the waitp->cv_word to tell
|
2514
|
+
// the unlock code to call CondVarEnqueue() to queue the thread on the condition
|
2515
|
+
// variable queue just before the mutex is to be unlocked, and (most
|
2498
2516
|
// importantly) after any call to an external routine that might re-enter the
|
2499
2517
|
// mutex code.
|
2500
2518
|
static void CondVarEnqueue(SynchWaitParams *waitp) {
|
@@ -2557,6 +2575,23 @@ bool CondVar::WaitCommon(Mutex *mutex, KernelTimeout t) {
|
|
2557
2575
|
while (waitp.thread->state.load(std::memory_order_acquire) ==
|
2558
2576
|
PerThreadSynch::kQueued) {
|
2559
2577
|
if (!Mutex::DecrementSynchSem(mutex, waitp.thread, t)) {
|
2578
|
+
// DecrementSynchSem returned due to timeout.
|
2579
|
+
// Now we will either (1) remove ourselves from the wait list in Remove
|
2580
|
+
// below, in which case Remove will set thread.state = kAvailable and
|
2581
|
+
// we will not call DecrementSynchSem again; or (2) Signal/SignalAll
|
2582
|
+
// has removed us concurrently and is calling Wakeup, which will set
|
2583
|
+
// thread.state = kAvailable and post to the semaphore.
|
2584
|
+
// It's important to reset the timeout for the case (2) because otherwise
|
2585
|
+
// we can live-lock in this loop since DecrementSynchSem will always
|
2586
|
+
// return immediately due to timeout, but Signal/SignalAll is not
|
2587
|
+
// necessary set thread.state = kAvailable yet (and is not scheduled
|
2588
|
+
// due to thread priorities or other scheduler artifacts).
|
2589
|
+
// Note this could also be resolved if Signal/SignalAll would set
|
2590
|
+
// thread.state = kAvailable while holding the wait list spin lock.
|
2591
|
+
// But this can't be easily done for SignalAll since it grabs the whole
|
2592
|
+
// wait list with a single compare-exchange and does not really grab
|
2593
|
+
// the spin lock.
|
2594
|
+
t = KernelTimeout::Never();
|
2560
2595
|
this->Remove(waitp.thread);
|
2561
2596
|
rc = true;
|
2562
2597
|
}
|
@@ -174,9 +174,12 @@ class ABSL_LOCKABLE Mutex {
|
|
174
174
|
|
175
175
|
// Mutex::AssertHeld()
|
176
176
|
//
|
177
|
-
//
|
178
|
-
//
|
179
|
-
//
|
177
|
+
// Require that the mutex be held exclusively (write mode) by this thread.
|
178
|
+
//
|
179
|
+
// If the mutex is not currently held by this thread, this function may report
|
180
|
+
// an error (typically by crashing with a diagnostic) or it may do nothing.
|
181
|
+
// This function is intended only as a tool to assist debugging; it doesn't
|
182
|
+
// guarantee correctness.
|
180
183
|
void AssertHeld() const ABSL_ASSERT_EXCLUSIVE_LOCK();
|
181
184
|
|
182
185
|
// ---------------------------------------------------------------------------
|
@@ -236,9 +239,13 @@ class ABSL_LOCKABLE Mutex {
|
|
236
239
|
|
237
240
|
// Mutex::AssertReaderHeld()
|
238
241
|
//
|
239
|
-
//
|
240
|
-
//
|
241
|
-
//
|
242
|
+
// Require that the mutex be held at least in shared mode (read mode) by this
|
243
|
+
// thread.
|
244
|
+
//
|
245
|
+
// If the mutex is not currently held by this thread, this function may report
|
246
|
+
// an error (typically by crashing with a diagnostic) or it may do nothing.
|
247
|
+
// This function is intended only as a tool to assist debugging; it doesn't
|
248
|
+
// guarantee correctness.
|
242
249
|
void AssertReaderHeld() const ABSL_ASSERT_SHARED_LOCK();
|
243
250
|
|
244
251
|
// Mutex::WriterLock()
|
@@ -984,14 +991,15 @@ inline Condition::Condition(const T *object,
|
|
984
991
|
// Register a hook for profiling support.
|
985
992
|
//
|
986
993
|
// The function pointer registered here will be called whenever a mutex is
|
987
|
-
// contended. The callback is given the
|
988
|
-
//
|
994
|
+
// contended. The callback is given the cycles for which waiting happened (as
|
995
|
+
// measured by //absl/base/internal/cycleclock.h, and which may not
|
996
|
+
// be real "cycle" counts.)
|
989
997
|
//
|
990
998
|
// Calls to this function do not race or block, but there is no ordering
|
991
999
|
// guaranteed between calls to this function and call to the provided hook.
|
992
1000
|
// In particular, the previously registered hook may still be called for some
|
993
1001
|
// time after this function returns.
|
994
|
-
void RegisterMutexProfiler(void (*fn)(int64_t
|
1002
|
+
void RegisterMutexProfiler(void (*fn)(int64_t wait_cycles));
|
995
1003
|
|
996
1004
|
// Register a hook for Mutex tracing.
|
997
1005
|
//
|
@@ -22,7 +22,7 @@
|
|
22
22
|
// The `Notification` object maintains a private boolean "notified" state that
|
23
23
|
// transitions to `true` at most once. The `Notification` class provides the
|
24
24
|
// following primary member functions:
|
25
|
-
// * `HasBeenNotified()
|
25
|
+
// * `HasBeenNotified()` to query its state
|
26
26
|
// * `WaitForNotification*()` to have threads wait until the "notified" state
|
27
27
|
// is `true`.
|
28
28
|
// * `Notify()` to set the notification's "notified" state to `true` and
|
@@ -52,6 +52,7 @@
|
|
52
52
|
|
53
53
|
#include <atomic>
|
54
54
|
|
55
|
+
#include "absl/base/attributes.h"
|
55
56
|
#include "absl/base/macros.h"
|
56
57
|
#include "absl/synchronization/mutex.h"
|
57
58
|
#include "absl/time/time.h"
|
@@ -74,7 +75,7 @@ class Notification {
|
|
74
75
|
// Notification::HasBeenNotified()
|
75
76
|
//
|
76
77
|
// Returns the value of the notification's internal "notified" state.
|
77
|
-
bool HasBeenNotified() const {
|
78
|
+
ABSL_MUST_USE_RESULT bool HasBeenNotified() const {
|
78
79
|
return HasBeenNotifiedInternal(&this->notified_yet_);
|
79
80
|
}
|
80
81
|
|
@@ -766,13 +766,14 @@ void AppendNumberUnit(std::string* out, double n, DisplayUnit unit) {
|
|
766
766
|
// is non-zero.
|
767
767
|
// Unlike Go, we format the zero duration as 0, with no unit.
|
768
768
|
std::string FormatDuration(Duration d) {
|
769
|
-
|
770
|
-
|
769
|
+
constexpr Duration kMinDuration = Seconds(kint64min);
|
770
|
+
std::string s;
|
771
|
+
if (d == kMinDuration) {
|
771
772
|
// Avoid needing to negate kint64min by directly returning what the
|
772
773
|
// following code should produce in that case.
|
773
|
-
|
774
|
+
s = "-2562047788015215h30m8s";
|
775
|
+
return s;
|
774
776
|
}
|
775
|
-
std::string s;
|
776
777
|
if (d < ZeroDuration()) {
|
777
778
|
s.append("-");
|
778
779
|
d = -d;
|
@@ -84,14 +84,13 @@ CONSTEXPR_F bool is_leap_year(year_t y) noexcept {
|
|
84
84
|
return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
|
85
85
|
}
|
86
86
|
CONSTEXPR_F int year_index(year_t y, month_t m) noexcept {
|
87
|
-
|
87
|
+
const int yi = static_cast<int>((y + (m > 2)) % 400);
|
88
|
+
return yi < 0 ? yi + 400 : yi;
|
88
89
|
}
|
89
|
-
CONSTEXPR_F int days_per_century(
|
90
|
-
const int yi = year_index(y, m);
|
90
|
+
CONSTEXPR_F int days_per_century(int yi) noexcept {
|
91
91
|
return 36524 + (yi == 0 || yi > 300);
|
92
92
|
}
|
93
|
-
CONSTEXPR_F int days_per_4years(
|
94
|
-
const int yi = year_index(y, m);
|
93
|
+
CONSTEXPR_F int days_per_4years(int yi) noexcept {
|
95
94
|
return 1460 + (yi == 0 || yi > 300 || (yi - 1) % 100 < 96);
|
96
95
|
}
|
97
96
|
CONSTEXPR_F int days_per_year(year_t y, month_t m) noexcept {
|
@@ -133,17 +132,22 @@ CONSTEXPR_F fields n_day(year_t y, month_t m, diff_t d, diff_t cd, hour_t hh,
|
|
133
132
|
}
|
134
133
|
}
|
135
134
|
if (d > 365) {
|
135
|
+
int yi = year_index(ey, m); // Index into Gregorian 400 year cycle.
|
136
136
|
for (;;) {
|
137
|
-
int n = days_per_century(
|
137
|
+
int n = days_per_century(yi);
|
138
138
|
if (d <= n) break;
|
139
139
|
d -= n;
|
140
140
|
ey += 100;
|
141
|
+
yi += 100;
|
142
|
+
if (yi >= 400) yi -= 400;
|
141
143
|
}
|
142
144
|
for (;;) {
|
143
|
-
int n = days_per_4years(
|
145
|
+
int n = days_per_4years(yi);
|
144
146
|
if (d <= n) break;
|
145
147
|
d -= n;
|
146
148
|
ey += 4;
|
149
|
+
yi += 4;
|
150
|
+
if (yi >= 400) yi -= 400;
|
147
151
|
}
|
148
152
|
for (;;) {
|
149
153
|
int n = days_per_year(ey, m);
|
@@ -120,7 +120,7 @@ using EnableIfFloat =
|
|
120
120
|
|
121
121
|
// Duration
|
122
122
|
//
|
123
|
-
// The `absl::Duration` class represents a signed, fixed-length
|
123
|
+
// The `absl::Duration` class represents a signed, fixed-length amount of time.
|
124
124
|
// A `Duration` is generated using a unit-specific factory function, or is
|
125
125
|
// the result of subtracting one `absl::Time` from another. Durations behave
|
126
126
|
// like unit-safe integers and they support all the natural integer-like
|
@@ -162,7 +162,7 @@ class Duration {
|
|
162
162
|
constexpr Duration() : rep_hi_(0), rep_lo_(0) {} // zero-length duration
|
163
163
|
|
164
164
|
// Copyable.
|
165
|
-
#if !defined(__clang__) && defined(_MSC_VER) && _MSC_VER <
|
165
|
+
#if !defined(__clang__) && defined(_MSC_VER) && _MSC_VER < 1930
|
166
166
|
// Explicitly defining the constexpr copy constructor avoids an MSVC bug.
|
167
167
|
constexpr Duration(const Duration& d)
|
168
168
|
: rep_hi_(d.rep_hi_), rep_lo_(d.rep_lo_) {}
|
@@ -579,7 +579,7 @@ bool ParseDuration(absl::string_view dur_string, Duration* d);
|
|
579
579
|
|
580
580
|
// AbslParseFlag()
|
581
581
|
//
|
582
|
-
// Parses a command-line flag string representation `text` into a
|
582
|
+
// Parses a command-line flag string representation `text` into a Duration
|
583
583
|
// value. Duration flags must be specified in a format that is valid input for
|
584
584
|
// `absl::ParseDuration()`.
|
585
585
|
bool AbslParseFlag(absl::string_view text, Duration* dst, std::string* error);
|
@@ -750,23 +750,24 @@ constexpr Time UnixEpoch() { return Time(); }
|
|
750
750
|
constexpr Time UniversalEpoch() {
|
751
751
|
// 719162 is the number of days from 0001-01-01 to 1970-01-01,
|
752
752
|
// assuming the Gregorian calendar.
|
753
|
-
return Time(
|
753
|
+
return Time(
|
754
|
+
time_internal::MakeDuration(-24 * 719162 * int64_t{3600}, uint32_t{0}));
|
754
755
|
}
|
755
756
|
|
756
757
|
// InfiniteFuture()
|
757
758
|
//
|
758
759
|
// Returns an `absl::Time` that is infinitely far in the future.
|
759
760
|
constexpr Time InfiniteFuture() {
|
760
|
-
return Time(
|
761
|
-
|
761
|
+
return Time(time_internal::MakeDuration((std::numeric_limits<int64_t>::max)(),
|
762
|
+
~uint32_t{0}));
|
762
763
|
}
|
763
764
|
|
764
765
|
// InfinitePast()
|
765
766
|
//
|
766
767
|
// Returns an `absl::Time` that is infinitely far in the past.
|
767
768
|
constexpr Time InfinitePast() {
|
768
|
-
return Time(
|
769
|
-
|
769
|
+
return Time(time_internal::MakeDuration((std::numeric_limits<int64_t>::min)(),
|
770
|
+
~uint32_t{0}));
|
770
771
|
}
|
771
772
|
|
772
773
|
// FromUnixNanos()
|
@@ -1422,14 +1423,17 @@ constexpr int64_t GetRepHi(Duration d) { return d.rep_hi_; }
|
|
1422
1423
|
constexpr uint32_t GetRepLo(Duration d) { return d.rep_lo_; }
|
1423
1424
|
|
1424
1425
|
// Returns true iff d is positive or negative infinity.
|
1425
|
-
constexpr bool IsInfiniteDuration(Duration d) {
|
1426
|
+
constexpr bool IsInfiniteDuration(Duration d) {
|
1427
|
+
return GetRepLo(d) == ~uint32_t{0};
|
1428
|
+
}
|
1426
1429
|
|
1427
1430
|
// Returns an infinite Duration with the opposite sign.
|
1428
1431
|
// REQUIRES: IsInfiniteDuration(d)
|
1429
1432
|
constexpr Duration OppositeInfinity(Duration d) {
|
1430
1433
|
return GetRepHi(d) < 0
|
1431
|
-
? MakeDuration((std::numeric_limits<int64_t>::max)(), ~
|
1432
|
-
: MakeDuration((std::numeric_limits<int64_t>::min)(),
|
1434
|
+
? MakeDuration((std::numeric_limits<int64_t>::max)(), ~uint32_t{0})
|
1435
|
+
: MakeDuration((std::numeric_limits<int64_t>::min)(),
|
1436
|
+
~uint32_t{0});
|
1433
1437
|
}
|
1434
1438
|
|
1435
1439
|
// Returns (-n)-1 (equivalently -(n+1)) without avoidable overflow.
|
@@ -1568,7 +1572,7 @@ constexpr Duration operator-(Duration d) {
|
|
1568
1572
|
|
1569
1573
|
constexpr Duration InfiniteDuration() {
|
1570
1574
|
return time_internal::MakeDuration((std::numeric_limits<int64_t>::max)(),
|
1571
|
-
~
|
1575
|
+
~uint32_t{0});
|
1572
1576
|
}
|
1573
1577
|
|
1574
1578
|
constexpr Duration FromChrono(const std::chrono::nanoseconds& d) {
|
@@ -91,7 +91,15 @@ class optional_data_dtor_base {
|
|
91
91
|
|
92
92
|
void destruct() noexcept {
|
93
93
|
if (engaged_) {
|
94
|
+
// `data_` must be initialized if `engaged_` is true.
|
95
|
+
#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
|
96
|
+
#pragma GCC diagnostic push
|
97
|
+
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
|
98
|
+
#endif
|
94
99
|
data_.~T();
|
100
|
+
#if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
|
101
|
+
#pragma GCC diagnostic pop
|
102
|
+
#endif
|
95
103
|
engaged_ = false;
|
96
104
|
}
|
97
105
|
}
|
@@ -16,8 +16,8 @@
|
|
16
16
|
// separate file to avoid cluttering the top of the API header with
|
17
17
|
// implementation details.
|
18
18
|
|
19
|
-
#ifndef
|
20
|
-
#define
|
19
|
+
#ifndef ABSL_TYPES_VARIANT_INTERNAL_H_
|
20
|
+
#define ABSL_TYPES_VARIANT_INTERNAL_H_
|
21
21
|
|
22
22
|
#include <cassert>
|
23
23
|
#include <cstddef>
|
@@ -1643,4 +1643,4 @@ ABSL_NAMESPACE_END
|
|
1643
1643
|
} // namespace absl
|
1644
1644
|
|
1645
1645
|
#endif // !defined(ABSL_USES_STD_VARIANT)
|
1646
|
-
#endif //
|
1646
|
+
#endif // ABSL_TYPES_VARIANT_INTERNAL_H_
|