grpc 1.42.0 → 1.43.1
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 +85 -34
- data/include/grpc/event_engine/event_engine.h +37 -13
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
- data/include/grpc/event_engine/memory_allocator.h +27 -11
- data/include/grpc/event_engine/memory_request.h +57 -0
- data/include/grpc/grpc_security.h +276 -145
- data/include/grpc/grpc_security_constants.h +1 -14
- data/include/grpc/impl/codegen/port_platform.h +7 -3
- data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
- data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
- data/src/core/ext/filters/client_channel/client_channel.h +5 -4
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
- data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
- data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
- data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
- data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
- data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
- data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
- data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
- data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
- data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
- data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
- data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
- data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
- data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
- data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
- data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
- data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
- data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
- data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
- data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
- data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
- data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
- data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
- data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
- data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
- data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
- data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
- data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
- data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
- data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
- data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
- data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
- data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
- data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
- data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
- data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
- data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
- data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
- data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
- data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
- data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
- data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
- data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
- data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
- data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
- data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
- data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
- data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
- data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
- data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
- data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
- data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
- data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
- data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
- data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
- data/src/core/ext/xds/certificate_provider_store.h +1 -1
- data/src/core/ext/xds/xds_api.cc +409 -304
- data/src/core/ext/xds/xds_api.h +3 -1
- data/src/core/ext/xds/xds_bootstrap.cc +6 -3
- data/src/core/ext/xds/xds_certificate_provider.h +1 -2
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
- data/src/core/ext/xds/xds_client.cc +395 -291
- data/src/core/ext/xds/xds_client.h +47 -38
- data/src/core/ext/xds/xds_routing.cc +247 -0
- data/src/core/ext/xds/xds_routing.h +98 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
- data/src/core/lib/avl/avl.h +389 -88
- data/src/core/lib/backoff/backoff.cc +2 -2
- data/src/core/lib/channel/channel_args.cc +17 -17
- data/src/core/lib/channel/channel_args.h +11 -10
- data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
- data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
- data/src/core/lib/channel/channel_stack_builder.cc +0 -2
- data/src/core/lib/channel/channel_trace.cc +6 -6
- data/src/core/lib/channel/channelz.cc +1 -1
- data/src/core/lib/compression/compression_args.cc +7 -5
- data/src/core/lib/compression/compression_args.h +6 -4
- data/src/core/lib/config/core_configuration.cc +3 -1
- data/src/core/lib/config/core_configuration.h +11 -0
- data/src/core/lib/debug/trace.h +2 -2
- data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
- data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
- data/src/core/lib/event_engine/event_engine.cc +0 -13
- data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
- data/src/core/lib/event_engine/event_engine_factory.h +33 -0
- data/src/core/lib/event_engine/memory_allocator.cc +70 -0
- data/src/core/lib/gpr/tls.h +6 -0
- data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
- data/src/core/lib/gprpp/global_config_env.cc +7 -7
- data/src/core/lib/gprpp/global_config_env.h +2 -2
- data/src/core/lib/gprpp/manual_constructor.h +2 -3
- data/src/core/lib/gprpp/orphanable.h +1 -1
- data/src/core/lib/gprpp/ref_counted.h +1 -1
- data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
- data/src/core/lib/gprpp/status_helper.h +1 -1
- data/src/core/lib/gprpp/table.h +13 -1
- data/src/core/lib/http/httpcli.cc +30 -26
- data/src/core/lib/http/httpcli.h +14 -12
- data/src/core/lib/iomgr/buffer_list.cc +9 -9
- data/src/core/lib/iomgr/buffer_list.h +13 -13
- data/src/core/lib/iomgr/call_combiner.cc +2 -3
- data/src/core/lib/iomgr/endpoint.h +0 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
- data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
- data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
- data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
- data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
- data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
- data/src/core/lib/iomgr/exec_ctx.h +11 -11
- data/src/core/lib/iomgr/executor.cc +12 -15
- data/src/core/lib/iomgr/executor.h +1 -1
- data/src/core/lib/iomgr/tcp_client.cc +2 -4
- data/src/core/lib/iomgr/tcp_client.h +1 -3
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
- data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
- data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
- data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
- data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
- data/src/core/lib/iomgr/tcp_custom.cc +9 -36
- data/src/core/lib/iomgr/tcp_custom.h +0 -1
- data/src/core/lib/iomgr/tcp_posix.cc +28 -33
- data/src/core/lib/iomgr/tcp_posix.h +1 -3
- data/src/core/lib/iomgr/tcp_server.cc +4 -6
- data/src/core/lib/iomgr/tcp_server.h +6 -8
- data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
- data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
- data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
- data/src/core/lib/iomgr/tcp_windows.cc +2 -7
- data/src/core/lib/iomgr/tcp_windows.h +1 -2
- data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
- data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
- data/src/core/lib/iomgr/work_serializer.cc +115 -44
- data/src/core/lib/iomgr/work_serializer.h +16 -4
- data/src/core/lib/json/json_reader.cc +83 -35
- data/src/core/lib/json/json_util.cc +1 -1
- data/src/core/lib/promise/activity.cc +115 -0
- data/src/core/lib/promise/activity.h +499 -0
- data/src/core/lib/promise/context.h +86 -0
- data/src/core/lib/promise/detail/basic_seq.h +407 -0
- data/src/core/lib/promise/detail/promise_factory.h +189 -0
- data/src/core/lib/promise/detail/promise_like.h +85 -0
- data/src/core/lib/promise/detail/status.h +44 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
- data/src/core/lib/promise/loop.h +108 -0
- data/src/core/lib/promise/map.h +88 -0
- data/src/core/lib/promise/poll.h +60 -0
- data/src/core/lib/promise/race.h +84 -0
- data/src/core/lib/promise/seq.h +71 -0
- data/src/core/lib/resource_quota/api.cc +108 -0
- data/src/core/lib/resource_quota/api.h +41 -0
- data/src/core/lib/resource_quota/memory_quota.cc +454 -0
- data/src/core/lib/resource_quota/memory_quota.h +421 -0
- data/src/core/lib/resource_quota/resource_quota.cc +33 -0
- data/src/core/lib/resource_quota/resource_quota.h +58 -0
- data/src/core/lib/resource_quota/thread_quota.cc +43 -0
- data/src/core/lib/resource_quota/thread_quota.h +57 -0
- data/src/core/lib/resource_quota/trace.cc +19 -0
- data/src/core/lib/resource_quota/trace.h +24 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
- data/src/core/lib/security/authorization/evaluate_args.h +2 -1
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
- data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
- data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
- data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
- 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 +7 -7
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
- data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
- data/src/core/lib/security/transport/security_handshaker.cc +2 -2
- data/src/core/lib/slice/percent_encoding.cc +30 -86
- data/src/core/lib/slice/percent_encoding.h +5 -11
- data/src/core/lib/slice/slice.cc +7 -7
- data/src/core/lib/slice/slice.h +341 -0
- data/src/core/lib/slice/slice_buffer.cc +4 -0
- data/src/core/lib/slice/slice_intern.cc +1 -1
- data/src/core/lib/slice/slice_refcount.h +5 -1
- data/src/core/lib/slice/slice_refcount_base.h +19 -11
- data/src/core/lib/slice/static_slice.cc +331 -483
- data/src/core/lib/slice/static_slice.h +101 -132
- data/src/core/lib/surface/builtins.cc +1 -1
- data/src/core/lib/surface/call.cc +85 -59
- data/src/core/lib/surface/channel.cc +4 -29
- data/src/core/lib/surface/channel.h +2 -12
- data/src/core/lib/surface/completion_queue.cc +2 -2
- data/src/core/lib/surface/init.cc +0 -1
- data/src/core/lib/surface/lame_client.cc +24 -17
- data/src/core/lib/surface/server.cc +22 -22
- data/src/core/lib/surface/server.h +8 -9
- data/src/core/lib/surface/validate_metadata.cc +2 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/byte_stream.cc +4 -0
- data/src/core/lib/transport/metadata.h +4 -4
- data/src/core/lib/transport/metadata_batch.cc +5 -0
- data/src/core/lib/transport/metadata_batch.h +174 -99
- data/src/core/lib/transport/parsed_metadata.cc +35 -0
- data/src/core/lib/transport/parsed_metadata.h +180 -61
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +529 -614
- data/src/core/lib/transport/static_metadata.h +0 -18
- data/src/core/lib/transport/transport.cc +4 -26
- data/src/core/lib/transport/transport.h +0 -1
- data/src/core/lib/transport/transport_op_string.cc +1 -1
- data/src/core/lib/uri/uri_parser.cc +19 -19
- data/src/core/lib/uri/uri_parser.h +2 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/local_transport_security.cc +15 -15
- data/src/core/tsi/ssl_transport_security.cc +30 -1
- data/src/core/tsi/ssl_transport_security.h +1 -0
- data/src/ruby/ext/grpc/extconf.rb +1 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
- data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
- data/third_party/abseil-cpp/absl/base/config.h +67 -37
- data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
- data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
- data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
- data/third_party/abseil-cpp/absl/base/options.h +1 -1
- data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
- data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
- data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
- data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
- data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
- data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
- data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
- data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
- data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
- data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
- data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
- data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
- data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
- data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
- data/third_party/abseil-cpp/absl/status/status.cc +9 -17
- data/third_party/abseil-cpp/absl/status/status.h +19 -15
- data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
- data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
- data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
- data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
- data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
- data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
- data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
- data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
- data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
- data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
- data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
- data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
- data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
- data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
- data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
- data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
- data/third_party/abseil-cpp/absl/time/time.h +67 -36
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
- data/third_party/abseil-cpp/absl/types/span.h +3 -3
- data/third_party/boringssl-with-bazel/err_data.c +681 -677
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
- data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
- data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
- data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
- data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
- data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
- data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
- data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
- data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
- data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
- data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
- data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
- data/third_party/upb/upb/decode.c +309 -178
- data/third_party/upb/upb/decode_fast.c +1 -1
- data/third_party/upb/upb/decode_internal.h +1 -0
- data/third_party/upb/upb/def.c +330 -85
- data/third_party/upb/upb/def.h +45 -14
- data/third_party/upb/upb/def.hpp +17 -4
- data/third_party/upb/upb/encode.c +100 -40
- data/third_party/upb/upb/msg.c +22 -9
- data/third_party/upb/upb/msg_internal.h +90 -8
- data/third_party/upb/upb/reflection.c +98 -58
- data/third_party/upb/upb/reflection.h +6 -2
- data/third_party/upb/upb/text_encode.c +3 -3
- data/third_party/upb/upb/upb.c +8 -0
- metadata +116 -56
- data/src/core/lib/avl/avl.cc +0 -306
- data/src/core/lib/gprpp/match.h +0 -73
- data/src/core/lib/gprpp/overload.h +0 -59
- data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
- data/src/core/lib/iomgr/resource_quota.cc +0 -1106
- data/src/core/lib/iomgr/resource_quota.h +0 -226
- data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -0,0 +1,115 @@
|
|
1
|
+
// Copyright 2021 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/lib/promise/activity.h"
|
18
|
+
|
19
|
+
#include "absl/base/attributes.h"
|
20
|
+
|
21
|
+
#include "src/core/lib/gprpp/atomic_utils.h"
|
22
|
+
|
23
|
+
namespace grpc_core {
|
24
|
+
|
25
|
+
///////////////////////////////////////////////////////////////////////////////
|
26
|
+
// GLOBALS
|
27
|
+
|
28
|
+
GPR_THREAD_LOCAL(Activity*) Activity::g_current_activity_{nullptr};
|
29
|
+
Waker::Unwakeable Waker::unwakeable_;
|
30
|
+
|
31
|
+
///////////////////////////////////////////////////////////////////////////////
|
32
|
+
// HELPER TYPES
|
33
|
+
|
34
|
+
// Weak handle to an Activity.
|
35
|
+
// Handle can persist while Activity goes away.
|
36
|
+
class Activity::Handle final : public Wakeable {
|
37
|
+
public:
|
38
|
+
explicit Handle(Activity* activity) : activity_(activity) {}
|
39
|
+
|
40
|
+
// Ref the Handle (not the activity).
|
41
|
+
void Ref() { refs_.fetch_add(1, std::memory_order_relaxed); }
|
42
|
+
|
43
|
+
// Activity is going away... drop its reference and sever the connection back.
|
44
|
+
void DropActivity() ABSL_LOCKS_EXCLUDED(mu_) {
|
45
|
+
mu_.Lock();
|
46
|
+
GPR_ASSERT(activity_ != nullptr);
|
47
|
+
activity_ = nullptr;
|
48
|
+
mu_.Unlock();
|
49
|
+
Unref();
|
50
|
+
}
|
51
|
+
|
52
|
+
// Activity needs to wake up (if it still exists!) - wake it up, and drop the
|
53
|
+
// ref that was kept for this handle.
|
54
|
+
void Wakeup() override ABSL_LOCKS_EXCLUDED(mu_) {
|
55
|
+
mu_.Lock();
|
56
|
+
// Note that activity refcount can drop to zero, but we could win the lock
|
57
|
+
// against DropActivity, so we need to only increase activities refcount if
|
58
|
+
// it is non-zero.
|
59
|
+
if (activity_ && activity_->RefIfNonzero()) {
|
60
|
+
Activity* activity = activity_;
|
61
|
+
mu_.Unlock();
|
62
|
+
// Activity still exists and we have a reference: wake it up, which will
|
63
|
+
// drop the ref.
|
64
|
+
activity->Wakeup();
|
65
|
+
} else {
|
66
|
+
// Could not get the activity - it's either gone or going. No need to wake
|
67
|
+
// it up!
|
68
|
+
mu_.Unlock();
|
69
|
+
}
|
70
|
+
// Drop the ref to the handle (we have one ref = one wakeup semantics).
|
71
|
+
Unref();
|
72
|
+
}
|
73
|
+
|
74
|
+
void Drop() override { Unref(); }
|
75
|
+
|
76
|
+
private:
|
77
|
+
// Unref the Handle (not the activity).
|
78
|
+
void Unref() {
|
79
|
+
if (1 == refs_.fetch_sub(1, std::memory_order_acq_rel)) {
|
80
|
+
delete this;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
// Two initial refs: one for the waiter that caused instantiation, one for the
|
85
|
+
// activity.
|
86
|
+
std::atomic<size_t> refs_{2};
|
87
|
+
Mutex mu_ ABSL_ACQUIRED_AFTER(activity_->mu_);
|
88
|
+
Activity* activity_ ABSL_GUARDED_BY(mu_);
|
89
|
+
};
|
90
|
+
|
91
|
+
///////////////////////////////////////////////////////////////////////////////
|
92
|
+
// ACTIVITY IMPLEMENTATION
|
93
|
+
|
94
|
+
bool Activity::RefIfNonzero() { return IncrementIfNonzero(&refs_); }
|
95
|
+
|
96
|
+
Activity::Handle* Activity::RefHandle() {
|
97
|
+
if (handle_ == nullptr) {
|
98
|
+
// No handle created yet - construct it and return it.
|
99
|
+
handle_ = new Handle(this);
|
100
|
+
return handle_;
|
101
|
+
} else {
|
102
|
+
// Already had to create a handle, ref & return it.
|
103
|
+
handle_->Ref();
|
104
|
+
return handle_;
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
void Activity::DropHandle() {
|
109
|
+
handle_->DropActivity();
|
110
|
+
handle_ = nullptr;
|
111
|
+
}
|
112
|
+
|
113
|
+
Waker Activity::MakeNonOwningWaker() { return Waker(RefHandle()); }
|
114
|
+
|
115
|
+
} // namespace grpc_core
|
@@ -0,0 +1,499 @@
|
|
1
|
+
// Copyright 2021 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_PROMISE_ACTIVITY_H
|
16
|
+
#define GRPC_CORE_LIB_PROMISE_ACTIVITY_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <stddef.h>
|
21
|
+
#include <stdint.h>
|
22
|
+
|
23
|
+
#include <algorithm>
|
24
|
+
#include <atomic>
|
25
|
+
#include <functional>
|
26
|
+
#include <memory>
|
27
|
+
#include <utility>
|
28
|
+
|
29
|
+
#include "absl/base/thread_annotations.h"
|
30
|
+
#include "absl/status/status.h"
|
31
|
+
#include "absl/types/optional.h"
|
32
|
+
#include "absl/types/variant.h"
|
33
|
+
#include "absl/utility/utility.h"
|
34
|
+
|
35
|
+
#include <grpc/support/log.h>
|
36
|
+
|
37
|
+
#include "src/core/lib/gpr/tls.h"
|
38
|
+
#include "src/core/lib/gprpp/construct_destruct.h"
|
39
|
+
#include "src/core/lib/gprpp/sync.h"
|
40
|
+
#include "src/core/lib/promise/context.h"
|
41
|
+
#include "src/core/lib/promise/detail/promise_factory.h"
|
42
|
+
#include "src/core/lib/promise/detail/status.h"
|
43
|
+
#include "src/core/lib/promise/poll.h"
|
44
|
+
|
45
|
+
namespace grpc_core {
|
46
|
+
|
47
|
+
// A Wakeable object is used by queues to wake activities.
|
48
|
+
class Wakeable {
|
49
|
+
public:
|
50
|
+
// Wake up the underlying activity.
|
51
|
+
// After calling, this Wakeable cannot be used again.
|
52
|
+
virtual void Wakeup() = 0;
|
53
|
+
// Drop this wakeable without waking up the underlying activity.
|
54
|
+
virtual void Drop() = 0;
|
55
|
+
|
56
|
+
protected:
|
57
|
+
inline ~Wakeable() {}
|
58
|
+
};
|
59
|
+
|
60
|
+
// An owning reference to a Wakeable.
|
61
|
+
// This type is non-copyable but movable.
|
62
|
+
class Waker {
|
63
|
+
public:
|
64
|
+
explicit Waker(Wakeable* wakeable) : wakeable_(wakeable) {}
|
65
|
+
Waker() : wakeable_(&unwakeable_) {}
|
66
|
+
~Waker() { wakeable_->Drop(); }
|
67
|
+
Waker(const Waker&) = delete;
|
68
|
+
Waker& operator=(const Waker&) = delete;
|
69
|
+
Waker(Waker&& other) noexcept : wakeable_(other.wakeable_) {
|
70
|
+
other.wakeable_ = &unwakeable_;
|
71
|
+
}
|
72
|
+
Waker& operator=(Waker&& other) noexcept {
|
73
|
+
std::swap(wakeable_, other.wakeable_);
|
74
|
+
return *this;
|
75
|
+
}
|
76
|
+
|
77
|
+
// Wake the underlying activity.
|
78
|
+
void Wakeup() {
|
79
|
+
wakeable_->Wakeup();
|
80
|
+
wakeable_ = &unwakeable_;
|
81
|
+
}
|
82
|
+
|
83
|
+
template <typename H>
|
84
|
+
friend H AbslHashValue(H h, const Waker& w) {
|
85
|
+
return H::combine(std::move(h), w.wakeable_);
|
86
|
+
}
|
87
|
+
|
88
|
+
bool operator==(const Waker& other) const noexcept {
|
89
|
+
return wakeable_ == other.wakeable_;
|
90
|
+
}
|
91
|
+
|
92
|
+
private:
|
93
|
+
class Unwakeable final : public Wakeable {
|
94
|
+
public:
|
95
|
+
void Wakeup() final {}
|
96
|
+
void Drop() final {}
|
97
|
+
};
|
98
|
+
|
99
|
+
Wakeable* wakeable_;
|
100
|
+
static Unwakeable unwakeable_;
|
101
|
+
};
|
102
|
+
|
103
|
+
// An Activity tracks execution of a single promise.
|
104
|
+
// It executes the promise under a mutex.
|
105
|
+
// When the promise stalls, it registers the containing activity to be woken up
|
106
|
+
// later.
|
107
|
+
// The activity takes a callback, which will be called exactly once with the
|
108
|
+
// result of execution.
|
109
|
+
// Activity execution may be cancelled by simply deleting the activity. In such
|
110
|
+
// a case, if execution had not already finished, the done callback would be
|
111
|
+
// called with absl::CancelledError().
|
112
|
+
class Activity : private Wakeable {
|
113
|
+
public:
|
114
|
+
// Cancel execution of the underlying promise.
|
115
|
+
virtual void Cancel() ABSL_LOCKS_EXCLUDED(mu_) = 0;
|
116
|
+
|
117
|
+
// Destroy the Activity - used for the type alias ActivityPtr.
|
118
|
+
struct Deleter {
|
119
|
+
void operator()(Activity* activity) {
|
120
|
+
activity->Cancel();
|
121
|
+
activity->Unref();
|
122
|
+
}
|
123
|
+
};
|
124
|
+
|
125
|
+
// Fetch the size of the implementation of this activity.
|
126
|
+
virtual size_t Size() = 0;
|
127
|
+
|
128
|
+
// Force wakeup from the outside.
|
129
|
+
// This should be rarely needed, and usages should be accompanied with a note
|
130
|
+
// on why it's not possible to wakeup with a Waker object.
|
131
|
+
// Nevertheless, it's sometimes useful for integrations with Activity to force
|
132
|
+
// an Activity to repoll.
|
133
|
+
void ForceWakeup() { MakeOwningWaker().Wakeup(); }
|
134
|
+
|
135
|
+
// Wakeup the current threads activity - will force a subsequent poll after
|
136
|
+
// the one that's running.
|
137
|
+
static void WakeupCurrent() {
|
138
|
+
current()->SetActionDuringRun(ActionDuringRun::kWakeup);
|
139
|
+
}
|
140
|
+
|
141
|
+
// Return the current activity.
|
142
|
+
// Additionally:
|
143
|
+
// - assert that there is a current activity (and catch bugs if there's not)
|
144
|
+
// - indicate to thread safety analysis that the current activity is indeed
|
145
|
+
// locked
|
146
|
+
// - back up that assertation with a runtime check in debug builds (it's
|
147
|
+
// prohibitively expensive in non-debug builds)
|
148
|
+
static Activity* current() ABSL_ASSERT_EXCLUSIVE_LOCK(current()->mu_) {
|
149
|
+
#ifndef NDEBUG
|
150
|
+
GPR_ASSERT(g_current_activity_);
|
151
|
+
if (g_current_activity_ != nullptr) {
|
152
|
+
g_current_activity_->mu_.AssertHeld();
|
153
|
+
}
|
154
|
+
#endif
|
155
|
+
return g_current_activity_;
|
156
|
+
}
|
157
|
+
|
158
|
+
// Produce an activity-owning Waker. The produced waker will keep the activity
|
159
|
+
// alive until it's awoken or dropped.
|
160
|
+
Waker MakeOwningWaker() {
|
161
|
+
Ref();
|
162
|
+
return Waker(this);
|
163
|
+
}
|
164
|
+
|
165
|
+
// Produce a non-owning Waker. The waker will own a small heap allocated weak
|
166
|
+
// pointer to this activity. This is more suitable for wakeups that may not be
|
167
|
+
// delivered until long after the activity should be destroyed.
|
168
|
+
Waker MakeNonOwningWaker() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
169
|
+
|
170
|
+
protected:
|
171
|
+
// Action received during a run, in priority order.
|
172
|
+
// If more than one action is received during a run, we use max() to resolve
|
173
|
+
// which one to report (so Cancel overrides Wakeup).
|
174
|
+
enum class ActionDuringRun : uint8_t {
|
175
|
+
kNone, // No action occured during run.
|
176
|
+
kWakeup, // A wakeup occured during run.
|
177
|
+
kCancel, // Cancel was called during run.
|
178
|
+
};
|
179
|
+
|
180
|
+
inline virtual ~Activity() {
|
181
|
+
if (handle_) {
|
182
|
+
DropHandle();
|
183
|
+
}
|
184
|
+
}
|
185
|
+
|
186
|
+
// All promise execution occurs under this mutex.
|
187
|
+
Mutex mu_;
|
188
|
+
|
189
|
+
// Check if this activity is the current activity executing on the current
|
190
|
+
// thread.
|
191
|
+
bool is_current() const { return this == g_current_activity_; }
|
192
|
+
// Check if there is an activity executing on the current thread.
|
193
|
+
static bool have_current() { return g_current_activity_ != nullptr; }
|
194
|
+
// Check if we got an internal wakeup since the last time this function was
|
195
|
+
// called.
|
196
|
+
ActionDuringRun GotActionDuringRun() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
197
|
+
return absl::exchange(action_during_run_, ActionDuringRun::kNone);
|
198
|
+
}
|
199
|
+
|
200
|
+
// Set the current activity at construction, clean it up at destruction.
|
201
|
+
class ScopedActivity {
|
202
|
+
public:
|
203
|
+
explicit ScopedActivity(Activity* activity) {
|
204
|
+
GPR_ASSERT(g_current_activity_ == nullptr);
|
205
|
+
g_current_activity_ = activity;
|
206
|
+
}
|
207
|
+
~ScopedActivity() { g_current_activity_ = nullptr; }
|
208
|
+
ScopedActivity(const ScopedActivity&) = delete;
|
209
|
+
ScopedActivity& operator=(const ScopedActivity&) = delete;
|
210
|
+
};
|
211
|
+
|
212
|
+
// Implementors of Wakeable::Wakeup should call this after the wakeup has
|
213
|
+
// completed.
|
214
|
+
void WakeupComplete() { Unref(); }
|
215
|
+
|
216
|
+
// Mark the current activity as being cancelled (so we can actually cancel it
|
217
|
+
// after polling).
|
218
|
+
void CancelCurrent() {
|
219
|
+
current()->SetActionDuringRun(ActionDuringRun::kCancel);
|
220
|
+
}
|
221
|
+
|
222
|
+
private:
|
223
|
+
class Handle;
|
224
|
+
|
225
|
+
void Ref() { refs_.fetch_add(1, std::memory_order_relaxed); }
|
226
|
+
void Unref() {
|
227
|
+
if (1 == refs_.fetch_sub(1, std::memory_order_acq_rel)) {
|
228
|
+
delete this;
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
// Return a Handle instance with a ref so that it can be stored waiting for
|
233
|
+
// some wakeup.
|
234
|
+
Handle* RefHandle() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
235
|
+
// If our refcount is non-zero, ref and return true.
|
236
|
+
// Otherwise, return false.
|
237
|
+
bool RefIfNonzero();
|
238
|
+
// Drop the (proved existing) wait handle.
|
239
|
+
void DropHandle() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
|
240
|
+
// Set the action that occured during this run.
|
241
|
+
// We use max to combine actions so that cancellation overrides wakeups.
|
242
|
+
void SetActionDuringRun(ActionDuringRun action)
|
243
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
244
|
+
action_during_run_ = std::max(action_during_run_, action);
|
245
|
+
}
|
246
|
+
|
247
|
+
// Current refcount.
|
248
|
+
std::atomic<uint32_t> refs_{1};
|
249
|
+
// If wakeup is called during Promise polling, we set this to Wakeup and
|
250
|
+
// repoll. If cancel is called during Promise polling, we set this to Cancel
|
251
|
+
// and cancel at the end of polling.
|
252
|
+
ActionDuringRun action_during_run_ ABSL_GUARDED_BY(mu_) =
|
253
|
+
ActionDuringRun::kNone;
|
254
|
+
// Handle for long waits. Allows a very small weak pointer type object to
|
255
|
+
// queue for wakeups while Activity may be deleted earlier.
|
256
|
+
Handle* handle_ ABSL_GUARDED_BY(mu_) = nullptr;
|
257
|
+
// Set during RunLoop to the Activity that's executing.
|
258
|
+
// Being set implies that mu_ is held.
|
259
|
+
static GPR_THREAD_LOCAL(Activity*) g_current_activity_;
|
260
|
+
};
|
261
|
+
|
262
|
+
// Owned pointer to one Activity.
|
263
|
+
using ActivityPtr = std::unique_ptr<Activity, Activity::Deleter>;
|
264
|
+
|
265
|
+
namespace promise_detail {
|
266
|
+
|
267
|
+
template <typename Context>
|
268
|
+
class ContextHolder {
|
269
|
+
public:
|
270
|
+
explicit ContextHolder(Context value) : value_(std::move(value)) {}
|
271
|
+
Context* GetContext() { return &value_; }
|
272
|
+
|
273
|
+
private:
|
274
|
+
Context value_;
|
275
|
+
};
|
276
|
+
|
277
|
+
template <typename Context>
|
278
|
+
class ContextHolder<Context*> {
|
279
|
+
public:
|
280
|
+
explicit ContextHolder(Context* value) : value_(value) {}
|
281
|
+
Context* GetContext() { return value_; }
|
282
|
+
|
283
|
+
private:
|
284
|
+
Context* value_;
|
285
|
+
};
|
286
|
+
|
287
|
+
template <typename... Contexts>
|
288
|
+
class EnterContexts : public promise_detail::Context<Contexts>... {
|
289
|
+
public:
|
290
|
+
explicit EnterContexts(Contexts*... contexts)
|
291
|
+
: promise_detail::Context<Contexts>(contexts)... {}
|
292
|
+
};
|
293
|
+
|
294
|
+
// Implementation details for an Activity of an arbitrary type of promise.
|
295
|
+
// There should exist a static function:
|
296
|
+
// struct WakeupScheduler {
|
297
|
+
// template <typename ActivityType>
|
298
|
+
// void ScheduleWakeup(ActivityType* activity);
|
299
|
+
// };
|
300
|
+
// This function should arrange that activity->RunScheduledWakeup() be invoked
|
301
|
+
// at the earliest opportunity.
|
302
|
+
// It can assume that activity will remain live until RunScheduledWakeup() is
|
303
|
+
// invoked, and that a given activity will not be concurrently scheduled again
|
304
|
+
// until its RunScheduledWakeup() has been invoked.
|
305
|
+
template <class F, class WakeupScheduler, class OnDone, typename... Contexts>
|
306
|
+
class PromiseActivity final
|
307
|
+
: public Activity,
|
308
|
+
private promise_detail::ContextHolder<Contexts>... {
|
309
|
+
public:
|
310
|
+
using Factory = PromiseFactory<void, F>;
|
311
|
+
PromiseActivity(F promise_factory, WakeupScheduler wakeup_scheduler,
|
312
|
+
OnDone on_done, Contexts... contexts)
|
313
|
+
: Activity(),
|
314
|
+
ContextHolder<Contexts>(std::move(contexts))...,
|
315
|
+
wakeup_scheduler_(std::move(wakeup_scheduler)),
|
316
|
+
on_done_(std::move(on_done)) {
|
317
|
+
// Lock, construct an initial promise from the factory, and step it.
|
318
|
+
// This may hit a waiter, which could expose our this pointer to other
|
319
|
+
// threads, meaning we do need to hold this mutex even though we're still
|
320
|
+
// constructing.
|
321
|
+
mu_.Lock();
|
322
|
+
auto status = Start(Factory(std::move(promise_factory)));
|
323
|
+
mu_.Unlock();
|
324
|
+
// We may complete immediately.
|
325
|
+
if (status.has_value()) {
|
326
|
+
on_done_(std::move(*status));
|
327
|
+
}
|
328
|
+
}
|
329
|
+
|
330
|
+
~PromiseActivity() override {
|
331
|
+
// We shouldn't destruct without calling Cancel() first, and that must get
|
332
|
+
// us to be done_, so we assume that and have no logic to destruct the
|
333
|
+
// promise here.
|
334
|
+
GPR_ASSERT(done_);
|
335
|
+
}
|
336
|
+
|
337
|
+
size_t Size() override { return sizeof(*this); }
|
338
|
+
|
339
|
+
void Cancel() final {
|
340
|
+
if (Activity::is_current()) {
|
341
|
+
CancelCurrent();
|
342
|
+
return;
|
343
|
+
}
|
344
|
+
bool was_done;
|
345
|
+
{
|
346
|
+
MutexLock lock(&mu_);
|
347
|
+
// Check if we were done, and flag done.
|
348
|
+
was_done = done_;
|
349
|
+
if (!done_) MarkDone();
|
350
|
+
}
|
351
|
+
// If we were not done, then call the on_done callback.
|
352
|
+
if (!was_done) {
|
353
|
+
on_done_(absl::CancelledError());
|
354
|
+
}
|
355
|
+
}
|
356
|
+
|
357
|
+
void RunScheduledWakeup() {
|
358
|
+
GPR_ASSERT(wakeup_scheduled_.exchange(false, std::memory_order_acq_rel));
|
359
|
+
Step();
|
360
|
+
WakeupComplete();
|
361
|
+
}
|
362
|
+
|
363
|
+
private:
|
364
|
+
// Wakeup this activity. Arrange to poll the activity again at a convenient
|
365
|
+
// time: this could be inline if it's deemed safe, or it could be by passing
|
366
|
+
// the activity to an external threadpool to run. If the activity is already
|
367
|
+
// running on this thread, a note is taken of such and the activity is
|
368
|
+
// repolled if it doesn't complete.
|
369
|
+
void Wakeup() final {
|
370
|
+
// If there is an active activity, but hey it's us, flag that and we'll loop
|
371
|
+
// in RunLoop (that's calling from above here!).
|
372
|
+
if (Activity::is_current()) {
|
373
|
+
WakeupCurrent();
|
374
|
+
WakeupComplete();
|
375
|
+
return;
|
376
|
+
}
|
377
|
+
if (!wakeup_scheduled_.exchange(true, std::memory_order_acq_rel)) {
|
378
|
+
// Can't safely run, so ask to run later.
|
379
|
+
wakeup_scheduler_.ScheduleWakeup(this);
|
380
|
+
} else {
|
381
|
+
// Already a wakeup scheduled for later, drop ref.
|
382
|
+
WakeupComplete();
|
383
|
+
}
|
384
|
+
}
|
385
|
+
|
386
|
+
// Drop a wakeup
|
387
|
+
void Drop() final { this->WakeupComplete(); }
|
388
|
+
|
389
|
+
// Notification that we're no longer executing - it's ok to destruct the
|
390
|
+
// promise.
|
391
|
+
void MarkDone() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
392
|
+
GPR_ASSERT(!done_);
|
393
|
+
done_ = true;
|
394
|
+
Destruct(&promise_holder_.promise);
|
395
|
+
}
|
396
|
+
|
397
|
+
// In response to Wakeup, run the Promise state machine again until it
|
398
|
+
// settles. Then check for completion, and if we have completed, call on_done.
|
399
|
+
void Step() ABSL_LOCKS_EXCLUDED(mu_) {
|
400
|
+
// Poll the promise until things settle out under a lock.
|
401
|
+
mu_.Lock();
|
402
|
+
if (done_) {
|
403
|
+
// We might get some spurious wakeups after finishing.
|
404
|
+
mu_.Unlock();
|
405
|
+
return;
|
406
|
+
}
|
407
|
+
auto status = RunStep();
|
408
|
+
mu_.Unlock();
|
409
|
+
if (status.has_value()) {
|
410
|
+
on_done_(std::move(*status));
|
411
|
+
}
|
412
|
+
}
|
413
|
+
|
414
|
+
// The main body of a step: set the current activity, and any contexts, and
|
415
|
+
// then run the main polling loop. Contained in a function by itself in order
|
416
|
+
// to keep the scoping rules a little easier in Step().
|
417
|
+
absl::optional<absl::Status> RunStep() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
418
|
+
ScopedActivity scoped_activity(this);
|
419
|
+
EnterContexts<Contexts...> contexts(
|
420
|
+
static_cast<ContextHolder<Contexts>*>(this)->GetContext()...);
|
421
|
+
return StepLoop();
|
422
|
+
}
|
423
|
+
|
424
|
+
// Similarly to RunStep, but additionally construct the promise from a promise
|
425
|
+
// factory before entering the main loop. Called once from the constructor.
|
426
|
+
absl::optional<absl::Status> Start(Factory promise_factory)
|
427
|
+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
428
|
+
ScopedActivity scoped_activity(this);
|
429
|
+
EnterContexts<Contexts...> contexts(
|
430
|
+
static_cast<ContextHolder<Contexts>*>(this)->GetContext()...);
|
431
|
+
Construct(&promise_holder_.promise, promise_factory.Once());
|
432
|
+
return StepLoop();
|
433
|
+
}
|
434
|
+
|
435
|
+
// Until there are no wakeups from within and the promise is incomplete: poll
|
436
|
+
// the promise.
|
437
|
+
absl::optional<absl::Status> StepLoop() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
|
438
|
+
GPR_ASSERT(is_current());
|
439
|
+
while (true) {
|
440
|
+
// Run the promise.
|
441
|
+
GPR_ASSERT(!done_);
|
442
|
+
auto r = promise_holder_.promise();
|
443
|
+
if (auto* status = absl::get_if<kPollReadyIdx>(&r)) {
|
444
|
+
// If complete, destroy the promise, flag done, and exit this loop.
|
445
|
+
MarkDone();
|
446
|
+
return IntoStatus(status);
|
447
|
+
}
|
448
|
+
// Continue looping til no wakeups occur.
|
449
|
+
switch (GotActionDuringRun()) {
|
450
|
+
case ActionDuringRun::kNone:
|
451
|
+
return {};
|
452
|
+
case ActionDuringRun::kWakeup:
|
453
|
+
break;
|
454
|
+
case ActionDuringRun::kCancel:
|
455
|
+
MarkDone();
|
456
|
+
return absl::CancelledError();
|
457
|
+
}
|
458
|
+
}
|
459
|
+
}
|
460
|
+
|
461
|
+
using Promise = typename Factory::Promise;
|
462
|
+
// Scheduler for wakeups
|
463
|
+
GPR_NO_UNIQUE_ADDRESS WakeupScheduler wakeup_scheduler_;
|
464
|
+
// Callback on completion of the promise.
|
465
|
+
GPR_NO_UNIQUE_ADDRESS OnDone on_done_;
|
466
|
+
// Has execution completed?
|
467
|
+
GPR_NO_UNIQUE_ADDRESS bool done_ ABSL_GUARDED_BY(mu_) = false;
|
468
|
+
// Is there a wakeup scheduled?
|
469
|
+
GPR_NO_UNIQUE_ADDRESS std::atomic<bool> wakeup_scheduled_{false};
|
470
|
+
// We wrap the promise in a union to allow control over the construction
|
471
|
+
// simultaneously with annotating mutex requirements and noting that the
|
472
|
+
// promise contained may not use any memory.
|
473
|
+
union PromiseHolder {
|
474
|
+
PromiseHolder() {}
|
475
|
+
~PromiseHolder() {}
|
476
|
+
GPR_NO_UNIQUE_ADDRESS Promise promise;
|
477
|
+
};
|
478
|
+
GPR_NO_UNIQUE_ADDRESS PromiseHolder promise_holder_ ABSL_GUARDED_BY(mu_);
|
479
|
+
};
|
480
|
+
|
481
|
+
} // namespace promise_detail
|
482
|
+
|
483
|
+
// Given a functor that returns a promise (a promise factory), a callback for
|
484
|
+
// completion, and a callback scheduler, construct an activity.
|
485
|
+
template <typename Factory, typename WakeupScheduler, typename OnDone,
|
486
|
+
typename... Contexts>
|
487
|
+
ActivityPtr MakeActivity(Factory promise_factory,
|
488
|
+
WakeupScheduler wakeup_scheduler, OnDone on_done,
|
489
|
+
Contexts... contexts) {
|
490
|
+
return ActivityPtr(
|
491
|
+
new promise_detail::PromiseActivity<Factory, WakeupScheduler, OnDone,
|
492
|
+
Contexts...>(
|
493
|
+
std::move(promise_factory), std::move(wakeup_scheduler),
|
494
|
+
std::move(on_done), std::move(contexts)...));
|
495
|
+
}
|
496
|
+
|
497
|
+
} // namespace grpc_core
|
498
|
+
|
499
|
+
#endif // GRPC_CORE_LIB_PROMISE_ACTIVITY_H
|
@@ -0,0 +1,86 @@
|
|
1
|
+
// Copyright 2021 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_PROMISE_CONTEXT_H
|
16
|
+
#define GRPC_CORE_LIB_PROMISE_CONTEXT_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <type_traits>
|
21
|
+
#include <utility>
|
22
|
+
|
23
|
+
#include "src/core/lib/gpr/tls.h"
|
24
|
+
|
25
|
+
namespace grpc_core {
|
26
|
+
|
27
|
+
// To avoid accidentally creating context types, we require an explicit
|
28
|
+
// specialization of this template per context type. The specialization need
|
29
|
+
// not contain any members, only exist.
|
30
|
+
// The reason for avoiding this is that context types each use a thread local.
|
31
|
+
template <typename T>
|
32
|
+
struct ContextType;
|
33
|
+
|
34
|
+
namespace promise_detail {
|
35
|
+
|
36
|
+
template <typename T>
|
37
|
+
class Context : public ContextType<T> {
|
38
|
+
public:
|
39
|
+
explicit Context(T* p) : old_(current_) { current_ = p; }
|
40
|
+
~Context() { current_ = old_; }
|
41
|
+
Context(const Context&) = delete;
|
42
|
+
Context& operator=(const Context&) = delete;
|
43
|
+
|
44
|
+
static T* get() { return current_; }
|
45
|
+
|
46
|
+
private:
|
47
|
+
T* const old_;
|
48
|
+
static GPR_THREAD_LOCAL(T*) current_;
|
49
|
+
};
|
50
|
+
|
51
|
+
template <typename T>
|
52
|
+
GPR_THREAD_LOCAL(T*)
|
53
|
+
Context<T>::current_;
|
54
|
+
|
55
|
+
template <typename T, typename F>
|
56
|
+
class WithContext {
|
57
|
+
public:
|
58
|
+
WithContext(F f, T* context) : context_(context), f_(std::move(f)) {}
|
59
|
+
|
60
|
+
decltype(std::declval<F>()()) operator()() {
|
61
|
+
Context<T> ctx(context_);
|
62
|
+
return f_();
|
63
|
+
}
|
64
|
+
|
65
|
+
private:
|
66
|
+
T* context_;
|
67
|
+
F f_;
|
68
|
+
};
|
69
|
+
|
70
|
+
} // namespace promise_detail
|
71
|
+
|
72
|
+
// Retrieve the current value of a context.
|
73
|
+
template <typename T>
|
74
|
+
T* GetContext() {
|
75
|
+
return promise_detail::Context<T>::get();
|
76
|
+
}
|
77
|
+
|
78
|
+
// Given a promise and a context, return a promise that has that context set.
|
79
|
+
template <typename T, typename F>
|
80
|
+
promise_detail::WithContext<T, F> WithContext(F f, T* context) {
|
81
|
+
return promise_detail::WithContext<T, F>(f, context);
|
82
|
+
}
|
83
|
+
|
84
|
+
} // namespace grpc_core
|
85
|
+
|
86
|
+
#endif // GRPC_CORE_LIB_PROMISE_CONTEXT_H
|