grpc 1.50.0.pre1 → 1.51.0
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 +131 -42
- data/include/grpc/event_engine/event_engine.h +10 -3
- data/include/grpc/event_engine/slice_buffer.h +17 -0
- data/include/grpc/grpc.h +0 -10
- data/include/grpc/impl/codegen/grpc_types.h +1 -5
- data/include/grpc/impl/codegen/port_platform.h +0 -3
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
- data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
- data/src/core/ext/filters/client_channel/client_channel.h +3 -4
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
- data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
- data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
- data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
- data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
- data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
- data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
- data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
- data/src/core/ext/filters/client_channel/subchannel.h +2 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
- data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
- data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
- data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
- data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
- data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
- data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
- data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
- data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
- data/src/core/ext/xds/certificate_provider_store.cc +4 -4
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
- data/src/core/ext/xds/xds_api.cc +15 -68
- data/src/core/ext/xds/xds_api.h +3 -7
- data/src/core/ext/xds/xds_bootstrap.h +0 -1
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
- data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
- data/src/core/ext/xds/xds_client.cc +122 -90
- data/src/core/ext/xds/xds_client.h +7 -2
- data/src/core/ext/xds/xds_client_grpc.cc +5 -24
- data/src/core/ext/xds/xds_cluster.cc +291 -183
- data/src/core/ext/xds/xds_cluster.h +11 -15
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
- data/src/core/ext/xds/xds_common_types.cc +208 -141
- data/src/core/ext/xds/xds_common_types.h +19 -13
- data/src/core/ext/xds/xds_endpoint.cc +214 -129
- data/src/core/ext/xds/xds_endpoint.h +4 -7
- data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
- data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
- data/src/core/ext/xds/xds_http_filters.cc +60 -73
- data/src/core/ext/xds/xds_http_filters.h +67 -19
- data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
- data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
- data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
- data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
- data/src/core/ext/xds/xds_listener.cc +459 -417
- data/src/core/ext/xds/xds_listener.h +43 -47
- data/src/core/ext/xds/xds_resource_type.h +3 -11
- data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
- data/src/core/ext/xds/xds_route_config.cc +94 -80
- data/src/core/ext/xds/xds_route_config.h +10 -10
- data/src/core/ext/xds/xds_routing.cc +2 -1
- data/src/core/ext/xds/xds_routing.h +2 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
- data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
- data/src/core/lib/address_utils/parse_address.cc +11 -10
- data/src/core/lib/channel/channel_args.h +16 -1
- data/src/core/lib/channel/channel_stack.cc +23 -20
- data/src/core/lib/channel/channel_stack.h +17 -4
- data/src/core/lib/channel/channel_stack_builder.cc +4 -7
- data/src/core/lib/channel/channel_stack_builder.h +14 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
- data/src/core/lib/channel/channel_trace.cc +4 -5
- data/src/core/lib/channel/channelz.cc +1 -1
- data/src/core/lib/channel/connected_channel.cc +695 -35
- data/src/core/lib/channel/connected_channel.h +0 -4
- data/src/core/lib/channel/promise_based_filter.cc +1004 -140
- data/src/core/lib/channel/promise_based_filter.h +364 -87
- data/src/core/lib/compression/message_compress.cc +5 -5
- data/src/core/lib/debug/event_log.cc +88 -0
- data/src/core/lib/debug/event_log.h +81 -0
- data/src/core/lib/debug/histogram_view.cc +69 -0
- data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
- data/src/core/lib/debug/stats.cc +22 -119
- data/src/core/lib/debug/stats.h +29 -35
- data/src/core/lib/debug/stats_data.cc +224 -73
- data/src/core/lib/debug/stats_data.h +263 -122
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +38 -15
- data/src/core/lib/event_engine/default_event_engine.h +15 -3
- data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
- data/src/core/lib/event_engine/memory_allocator.cc +1 -1
- data/src/core/lib/event_engine/poller.h +10 -4
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
- data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
- data/src/core/lib/event_engine/slice.cc +7 -6
- data/src/core/lib/event_engine/slice_buffer.cc +2 -2
- data/src/core/lib/event_engine/thread_pool.cc +106 -25
- data/src/core/lib/event_engine/thread_pool.h +32 -9
- data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
- data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
- data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
- data/src/core/lib/experiments/config.cc +1 -1
- data/src/core/lib/experiments/experiments.cc +13 -2
- data/src/core/lib/experiments/experiments.h +8 -1
- data/src/core/lib/gpr/cpu_linux.cc +6 -2
- data/src/core/lib/gpr/log_linux.cc +3 -4
- data/src/core/lib/gpr/string.h +1 -1
- data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
- data/src/core/lib/gprpp/load_file.cc +75 -0
- data/src/core/lib/gprpp/load_file.h +33 -0
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/stat_posix.cc +5 -4
- data/src/core/lib/gprpp/stat_windows.cc +3 -2
- data/src/core/lib/gprpp/status_helper.h +1 -3
- data/src/core/lib/gprpp/strerror.cc +41 -0
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
- data/src/core/lib/gprpp/thd_windows.cc +1 -2
- data/src/core/lib/gprpp/time.cc +3 -4
- data/src/core/lib/gprpp/time.h +13 -2
- data/src/core/lib/gprpp/validation_errors.h +18 -1
- data/src/core/lib/http/httpcli.cc +40 -44
- data/src/core/lib/http/httpcli.h +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +4 -6
- data/src/core/lib/http/parser.cc +54 -65
- data/src/core/lib/iomgr/buffer_list.cc +105 -116
- data/src/core/lib/iomgr/buffer_list.h +60 -44
- data/src/core/lib/iomgr/call_combiner.cc +11 -10
- data/src/core/lib/iomgr/call_combiner.h +3 -4
- data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
- data/src/core/lib/iomgr/closure.h +49 -5
- data/src/core/lib/iomgr/combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
- data/src/core/lib/iomgr/error.cc +27 -42
- data/src/core/lib/iomgr/error.h +22 -152
- data/src/core/lib/iomgr/ev_apple.cc +4 -4
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
- data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
- data/src/core/lib/iomgr/exec_ctx.cc +3 -4
- data/src/core/lib/iomgr/exec_ctx.h +2 -3
- data/src/core/lib/iomgr/executor.cc +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
- data/src/core/lib/iomgr/iocp_windows.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
- data/src/core/lib/iomgr/load_file.cc +5 -9
- data/src/core/lib/iomgr/lockfree_event.cc +10 -10
- data/src/core/lib/iomgr/pollset_windows.cc +4 -4
- data/src/core/lib/iomgr/python_util.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +8 -3
- data/src/core/lib/iomgr/resolve_address.h +3 -4
- data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
- data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
- data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
- data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
- data/src/core/lib/iomgr/socket_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
- data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
- data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
- data/src/core/lib/iomgr/tcp_posix.cc +92 -108
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
- data/src/core/lib/iomgr/tcp_windows.cc +27 -34
- data/src/core/lib/iomgr/timer.h +8 -8
- data/src/core/lib/iomgr/timer_generic.cc +9 -15
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +7 -2
- data/src/core/lib/json/json_object_loader.h +22 -0
- data/src/core/lib/json/json_util.cc +5 -5
- data/src/core/lib/json/json_util.h +4 -4
- data/src/core/lib/load_balancing/lb_policy.cc +1 -1
- data/src/core/lib/load_balancing/lb_policy.h +4 -0
- data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
- data/src/core/lib/matchers/matchers.cc +3 -4
- data/src/core/lib/promise/activity.cc +16 -2
- data/src/core/lib/promise/activity.h +38 -15
- data/src/core/lib/promise/arena_promise.h +80 -51
- data/src/core/lib/promise/context.h +13 -6
- data/src/core/lib/promise/detail/basic_seq.h +9 -28
- data/src/core/lib/promise/detail/promise_factory.h +58 -10
- data/src/core/lib/promise/detail/status.h +28 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
- data/src/core/lib/promise/for_each.h +129 -0
- data/src/core/lib/promise/loop.h +7 -5
- data/src/core/lib/promise/map_pipe.h +87 -0
- data/src/core/lib/promise/pipe.cc +19 -0
- data/src/core/lib/promise/pipe.h +505 -0
- data/src/core/lib/promise/poll.h +13 -0
- data/src/core/lib/promise/seq.h +3 -5
- data/src/core/lib/promise/sleep.cc +5 -4
- data/src/core/lib/promise/sleep.h +1 -2
- data/src/core/lib/promise/try_concurrently.h +341 -0
- data/src/core/lib/promise/try_seq.h +10 -13
- data/src/core/lib/resolver/server_address.cc +1 -0
- data/src/core/lib/resolver/server_address.h +1 -3
- data/src/core/lib/resource_quota/api.cc +0 -1
- data/src/core/lib/resource_quota/arena.cc +19 -0
- data/src/core/lib/resource_quota/arena.h +89 -0
- data/src/core/lib/resource_quota/memory_quota.cc +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
- data/src/core/lib/security/authorization/matchers.cc +25 -22
- data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
- data/src/core/lib/security/context/security_context.h +10 -0
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
- data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
- data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
- data/src/core/lib/security/transport/security_handshaker.cc +53 -53
- data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
- data/src/core/lib/security/transport/tsi_error.cc +6 -3
- data/src/core/lib/security/util/json_util.cc +4 -5
- data/src/core/lib/service_config/service_config.h +1 -1
- data/src/core/lib/service_config/service_config_impl.cc +111 -158
- data/src/core/lib/service_config/service_config_impl.h +14 -17
- data/src/core/lib/service_config/service_config_parser.cc +14 -31
- data/src/core/lib/service_config/service_config_parser.h +14 -10
- data/src/core/lib/slice/b64.cc +2 -2
- data/src/core/lib/slice/slice.cc +7 -1
- data/src/core/lib/slice/slice.h +19 -6
- data/src/core/lib/slice/slice_buffer.cc +13 -14
- data/src/core/lib/slice/slice_internal.h +13 -21
- data/src/core/lib/slice/slice_refcount.h +34 -19
- data/src/core/lib/surface/byte_buffer.cc +3 -4
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +1366 -239
- data/src/core/lib/surface/call.h +44 -0
- data/src/core/lib/surface/call_details.cc +3 -3
- data/src/core/lib/surface/call_trace.cc +113 -0
- data/src/core/lib/surface/call_trace.h +30 -0
- data/src/core/lib/surface/channel.cc +44 -49
- data/src/core/lib/surface/channel.h +9 -1
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/channel_stack_type.cc +4 -0
- data/src/core/lib/surface/channel_stack_type.h +2 -0
- data/src/core/lib/surface/completion_queue.cc +38 -52
- data/src/core/lib/surface/init.cc +8 -39
- data/src/core/lib/surface/init_internally.h +8 -0
- data/src/core/lib/surface/lame_client.cc +10 -8
- data/src/core/lib/surface/server.cc +48 -70
- data/src/core/lib/surface/server.h +3 -4
- data/src/core/lib/surface/validate_metadata.cc +11 -12
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/connectivity_state.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +34 -28
- data/src/core/lib/transport/error_utils.h +3 -3
- data/src/core/lib/transport/handshaker.cc +14 -14
- data/src/core/lib/transport/handshaker.h +1 -1
- data/src/core/lib/transport/handshaker_factory.h +26 -0
- data/src/core/lib/transport/handshaker_registry.cc +8 -2
- data/src/core/lib/transport/handshaker_registry.h +3 -4
- data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
- data/src/core/lib/transport/metadata_batch.h +17 -1
- data/src/core/lib/transport/parsed_metadata.cc +2 -6
- data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
- data/src/core/lib/transport/transport.cc +63 -17
- data/src/core/lib/transport/transport.h +64 -68
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +7 -6
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
- data/src/core/tsi/fake_transport_security.cc +3 -3
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +0 -43
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +21 -12
- data/third_party/zlib/deflate.c +112 -106
- data/third_party/zlib/deflate.h +2 -2
- data/third_party/zlib/gzlib.c +1 -1
- data/third_party/zlib/gzread.c +3 -5
- data/third_party/zlib/gzwrite.c +1 -1
- data/third_party/zlib/infback.c +10 -7
- data/third_party/zlib/inflate.c +5 -2
- data/third_party/zlib/inftrees.c +2 -2
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +61 -62
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +10 -10
- data/third_party/zlib/zutil.c +9 -7
- data/third_party/zlib/zutil.h +1 -0
- metadata +57 -20
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
- data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
- data/src/core/lib/gpr/murmur_hash.cc +0 -82
- data/src/core/lib/gpr/murmur_hash.h +0 -29
- data/src/core/lib/gpr/tls.h +0 -156
- data/src/core/lib/promise/call_push_pull.h +0 -148
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_buffer_api.cc +0 -35
- data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -18,7 +18,6 @@
|
|
18
18
|
|
19
19
|
#include <utility>
|
20
20
|
|
21
|
-
#include "absl/memory/memory.h"
|
22
21
|
#include "absl/status/status.h"
|
23
22
|
#include "absl/strings/ascii.h"
|
24
23
|
#include "absl/strings/match.h"
|
@@ -35,7 +34,7 @@ absl::StatusOr<StringMatcher> StringMatcher::Create(Type type,
|
|
35
34
|
absl::string_view matcher,
|
36
35
|
bool case_sensitive) {
|
37
36
|
if (type == Type::kSafeRegex) {
|
38
|
-
auto regex_matcher =
|
37
|
+
auto regex_matcher = std::make_unique<RE2>(std::string(matcher));
|
39
38
|
if (!regex_matcher->ok()) {
|
40
39
|
return absl::InvalidArgumentError(
|
41
40
|
"Invalid regex string specified in matcher.");
|
@@ -56,7 +55,7 @@ StringMatcher::StringMatcher(std::unique_ptr<RE2> regex_matcher)
|
|
56
55
|
StringMatcher::StringMatcher(const StringMatcher& other)
|
57
56
|
: type_(other.type_), case_sensitive_(other.case_sensitive_) {
|
58
57
|
if (type_ == Type::kSafeRegex) {
|
59
|
-
regex_matcher_ =
|
58
|
+
regex_matcher_ = std::make_unique<RE2>(other.regex_matcher_->pattern());
|
60
59
|
} else {
|
61
60
|
string_matcher_ = other.string_matcher_;
|
62
61
|
}
|
@@ -65,7 +64,7 @@ StringMatcher::StringMatcher(const StringMatcher& other)
|
|
65
64
|
StringMatcher& StringMatcher::operator=(const StringMatcher& other) {
|
66
65
|
type_ = other.type_;
|
67
66
|
if (type_ == Type::kSafeRegex) {
|
68
|
-
regex_matcher_ =
|
67
|
+
regex_matcher_ = std::make_unique<RE2>(other.regex_matcher_->pattern());
|
69
68
|
} else {
|
70
69
|
string_matcher_ = other.string_matcher_;
|
71
70
|
}
|
@@ -18,6 +18,8 @@
|
|
18
18
|
|
19
19
|
#include <stddef.h>
|
20
20
|
|
21
|
+
#include "absl/strings/str_format.h"
|
22
|
+
|
21
23
|
#include "src/core/lib/gprpp/atomic_utils.h"
|
22
24
|
|
23
25
|
namespace grpc_core {
|
@@ -25,13 +27,15 @@ namespace grpc_core {
|
|
25
27
|
///////////////////////////////////////////////////////////////////////////////
|
26
28
|
// GLOBALS
|
27
29
|
|
28
|
-
|
30
|
+
thread_local Activity* Activity::g_current_activity_{nullptr};
|
29
31
|
|
30
32
|
namespace promise_detail {
|
31
33
|
|
32
34
|
///////////////////////////////////////////////////////////////////////////////
|
33
35
|
// HELPER TYPES
|
34
36
|
|
37
|
+
std::string Unwakeable::ActivityDebugTag() const { return "<unknown>"; }
|
38
|
+
|
35
39
|
// Weak handle to an Activity.
|
36
40
|
// Handle can persist while Activity goes away.
|
37
41
|
class FreestandingActivity::Handle final : public Wakeable {
|
@@ -74,6 +78,11 @@ class FreestandingActivity::Handle final : public Wakeable {
|
|
74
78
|
|
75
79
|
void Drop() override { Unref(); }
|
76
80
|
|
81
|
+
std::string ActivityDebugTag() const override {
|
82
|
+
MutexLock lock(&mu_);
|
83
|
+
return activity_ == nullptr ? "<unknown>" : activity_->DebugTag();
|
84
|
+
}
|
85
|
+
|
77
86
|
private:
|
78
87
|
// Unref the Handle (not the activity).
|
79
88
|
void Unref() {
|
@@ -85,7 +94,7 @@ class FreestandingActivity::Handle final : public Wakeable {
|
|
85
94
|
// Two initial refs: one for the waiter that caused instantiation, one for the
|
86
95
|
// activity.
|
87
96
|
std::atomic<size_t> refs_{2};
|
88
|
-
Mutex mu_ ABSL_ACQUIRED_AFTER(activity_->mu_);
|
97
|
+
mutable Mutex mu_ ABSL_ACQUIRED_AFTER(activity_->mu_);
|
89
98
|
FreestandingActivity* activity_ ABSL_GUARDED_BY(mu_);
|
90
99
|
};
|
91
100
|
|
@@ -117,4 +126,9 @@ Waker FreestandingActivity::MakeNonOwningWaker() {
|
|
117
126
|
}
|
118
127
|
|
119
128
|
} // namespace promise_detail
|
129
|
+
|
130
|
+
std::string Activity::DebugTag() const {
|
131
|
+
return absl::StrFormat("ACTIVITY[%p]", this);
|
132
|
+
}
|
133
|
+
|
120
134
|
} // namespace grpc_core
|
@@ -22,16 +22,17 @@
|
|
22
22
|
#include <algorithm>
|
23
23
|
#include <atomic>
|
24
24
|
#include <memory>
|
25
|
+
#include <string>
|
25
26
|
#include <utility>
|
26
27
|
|
27
28
|
#include "absl/base/thread_annotations.h"
|
28
29
|
#include "absl/status/status.h"
|
29
30
|
#include "absl/types/optional.h"
|
30
31
|
#include "absl/types/variant.h"
|
32
|
+
#include "absl/utility/utility.h"
|
31
33
|
|
32
34
|
#include <grpc/support/log.h>
|
33
35
|
|
34
|
-
#include "src/core/lib/gpr/tls.h"
|
35
36
|
#include "src/core/lib/gprpp/construct_destruct.h"
|
36
37
|
#include "src/core/lib/gprpp/no_destruct.h"
|
37
38
|
#include "src/core/lib/gprpp/orphanable.h"
|
@@ -43,6 +44,8 @@
|
|
43
44
|
|
44
45
|
namespace grpc_core {
|
45
46
|
|
47
|
+
class Activity;
|
48
|
+
|
46
49
|
// A Wakeable object is used by queues to wake activities.
|
47
50
|
class Wakeable {
|
48
51
|
public:
|
@@ -52,19 +55,23 @@ class Wakeable {
|
|
52
55
|
// Drop this wakeable without waking up the underlying activity.
|
53
56
|
virtual void Drop() = 0;
|
54
57
|
|
58
|
+
// Return the underlying activity debug tag, or "<unknown>" if not available.
|
59
|
+
virtual std::string ActivityDebugTag() const = 0;
|
60
|
+
|
55
61
|
protected:
|
56
62
|
inline ~Wakeable() {}
|
57
63
|
};
|
58
64
|
|
59
|
-
namespace
|
65
|
+
namespace promise_detail {
|
60
66
|
struct Unwakeable final : public Wakeable {
|
61
67
|
void Wakeup() override {}
|
62
68
|
void Drop() override {}
|
69
|
+
std::string ActivityDebugTag() const override;
|
63
70
|
};
|
64
71
|
static Unwakeable* unwakeable() {
|
65
72
|
return NoDestructSingleton<Unwakeable>::Get();
|
66
73
|
}
|
67
|
-
} // namespace
|
74
|
+
} // namespace promise_detail
|
68
75
|
|
69
76
|
class AtomicWaker;
|
70
77
|
|
@@ -73,7 +80,7 @@ class AtomicWaker;
|
|
73
80
|
class Waker {
|
74
81
|
public:
|
75
82
|
explicit Waker(Wakeable* wakeable) : wakeable_(wakeable) {}
|
76
|
-
Waker() : Waker(
|
83
|
+
Waker() : Waker(promise_detail::unwakeable()) {}
|
77
84
|
~Waker() { wakeable_->Drop(); }
|
78
85
|
Waker(const Waker&) = delete;
|
79
86
|
Waker& operator=(const Waker&) = delete;
|
@@ -95,11 +102,15 @@ class Waker {
|
|
95
102
|
return wakeable_ == other.wakeable_;
|
96
103
|
}
|
97
104
|
|
105
|
+
std::string ActivityDebugTag() {
|
106
|
+
return wakeable_ == nullptr ? "<unknown>" : wakeable_->ActivityDebugTag();
|
107
|
+
}
|
108
|
+
|
98
109
|
private:
|
99
110
|
friend class AtomicWaker;
|
100
111
|
|
101
112
|
Wakeable* Take() {
|
102
|
-
return std::exchange(wakeable_,
|
113
|
+
return std::exchange(wakeable_, promise_detail::unwakeable());
|
103
114
|
}
|
104
115
|
|
105
116
|
Wakeable* wakeable_;
|
@@ -109,7 +120,7 @@ class Waker {
|
|
109
120
|
class AtomicWaker {
|
110
121
|
public:
|
111
122
|
explicit AtomicWaker(Wakeable* wakeable) : wakeable_(wakeable) {}
|
112
|
-
AtomicWaker() : AtomicWaker(
|
123
|
+
AtomicWaker() : AtomicWaker(promise_detail::unwakeable()) {}
|
113
124
|
explicit AtomicWaker(Waker waker) : AtomicWaker(waker.Take()) {}
|
114
125
|
~AtomicWaker() { wakeable_.load(std::memory_order_acquire)->Drop(); }
|
115
126
|
AtomicWaker(const AtomicWaker&) = delete;
|
@@ -123,7 +134,7 @@ class AtomicWaker {
|
|
123
134
|
// Return true if there is a not-unwakeable wakeable present.
|
124
135
|
bool Armed() const noexcept {
|
125
136
|
return wakeable_.load(std::memory_order_relaxed) !=
|
126
|
-
|
137
|
+
promise_detail::unwakeable();
|
127
138
|
}
|
128
139
|
|
129
140
|
// Set to some new waker
|
@@ -133,7 +144,7 @@ class AtomicWaker {
|
|
133
144
|
|
134
145
|
private:
|
135
146
|
Wakeable* Take() {
|
136
|
-
return wakeable_.exchange(
|
147
|
+
return wakeable_.exchange(promise_detail::unwakeable(),
|
137
148
|
std::memory_order_acq_rel);
|
138
149
|
}
|
139
150
|
|
@@ -179,6 +190,9 @@ class Activity : public Orphanable {
|
|
179
190
|
// delivered until long after the activity should be destroyed.
|
180
191
|
virtual Waker MakeNonOwningWaker() = 0;
|
181
192
|
|
193
|
+
// Some descriptive text to add to log messages to identify this activity.
|
194
|
+
virtual std::string DebugTag() const;
|
195
|
+
|
182
196
|
protected:
|
183
197
|
// Check if this activity is the current activity executing on the current
|
184
198
|
// thread.
|
@@ -203,7 +217,7 @@ class Activity : public Orphanable {
|
|
203
217
|
private:
|
204
218
|
// Set during RunLoop to the Activity that's executing.
|
205
219
|
// Being set implies that mu_ is held.
|
206
|
-
static
|
220
|
+
static thread_local Activity* g_current_activity_;
|
207
221
|
};
|
208
222
|
|
209
223
|
// Owned pointer to one Activity.
|
@@ -262,7 +276,10 @@ class ActivityContexts : public ContextHolder<Contexts>... {
|
|
262
276
|
explicit ScopedContext(ActivityContexts* contexts)
|
263
277
|
: Context<ContextTypeFromHeld<Contexts>>(
|
264
278
|
static_cast<ContextHolder<Contexts>*>(contexts)
|
265
|
-
->GetContext())... {
|
279
|
+
->GetContext())... {
|
280
|
+
// Silence `unused-but-set-parameter` in case of Contexts = {}
|
281
|
+
(void)contexts;
|
282
|
+
}
|
266
283
|
};
|
267
284
|
};
|
268
285
|
|
@@ -330,6 +347,8 @@ class FreestandingActivity : public Activity, private Wakeable {
|
|
330
347
|
|
331
348
|
Mutex* mu() ABSL_LOCK_RETURNED(mu_) { return &mu_; }
|
332
349
|
|
350
|
+
std::string ActivityDebugTag() const override { return DebugTag(); }
|
351
|
+
|
333
352
|
private:
|
334
353
|
class Handle;
|
335
354
|
|
@@ -386,7 +405,7 @@ template <class F, class WakeupScheduler, class OnDone, typename... Contexts>
|
|
386
405
|
class PromiseActivity final : public FreestandingActivity,
|
387
406
|
private ActivityContexts<Contexts...> {
|
388
407
|
public:
|
389
|
-
using Factory =
|
408
|
+
using Factory = OncePromiseFactory<void, F>;
|
390
409
|
using ResultType = typename Factory::Promise::Result;
|
391
410
|
|
392
411
|
PromiseActivity(F promise_factory, WakeupScheduler wakeup_scheduler,
|
@@ -435,7 +454,11 @@ class PromiseActivity final : public FreestandingActivity,
|
|
435
454
|
MutexLock lock(mu());
|
436
455
|
// Check if we were done, and flag done.
|
437
456
|
was_done = done_;
|
438
|
-
if (!done_)
|
457
|
+
if (!done_) {
|
458
|
+
ScopedActivity scoped_activity(this);
|
459
|
+
ScopedContext contexts(this);
|
460
|
+
MarkDone();
|
461
|
+
}
|
439
462
|
}
|
440
463
|
// If we were not done, then call the on_done callback.
|
441
464
|
if (!was_done) {
|
@@ -472,8 +495,8 @@ class PromiseActivity final : public FreestandingActivity,
|
|
472
495
|
// Notification that we're no longer executing - it's ok to destruct the
|
473
496
|
// promise.
|
474
497
|
void MarkDone() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
|
475
|
-
GPR_ASSERT(!done_);
|
476
|
-
|
498
|
+
GPR_ASSERT(!absl::exchange(done_, true));
|
499
|
+
ScopedContext contexts(this);
|
477
500
|
Destruct(&promise_holder_.promise);
|
478
501
|
}
|
479
502
|
|
@@ -510,7 +533,7 @@ class PromiseActivity final : public FreestandingActivity,
|
|
510
533
|
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
|
511
534
|
ScopedActivity scoped_activity(this);
|
512
535
|
ScopedContext contexts(this);
|
513
|
-
Construct(&promise_holder_.promise, promise_factory.
|
536
|
+
Construct(&promise_holder_.promise, promise_factory.Make());
|
514
537
|
return StepLoop();
|
515
538
|
}
|
516
539
|
|
@@ -19,11 +19,12 @@
|
|
19
19
|
|
20
20
|
#include <stdlib.h>
|
21
21
|
|
22
|
-
#include <
|
22
|
+
#include <memory>
|
23
23
|
#include <utility>
|
24
24
|
|
25
25
|
#include "absl/meta/type_traits.h"
|
26
26
|
|
27
|
+
#include "src/core/lib/gprpp/construct_destruct.h"
|
27
28
|
#include "src/core/lib/promise/context.h"
|
28
29
|
#include "src/core/lib/promise/poll.h"
|
29
30
|
#include "src/core/lib/resource_quota/arena.h"
|
@@ -32,20 +33,28 @@ namespace grpc_core {
|
|
32
33
|
|
33
34
|
namespace arena_promise_detail {
|
34
35
|
|
36
|
+
using ArgType = std::aligned_storage_t<sizeof(void*)>;
|
37
|
+
template <typename T>
|
38
|
+
T*& ArgAsPtr(ArgType* arg) {
|
39
|
+
static_assert(sizeof(ArgType) >= sizeof(T**),
|
40
|
+
"Must have ArgType of at least one pointer size");
|
41
|
+
return *reinterpret_cast<T**>(arg);
|
42
|
+
}
|
43
|
+
|
35
44
|
template <typename T>
|
36
45
|
struct Vtable {
|
37
46
|
// Poll the promise, once.
|
38
|
-
Poll<T> (*poll_once)(
|
47
|
+
Poll<T> (*poll_once)(ArgType* arg);
|
39
48
|
// Destroy the underlying callable object if there is one.
|
40
49
|
// Since we don't delete (the arena owns the memory) but we may need to call a
|
41
50
|
// destructor, we expose this for when the ArenaPromise object is destroyed.
|
42
|
-
void (*destroy)(
|
51
|
+
void (*destroy)(ArgType* arg);
|
43
52
|
};
|
44
53
|
|
45
54
|
template <typename T>
|
46
55
|
struct VtableAndArg {
|
47
56
|
const Vtable<T>* vtable;
|
48
|
-
|
57
|
+
ArgType arg;
|
49
58
|
};
|
50
59
|
|
51
60
|
// Implementation of Vtable for an empty object.
|
@@ -53,37 +62,52 @@ struct VtableAndArg {
|
|
53
62
|
// from. Since in either case these objects should not be polled, we simply
|
54
63
|
// crash if it is.
|
55
64
|
template <typename T>
|
56
|
-
|
57
|
-
static const Vtable<T> vtable
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
struct Null {
|
66
|
+
static const Vtable<T> vtable;
|
67
|
+
|
68
|
+
static Poll<T> PollOnce(ArgType*) {
|
69
|
+
abort();
|
70
|
+
GPR_UNREACHABLE_CODE(return Pending{});
|
71
|
+
}
|
72
|
+
|
73
|
+
static void Destroy(ArgType*) {}
|
74
|
+
};
|
75
|
+
|
76
|
+
template <typename T>
|
77
|
+
const Vtable<T> Null<T>::vtable = {PollOnce, Destroy};
|
64
78
|
|
65
79
|
// Implementation of ImplInterface for a callable object.
|
66
80
|
template <typename T, typename Callable>
|
67
|
-
|
68
|
-
static const Vtable<T> vtable
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
}
|
81
|
+
struct AllocatedCallable {
|
82
|
+
static const Vtable<T> vtable;
|
83
|
+
|
84
|
+
static Poll<T> PollOnce(ArgType* arg) {
|
85
|
+
return poll_cast<T>((*ArgAsPtr<Callable>(arg))());
|
86
|
+
}
|
87
|
+
|
88
|
+
static void Destroy(ArgType* arg) { Destruct(ArgAsPtr<Callable>(arg)); }
|
89
|
+
};
|
90
|
+
|
91
|
+
template <typename T, typename Callable>
|
92
|
+
const Vtable<T> AllocatedCallable<T, Callable>::vtable = {PollOnce, Destroy};
|
75
93
|
|
76
94
|
// Implementation of ImplInterface for a small callable object (one that fits
|
77
|
-
// within the
|
95
|
+
// within the ArgType arg)
|
78
96
|
template <typename T, typename Callable>
|
79
|
-
|
80
|
-
static const Vtable<T> vtable
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
97
|
+
struct Inlined {
|
98
|
+
static const Vtable<T> vtable;
|
99
|
+
|
100
|
+
static Poll<T> PollOnce(ArgType* arg) {
|
101
|
+
return poll_cast<T>((*reinterpret_cast<Callable*>(arg))());
|
102
|
+
}
|
103
|
+
|
104
|
+
static void Destroy(ArgType* arg) {
|
105
|
+
Destruct(reinterpret_cast<Callable*>(arg));
|
106
|
+
}
|
107
|
+
};
|
108
|
+
|
109
|
+
template <typename T, typename Callable>
|
110
|
+
const Vtable<T> Inlined<T, Callable>::vtable = {PollOnce, Destroy};
|
87
111
|
|
88
112
|
// If a callable object is empty we can substitute any instance of that callable
|
89
113
|
// for the one we call (for how could we tell the difference)?
|
@@ -93,12 +117,17 @@ inline const Vtable<T>* inlined_callable_impl() {
|
|
93
117
|
// (this comes up often when the promise only accesses context data from the
|
94
118
|
// containing activity).
|
95
119
|
template <typename T, typename Callable>
|
96
|
-
|
97
|
-
static
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
}
|
120
|
+
struct SharedCallable {
|
121
|
+
static const Vtable<T> vtable;
|
122
|
+
|
123
|
+
static Poll<T> PollOnce(ArgType* arg) {
|
124
|
+
return (*reinterpret_cast<Callable*>(arg))();
|
125
|
+
}
|
126
|
+
};
|
127
|
+
|
128
|
+
template <typename T, typename Callable>
|
129
|
+
const Vtable<T> SharedCallable<T, Callable>::vtable = {PollOnce,
|
130
|
+
Null<T>::Destroy};
|
102
131
|
|
103
132
|
// Redirector type: given a callable type, expose a Make() function that creates
|
104
133
|
// the appropriate underlying implementation.
|
@@ -109,11 +138,11 @@ template <typename T, typename Callable>
|
|
109
138
|
struct ChooseImplForCallable<
|
110
139
|
T, Callable,
|
111
140
|
absl::enable_if_t<!std::is_empty<Callable>::value &&
|
112
|
-
(sizeof(Callable) > sizeof(
|
141
|
+
(sizeof(Callable) > sizeof(ArgType))>> {
|
113
142
|
static void Make(Callable&& callable, VtableAndArg<T>* out) {
|
114
|
-
|
115
|
-
|
116
|
-
|
143
|
+
out->vtable = &AllocatedCallable<T, Callable>::vtable;
|
144
|
+
ArgAsPtr<Callable>(&out->arg) = GetContext<Arena>()->template New<Callable>(
|
145
|
+
std::forward<Callable>(callable));
|
117
146
|
}
|
118
147
|
};
|
119
148
|
|
@@ -121,19 +150,19 @@ template <typename T, typename Callable>
|
|
121
150
|
struct ChooseImplForCallable<
|
122
151
|
T, Callable,
|
123
152
|
absl::enable_if_t<!std::is_empty<Callable>::value &&
|
124
|
-
(sizeof(Callable) <= sizeof(
|
153
|
+
(sizeof(Callable) <= sizeof(ArgType))>> {
|
125
154
|
static void Make(Callable&& callable, VtableAndArg<T>* out) {
|
126
|
-
out->vtable =
|
127
|
-
|
155
|
+
out->vtable = &Inlined<T, Callable>::vtable;
|
156
|
+
Construct(reinterpret_cast<Callable*>(&out->arg),
|
157
|
+
std::forward<Callable>(callable));
|
128
158
|
}
|
129
159
|
};
|
130
160
|
|
131
161
|
template <typename T, typename Callable>
|
132
162
|
struct ChooseImplForCallable<
|
133
163
|
T, Callable, absl::enable_if_t<std::is_empty<Callable>::value>> {
|
134
|
-
static void Make(Callable
|
135
|
-
out->vtable =
|
136
|
-
shared_callable_impl<T, Callable>(std::forward<Callable>(callable));
|
164
|
+
static void Make(Callable&&, VtableAndArg<T>* out) {
|
165
|
+
out->vtable = &SharedCallable<T, Callable>::vtable;
|
137
166
|
}
|
138
167
|
};
|
139
168
|
|
@@ -159,8 +188,8 @@ class ArenaPromise {
|
|
159
188
|
absl::enable_if_t<!std::is_same<Callable, ArenaPromise>::value>>
|
160
189
|
// NOLINTNEXTLINE(google-explicit-constructor)
|
161
190
|
ArenaPromise(Callable&& callable) {
|
162
|
-
arena_promise_detail::MakeImplForCallable<
|
163
|
-
|
191
|
+
arena_promise_detail::MakeImplForCallable(std::forward<Callable>(callable),
|
192
|
+
&vtable_and_arg_);
|
164
193
|
}
|
165
194
|
|
166
195
|
// ArenaPromise is not copyable.
|
@@ -169,12 +198,12 @@ class ArenaPromise {
|
|
169
198
|
// ArenaPromise is movable.
|
170
199
|
ArenaPromise(ArenaPromise&& other) noexcept
|
171
200
|
: vtable_and_arg_(other.vtable_and_arg_) {
|
172
|
-
other.vtable_and_arg_.vtable = arena_promise_detail::
|
201
|
+
other.vtable_and_arg_.vtable = &arena_promise_detail::Null<T>::vtable;
|
173
202
|
}
|
174
203
|
ArenaPromise& operator=(ArenaPromise&& other) noexcept {
|
175
204
|
vtable_and_arg_.vtable->destroy(&vtable_and_arg_.arg);
|
176
205
|
vtable_and_arg_ = other.vtable_and_arg_;
|
177
|
-
other.vtable_and_arg_.vtable = arena_promise_detail::
|
206
|
+
other.vtable_and_arg_.vtable = &arena_promise_detail::Null<T>::vtable;
|
178
207
|
return *this;
|
179
208
|
}
|
180
209
|
|
@@ -187,13 +216,13 @@ class ArenaPromise {
|
|
187
216
|
}
|
188
217
|
|
189
218
|
bool has_value() const {
|
190
|
-
return vtable_and_arg_.vtable != arena_promise_detail::
|
219
|
+
return vtable_and_arg_.vtable != &arena_promise_detail::Null<T>::vtable;
|
191
220
|
}
|
192
221
|
|
193
222
|
private:
|
194
223
|
// Underlying impl object.
|
195
224
|
arena_promise_detail::VtableAndArg<T> vtable_and_arg_ = {
|
196
|
-
arena_promise_detail::
|
225
|
+
&arena_promise_detail::Null<T>::vtable, {}};
|
197
226
|
};
|
198
227
|
|
199
228
|
} // namespace grpc_core
|
@@ -19,7 +19,7 @@
|
|
19
19
|
|
20
20
|
#include <utility>
|
21
21
|
|
22
|
-
#include
|
22
|
+
#include <grpc/support/log.h>
|
23
23
|
|
24
24
|
namespace grpc_core {
|
25
25
|
|
@@ -44,12 +44,11 @@ class Context : public ContextType<T> {
|
|
44
44
|
|
45
45
|
private:
|
46
46
|
T* const old_;
|
47
|
-
static
|
47
|
+
static thread_local T* current_;
|
48
48
|
};
|
49
49
|
|
50
50
|
template <typename T>
|
51
|
-
|
52
|
-
Context<T>::current_;
|
51
|
+
thread_local T* Context<T>::current_;
|
53
52
|
|
54
53
|
template <typename T, typename F>
|
55
54
|
class WithContext {
|
@@ -68,10 +67,18 @@ class WithContext {
|
|
68
67
|
|
69
68
|
} // namespace promise_detail
|
70
69
|
|
71
|
-
//
|
70
|
+
// Return true if a context of type T is currently active.
|
71
|
+
template <typename T>
|
72
|
+
bool HasContext() {
|
73
|
+
return promise_detail::Context<T>::get() != nullptr;
|
74
|
+
}
|
75
|
+
|
76
|
+
// Retrieve the current value of a context, or abort if the value is unset.
|
72
77
|
template <typename T>
|
73
78
|
T* GetContext() {
|
74
|
-
|
79
|
+
auto* p = promise_detail::Context<T>::get();
|
80
|
+
GPR_ASSERT(p != nullptr);
|
81
|
+
return p;
|
75
82
|
}
|
76
83
|
|
77
84
|
// Given a promise and a context, return a promise that has that context set.
|
@@ -17,8 +17,6 @@
|
|
17
17
|
|
18
18
|
#include <grpc/support/port_platform.h>
|
19
19
|
|
20
|
-
#include <stddef.h>
|
21
|
-
|
22
20
|
#include <array>
|
23
21
|
#include <cassert>
|
24
22
|
#include <new>
|
@@ -32,29 +30,12 @@
|
|
32
30
|
#include "src/core/lib/gprpp/construct_destruct.h"
|
33
31
|
#include "src/core/lib/promise/detail/promise_factory.h"
|
34
32
|
#include "src/core/lib/promise/detail/promise_like.h"
|
33
|
+
#include "src/core/lib/promise/detail/switch.h"
|
35
34
|
#include "src/core/lib/promise/poll.h"
|
36
35
|
|
37
36
|
namespace grpc_core {
|
38
37
|
namespace promise_detail {
|
39
38
|
|
40
|
-
// Given f0, ..., fn, call function idx and return the result.
|
41
|
-
template <typename R, typename A, R (*... f)(A* arg)>
|
42
|
-
class JumpTable {
|
43
|
-
public:
|
44
|
-
JumpTable() = delete;
|
45
|
-
JumpTable(const JumpTable&) = delete;
|
46
|
-
|
47
|
-
static R Run(size_t idx, A* arg) { return fs_[idx](arg); }
|
48
|
-
|
49
|
-
private:
|
50
|
-
using Fn = R (*)(A* arg);
|
51
|
-
static const Fn fs_[sizeof...(f)];
|
52
|
-
};
|
53
|
-
|
54
|
-
template <typename R, typename A, R (*... f)(A* arg)>
|
55
|
-
const typename JumpTable<R, A, f...>::Fn
|
56
|
-
JumpTable<R, A, f...>::fs_[sizeof...(f)] = {f...};
|
57
|
-
|
58
39
|
// Helper for SeqState to evaluate some common types to all partial
|
59
40
|
// specializations.
|
60
41
|
template <template <typename> class Traits, typename FPromise, typename FNext>
|
@@ -68,7 +49,7 @@ struct SeqStateTypes {
|
|
68
49
|
// Wrap the factory callable in our factory wrapper to deal with common edge
|
69
50
|
// cases. We use the 'unwrapped type' from the traits, so for instance, TrySeq
|
70
51
|
// can pass back a T from a StatusOr<T>.
|
71
|
-
using Next = promise_detail::
|
52
|
+
using Next = promise_detail::OncePromiseFactory<
|
72
53
|
typename PromiseResultTraits::UnwrappedType, FNext>;
|
73
54
|
};
|
74
55
|
|
@@ -353,14 +334,16 @@ class BasicSeq {
|
|
353
334
|
// parameter unpacking can work.
|
354
335
|
template <char I>
|
355
336
|
struct RunStateStruct {
|
356
|
-
|
337
|
+
BasicSeq* s;
|
338
|
+
Poll<Result> operator()() { return s->RunState<I>(); }
|
357
339
|
};
|
358
340
|
|
359
341
|
// Similarly placate those compilers for
|
360
342
|
// DestructCurrentPromiseAndSubsequentFactories
|
361
343
|
template <char I>
|
362
344
|
struct DestructCurrentPromiseAndSubsequentFactoriesStruct {
|
363
|
-
|
345
|
+
BasicSeq* s;
|
346
|
+
void operator()() {
|
364
347
|
return s->DestructCurrentPromiseAndSubsequentFactories<I>();
|
365
348
|
}
|
366
349
|
};
|
@@ -373,8 +356,7 @@ class BasicSeq {
|
|
373
356
|
// Duff's device like mechanic for evaluating sequences.
|
374
357
|
template <char... I>
|
375
358
|
Poll<Result> Run(absl::integer_sequence<char, I...>) {
|
376
|
-
return
|
377
|
-
state_, this);
|
359
|
+
return Switch<Poll<Result>>(state_, RunStateStruct<I>{this}...);
|
378
360
|
}
|
379
361
|
|
380
362
|
// Run the appropriate destructors for a given state.
|
@@ -384,9 +366,8 @@ class BasicSeq {
|
|
384
366
|
// which can choose the correct instance at runtime to destroy everything.
|
385
367
|
template <char... I>
|
386
368
|
void RunDestruct(absl::integer_sequence<char, I...>) {
|
387
|
-
|
388
|
-
|
389
|
-
Run(state_, this);
|
369
|
+
Switch<void>(
|
370
|
+
state_, DestructCurrentPromiseAndSubsequentFactoriesStruct<I>{this}...);
|
390
371
|
}
|
391
372
|
|
392
373
|
public:
|