grpc 1.73.0 → 1.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +38 -17
- data/include/grpc/create_channel_from_endpoint.h +54 -0
- data/include/grpc/credentials.h +11 -5
- data/include/grpc/event_engine/event_engine.h +74 -17
- data/include/grpc/grpc_posix.h +20 -1
- data/include/grpc/impl/channel_arg_names.h +2 -4
- data/include/grpc/module.modulemap +1 -0
- data/include/grpc/support/json.h +24 -0
- data/src/core/call/interception_chain.h +7 -11
- data/src/core/channelz/channel_trace.cc +213 -115
- data/src/core/channelz/channel_trace.h +380 -86
- data/src/core/channelz/channelz.cc +270 -181
- data/src/core/channelz/channelz.h +168 -55
- data/src/core/channelz/channelz_registry.cc +2 -1
- data/src/core/channelz/channelz_registry.h +24 -0
- data/src/core/channelz/property_list.cc +357 -0
- data/src/core/channelz/property_list.h +202 -0
- data/src/core/channelz/ztrace_collector.h +3 -2
- data/src/core/client_channel/backup_poller.cc +17 -2
- data/src/core/client_channel/client_channel.cc +17 -28
- data/src/core/client_channel/client_channel_filter.cc +19 -29
- data/src/core/client_channel/config_selector.h +8 -2
- data/src/core/client_channel/dynamic_filters.cc +5 -6
- data/src/core/client_channel/dynamic_filters.h +1 -1
- data/src/core/client_channel/global_subchannel_pool.cc +4 -1
- data/src/core/client_channel/retry_filter.cc +21 -27
- data/src/core/client_channel/retry_filter.h +10 -7
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
- data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
- data/src/core/client_channel/retry_interceptor.cc +30 -44
- data/src/core/client_channel/retry_interceptor.h +18 -17
- data/src/core/client_channel/retry_throttle.cc +46 -61
- data/src/core/client_channel/retry_throttle.h +17 -39
- data/src/core/client_channel/subchannel.cc +43 -19
- data/src/core/client_channel/subchannel.h +8 -0
- data/src/core/config/config_vars.cc +2 -0
- data/src/core/config/core_configuration.cc +1 -0
- data/src/core/config/core_configuration.h +11 -0
- data/src/core/credentials/call/call_creds_registry.h +125 -0
- data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
- data/src/core/credentials/call/jwt_util.cc +70 -0
- data/src/core/credentials/call/jwt_util.h +32 -0
- data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
- data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
- data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
- data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
- data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
- data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
- data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
- data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
- data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
- data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
- data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
- data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
- data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
- data/src/core/filter/auth/auth_filters.h +0 -25
- data/src/core/filter/auth/client_auth_filter.cc +0 -118
- data/src/core/filter/filter_args.h +9 -23
- data/src/core/handshaker/handshaker.cc +23 -14
- data/src/core/handshaker/handshaker.h +3 -0
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
- data/src/core/handshaker/security/secure_endpoint.cc +70 -25
- data/src/core/handshaker/security/security_handshaker.cc +4 -1
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
- data/src/core/lib/channel/channel_args.cc +15 -0
- data/src/core/lib/channel/channel_args.h +3 -0
- data/src/core/lib/channel/channel_stack.cc +22 -23
- data/src/core/lib/channel/channel_stack.h +9 -7
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
- data/src/core/lib/channel/promise_based_filter.h +5 -5
- data/src/core/lib/debug/trace_impl.h +0 -1
- data/src/core/lib/event_engine/ares_resolver.cc +165 -46
- data/src/core/lib/event_engine/ares_resolver.h +48 -2
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
- data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
- data/src/core/lib/event_engine/event_engine.cc +7 -0
- data/src/core/lib/event_engine/extensions/channelz.h +10 -6
- data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
- data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
- data/src/core/lib/event_engine/shim.cc +9 -0
- data/src/core/lib/event_engine/shim.h +3 -0
- data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
- data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
- data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
- data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
- data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
- data/src/core/lib/experiments/experiments.cc +45 -93
- data/src/core/lib/experiments/experiments.h +21 -51
- data/src/core/lib/iomgr/endpoint.cc +4 -3
- data/src/core/lib/iomgr/endpoint.h +7 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
- data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
- data/src/core/lib/iomgr/tcp_posix.cc +12 -6
- data/src/core/lib/iomgr/tcp_windows.cc +3 -2
- data/src/core/lib/promise/activity.h +1 -0
- data/src/core/lib/promise/arena_promise.h +23 -7
- data/src/core/lib/promise/detail/promise_factory.h +10 -0
- data/src/core/lib/promise/detail/promise_like.h +118 -11
- data/src/core/lib/promise/detail/promise_variant.h +50 -0
- data/src/core/lib/promise/detail/seq_state.h +687 -548
- data/src/core/lib/promise/if.h +20 -0
- data/src/core/lib/promise/inter_activity_latch.h +147 -0
- data/src/core/lib/promise/inter_activity_mutex.h +547 -0
- data/src/core/lib/promise/loop.h +65 -3
- data/src/core/lib/promise/map.h +24 -0
- data/src/core/lib/promise/match_promise.h +103 -0
- data/src/core/lib/promise/mpsc.cc +425 -0
- data/src/core/lib/promise/mpsc.h +490 -0
- data/src/core/lib/promise/party.cc +50 -1
- data/src/core/lib/promise/party.h +66 -1
- data/src/core/lib/promise/race.h +31 -0
- data/src/core/lib/promise/seq.h +4 -1
- data/src/core/lib/promise/status_flag.h +7 -0
- data/src/core/lib/promise/try_seq.h +4 -1
- data/src/core/lib/promise/wait_set.cc +28 -0
- data/src/core/lib/promise/wait_set.h +86 -0
- data/src/core/lib/resource_quota/arena.h +19 -0
- data/src/core/lib/slice/slice.h +5 -0
- data/src/core/lib/surface/channel_create.cc +88 -13
- data/src/core/lib/surface/channel_create.h +4 -0
- data/src/core/lib/surface/channel_init.cc +164 -47
- data/src/core/lib/surface/channel_init.h +64 -1
- data/src/core/lib/surface/filter_stack_call.cc +18 -9
- data/src/core/lib/surface/init.cc +6 -15
- data/src/core/lib/surface/legacy_channel.cc +3 -5
- data/src/core/lib/surface/legacy_channel.h +3 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.cc +110 -0
- data/src/core/lib/transport/promise_endpoint.h +307 -0
- data/src/core/load_balancing/child_policy_handler.cc +2 -4
- data/src/core/load_balancing/delegating_helper.h +2 -3
- data/src/core/load_balancing/health_check_client.cc +1 -5
- data/src/core/load_balancing/lb_policy.h +1 -3
- data/src/core/load_balancing/oob_backend_metric.cc +1 -5
- data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
- data/src/core/load_balancing/xds/cds.cc +10 -1
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
- data/src/core/resolver/xds/xds_config.cc +6 -3
- data/src/core/resolver/xds/xds_config.h +9 -4
- data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
- data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
- data/src/core/resolver/xds/xds_resolver.cc +31 -11
- data/src/core/server/server.cc +83 -12
- data/src/core/server/server.h +21 -2
- data/src/core/server/xds_server_config_fetcher.cc +63 -25
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_impl.h +1 -1
- data/src/core/telemetry/context_list_entry.cc +38 -0
- data/src/core/telemetry/context_list_entry.h +42 -12
- data/src/core/telemetry/stats_data.cc +233 -207
- data/src/core/telemetry/stats_data.h +250 -153
- data/src/core/telemetry/tcp_tracer.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
- data/src/core/tsi/fake_transport_security.cc +17 -0
- data/src/core/tsi/ssl_transport_security.cc +2 -0
- data/src/core/tsi/transport_security_grpc.cc +8 -0
- data/src/core/tsi/transport_security_grpc.h +15 -0
- data/src/core/util/backoff.cc +1 -5
- data/src/core/util/backoff.h +1 -0
- data/src/core/util/down_cast.h +1 -1
- data/src/core/util/function_signature.h +15 -1
- data/src/core/util/http_client/httpcli.cc +12 -5
- data/src/core/util/http_client/httpcli.h +4 -1
- data/src/core/util/latent_see.h +8 -5
- data/src/core/util/log.cc +4 -0
- data/src/core/util/memory_usage.h +268 -0
- data/src/core/util/per_cpu.cc +2 -0
- data/src/core/util/per_cpu.h +7 -0
- data/src/core/util/shared_bit_gen.h +20 -0
- data/src/core/util/single_set_ptr.h +2 -2
- data/src/core/util/upb_utils.h +42 -0
- data/src/core/util/uri.cc +3 -2
- data/src/core/util/useful.h +53 -2
- data/src/core/util/wait_for_single_owner.cc +31 -0
- data/src/core/util/wait_for_single_owner.h +24 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
- data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
- data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
- data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
- data/src/core/xds/grpc/xds_http_filter.h +7 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
- data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
- data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
- data/src/core/xds/grpc/xds_server_grpc.h +10 -2
- data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
- data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
- data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
- data/src/core/xds/xds_client/xds_client.cc +26 -5
- data/src/ruby/ext/grpc/extconf.rb +2 -0
- data/src/ruby/ext/grpc/rb_call.c +1 -8
- data/src/ruby/ext/grpc/rb_channel.c +72 -568
- data/src/ruby/ext/grpc/rb_channel.h +0 -3
- data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
- data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
- data/src/ruby/ext/grpc/rb_grpc.c +9 -5
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/ext/grpc/rb_loader.c +0 -4
- data/src/ruby/ext/grpc/rb_server.c +31 -50
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/core_spec.rb +22 -0
- data/src/ruby/spec/generic/active_call_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
- data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
- data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
- data/third_party/abseil-cpp/absl/base/config.h +20 -129
- data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
- data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
- data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
- data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
- data/third_party/abseil-cpp/absl/base/options.h +3 -80
- data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
- data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
- data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
- data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
- data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
- data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
- data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
- data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
- data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
- data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
- data/third_party/abseil-cpp/absl/log/check.h +2 -1
- data/third_party/abseil-cpp/absl/log/globals.h +4 -5
- data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
- data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
- data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
- data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
- data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
- data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
- data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
- data/third_party/abseil-cpp/absl/log/log.h +48 -35
- data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
- data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
- data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
- data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
- data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- data/third_party/abseil-cpp/absl/random/random.h +88 -53
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
- data/third_party/abseil-cpp/absl/status/status.cc +4 -8
- data/third_party/abseil-cpp/absl/status/status.h +8 -8
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
- data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
- data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
- data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
- data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
- data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
- data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- 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 +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
- data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
- data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
- data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
- data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
- data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
- data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
- data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
- data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
- data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
- data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
- data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
- data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- data/third_party/abseil-cpp/absl/time/time.h +20 -15
- data/third_party/abseil-cpp/absl/types/optional.h +7 -747
- data/third_party/abseil-cpp/absl/types/span.h +13 -11
- data/third_party/abseil-cpp/absl/types/variant.h +5 -784
- data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
- metadata +72 -20
- data/src/core/lib/event_engine/forkable.cc +0 -105
- data/src/core/lib/event_engine/forkable.h +0 -67
- data/src/core/lib/iomgr/python_util.h +0 -46
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
- data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
- data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -0,0 +1,490 @@
|
|
1
|
+
// Copyright 2022 gRPC 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
|
+
// http://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
|
+
|
15
|
+
#ifndef GRPC_SRC_CORE_LIB_PROMISE_MPSC_H
|
16
|
+
#define GRPC_SRC_CORE_LIB_PROMISE_MPSC_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
#include <stddef.h>
|
20
|
+
|
21
|
+
#include <algorithm>
|
22
|
+
#include <atomic>
|
23
|
+
#include <cstdint>
|
24
|
+
#include <utility>
|
25
|
+
|
26
|
+
#include "absl/log/check.h"
|
27
|
+
#include "src/core/channelz/property_list.h"
|
28
|
+
#include "src/core/lib/promise/activity.h"
|
29
|
+
#include "src/core/lib/promise/map.h"
|
30
|
+
#include "src/core/lib/promise/poll.h"
|
31
|
+
#include "src/core/lib/promise/status_flag.h"
|
32
|
+
#include "src/core/util/ref_counted.h"
|
33
|
+
#include "src/core/util/ref_counted_ptr.h"
|
34
|
+
|
35
|
+
namespace grpc_core {
|
36
|
+
|
37
|
+
namespace mpscpipe_detail {
|
38
|
+
|
39
|
+
// Multi Producer Single Consumer (MPSC) inter-activity communications.
|
40
|
+
// MPSC is used to communicate in between two or more Activities or Promise
|
41
|
+
// Parties in a thread safe way.
|
42
|
+
// The communication consists of one or more MpscSender objects and one
|
43
|
+
// MpscReceiver.
|
44
|
+
|
45
|
+
// Base MPSC class.
|
46
|
+
//
|
47
|
+
// The templates below wrap this and provide a more user friendly API.
|
48
|
+
// This class provides queuing of nodes, blocking those sends if there are too
|
49
|
+
// many tokens in the queue, a way of dequeuing nodes in order, and a way of
|
50
|
+
// lazily returning tokens to the queue after a node is dequeued.
|
51
|
+
//
|
52
|
+
// Notes:
|
53
|
+
//
|
54
|
+
// We split the queue in two.
|
55
|
+
//
|
56
|
+
// The first is an unbounded MPSC that we queue all prospective nodes into.
|
57
|
+
// Since the nodes exist, there's no reason not to keep track of them, but we
|
58
|
+
// do signal that nodes above the max_queued_ are blocked and refused to
|
59
|
+
// complete the send promise until they become accepted. The unbounded mpsc
|
60
|
+
// is derived from the same algorithm in mpscq.h, and consequently from
|
61
|
+
// http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue
|
62
|
+
//
|
63
|
+
// That implementation is modified to allow a Waker object to be CAS-d in
|
64
|
+
// whenever we'd otherwise return nullptr to signify no ready node yet. This
|
65
|
+
// allows us to then wake up the stalled actor using the Activity wakeup system
|
66
|
+
// without needing any backoff/manual retry loop that's traditionally plagued
|
67
|
+
// usage of mpscq.h. If there are bugs, it's probably in those modifications.
|
68
|
+
//
|
69
|
+
// The second queue is an spsc queue that tracks nodes that have been accepted,
|
70
|
+
// that is that could be returned by Next() but have not yet been returned.
|
71
|
+
// We cheat a little here and allow (max_queued_ - 1) + (one node) to be
|
72
|
+
// accepted because it makes the logic much simpler - by decoupling the
|
73
|
+
// acceptance check and the dequeue operation.
|
74
|
+
//
|
75
|
+
// The second queue is entirely maintained by the single consumer.
|
76
|
+
class Mpsc {
|
77
|
+
public:
|
78
|
+
explicit Mpsc(size_t max_queued) : max_queued_(max_queued) {}
|
79
|
+
~Mpsc();
|
80
|
+
|
81
|
+
// Base class for nodes in the queue.
|
82
|
+
// Center<T>::Node extends this for various types.
|
83
|
+
class Node {
|
84
|
+
public:
|
85
|
+
// One ref for blocking, one ref for releasing tokens. If there are no
|
86
|
+
// tokens this is an immediate send, and so we don't need the ref for
|
87
|
+
// blocking.
|
88
|
+
explicit Node(uint32_t tokens) : tokens_(tokens) {}
|
89
|
+
virtual ~Node() = default;
|
90
|
+
|
91
|
+
uint32_t tokens() const { return tokens_; }
|
92
|
+
|
93
|
+
private:
|
94
|
+
friend class Mpsc;
|
95
|
+
static constexpr uintptr_t kWakerPtr = 1;
|
96
|
+
static constexpr uint8_t kBlockedState = 128;
|
97
|
+
static constexpr uint8_t kClosedState = 64;
|
98
|
+
static constexpr uint8_t kRefMask = 3;
|
99
|
+
|
100
|
+
void Unref() {
|
101
|
+
if ((state_.fetch_sub(1, std::memory_order_acq_rel) & kRefMask) == 1) {
|
102
|
+
delete this;
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
channelz::PropertyList ChannelzProperties() const {
|
107
|
+
auto state = state_.load(std::memory_order_relaxed);
|
108
|
+
return channelz::PropertyList()
|
109
|
+
.Set("blocked", state & Node::kBlockedState)
|
110
|
+
.Set("closed", state & Node::kClosedState)
|
111
|
+
.Set("refs", state & Node::kRefMask);
|
112
|
+
}
|
113
|
+
|
114
|
+
const uint32_t tokens_;
|
115
|
+
// All following fields are maintained by the Mpsc class.
|
116
|
+
std::atomic<uint8_t> state_;
|
117
|
+
Waker waker_;
|
118
|
+
union {
|
119
|
+
std::atomic<uintptr_t> next_{0};
|
120
|
+
Node* spsc_next_;
|
121
|
+
};
|
122
|
+
};
|
123
|
+
|
124
|
+
private:
|
125
|
+
class SendPoller {
|
126
|
+
public:
|
127
|
+
explicit SendPoller(Node* node) : node_(node) {}
|
128
|
+
~SendPoller() {
|
129
|
+
if (node_ != nullptr) node_->Unref();
|
130
|
+
}
|
131
|
+
SendPoller(const SendPoller&) = delete;
|
132
|
+
SendPoller& operator=(const SendPoller&) = delete;
|
133
|
+
SendPoller(SendPoller&& other) noexcept
|
134
|
+
: node_(std::exchange(other.node_, nullptr)) {}
|
135
|
+
SendPoller& operator=(SendPoller&& other) noexcept {
|
136
|
+
std::swap(node_, other.node_);
|
137
|
+
return *this;
|
138
|
+
}
|
139
|
+
Poll<StatusFlag> operator()() {
|
140
|
+
auto state = node_->state_.load(std::memory_order_relaxed);
|
141
|
+
if (state & Node::kClosedState) {
|
142
|
+
node_->Unref();
|
143
|
+
node_ = nullptr;
|
144
|
+
return Failure{};
|
145
|
+
}
|
146
|
+
if (state & Node::kBlockedState) {
|
147
|
+
return Pending{};
|
148
|
+
}
|
149
|
+
node_->Unref();
|
150
|
+
node_ = nullptr;
|
151
|
+
return Success{};
|
152
|
+
}
|
153
|
+
|
154
|
+
channelz::PropertyList ChannelzProperties() const {
|
155
|
+
return node_->ChannelzProperties();
|
156
|
+
}
|
157
|
+
|
158
|
+
private:
|
159
|
+
Node* node_;
|
160
|
+
};
|
161
|
+
|
162
|
+
class NextPoller {
|
163
|
+
public:
|
164
|
+
explicit NextPoller(Mpsc* mpsc) : mpsc_(mpsc) {}
|
165
|
+
NextPoller(const NextPoller&) = delete;
|
166
|
+
NextPoller& operator=(const NextPoller&) = delete;
|
167
|
+
NextPoller(NextPoller&& other) noexcept
|
168
|
+
: mpsc_(std::exchange(other.mpsc_, nullptr)) {}
|
169
|
+
NextPoller& operator=(NextPoller&& other) noexcept {
|
170
|
+
std::swap(mpsc_, other.mpsc_);
|
171
|
+
return *this;
|
172
|
+
}
|
173
|
+
Poll<ValueOrFailure<Node*>> operator()() { return mpsc_->PollNext(); }
|
174
|
+
channelz::PropertyList ChannelzProperties() const {
|
175
|
+
return mpsc_->PollNextChannelzProperties();
|
176
|
+
}
|
177
|
+
|
178
|
+
private:
|
179
|
+
Mpsc* mpsc_;
|
180
|
+
};
|
181
|
+
|
182
|
+
public:
|
183
|
+
auto Send(Node* node) {
|
184
|
+
DCHECK(node->waker_.is_unwakeable());
|
185
|
+
// Enqueue the node immediately; this means that Send() must be called
|
186
|
+
// from the same activity that will poll the result.
|
187
|
+
Enqueue(node);
|
188
|
+
return SendPoller(node);
|
189
|
+
}
|
190
|
+
|
191
|
+
StatusFlag UnbufferedImmediateSend(Node* node);
|
192
|
+
|
193
|
+
auto Next() { return NextPoller(this); }
|
194
|
+
Node* ImmediateNext() {
|
195
|
+
Node* accepted_head = accepted_head_;
|
196
|
+
if (accepted_head != nullptr) {
|
197
|
+
accepted_head_ = reinterpret_cast<Node*>(
|
198
|
+
accepted_head->next_.load(std::memory_order_relaxed));
|
199
|
+
}
|
200
|
+
return accepted_head;
|
201
|
+
}
|
202
|
+
void ReleaseTokens(Node* node);
|
203
|
+
|
204
|
+
void Close(bool wake_reader);
|
205
|
+
|
206
|
+
channelz::PropertyList ChannelzProperties() const;
|
207
|
+
|
208
|
+
uint64_t QueuedTokens() const { return queued_tokens_.load(); }
|
209
|
+
|
210
|
+
private:
|
211
|
+
void Enqueue(Node* node);
|
212
|
+
void ReleaseTokensAndClose(Node* node);
|
213
|
+
Poll<Node*> Dequeue();
|
214
|
+
Node* DequeueImmediate();
|
215
|
+
Node* DequeueForDrain();
|
216
|
+
// Returns true if we can accept more nodes.
|
217
|
+
bool AcceptNode(Node* node);
|
218
|
+
// Returns true if we can accept more nodes.
|
219
|
+
// If it returns false, ensures a waker is set for the next enqueue.
|
220
|
+
bool CheckActiveTokens();
|
221
|
+
void DrainMpsc();
|
222
|
+
void PushStub();
|
223
|
+
void ReleaseActiveTokens(bool wake_reader, uint64_t tokens);
|
224
|
+
Poll<ValueOrFailure<Node*>> PollNext();
|
225
|
+
channelz::PropertyList PollNextChannelzProperties() const;
|
226
|
+
|
227
|
+
// Top two bits of active tokens is used for synchronization of
|
228
|
+
// the waker.
|
229
|
+
// When we see we need to pause because active tokens exceeds max queued,
|
230
|
+
// we first store a waker in active_tokens_waker_, then set active_tokens_ to
|
231
|
+
// hold kActiveTokensWakerBit.
|
232
|
+
// A token releaser to see active tokens less than max queued whilst the waker
|
233
|
+
// bit is set will try to transition it to having just the /waking/ bit set.
|
234
|
+
// If it succeeds, it holds the waker lock, and moves the waker out to a local
|
235
|
+
// variable.
|
236
|
+
// Next, it clears the top bits of active tokens, to indicate a waker can once
|
237
|
+
// again be installed.
|
238
|
+
// Finally, it executes the wakeup it's stored locally.
|
239
|
+
static constexpr uint64_t kActiveTokensWakerBit = 1ull << 63;
|
240
|
+
static constexpr uint64_t kActiveTokensWakingBit = 1ull << 62;
|
241
|
+
static constexpr uint64_t kActiveTokensMask = kActiveTokensWakingBit - 1;
|
242
|
+
const uint64_t max_queued_;
|
243
|
+
|
244
|
+
// Each active enqueue is one actor, and the reader is an actor.
|
245
|
+
// Once we close, we drop the reader actor, allowing each enqueuer to see
|
246
|
+
// if it's the last enqueuer.
|
247
|
+
// The last actor must drain the queue.
|
248
|
+
std::atomic<uint64_t> actors_{1};
|
249
|
+
std::atomic<uint64_t> queued_tokens_{0};
|
250
|
+
Waker active_tokens_waker_;
|
251
|
+
std::atomic<Node*> head_ = &stub_;
|
252
|
+
alignas(GPR_CACHELINE_SIZE) Node* tail_ = &stub_;
|
253
|
+
Node* accepted_head_ = nullptr;
|
254
|
+
std::atomic<uint64_t> active_tokens_{0};
|
255
|
+
Node stub_{0};
|
256
|
+
#ifndef NDEBUG
|
257
|
+
bool drained = false;
|
258
|
+
#endif
|
259
|
+
};
|
260
|
+
|
261
|
+
// "Center" of the communication pipe.
|
262
|
+
// Contains sent but not received messages, and open/close state.
|
263
|
+
template <typename T>
|
264
|
+
class Center : public RefCounted<Center<T>, NonPolymorphicRefCount> {
|
265
|
+
private:
|
266
|
+
struct Node final : public Mpsc::Node {
|
267
|
+
explicit Node(uint32_t tokens, T value)
|
268
|
+
: Mpsc::Node(tokens), value(std::move(value)) {}
|
269
|
+
T value;
|
270
|
+
};
|
271
|
+
|
272
|
+
public:
|
273
|
+
// Construct the center with a maximum queue size.
|
274
|
+
explicit Center(size_t max_queued) : mpsc_(max_queued) {}
|
275
|
+
|
276
|
+
~Center() {}
|
277
|
+
|
278
|
+
class Queued {
|
279
|
+
public:
|
280
|
+
Queued() : node_(nullptr) {}
|
281
|
+
Queued(Node* node, RefCountedPtr<Center<T>> center)
|
282
|
+
: node_(node), center_(std::move(center)) {}
|
283
|
+
~Queued() {
|
284
|
+
if (node_ != nullptr) center_->mpsc_.ReleaseTokens(node_);
|
285
|
+
}
|
286
|
+
Queued(const Queued&) = delete;
|
287
|
+
Queued& operator=(const Queued&) = delete;
|
288
|
+
Queued(Queued&& q) noexcept
|
289
|
+
: node_(std::exchange(q.node_, nullptr)),
|
290
|
+
center_(std::move(q.center_)) {}
|
291
|
+
Queued& operator=(Queued&& q) noexcept {
|
292
|
+
std::swap(node_, q.node_);
|
293
|
+
std::swap(center_, q.center_);
|
294
|
+
return *this;
|
295
|
+
}
|
296
|
+
|
297
|
+
template <typename Sink>
|
298
|
+
friend void AbslStringify(Sink& sink, const Queued& q) {
|
299
|
+
absl::Format(&sink, "Queued{%s, tokens=%d}", absl::StrCat(q.node_->value),
|
300
|
+
q.node_->tokens());
|
301
|
+
}
|
302
|
+
|
303
|
+
friend std::ostream& operator<<(std::ostream& os, const Queued& q) {
|
304
|
+
return os << absl::StrCat(q);
|
305
|
+
}
|
306
|
+
|
307
|
+
T& operator*() { return node_->value; }
|
308
|
+
const T& operator*() const { return node_->value; }
|
309
|
+
T* operator->() { return &node_->value; }
|
310
|
+
const T* operator->() const { return &node_->value; }
|
311
|
+
|
312
|
+
uint32_t tokens() const { return node_->tokens(); }
|
313
|
+
|
314
|
+
private:
|
315
|
+
Node* node_;
|
316
|
+
RefCountedPtr<Center<T>> center_;
|
317
|
+
};
|
318
|
+
|
319
|
+
auto Send(T value, uint32_t tokens) {
|
320
|
+
return mpsc_.Send(new Node(tokens, std::move(value)));
|
321
|
+
}
|
322
|
+
|
323
|
+
StatusFlag UnbufferedImmediateSend(T value, uint32_t tokens) {
|
324
|
+
return mpsc_.UnbufferedImmediateSend(new Node(tokens, std::move(value)));
|
325
|
+
}
|
326
|
+
|
327
|
+
auto Next() {
|
328
|
+
return Map(mpsc_.Next(),
|
329
|
+
[this](ValueOrFailure<Mpsc::Node*> x) -> ValueOrFailure<Queued> {
|
330
|
+
if (!x.ok()) return Failure{};
|
331
|
+
return Queued(DownCast<Node*>(*x), this->Ref());
|
332
|
+
});
|
333
|
+
}
|
334
|
+
|
335
|
+
auto NextBatch(size_t max_batch_size) {
|
336
|
+
// Does not support delayed returning of tokens.
|
337
|
+
return Map(mpsc_.Next(),
|
338
|
+
[this, max_batch_size](ValueOrFailure<Mpsc::Node*> x)
|
339
|
+
-> ValueOrFailure<std::vector<T>> {
|
340
|
+
if (!x.ok()) return Failure{};
|
341
|
+
std::vector<T> result;
|
342
|
+
result.emplace_back(std::move(DownCast<Node*>(*x)->value));
|
343
|
+
mpsc_.ReleaseTokens(*x);
|
344
|
+
while (result.size() < max_batch_size) {
|
345
|
+
auto next = mpsc_.ImmediateNext();
|
346
|
+
if (next == nullptr) break;
|
347
|
+
result.emplace_back(std::move(DownCast<Node*>(next)->value));
|
348
|
+
mpsc_.ReleaseTokens(next);
|
349
|
+
}
|
350
|
+
return std::move(result);
|
351
|
+
});
|
352
|
+
}
|
353
|
+
|
354
|
+
void ReceiverClosed(bool wake_reader) { mpsc_.Close(wake_reader); }
|
355
|
+
|
356
|
+
uint64_t QueuedTokens() const { return mpsc_.QueuedTokens(); }
|
357
|
+
|
358
|
+
channelz::PropertyList ChannelzProperties() const {
|
359
|
+
return mpsc_.ChannelzProperties();
|
360
|
+
}
|
361
|
+
|
362
|
+
private:
|
363
|
+
Mpsc mpsc_;
|
364
|
+
};
|
365
|
+
|
366
|
+
} // namespace mpscpipe_detail
|
367
|
+
|
368
|
+
template <typename T>
|
369
|
+
using MpscQueued = typename mpscpipe_detail::Center<T>::Queued;
|
370
|
+
|
371
|
+
template <typename T>
|
372
|
+
class MpscReceiver;
|
373
|
+
|
374
|
+
// Send half of an mpsc pipe.
|
375
|
+
template <typename T>
|
376
|
+
class MpscSender {
|
377
|
+
public:
|
378
|
+
MpscSender() = default;
|
379
|
+
MpscSender(const MpscSender&) = default;
|
380
|
+
MpscSender& operator=(const MpscSender&) = default;
|
381
|
+
MpscSender(MpscSender&&) noexcept = default;
|
382
|
+
MpscSender& operator=(MpscSender&&) noexcept = default;
|
383
|
+
|
384
|
+
// Input: Input is the object that you want to send. The promise that is
|
385
|
+
// returned by Send will take ownership of the object.
|
386
|
+
// Return: Returns a promise that will send one item.
|
387
|
+
// This promise can either return
|
388
|
+
// 1. Pending{} if the sending is still pending
|
389
|
+
// 2. Resolves to true if sending is successful
|
390
|
+
// 3. Resolves to false if the receiver was closed and the value
|
391
|
+
// will never be successfully sent.
|
392
|
+
// The promise returned is thread safe. We can use multiple send calls
|
393
|
+
// in parallel to generate multiple such send promises and these promises can
|
394
|
+
// be run in parallel in a thread safe way.
|
395
|
+
auto Send(T t, uint32_t tokens) {
|
396
|
+
return Map(center_->Send(std::move(t), tokens),
|
397
|
+
[c = center_](auto x) { return x; });
|
398
|
+
}
|
399
|
+
|
400
|
+
StatusFlag UnbufferedImmediateSend(T t, uint32_t tokens) {
|
401
|
+
return center_->UnbufferedImmediateSend(std::move(t), tokens);
|
402
|
+
}
|
403
|
+
|
404
|
+
private:
|
405
|
+
friend class MpscReceiver<T>;
|
406
|
+
explicit MpscSender(RefCountedPtr<mpscpipe_detail::Center<T>> center)
|
407
|
+
: center_(std::move(center)) {}
|
408
|
+
RefCountedPtr<mpscpipe_detail::Center<T>> center_;
|
409
|
+
};
|
410
|
+
|
411
|
+
template <typename T>
|
412
|
+
class MpscDebug {
|
413
|
+
public:
|
414
|
+
MpscDebug() = default;
|
415
|
+
channelz::PropertyList ChannelzProperties() const {
|
416
|
+
return center_->ChannelzProperties();
|
417
|
+
}
|
418
|
+
|
419
|
+
private:
|
420
|
+
friend class MpscReceiver<T>;
|
421
|
+
explicit MpscDebug(RefCountedPtr<mpscpipe_detail::Center<T>> center)
|
422
|
+
: center_(std::move(center)) {}
|
423
|
+
RefCountedPtr<mpscpipe_detail::Center<T>> center_;
|
424
|
+
};
|
425
|
+
|
426
|
+
template <typename T>
|
427
|
+
class MpscProbe {
|
428
|
+
public:
|
429
|
+
MpscProbe() = default;
|
430
|
+
|
431
|
+
uint64_t QueuedTokens() const {
|
432
|
+
return center_ == nullptr ? 0 : center_->QueuedTokens();
|
433
|
+
}
|
434
|
+
|
435
|
+
private:
|
436
|
+
friend class MpscReceiver<T>;
|
437
|
+
explicit MpscProbe(RefCountedPtr<mpscpipe_detail::Center<T>> center)
|
438
|
+
: center_(std::move(center)) {}
|
439
|
+
RefCountedPtr<mpscpipe_detail::Center<T>> center_;
|
440
|
+
};
|
441
|
+
|
442
|
+
// Receive half of an mpsc pipe.
|
443
|
+
template <typename T>
|
444
|
+
class MpscReceiver {
|
445
|
+
public:
|
446
|
+
// max_buffer_hint is the maximum number of tokens we'd like to buffer.
|
447
|
+
explicit MpscReceiver(uint64_t max_buffer_hint)
|
448
|
+
: center_(MakeRefCounted<mpscpipe_detail::Center<T>>(max_buffer_hint)) {}
|
449
|
+
~MpscReceiver() {
|
450
|
+
if (center_ != nullptr) center_->ReceiverClosed(false);
|
451
|
+
}
|
452
|
+
// Marking the receiver closed will make sure it will not receive any
|
453
|
+
// messages. If a sender tries to Send a message to a closed receiver,
|
454
|
+
// sending will fail.
|
455
|
+
void MarkClosed() {
|
456
|
+
if (center_ != nullptr) center_->ReceiverClosed(true);
|
457
|
+
}
|
458
|
+
MpscReceiver(const MpscReceiver&) = delete;
|
459
|
+
MpscReceiver& operator=(const MpscReceiver&) = delete;
|
460
|
+
MpscReceiver(MpscReceiver&& other) noexcept
|
461
|
+
: center_(std::move(other.center_)) {}
|
462
|
+
MpscReceiver& operator=(MpscReceiver&& other) noexcept {
|
463
|
+
center_ = std::move(other.center_);
|
464
|
+
return *this;
|
465
|
+
}
|
466
|
+
|
467
|
+
// Construct a new sender for this receiver. One receiver can have multiple
|
468
|
+
// senders.
|
469
|
+
MpscSender<T> MakeSender() { return MpscSender<T>(center_); }
|
470
|
+
|
471
|
+
MpscDebug<T> MakeDebug() { return MpscDebug<T>(center_); }
|
472
|
+
MpscProbe<T> MakeProbe() { return MpscProbe<T>(center_); }
|
473
|
+
|
474
|
+
// Returns a promise that will resolve to ValueOrFailure<T>.
|
475
|
+
// If receiving is closed, the promise will resolve to failure.
|
476
|
+
// Otherwise, the promise resolves to the next item and removes
|
477
|
+
// said item from the queue.
|
478
|
+
auto Next() { return center_->Next(); }
|
479
|
+
|
480
|
+
auto NextBatch(size_t max_batch_size) {
|
481
|
+
return center_->NextBatch(max_batch_size);
|
482
|
+
}
|
483
|
+
|
484
|
+
private:
|
485
|
+
RefCountedPtr<mpscpipe_detail::Center<T>> center_;
|
486
|
+
};
|
487
|
+
|
488
|
+
} // namespace grpc_core
|
489
|
+
|
490
|
+
#endif // GRPC_SRC_CORE_LIB_PROMISE_MPSC_H
|
@@ -27,6 +27,7 @@
|
|
27
27
|
#include "src/core/lib/event_engine/event_engine_context.h"
|
28
28
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
29
29
|
#include "src/core/lib/promise/activity.h"
|
30
|
+
#include "src/core/util/json/json_writer.h"
|
30
31
|
#include "src/core/util/latent_see.h"
|
31
32
|
#include "src/core/util/sync.h"
|
32
33
|
|
@@ -154,6 +155,7 @@ Party::Participant::~Participant() {
|
|
154
155
|
// Party::SpawnSerializer
|
155
156
|
|
156
157
|
bool Party::SpawnSerializer::PollParticipantPromise() {
|
158
|
+
GRPC_LATENT_SEE_INNER_SCOPE("SpawnSerializer::PollParticipantPromise");
|
157
159
|
if (active_ == nullptr) {
|
158
160
|
active_ = next_.Pop().value_or(nullptr);
|
159
161
|
}
|
@@ -187,6 +189,50 @@ void Party::SpawnSerializer::Destroy() {
|
|
187
189
|
|
188
190
|
Party::~Party() {}
|
189
191
|
|
192
|
+
void Party::ToJson(absl::AnyInvocable<void(Json::Object)> f) {
|
193
|
+
Spawn(
|
194
|
+
"get-json",
|
195
|
+
[f = std::move(f), self = Ref()]() mutable {
|
196
|
+
return [f = std::move(f), self]() mutable {
|
197
|
+
f(self->ChannelzPropertiesLocked().TakeJsonObject());
|
198
|
+
return absl::OkStatus();
|
199
|
+
};
|
200
|
+
},
|
201
|
+
[](absl::Status) {});
|
202
|
+
}
|
203
|
+
|
204
|
+
void Party::ExportToChannelz(std::string name, channelz::DataSink sink) {
|
205
|
+
Spawn(
|
206
|
+
"export-to-channelz",
|
207
|
+
[name = std::move(name), sink = std::move(sink), self = Ref()]() mutable {
|
208
|
+
sink.AddData(std::move(name), self->ChannelzPropertiesLocked());
|
209
|
+
return absl::OkStatus();
|
210
|
+
},
|
211
|
+
[](absl::Status) {});
|
212
|
+
}
|
213
|
+
|
214
|
+
channelz::PropertyList Party::ChannelzPropertiesLocked() {
|
215
|
+
return channelz::PropertyList()
|
216
|
+
.Set("ref_count", state_.load(std::memory_order_relaxed) >> kRefShift)
|
217
|
+
.Set("allocated_participants",
|
218
|
+
(state_.load(std::memory_order_relaxed) & kAllocatedMask) >>
|
219
|
+
kAllocatedShift)
|
220
|
+
.Set("wakeup_mask", wakeup_mask_ & kWakeupMask)
|
221
|
+
.Set("locked", (state_.load(std::memory_order_relaxed) & kLocked) != 0)
|
222
|
+
.Set("local_wakeup_mask", wakeup_mask_)
|
223
|
+
.Set("currently_polling", currently_polling_)
|
224
|
+
.Set("participants", [this]() {
|
225
|
+
channelz::PropertyTable table;
|
226
|
+
for (size_t i = 0; i < party_detail::kMaxParticipants; i++) {
|
227
|
+
if (auto* p = participants_[i].load(std::memory_order_acquire);
|
228
|
+
p != nullptr) {
|
229
|
+
table.AppendRow(p->ChannelzProperties());
|
230
|
+
}
|
231
|
+
}
|
232
|
+
return table;
|
233
|
+
}());
|
234
|
+
}
|
235
|
+
|
190
236
|
void Party::CancelRemainingParticipants() {
|
191
237
|
uint64_t prev_state = state_.load(std::memory_order_relaxed);
|
192
238
|
if ((prev_state & kAllocatedMask) == 0) return;
|
@@ -260,6 +306,7 @@ void Party::RunLockedAndUnref(Party* party, uint64_t prev_state) {
|
|
260
306
|
g_run_state = this;
|
261
307
|
do {
|
262
308
|
GRPC_LATENT_SEE_INNER_SCOPE("run_one_party");
|
309
|
+
CHECK(first.party != nullptr);
|
263
310
|
first.party->RunPartyAndUnref(first.prev_state);
|
264
311
|
first = std::exchange(next, PartyWakeup{});
|
265
312
|
} while (first.party != nullptr);
|
@@ -290,10 +337,12 @@ void Party::RunLockedAndUnref(Party* party, uint64_t prev_state) {
|
|
290
337
|
// gets held for a really long time.
|
291
338
|
auto wakeup =
|
292
339
|
std::exchange(g_run_state->next, PartyWakeup{party, prev_state});
|
293
|
-
auto arena = party->arena_.get();
|
340
|
+
auto arena = wakeup.party->arena_.get();
|
341
|
+
CHECK(arena != nullptr);
|
294
342
|
auto* event_engine =
|
295
343
|
arena->GetContext<grpc_event_engine::experimental::EventEngine>();
|
296
344
|
CHECK(event_engine != nullptr) << "; " << GRPC_DUMP_ARGS(party, arena);
|
345
|
+
GRPC_LATENT_SEE_INNER_SCOPE("offload_one_party");
|
297
346
|
event_engine->Run([wakeup]() {
|
298
347
|
GRPC_LATENT_SEE_PARENT_SCOPE("Party::RunLocked offload");
|
299
348
|
ExecCtx exec_ctx;
|