grpc 1.60.2 → 1.61.0.pre2
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 +208 -165
- data/include/grpc/event_engine/event_engine.h +59 -12
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
- data/include/grpc/event_engine/internal/slice_cast.h +12 -0
- data/include/grpc/event_engine/memory_allocator.h +3 -1
- data/include/grpc/event_engine/slice.h +5 -0
- data/include/grpc/grpc_security.h +22 -1
- data/include/grpc/impl/call.h +29 -0
- data/include/grpc/impl/channel_arg_names.h +12 -1
- data/include/grpc/impl/slice_type.h +1 -1
- data/include/grpc/module.modulemap +1 -0
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
- data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
- data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
- data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
- data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
- data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
- data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
- data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
- data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
- data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
- data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
- data/src/core/ext/filters/http/client_authority_filter.h +12 -4
- data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
- data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
- data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
- data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
- data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
- data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
- data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
- data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
- data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +68 -145
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
- data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +27 -36
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -2
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
- data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
- data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
- data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
- data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
- data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
- data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
- data/src/core/ext/xds/certificate_provider_store.cc +2 -1
- data/src/core/ext/xds/certificate_provider_store.h +0 -5
- data/src/core/ext/xds/xds_api.cc +31 -18
- data/src/core/ext/xds/xds_api.h +2 -2
- data/src/core/ext/xds/xds_bootstrap.h +3 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
- data/src/core/ext/xds/xds_certificate_provider.h +44 -111
- data/src/core/ext/xds/xds_client.cc +420 -414
- data/src/core/ext/xds/xds_client.h +31 -22
- data/src/core/ext/xds/xds_client_grpc.cc +3 -1
- data/src/core/ext/xds/xds_cluster.cc +104 -11
- data/src/core/ext/xds/xds_cluster.h +9 -1
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
- data/src/core/ext/xds/xds_common_types.cc +14 -10
- data/src/core/ext/xds/xds_endpoint.cc +9 -4
- data/src/core/ext/xds/xds_endpoint.h +5 -1
- data/src/core/ext/xds/xds_health_status.cc +12 -2
- data/src/core/ext/xds/xds_health_status.h +4 -2
- data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
- data/src/core/ext/xds/xds_listener.cc +14 -8
- data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
- data/src/core/ext/xds/xds_route_config.cc +34 -22
- data/src/core/ext/xds/xds_route_config.h +1 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
- data/src/core/ext/xds/xds_transport.h +3 -0
- data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
- data/src/core/ext/xds/xds_transport_grpc.h +4 -0
- data/src/core/lib/channel/call_tracer.cc +12 -0
- data/src/core/lib/channel/call_tracer.h +17 -3
- data/src/core/lib/channel/channel_args.cc +24 -14
- data/src/core/lib/channel/channel_args.h +74 -13
- data/src/core/lib/channel/channel_stack.cc +27 -0
- data/src/core/lib/channel/channel_stack.h +10 -10
- data/src/core/lib/channel/connected_channel.cc +64 -18
- data/src/core/lib/channel/promise_based_filter.h +1041 -1
- data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
- data/src/core/lib/compression/compression_internal.cc +0 -3
- data/src/core/lib/event_engine/ares_resolver.cc +35 -14
- data/src/core/lib/event_engine/ares_resolver.h +9 -10
- data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
- data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
- data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
- data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
- data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
- data/src/core/lib/experiments/config.cc +13 -0
- data/src/core/lib/experiments/config.h +3 -0
- data/src/core/lib/experiments/experiments.cc +245 -366
- data/src/core/lib/experiments/experiments.h +50 -156
- data/src/core/lib/gprpp/debug_location.h +13 -0
- data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
- data/src/core/lib/gprpp/orphanable.h +27 -0
- data/src/core/lib/gprpp/ref_counted.h +63 -22
- data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
- data/src/core/lib/gprpp/ref_counted_string.h +13 -0
- data/src/core/lib/gprpp/status_helper.cc +1 -2
- data/src/core/lib/iomgr/combiner.cc +15 -51
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
- data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
- data/src/core/lib/load_balancing/lb_policy.h +1 -1
- data/src/core/lib/promise/activity.cc +17 -2
- data/src/core/lib/promise/activity.h +5 -4
- data/src/core/lib/promise/all_ok.h +80 -0
- data/src/core/lib/promise/detail/join_state.h +2077 -0
- data/src/core/lib/promise/detail/promise_factory.h +1 -0
- data/src/core/lib/promise/detail/promise_like.h +8 -1
- data/src/core/lib/promise/detail/seq_state.h +3458 -150
- data/src/core/lib/promise/detail/status.h +42 -5
- data/src/core/lib/promise/for_each.h +13 -1
- data/src/core/lib/promise/if.h +4 -0
- data/src/core/lib/promise/latch.h +6 -3
- data/src/core/lib/promise/party.cc +33 -31
- data/src/core/lib/promise/party.h +142 -6
- data/src/core/lib/promise/poll.h +39 -13
- data/src/core/lib/promise/promise.h +4 -0
- data/src/core/lib/promise/seq.h +107 -7
- data/src/core/lib/promise/status_flag.h +196 -0
- data/src/core/lib/promise/try_join.h +132 -0
- data/src/core/lib/promise/try_seq.h +132 -10
- data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
- data/src/core/lib/resolver/endpoint_addresses.h +48 -0
- data/src/core/lib/resource_quota/arena.h +2 -2
- data/src/core/lib/resource_quota/memory_quota.cc +57 -8
- data/src/core/lib/resource_quota/memory_quota.h +6 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
- data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
- data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
- data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
- data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
- data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
- data/src/core/lib/security/transport/auth_filters.h +71 -4
- data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
- data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
- data/src/core/lib/slice/slice_buffer.h +3 -0
- data/src/core/lib/surface/builtins.cc +1 -1
- data/src/core/lib/surface/call.cc +683 -196
- data/src/core/lib/surface/call.h +26 -13
- data/src/core/lib/surface/call_trace.cc +42 -1
- data/src/core/lib/surface/channel.cc +0 -1
- data/src/core/lib/surface/channel.h +0 -6
- data/src/core/lib/surface/channel_init.h +26 -0
- data/src/core/lib/surface/init.cc +14 -8
- data/src/core/lib/surface/server.cc +256 -237
- data/src/core/lib/surface/server.h +26 -54
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
- data/src/core/lib/transport/call_final_info.cc +38 -0
- data/src/core/lib/transport/call_final_info.h +54 -0
- data/src/core/lib/transport/connectivity_state.cc +3 -2
- data/src/core/lib/transport/connectivity_state.h +4 -0
- data/src/core/lib/transport/metadata_batch.h +4 -4
- data/src/core/lib/transport/transport.cc +70 -19
- data/src/core/lib/transport/transport.h +395 -25
- data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +65 -43
- data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc.c +0 -1
- data/src/ruby/ext/grpc/rb_grpc.h +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/upb/upb/reflection/def_pool.h +2 -2
- data/third_party/zlib/adler32.c +5 -27
- data/third_party/zlib/compress.c +5 -16
- data/third_party/zlib/crc32.c +86 -162
- data/third_party/zlib/deflate.c +233 -336
- data/third_party/zlib/deflate.h +8 -8
- data/third_party/zlib/gzguts.h +11 -12
- data/third_party/zlib/infback.c +7 -23
- data/third_party/zlib/inffast.c +1 -4
- data/third_party/zlib/inffast.h +1 -1
- data/third_party/zlib/inflate.c +30 -99
- data/third_party/zlib/inftrees.c +6 -11
- data/third_party/zlib/inftrees.h +3 -3
- data/third_party/zlib/trees.c +224 -302
- data/third_party/zlib/uncompr.c +4 -12
- data/third_party/zlib/zconf.h +6 -2
- data/third_party/zlib/zlib.h +191 -188
- data/third_party/zlib/zutil.c +16 -44
- data/third_party/zlib/zutil.h +10 -10
- metadata +35 -13
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
- data/src/core/lib/event_engine/memory_allocator.cc +0 -74
- data/src/core/lib/transport/pid_controller.cc +0 -51
- data/src/core/lib/transport/pid_controller.h +0 -116
- data/third_party/upb/upb/collections/array.h +0 -17
- data/third_party/upb/upb/collections/map.h +0 -17
- data/third_party/upb/upb/upb.hpp +0 -18
@@ -219,7 +219,7 @@ class NonPolymorphicRefCount {
|
|
219
219
|
// Default behavior: Delete the object.
|
220
220
|
struct UnrefDelete {
|
221
221
|
template <typename T>
|
222
|
-
void operator()(T* p) {
|
222
|
+
void operator()(T* p) const {
|
223
223
|
delete p;
|
224
224
|
}
|
225
225
|
};
|
@@ -231,7 +231,7 @@ struct UnrefDelete {
|
|
231
231
|
// later by identifying entries for which RefIfNonZero() returns null.
|
232
232
|
struct UnrefNoDelete {
|
233
233
|
template <typename T>
|
234
|
-
void operator()(T* /*p*/) {}
|
234
|
+
void operator()(T* /*p*/) const {}
|
235
235
|
};
|
236
236
|
|
237
237
|
// Call the object's dtor but do not delete it. This is useful for cases
|
@@ -239,7 +239,7 @@ struct UnrefNoDelete {
|
|
239
239
|
// arena).
|
240
240
|
struct UnrefCallDtor {
|
241
241
|
template <typename T>
|
242
|
-
void operator()(T* p) {
|
242
|
+
void operator()(T* p) const {
|
243
243
|
p->~T();
|
244
244
|
}
|
245
245
|
};
|
@@ -276,35 +276,52 @@ class RefCounted : public Impl {
|
|
276
276
|
public:
|
277
277
|
using RefCountedChildType = Child;
|
278
278
|
|
279
|
+
// Not copyable nor movable.
|
280
|
+
RefCounted(const RefCounted&) = delete;
|
281
|
+
RefCounted& operator=(const RefCounted&) = delete;
|
282
|
+
|
279
283
|
// Note: Depending on the Impl used, this dtor can be implicitly virtual.
|
280
284
|
~RefCounted() = default;
|
281
285
|
|
286
|
+
// Ref() for mutable types.
|
282
287
|
GRPC_MUST_USE_RESULT RefCountedPtr<Child> Ref() {
|
283
288
|
IncrementRefCount();
|
284
289
|
return RefCountedPtr<Child>(static_cast<Child*>(this));
|
285
290
|
}
|
286
|
-
|
287
291
|
GRPC_MUST_USE_RESULT RefCountedPtr<Child> Ref(const DebugLocation& location,
|
288
292
|
const char* reason) {
|
289
293
|
IncrementRefCount(location, reason);
|
290
294
|
return RefCountedPtr<Child>(static_cast<Child*>(this));
|
291
295
|
}
|
292
296
|
|
293
|
-
//
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
void Unref() {
|
298
|
-
if (GPR_UNLIKELY(refs_.Unref())) {
|
299
|
-
unref_behavior_(static_cast<Child*>(this));
|
300
|
-
}
|
297
|
+
// Ref() for const types.
|
298
|
+
GRPC_MUST_USE_RESULT RefCountedPtr<const Child> Ref() const {
|
299
|
+
IncrementRefCount();
|
300
|
+
return RefCountedPtr<const Child>(static_cast<const Child*>(this));
|
301
301
|
}
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
302
|
+
GRPC_MUST_USE_RESULT RefCountedPtr<const Child> Ref(
|
303
|
+
const DebugLocation& location, const char* reason) const {
|
304
|
+
IncrementRefCount(location, reason);
|
305
|
+
return RefCountedPtr<const Child>(static_cast<const Child*>(this));
|
306
|
+
}
|
307
|
+
|
308
|
+
template <
|
309
|
+
typename Subclass,
|
310
|
+
std::enable_if_t<std::is_base_of<Child, Subclass>::value, bool> = true>
|
311
|
+
RefCountedPtr<Subclass> RefAsSubclass() {
|
312
|
+
IncrementRefCount();
|
313
|
+
return RefCountedPtr<Subclass>(static_cast<Subclass*>(this));
|
314
|
+
}
|
315
|
+
template <
|
316
|
+
typename Subclass,
|
317
|
+
std::enable_if_t<std::is_base_of<Child, Subclass>::value, bool> = true>
|
318
|
+
RefCountedPtr<Subclass> RefAsSubclass(const DebugLocation& location,
|
319
|
+
const char* reason) {
|
320
|
+
IncrementRefCount(location, reason);
|
321
|
+
return RefCountedPtr<Subclass>(static_cast<Subclass*>(this));
|
306
322
|
}
|
307
323
|
|
324
|
+
// RefIfNonZero() for mutable types.
|
308
325
|
GRPC_MUST_USE_RESULT RefCountedPtr<Child> RefIfNonZero() {
|
309
326
|
return RefCountedPtr<Child>(refs_.RefIfNonZero() ? static_cast<Child*>(this)
|
310
327
|
: nullptr);
|
@@ -316,9 +333,32 @@ class RefCounted : public Impl {
|
|
316
333
|
: nullptr);
|
317
334
|
}
|
318
335
|
|
319
|
-
//
|
320
|
-
|
321
|
-
|
336
|
+
// RefIfNonZero() for const types.
|
337
|
+
GRPC_MUST_USE_RESULT RefCountedPtr<const Child> RefIfNonZero() const {
|
338
|
+
return RefCountedPtr<const Child>(
|
339
|
+
refs_.RefIfNonZero() ? static_cast<const Child*>(this) : nullptr);
|
340
|
+
}
|
341
|
+
GRPC_MUST_USE_RESULT RefCountedPtr<const Child> RefIfNonZero(
|
342
|
+
const DebugLocation& location, const char* reason) const {
|
343
|
+
return RefCountedPtr<const Child>(refs_.RefIfNonZero(location, reason)
|
344
|
+
? static_cast<const Child*>(this)
|
345
|
+
: nullptr);
|
346
|
+
}
|
347
|
+
|
348
|
+
// TODO(roth): Once all of our code is converted to C++ and can use
|
349
|
+
// RefCountedPtr<> instead of manual ref-counting, make this method
|
350
|
+
// private, since it will only be used by RefCountedPtr<>, which is a
|
351
|
+
// friend of this class.
|
352
|
+
void Unref() const {
|
353
|
+
if (GPR_UNLIKELY(refs_.Unref())) {
|
354
|
+
unref_behavior_(static_cast<const Child*>(this));
|
355
|
+
}
|
356
|
+
}
|
357
|
+
void Unref(const DebugLocation& location, const char* reason) const {
|
358
|
+
if (GPR_UNLIKELY(refs_.Unref(location, reason))) {
|
359
|
+
unref_behavior_(static_cast<const Child*>(this));
|
360
|
+
}
|
361
|
+
}
|
322
362
|
|
323
363
|
protected:
|
324
364
|
// Note: Tracing is a no-op on non-debug builds.
|
@@ -336,12 +376,13 @@ class RefCounted : public Impl {
|
|
336
376
|
template <typename T>
|
337
377
|
friend class RefCountedPtr;
|
338
378
|
|
339
|
-
void IncrementRefCount() { refs_.Ref(); }
|
340
|
-
void IncrementRefCount(const DebugLocation& location,
|
379
|
+
void IncrementRefCount() const { refs_.Ref(); }
|
380
|
+
void IncrementRefCount(const DebugLocation& location,
|
381
|
+
const char* reason) const {
|
341
382
|
refs_.Ref(location, reason);
|
342
383
|
}
|
343
384
|
|
344
|
-
RefCount refs_;
|
385
|
+
mutable RefCount refs_;
|
345
386
|
GPR_NO_UNIQUE_ADDRESS UnrefBehavior unref_behavior_;
|
346
387
|
};
|
347
388
|
|
@@ -43,7 +43,8 @@ class RefCountedPtr {
|
|
43
43
|
RefCountedPtr(std::nullptr_t) {}
|
44
44
|
|
45
45
|
// If value is non-null, we take ownership of a ref to it.
|
46
|
-
template <typename Y
|
46
|
+
template <typename Y,
|
47
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
47
48
|
explicit RefCountedPtr(Y* value) : value_(value) {}
|
48
49
|
|
49
50
|
// Move ctors.
|
@@ -51,7 +52,8 @@ class RefCountedPtr {
|
|
51
52
|
value_ = other.value_;
|
52
53
|
other.value_ = nullptr;
|
53
54
|
}
|
54
|
-
template <typename Y
|
55
|
+
template <typename Y,
|
56
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
55
57
|
// NOLINTNEXTLINE(google-explicit-constructor)
|
56
58
|
RefCountedPtr(RefCountedPtr<Y>&& other) noexcept {
|
57
59
|
value_ = static_cast<T*>(other.value_);
|
@@ -63,7 +65,8 @@ class RefCountedPtr {
|
|
63
65
|
reset(std::exchange(other.value_, nullptr));
|
64
66
|
return *this;
|
65
67
|
}
|
66
|
-
template <typename Y
|
68
|
+
template <typename Y,
|
69
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
67
70
|
RefCountedPtr& operator=(RefCountedPtr<Y>&& other) noexcept {
|
68
71
|
reset(std::exchange(other.value_, nullptr));
|
69
72
|
return *this;
|
@@ -74,7 +77,8 @@ class RefCountedPtr {
|
|
74
77
|
if (other.value_ != nullptr) other.value_->IncrementRefCount();
|
75
78
|
value_ = other.value_;
|
76
79
|
}
|
77
|
-
template <typename Y
|
80
|
+
template <typename Y,
|
81
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
78
82
|
// NOLINTNEXTLINE(google-explicit-constructor)
|
79
83
|
RefCountedPtr(const RefCountedPtr<Y>& other) {
|
80
84
|
static_assert(std::has_virtual_destructor<T>::value,
|
@@ -92,7 +96,8 @@ class RefCountedPtr {
|
|
92
96
|
reset(other.value_);
|
93
97
|
return *this;
|
94
98
|
}
|
95
|
-
template <typename Y
|
99
|
+
template <typename Y,
|
100
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
96
101
|
RefCountedPtr& operator=(const RefCountedPtr<Y>& other) {
|
97
102
|
static_assert(std::has_virtual_destructor<T>::value,
|
98
103
|
"T does not have a virtual dtor");
|
@@ -107,6 +112,12 @@ class RefCountedPtr {
|
|
107
112
|
if (value_ != nullptr) value_->Unref();
|
108
113
|
}
|
109
114
|
|
115
|
+
// An explicit copy method that supports ref-count tracing.
|
116
|
+
RefCountedPtr<T> Ref(const DebugLocation& location, const char* reason) {
|
117
|
+
if (value_ != nullptr) value_->IncrementRefCount(location, reason);
|
118
|
+
return RefCountedPtr<T>(value_);
|
119
|
+
}
|
120
|
+
|
110
121
|
void swap(RefCountedPtr& other) { std::swap(value_, other.value_); }
|
111
122
|
|
112
123
|
// If value is non-null, we take ownership of a ref to it.
|
@@ -119,13 +130,15 @@ class RefCountedPtr {
|
|
119
130
|
T* old_value = std::exchange(value_, value);
|
120
131
|
if (old_value != nullptr) old_value->Unref(location, reason);
|
121
132
|
}
|
122
|
-
template <typename Y
|
133
|
+
template <typename Y,
|
134
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
123
135
|
void reset(Y* value = nullptr) {
|
124
136
|
static_assert(std::has_virtual_destructor<T>::value,
|
125
137
|
"T does not have a virtual dtor");
|
126
138
|
reset(static_cast<T*>(value));
|
127
139
|
}
|
128
|
-
template <typename Y
|
140
|
+
template <typename Y,
|
141
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
129
142
|
void reset(const DebugLocation& location, const char* reason,
|
130
143
|
Y* value = nullptr) {
|
131
144
|
static_assert(std::has_virtual_destructor<T>::value,
|
@@ -143,24 +156,34 @@ class RefCountedPtr {
|
|
143
156
|
T& operator*() const { return *value_; }
|
144
157
|
T* operator->() const { return value_; }
|
145
158
|
|
146
|
-
template <typename Y
|
159
|
+
template <typename Y,
|
160
|
+
std::enable_if_t<std::is_base_of<T, Y>::value, bool> = true>
|
161
|
+
RefCountedPtr<Y> TakeAsSubclass() {
|
162
|
+
return RefCountedPtr<Y>(static_cast<Y*>(release()));
|
163
|
+
}
|
164
|
+
|
165
|
+
template <typename Y,
|
166
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
147
167
|
bool operator==(const RefCountedPtr<Y>& other) const {
|
148
168
|
return value_ == other.value_;
|
149
169
|
}
|
150
170
|
|
151
|
-
template <typename Y
|
171
|
+
template <typename Y,
|
172
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
152
173
|
bool operator==(const Y* other) const {
|
153
174
|
return value_ == other;
|
154
175
|
}
|
155
176
|
|
156
177
|
bool operator==(std::nullptr_t) const { return value_ == nullptr; }
|
157
178
|
|
158
|
-
template <typename Y
|
179
|
+
template <typename Y,
|
180
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
159
181
|
bool operator!=(const RefCountedPtr<Y>& other) const {
|
160
182
|
return value_ != other.value_;
|
161
183
|
}
|
162
184
|
|
163
|
-
template <typename Y
|
185
|
+
template <typename Y,
|
186
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
164
187
|
bool operator!=(const Y* other) const {
|
165
188
|
return value_ != other;
|
166
189
|
}
|
@@ -184,7 +207,8 @@ class WeakRefCountedPtr {
|
|
184
207
|
WeakRefCountedPtr(std::nullptr_t) {}
|
185
208
|
|
186
209
|
// If value is non-null, we take ownership of a ref to it.
|
187
|
-
template <typename Y
|
210
|
+
template <typename Y,
|
211
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
188
212
|
explicit WeakRefCountedPtr(Y* value) {
|
189
213
|
value_ = value;
|
190
214
|
}
|
@@ -194,7 +218,8 @@ class WeakRefCountedPtr {
|
|
194
218
|
value_ = other.value_;
|
195
219
|
other.value_ = nullptr;
|
196
220
|
}
|
197
|
-
template <typename Y
|
221
|
+
template <typename Y,
|
222
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
198
223
|
// NOLINTNEXTLINE(google-explicit-constructor)
|
199
224
|
WeakRefCountedPtr(WeakRefCountedPtr<Y>&& other) noexcept {
|
200
225
|
value_ = static_cast<T*>(other.value_);
|
@@ -206,7 +231,8 @@ class WeakRefCountedPtr {
|
|
206
231
|
reset(std::exchange(other.value_, nullptr));
|
207
232
|
return *this;
|
208
233
|
}
|
209
|
-
template <typename Y
|
234
|
+
template <typename Y,
|
235
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
210
236
|
WeakRefCountedPtr& operator=(WeakRefCountedPtr<Y>&& other) noexcept {
|
211
237
|
reset(std::exchange(other.value_, nullptr));
|
212
238
|
return *this;
|
@@ -217,7 +243,8 @@ class WeakRefCountedPtr {
|
|
217
243
|
if (other.value_ != nullptr) other.value_->IncrementWeakRefCount();
|
218
244
|
value_ = other.value_;
|
219
245
|
}
|
220
|
-
template <typename Y
|
246
|
+
template <typename Y,
|
247
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
221
248
|
// NOLINTNEXTLINE(google-explicit-constructor)
|
222
249
|
WeakRefCountedPtr(const WeakRefCountedPtr<Y>& other) {
|
223
250
|
static_assert(std::has_virtual_destructor<T>::value,
|
@@ -235,7 +262,8 @@ class WeakRefCountedPtr {
|
|
235
262
|
reset(other.value_);
|
236
263
|
return *this;
|
237
264
|
}
|
238
|
-
template <typename Y
|
265
|
+
template <typename Y,
|
266
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
239
267
|
WeakRefCountedPtr& operator=(const WeakRefCountedPtr<Y>& other) {
|
240
268
|
static_assert(std::has_virtual_destructor<T>::value,
|
241
269
|
"T does not have a virtual dtor");
|
@@ -250,6 +278,13 @@ class WeakRefCountedPtr {
|
|
250
278
|
if (value_ != nullptr) value_->WeakUnref();
|
251
279
|
}
|
252
280
|
|
281
|
+
// An explicit copy method that supports ref-count tracing.
|
282
|
+
WeakRefCountedPtr<T> WeakRef(const DebugLocation& location,
|
283
|
+
const char* reason) {
|
284
|
+
if (value_ != nullptr) value_->IncrementWeakRefCount(location, reason);
|
285
|
+
return WeakRefCountedPtr<T>(value_);
|
286
|
+
}
|
287
|
+
|
253
288
|
void swap(WeakRefCountedPtr& other) { std::swap(value_, other.value_); }
|
254
289
|
|
255
290
|
// If value is non-null, we take ownership of a ref to it.
|
@@ -262,13 +297,15 @@ class WeakRefCountedPtr {
|
|
262
297
|
T* old_value = std::exchange(value_, value);
|
263
298
|
if (old_value != nullptr) old_value->WeakUnref(location, reason);
|
264
299
|
}
|
265
|
-
template <typename Y
|
300
|
+
template <typename Y,
|
301
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
266
302
|
void reset(Y* value = nullptr) {
|
267
303
|
static_assert(std::has_virtual_destructor<T>::value,
|
268
304
|
"T does not have a virtual dtor");
|
269
305
|
reset(static_cast<T*>(value));
|
270
306
|
}
|
271
|
-
template <typename Y
|
307
|
+
template <typename Y,
|
308
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
272
309
|
void reset(const DebugLocation& location, const char* reason,
|
273
310
|
Y* value = nullptr) {
|
274
311
|
static_assert(std::has_virtual_destructor<T>::value,
|
@@ -280,35 +317,41 @@ class WeakRefCountedPtr {
|
|
280
317
|
// us to pass a ref to idiomatic C code that does not use WeakRefCountedPtr<>.
|
281
318
|
// Once all of our code has been converted to idiomatic C++, this
|
282
319
|
// method should go away.
|
283
|
-
T* release() {
|
284
|
-
T* value = value_;
|
285
|
-
value_ = nullptr;
|
286
|
-
return value;
|
287
|
-
}
|
320
|
+
T* release() { return std::exchange(value_, nullptr); }
|
288
321
|
|
289
322
|
T* get() const { return value_; }
|
290
323
|
|
291
324
|
T& operator*() const { return *value_; }
|
292
325
|
T* operator->() const { return value_; }
|
293
326
|
|
294
|
-
template <typename Y
|
327
|
+
template <typename Y,
|
328
|
+
std::enable_if_t<std::is_base_of<T, Y>::value, bool> = true>
|
329
|
+
WeakRefCountedPtr<Y> TakeAsSubclass() {
|
330
|
+
return WeakRefCountedPtr<Y>(static_cast<Y*>(release()));
|
331
|
+
}
|
332
|
+
|
333
|
+
template <typename Y,
|
334
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
295
335
|
bool operator==(const WeakRefCountedPtr<Y>& other) const {
|
296
336
|
return value_ == other.value_;
|
297
337
|
}
|
298
338
|
|
299
|
-
template <typename Y
|
339
|
+
template <typename Y,
|
340
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
300
341
|
bool operator==(const Y* other) const {
|
301
342
|
return value_ == other;
|
302
343
|
}
|
303
344
|
|
304
345
|
bool operator==(std::nullptr_t) const { return value_ == nullptr; }
|
305
346
|
|
306
|
-
template <typename Y
|
347
|
+
template <typename Y,
|
348
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
307
349
|
bool operator!=(const WeakRefCountedPtr<Y>& other) const {
|
308
350
|
return value_ != other.value_;
|
309
351
|
}
|
310
352
|
|
311
|
-
template <typename Y
|
353
|
+
template <typename Y,
|
354
|
+
std::enable_if_t<std::is_convertible<Y*, T*>::value, bool> = true>
|
312
355
|
bool operator!=(const Y* other) const {
|
313
356
|
return value_ != other;
|
314
357
|
}
|
@@ -104,6 +104,19 @@ inline bool operator==(const RefCountedStringValue& lhs,
|
|
104
104
|
return lhs.as_string_view() == rhs.as_string_view();
|
105
105
|
}
|
106
106
|
|
107
|
+
inline bool operator!=(const RefCountedStringValue& lhs,
|
108
|
+
absl::string_view rhs) {
|
109
|
+
return lhs.as_string_view() != rhs;
|
110
|
+
}
|
111
|
+
inline bool operator!=(absl::string_view lhs,
|
112
|
+
const RefCountedStringValue& rhs) {
|
113
|
+
return lhs != rhs.as_string_view();
|
114
|
+
}
|
115
|
+
inline bool operator!=(const RefCountedStringValue& lhs,
|
116
|
+
const RefCountedStringValue& rhs) {
|
117
|
+
return lhs.as_string_view() != rhs.as_string_view();
|
118
|
+
}
|
119
|
+
|
107
120
|
inline bool operator<(const RefCountedStringValue& lhs, absl::string_view rhs) {
|
108
121
|
return lhs.as_string_view() < rhs;
|
109
122
|
}
|
@@ -51,19 +51,11 @@ static void combiner_finally_exec(grpc_core::Combiner* lock,
|
|
51
51
|
grpc_closure* closure,
|
52
52
|
grpc_error_handle error);
|
53
53
|
|
54
|
-
// TODO(ctiller): delete this when the combiner_offload_to_event_engine
|
55
|
-
// experiment is removed.
|
56
|
-
static void offload(void* arg, grpc_error_handle error);
|
57
|
-
|
58
54
|
grpc_core::Combiner* grpc_combiner_create(
|
59
55
|
std::shared_ptr<grpc_event_engine::experimental::EventEngine>
|
60
56
|
event_engine) {
|
61
57
|
grpc_core::Combiner* lock = new grpc_core::Combiner();
|
62
|
-
|
63
|
-
lock->event_engine = event_engine;
|
64
|
-
} else {
|
65
|
-
GRPC_CLOSURE_INIT(&lock->offload, offload, lock, nullptr);
|
66
|
-
}
|
58
|
+
lock->event_engine = event_engine;
|
67
59
|
gpr_ref_init(&lock->refs, 1);
|
68
60
|
gpr_atm_no_barrier_store(&lock->state, STATE_UNORPHANED);
|
69
61
|
grpc_closure_list_init(&lock->final_list);
|
@@ -173,27 +165,18 @@ static void move_next() {
|
|
173
165
|
}
|
174
166
|
}
|
175
167
|
|
176
|
-
static void offload(void* arg, grpc_error_handle /*error*/) {
|
177
|
-
grpc_core::Combiner* lock = static_cast<grpc_core::Combiner*>(arg);
|
178
|
-
push_last_on_exec_ctx(lock);
|
179
|
-
}
|
180
|
-
|
181
168
|
static void queue_offload(grpc_core::Combiner* lock) {
|
182
169
|
move_next();
|
183
170
|
// Make the combiner look uncontended by storing a non-null value here, so
|
184
171
|
// that we don't immediately offload again.
|
185
172
|
gpr_atm_no_barrier_store(&lock->initiating_exec_ctx_or_null, 1);
|
186
173
|
GRPC_COMBINER_TRACE(gpr_log(GPR_INFO, "C:%p queue_offload", lock));
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
});
|
194
|
-
} else {
|
195
|
-
grpc_core::Executor::Run(&lock->offload, absl::OkStatus());
|
196
|
-
}
|
174
|
+
lock->event_engine->Run([lock] {
|
175
|
+
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
176
|
+
grpc_core::ExecCtx exec_ctx(0);
|
177
|
+
push_last_on_exec_ctx(lock);
|
178
|
+
exec_ctx.Flush();
|
179
|
+
});
|
197
180
|
}
|
198
181
|
|
199
182
|
bool grpc_combiner_continue_exec_ctx() {
|
@@ -215,33 +198,14 @@ bool grpc_combiner_continue_exec_ctx() {
|
|
215
198
|
grpc_core::ExecCtx::Get()->IsReadyToFinish(),
|
216
199
|
lock->time_to_execute_final_list));
|
217
200
|
|
218
|
-
if (
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
return true;
|
227
|
-
}
|
228
|
-
} else {
|
229
|
-
// TODO(ctiller): delete this when the combiner_offload_to_event_engine
|
230
|
-
// experiment is removed.
|
231
|
-
|
232
|
-
// offload only if all the following conditions are true:
|
233
|
-
// 1. the combiner is contended and has more than one closure to execute
|
234
|
-
// 2. the current execution context needs to finish as soon as possible
|
235
|
-
// 3. the current thread is not a worker for any background poller
|
236
|
-
// 4. the DEFAULT executor is threaded
|
237
|
-
if (contended && grpc_core::ExecCtx::Get()->IsReadyToFinish() &&
|
238
|
-
!grpc_iomgr_platform_is_any_background_poller_thread() &&
|
239
|
-
grpc_core::Executor::IsThreadedDefault()) {
|
240
|
-
// this execution context wants to move on: schedule remaining work to be
|
241
|
-
// picked up on the executor
|
242
|
-
queue_offload(lock);
|
243
|
-
return true;
|
244
|
-
}
|
201
|
+
// offload only if both (1) the combiner is contended and has more than one
|
202
|
+
// closure to execute, and (2) the current execution context needs to finish
|
203
|
+
// as soon as possible
|
204
|
+
if (contended && grpc_core::ExecCtx::Get()->IsReadyToFinish()) {
|
205
|
+
// this execution context wants to move on: schedule remaining work to be
|
206
|
+
// picked up on the executor
|
207
|
+
queue_offload(lock);
|
208
|
+
return true;
|
245
209
|
}
|
246
210
|
|
247
211
|
if (!lock->time_to_execute_final_list ||
|
@@ -17,6 +17,7 @@
|
|
17
17
|
|
18
18
|
#include <atomic>
|
19
19
|
#include <memory>
|
20
|
+
#include <utility>
|
20
21
|
|
21
22
|
#include "absl/functional/any_invocable.h"
|
22
23
|
#include "absl/status/status.h"
|
@@ -69,6 +70,12 @@ class EventEngineEndpointWrapper {
|
|
69
70
|
explicit EventEngineEndpointWrapper(
|
70
71
|
std::unique_ptr<EventEngine::Endpoint> endpoint);
|
71
72
|
|
73
|
+
EventEngine::Endpoint* endpoint() { return endpoint_.get(); }
|
74
|
+
|
75
|
+
std::unique_ptr<EventEngine::Endpoint> ReleaseEndpoint() {
|
76
|
+
return std::move(endpoint_);
|
77
|
+
}
|
78
|
+
|
72
79
|
int Fd() {
|
73
80
|
grpc_core::MutexLock lock(&mu_);
|
74
81
|
return fd_;
|
@@ -428,6 +435,30 @@ bool grpc_is_event_engine_endpoint(grpc_endpoint* ep) {
|
|
428
435
|
return ep->vtable == &grpc_event_engine_endpoint_vtable;
|
429
436
|
}
|
430
437
|
|
438
|
+
EventEngine::Endpoint* grpc_get_wrapped_event_engine_endpoint(
|
439
|
+
grpc_endpoint* ep) {
|
440
|
+
if (!grpc_is_event_engine_endpoint(ep)) {
|
441
|
+
return nullptr;
|
442
|
+
}
|
443
|
+
auto* eeep =
|
444
|
+
reinterpret_cast<EventEngineEndpointWrapper::grpc_event_engine_endpoint*>(
|
445
|
+
ep);
|
446
|
+
return eeep->wrapper->endpoint();
|
447
|
+
}
|
448
|
+
|
449
|
+
std::unique_ptr<EventEngine::Endpoint> grpc_take_wrapped_event_engine_endpoint(
|
450
|
+
grpc_endpoint* ep) {
|
451
|
+
if (!grpc_is_event_engine_endpoint(ep)) {
|
452
|
+
return nullptr;
|
453
|
+
}
|
454
|
+
auto* eeep =
|
455
|
+
reinterpret_cast<EventEngineEndpointWrapper::grpc_event_engine_endpoint*>(
|
456
|
+
ep);
|
457
|
+
auto endpoint = eeep->wrapper->ReleaseEndpoint();
|
458
|
+
delete eeep->wrapper;
|
459
|
+
return endpoint;
|
460
|
+
}
|
461
|
+
|
431
462
|
void grpc_event_engine_endpoint_destroy_and_release_fd(
|
432
463
|
grpc_endpoint* ep, int* fd, grpc_closure* on_release_fd) {
|
433
464
|
auto* eeep =
|
@@ -15,6 +15,8 @@
|
|
15
15
|
#define GRPC_SRC_CORE_LIB_IOMGR_EVENT_ENGINE_SHIMS_ENDPOINT_H
|
16
16
|
#include <grpc/support/port_platform.h>
|
17
17
|
|
18
|
+
#include <memory>
|
19
|
+
|
18
20
|
#include <grpc/event_engine/event_engine.h>
|
19
21
|
|
20
22
|
#include "src/core/lib/iomgr/endpoint.h"
|
@@ -31,6 +33,20 @@ grpc_endpoint* grpc_event_engine_endpoint_create(
|
|
31
33
|
/// Returns true if the passed endpoint is an event engine shim endpoint.
|
32
34
|
bool grpc_is_event_engine_endpoint(grpc_endpoint* ep);
|
33
35
|
|
36
|
+
/// Returns the wrapped event engine endpoint if the given grpc_endpoint is an
|
37
|
+
/// event engine shim endpoint. Otherwise it returns nullptr.
|
38
|
+
EventEngine::Endpoint* grpc_get_wrapped_event_engine_endpoint(
|
39
|
+
grpc_endpoint* ep);
|
40
|
+
|
41
|
+
/// Transfers ownership of the wrapped event engine endpoint if the given
|
42
|
+
/// grpc_endpoint is an event engine shim endpoint. Otherwise it returns
|
43
|
+
/// nullptr. If the passed ep wraps an event_engine endpoint, then after this
|
44
|
+
/// call, the memory location holding by the passed ep is free'ed.
|
45
|
+
/// Its safe to call this function only when there are no pending reads/writes
|
46
|
+
/// on the endpoint.
|
47
|
+
std::unique_ptr<EventEngine::Endpoint> grpc_take_wrapped_event_engine_endpoint(
|
48
|
+
grpc_endpoint* ep);
|
49
|
+
|
34
50
|
/// Destroys the passed in event engine shim endpoint and schedules the
|
35
51
|
/// asynchronous execution of the on_release_fd callback. The int pointer fd is
|
36
52
|
/// set to the underlying endpoint's file descriptor.
|
@@ -336,6 +336,7 @@ int64_t grpc_tcp_client_create_from_prepared_fd(
|
|
336
336
|
err = connect(fd, reinterpret_cast<const grpc_sockaddr*>(addr->addr),
|
337
337
|
addr->len);
|
338
338
|
} while (err < 0 && errno == EINTR);
|
339
|
+
int connect_errno = (err < 0) ? errno : 0;
|
339
340
|
|
340
341
|
auto addr_uri = grpc_sockaddr_to_uri(addr);
|
341
342
|
if (!addr_uri.ok()) {
|
@@ -347,7 +348,7 @@ int64_t grpc_tcp_client_create_from_prepared_fd(
|
|
347
348
|
std::string name = absl::StrCat("tcp-client:", addr_uri.value());
|
348
349
|
grpc_fd* fdobj = grpc_fd_create(fd, name.c_str(), true);
|
349
350
|
int64_t connection_id = 0;
|
350
|
-
if (
|
351
|
+
if (connect_errno == EWOULDBLOCK || connect_errno == EINPROGRESS) {
|
351
352
|
// Connection is still in progress.
|
352
353
|
connection_id = g_connection_id.fetch_add(1, std::memory_order_acq_rel);
|
353
354
|
}
|
@@ -359,10 +360,10 @@ int64_t grpc_tcp_client_create_from_prepared_fd(
|
|
359
360
|
grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, absl::OkStatus());
|
360
361
|
return 0;
|
361
362
|
}
|
362
|
-
if (
|
363
|
+
if (connect_errno != EWOULDBLOCK && connect_errno != EINPROGRESS) {
|
363
364
|
// Connection already failed. Return 0 to discourage any cancellation
|
364
365
|
// attempts.
|
365
|
-
grpc_error_handle error = GRPC_OS_ERROR(
|
366
|
+
grpc_error_handle error = GRPC_OS_ERROR(connect_errno, "connect");
|
366
367
|
error = grpc_error_set_str(
|
367
368
|
error, grpc_core::StatusStrProperty::kTargetAddress, addr_uri.value());
|
368
369
|
grpc_fd_orphan(fdobj, nullptr, nullptr, "tcp_client_connect_error");
|
@@ -346,7 +346,7 @@ class LoadBalancingPolicy : public InternallyRefCounted<LoadBalancingPolicy> {
|
|
346
346
|
struct UpdateArgs {
|
347
347
|
/// A list of endpoints, each with one or more address, or an error
|
348
348
|
/// indicating a failure to obtain the list of addresses.
|
349
|
-
absl::StatusOr<
|
349
|
+
absl::StatusOr<std::shared_ptr<EndpointAddressesIterator>> addresses;
|
350
350
|
/// The LB policy config.
|
351
351
|
RefCountedPtr<Config> config;
|
352
352
|
/// A human-readable note providing context about the name resolution that
|