grpc 1.18.0 → 1.22.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +4731 -7404
- data/etc/roots.pem +146 -0
- data/include/grpc/grpc.h +11 -6
- data/include/grpc/grpc_security.h +297 -4
- data/include/grpc/grpc_security_constants.h +1 -1
- data/include/grpc/impl/codegen/byte_buffer.h +13 -0
- data/include/grpc/impl/codegen/gpr_types.h +1 -1
- data/include/grpc/impl/codegen/grpc_types.h +30 -7
- data/include/grpc/impl/codegen/port_platform.h +88 -7
- data/include/grpc/impl/codegen/slice.h +2 -22
- data/include/grpc/impl/codegen/status.h +2 -1
- data/include/grpc/impl/codegen/sync_posix.h +18 -0
- data/include/grpc/slice.h +3 -3
- data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
- data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
- data/src/core/ext/filters/client_channel/client_channel.h +2 -10
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
- data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
- data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
- data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
- data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
- data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
- data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
- data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
- data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
- data/src/core/ext/filters/client_channel/resolver.cc +54 -1
- data/src/core/ext/filters/client_channel/resolver.h +52 -23
- data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
- data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
- data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
- data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
- data/src/core/ext/filters/client_channel/server_address.cc +4 -54
- data/src/core/ext/filters/client_channel/server_address.h +1 -13
- data/src/core/ext/filters/client_channel/service_config.cc +329 -0
- data/src/core/ext/filters/client_channel/service_config.h +205 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
- data/src/core/ext/filters/client_channel/subchannel.h +295 -128
- data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
- data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
- data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
- data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
- data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
- data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
- data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
- data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
- data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
- data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
- data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
- data/src/core/lib/channel/channel_args.cc +2 -101
- data/src/core/lib/channel/channel_args.h +3 -37
- data/src/core/lib/channel/channel_stack.h +10 -6
- data/src/core/lib/channel/channel_trace.cc +4 -4
- data/src/core/lib/channel/channel_trace.h +4 -4
- data/src/core/lib/channel/channelz.cc +168 -38
- data/src/core/lib/channel/channelz.h +40 -44
- data/src/core/lib/channel/channelz_registry.cc +75 -107
- data/src/core/lib/channel/channelz_registry.h +10 -28
- data/src/core/lib/channel/connected_channel.cc +2 -2
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/channel/handshaker.cc +151 -218
- data/src/core/lib/channel/handshaker.h +110 -101
- data/src/core/lib/channel/handshaker_factory.h +11 -19
- data/src/core/lib/channel/handshaker_registry.cc +67 -51
- data/src/core/lib/channel/handshaker_registry.h +21 -16
- data/src/core/lib/compression/algorithm_metadata.h +3 -3
- data/src/core/lib/compression/compression.cc +14 -9
- data/src/core/lib/compression/compression_args.cc +127 -0
- data/src/core/lib/compression/compression_args.h +55 -0
- data/src/core/lib/compression/compression_internal.cc +16 -12
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/compression/stream_compression.cc +3 -2
- data/src/core/lib/compression/stream_compression.h +2 -2
- data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
- data/src/core/lib/debug/trace.cc +13 -7
- data/src/core/lib/debug/trace.h +14 -1
- data/src/core/lib/gpr/arena.h +13 -9
- data/src/core/lib/gpr/cpu_posix.cc +5 -3
- data/src/core/lib/gpr/env.h +3 -6
- data/src/core/lib/gpr/env_linux.cc +6 -1
- data/src/core/lib/gpr/env_posix.cc +5 -0
- data/src/core/lib/gpr/env_windows.cc +7 -5
- data/src/core/lib/gpr/log.cc +9 -13
- data/src/core/lib/gpr/log_posix.cc +2 -1
- data/src/core/lib/gpr/string.cc +20 -7
- data/src/core/lib/gpr/string.h +10 -3
- data/src/core/lib/gpr/sync_posix.cc +65 -4
- data/src/core/lib/gpr/time.cc +8 -0
- data/src/core/lib/gpr/time_posix.cc +21 -2
- data/src/core/lib/gprpp/arena.cc +103 -0
- data/src/core/lib/gprpp/arena.h +121 -0
- data/src/core/lib/gprpp/atomic.h +75 -5
- data/src/core/lib/gprpp/fork.cc +13 -32
- data/src/core/lib/gprpp/fork.h +5 -1
- data/src/core/lib/gprpp/global_config.h +96 -0
- data/src/core/lib/gprpp/global_config_custom.h +29 -0
- data/src/core/lib/gprpp/global_config_env.cc +135 -0
- data/src/core/lib/gprpp/global_config_env.h +131 -0
- data/src/core/lib/gprpp/global_config_generic.h +44 -0
- data/src/core/lib/gprpp/inlined_vector.h +8 -0
- data/src/core/lib/gprpp/map.h +436 -0
- data/src/core/lib/gprpp/memory.h +2 -2
- data/src/core/lib/gprpp/optional.h +48 -0
- data/src/core/lib/gprpp/orphanable.h +6 -5
- data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
- data/src/core/lib/gprpp/ref_counted.h +36 -17
- data/src/core/lib/gprpp/sync.h +126 -0
- data/src/core/lib/gprpp/thd.h +42 -7
- data/src/core/lib/gprpp/thd_posix.cc +31 -13
- data/src/core/lib/gprpp/thd_windows.cc +47 -34
- data/src/core/lib/http/httpcli.cc +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +13 -15
- data/src/core/lib/http/parser.cc +3 -2
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/buffer_list.cc +182 -24
- data/src/core/lib/iomgr/buffer_list.h +72 -10
- data/src/core/lib/iomgr/call_combiner.cc +84 -90
- data/src/core/lib/iomgr/call_combiner.h +75 -82
- data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
- data/src/core/lib/iomgr/cfstream_handle.h +86 -0
- data/src/core/lib/iomgr/combiner.cc +11 -3
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/endpoint.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +3 -2
- data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
- data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
- data/src/core/lib/iomgr/error.cc +21 -17
- data/src/core/lib/iomgr/error.h +36 -6
- data/src/core/lib/iomgr/error_cfstream.cc +52 -0
- data/src/core/lib/iomgr/error_cfstream.h +31 -0
- data/src/core/lib/iomgr/error_internal.h +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
- data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
- data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
- data/src/core/lib/iomgr/ev_posix.cc +29 -19
- data/src/core/lib/iomgr/ev_posix.h +19 -3
- data/src/core/lib/iomgr/ev_windows.cc +2 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -0
- data/src/core/lib/iomgr/exec_ctx.h +137 -8
- data/src/core/lib/iomgr/executor.cc +147 -95
- data/src/core/lib/iomgr/executor.h +55 -49
- data/src/core/lib/iomgr/fork_posix.cc +6 -5
- data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
- data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
- data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
- data/src/core/lib/iomgr/internal_errqueue.h +105 -3
- data/src/core/lib/iomgr/iomgr.cc +20 -13
- data/src/core/lib/iomgr/iomgr.h +15 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
- data/src/core/lib/iomgr/iomgr_custom.h +2 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
- data/src/core/lib/iomgr/iomgr_internal.h +12 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
- data/src/core/lib/iomgr/lockfree_event.cc +4 -4
- data/src/core/lib/iomgr/port.h +35 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
- data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
- data/src/core/lib/iomgr/resource_quota.cc +40 -37
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
- data/src/core/lib/iomgr/socket_windows.cc +19 -0
- data/src/core/lib/iomgr/socket_windows.h +8 -0
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
- data/src/core/lib/iomgr/tcp_custom.cc +10 -14
- data/src/core/lib/iomgr/tcp_posix.cc +256 -140
- data/src/core/lib/iomgr/tcp_server.cc +5 -0
- data/src/core/lib/iomgr/tcp_server.h +24 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
- data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
- data/src/core/lib/iomgr/tcp_uv.cc +5 -7
- data/src/core/lib/iomgr/tcp_windows.cc +8 -14
- data/src/core/lib/iomgr/timer.h +2 -1
- data/src/core/lib/iomgr/timer_generic.cc +16 -16
- data/src/core/lib/iomgr/timer_manager.cc +20 -11
- data/src/core/lib/iomgr/udp_server.cc +8 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
- data/src/core/lib/json/json.cc +1 -4
- data/src/core/lib/profiling/basic_timers.cc +10 -4
- data/src/core/lib/security/context/security_context.cc +6 -7
- data/src/core/lib/security/context/security_context.h +3 -4
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
- data/src/core/lib/security/credentials/credentials.h +9 -1
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
- data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
- data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
- data/src/core/lib/security/security_connector/security_connector.cc +0 -1
- data/src/core/lib/security/security_connector/security_connector.h +3 -3
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
- data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
- data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
- data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
- data/src/core/lib/security/transport/auth_filters.h +5 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
- data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
- data/src/core/lib/security/transport/security_handshaker.cc +271 -303
- data/src/core/lib/security/transport/security_handshaker.h +11 -2
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
- data/src/core/lib/slice/b64.h +2 -2
- data/src/core/lib/slice/percent_encoding.cc +3 -3
- data/src/core/lib/slice/percent_encoding.h +3 -3
- data/src/core/lib/slice/slice.cc +174 -122
- data/src/core/lib/slice/slice_buffer.cc +54 -21
- data/src/core/lib/slice/slice_hash_table.h +4 -4
- data/src/core/lib/slice/slice_intern.cc +49 -107
- data/src/core/lib/slice/slice_internal.h +264 -3
- data/src/core/lib/slice/slice_string_helpers.cc +10 -1
- data/src/core/lib/slice/slice_string_helpers.h +3 -1
- data/src/core/lib/slice/slice_utils.h +50 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
- data/src/core/lib/surface/api_trace.h +1 -1
- data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
- data/src/core/lib/surface/call.cc +67 -46
- data/src/core/lib/surface/call.h +7 -2
- data/src/core/lib/surface/call_details.cc +0 -1
- data/src/core/lib/surface/channel.cc +89 -97
- data/src/core/lib/surface/channel.h +60 -6
- data/src/core/lib/surface/channel_init.h +5 -0
- data/src/core/lib/surface/completion_queue.cc +221 -216
- data/src/core/lib/surface/completion_queue.h +2 -1
- data/src/core/lib/surface/init.cc +82 -33
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.cc +1 -1
- data/src/core/lib/surface/lame_client.cc +5 -7
- data/src/core/lib/surface/server.cc +42 -47
- data/src/core/lib/surface/validate_metadata.cc +14 -8
- data/src/core/lib/surface/validate_metadata.h +13 -2
- data/src/core/lib/surface/version.cc +1 -1
- data/src/core/lib/transport/bdp_estimator.cc +3 -3
- data/src/core/lib/transport/bdp_estimator.h +2 -2
- data/src/core/lib/transport/connectivity_state.cc +10 -40
- data/src/core/lib/transport/connectivity_state.h +0 -8
- data/src/core/lib/transport/error_utils.cc +12 -0
- data/src/core/lib/transport/metadata.cc +258 -267
- data/src/core/lib/transport/metadata.h +227 -16
- data/src/core/lib/transport/metadata_batch.cc +1 -1
- data/src/core/lib/transport/metadata_batch.h +1 -1
- data/src/core/lib/transport/static_metadata.cc +477 -399
- data/src/core/lib/transport/static_metadata.h +273 -182
- data/src/core/lib/transport/status_metadata.cc +3 -3
- data/src/core/lib/transport/timeout_encoding.cc +1 -1
- data/src/core/lib/transport/timeout_encoding.h +1 -1
- data/src/core/lib/transport/transport.cc +39 -72
- data/src/core/lib/transport/transport.h +59 -24
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
- data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
- data/src/core/tsi/fake_transport_security.cc +4 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
- data/src/core/tsi/ssl_transport_security.cc +12 -10
- data/src/core/tsi/ssl_transport_security.h +24 -4
- data/src/ruby/bin/math_pb.rb +18 -16
- data/src/ruby/ext/grpc/extconf.rb +12 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
- data/src/ruby/ext/grpc/rb_channel.c +14 -10
- data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
- data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
- data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc.c +23 -24
- data/src/ruby/ext/grpc/rb_grpc.h +4 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
- data/src/ruby/ext/grpc/rb_server.c +8 -4
- data/src/ruby/lib/grpc/errors.rb +22 -3
- data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/README.md +1 -1
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
- data/src/ruby/spec/errors_spec.rb +141 -0
- data/third_party/cares/cares/ares.h +12 -0
- data/third_party/cares/cares/ares_create_query.c +5 -1
- data/third_party/cares/cares/ares_data.c +74 -73
- data/third_party/cares/cares/ares_destroy.c +6 -1
- data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
- data/third_party/cares/cares/ares_gethostbyname.c +15 -4
- data/third_party/cares/cares/ares_getnameinfo.c +11 -0
- data/third_party/cares/cares/ares_init.c +274 -173
- data/third_party/cares/cares/ares_library_init.c +21 -3
- data/third_party/cares/cares/ares_options.c +6 -2
- data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
- data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
- data/third_party/cares/cares/ares_platform.c +7 -0
- data/third_party/cares/cares/ares_private.h +19 -11
- data/third_party/cares/cares/ares_process.c +27 -2
- data/third_party/cares/cares/ares_rules.h +1 -1
- data/third_party/cares/cares/ares_search.c +7 -0
- data/third_party/cares/cares/ares_send.c +6 -0
- data/third_party/cares/cares/ares_strsplit.c +174 -0
- data/third_party/cares/cares/ares_strsplit.h +43 -0
- data/third_party/cares/cares/ares_version.h +4 -4
- data/third_party/cares/cares/config-win32.h +1 -1
- data/third_party/cares/cares/inet_ntop.c +2 -3
- data/third_party/cares/config_darwin/ares_config.h +3 -0
- data/third_party/cares/config_freebsd/ares_config.h +3 -0
- data/third_party/cares/config_linux/ares_config.h +3 -0
- data/third_party/cares/config_openbsd/ares_config.h +3 -0
- metadata +83 -48
- data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
- data/src/core/ext/filters/client_channel/request_routing.h +0 -177
- data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
- data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
- data/src/core/lib/channel/handshaker_factory.cc +0 -42
- data/src/core/lib/gpr/arena.cc +0 -192
- data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
- data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
- data/src/core/lib/transport/service_config.cc +0 -106
- data/src/core/lib/transport/service_config.h +0 -249
@@ -24,16 +24,20 @@
|
|
24
24
|
#include <poll.h>
|
25
25
|
|
26
26
|
#include "src/core/lib/debug/trace.h"
|
27
|
+
#include "src/core/lib/gprpp/global_config.h"
|
27
28
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
28
29
|
#include "src/core/lib/iomgr/pollset.h"
|
29
30
|
#include "src/core/lib/iomgr/pollset_set.h"
|
30
31
|
#include "src/core/lib/iomgr/wakeup_fd_posix.h"
|
31
32
|
|
32
|
-
|
33
|
-
|
33
|
+
GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_poll_strategy);
|
34
|
+
|
35
|
+
extern grpc_core::DebugOnlyTraceFlag grpc_fd_trace; /* Disabled by default */
|
36
|
+
extern grpc_core::DebugOnlyTraceFlag
|
37
|
+
grpc_polling_trace; /* Disabled by default */
|
34
38
|
|
35
39
|
#define GRPC_FD_TRACE(format, ...) \
|
36
|
-
if (grpc_fd_trace
|
40
|
+
if (GRPC_TRACE_FLAG_ENABLED(grpc_fd_trace)) { \
|
37
41
|
gpr_log(GPR_INFO, "(fd-trace) " format, __VA_ARGS__); \
|
38
42
|
}
|
39
43
|
|
@@ -80,8 +84,11 @@ typedef struct grpc_event_engine_vtable {
|
|
80
84
|
void (*pollset_set_add_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd);
|
81
85
|
void (*pollset_set_del_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd);
|
82
86
|
|
87
|
+
bool (*is_any_background_poller_thread)(void);
|
83
88
|
void (*shutdown_background_closure)(void);
|
84
89
|
void (*shutdown_engine)(void);
|
90
|
+
bool (*add_closure_to_background_poller)(grpc_closure* closure,
|
91
|
+
grpc_error* error);
|
85
92
|
} grpc_event_engine_vtable;
|
86
93
|
|
87
94
|
/* register a new event engine factory */
|
@@ -181,6 +188,15 @@ void grpc_pollset_add_fd(grpc_pollset* pollset, struct grpc_fd* fd);
|
|
181
188
|
void grpc_pollset_set_add_fd(grpc_pollset_set* pollset_set, grpc_fd* fd);
|
182
189
|
void grpc_pollset_set_del_fd(grpc_pollset_set* pollset_set, grpc_fd* fd);
|
183
190
|
|
191
|
+
/* Returns true if the caller is a worker thread for any background poller. */
|
192
|
+
bool grpc_is_any_background_poller_thread();
|
193
|
+
|
194
|
+
/* Returns true if the closure is registered into the background poller. Note
|
195
|
+
* that the closure may or may not run yet when this function returns, and the
|
196
|
+
* closure should not be blocking or long-running. */
|
197
|
+
bool grpc_add_closure_to_background_poller(grpc_closure* closure,
|
198
|
+
grpc_error* error);
|
199
|
+
|
184
200
|
/* Shut down all the closures registered in the background poller. */
|
185
201
|
void grpc_shutdown_background_closure();
|
186
202
|
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
#include "src/core/lib/debug/trace.h"
|
26
26
|
|
27
|
-
grpc_core::
|
28
|
-
|
27
|
+
grpc_core::DebugOnlyTraceFlag grpc_polling_trace(
|
28
|
+
false, "polling"); /* Disabled by default */
|
29
29
|
|
30
30
|
#endif // GRPC_WINSOCK_SOCKET
|
@@ -115,6 +115,7 @@ grpc_closure_scheduler* grpc_schedule_on_exec_ctx = &exec_ctx_scheduler;
|
|
115
115
|
|
116
116
|
namespace grpc_core {
|
117
117
|
GPR_TLS_CLASS_DEF(ExecCtx::exec_ctx_);
|
118
|
+
GPR_TLS_CLASS_DEF(ApplicationCallbackExecCtx::callback_exec_ctx_);
|
118
119
|
|
119
120
|
// WARNING: for testing purposes only!
|
120
121
|
void ExecCtx::TestOnlyGlobalInit(gpr_timespec new_val) {
|
@@ -21,6 +21,7 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
+
#include <grpc/impl/codegen/grpc_types.h>
|
24
25
|
#include <grpc/support/atm.h>
|
25
26
|
#include <grpc/support/cpu.h>
|
26
27
|
#include <grpc/support/log.h>
|
@@ -34,9 +35,8 @@ typedef int64_t grpc_millis;
|
|
34
35
|
#define GRPC_MILLIS_INF_FUTURE INT64_MAX
|
35
36
|
#define GRPC_MILLIS_INF_PAST INT64_MIN
|
36
37
|
|
37
|
-
/** A
|
38
|
-
Forward declared here to avoid a circular dependency with
|
39
|
-
typedef struct grpc_workqueue grpc_workqueue;
|
38
|
+
/** A combiner represents a list of work to be executed later.
|
39
|
+
Forward declared here to avoid a circular dependency with combiner.h. */
|
40
40
|
typedef struct grpc_combiner grpc_combiner;
|
41
41
|
|
42
42
|
/* This exec_ctx is ready to return: either pre-populated, or cached as soon as
|
@@ -49,6 +49,10 @@ typedef struct grpc_combiner grpc_combiner;
|
|
49
49
|
be counted by fork handlers */
|
50
50
|
#define GRPC_EXEC_CTX_FLAG_IS_INTERNAL_THREAD 4
|
51
51
|
|
52
|
+
/* This application callback exec ctx was initialized by an internal thread, and
|
53
|
+
should not be counted by fork handlers */
|
54
|
+
#define GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD 1
|
55
|
+
|
52
56
|
extern grpc_closure_scheduler* grpc_schedule_on_exec_ctx;
|
53
57
|
|
54
58
|
gpr_timespec grpc_millis_to_timespec(grpc_millis millis, gpr_clock_type clock);
|
@@ -58,8 +62,8 @@ grpc_millis grpc_timespec_to_millis_round_up(gpr_timespec timespec);
|
|
58
62
|
namespace grpc_core {
|
59
63
|
/** Execution context.
|
60
64
|
* A bag of data that collects information along a callstack.
|
61
|
-
* It is created on the stack at public API
|
62
|
-
* as a thread-local variable.
|
65
|
+
* It is created on the stack at core entry points (public API or iomgr), and
|
66
|
+
* stored internally as a thread-local variable.
|
63
67
|
*
|
64
68
|
* Generally, to create an exec_ctx instance, add the following line at the top
|
65
69
|
* of the public API entry point or at the start of a thread's work function :
|
@@ -70,7 +74,7 @@ namespace grpc_core {
|
|
70
74
|
* grpc_core::ExecCtx::Get()
|
71
75
|
*
|
72
76
|
* Specific responsibilities (this may grow in the future):
|
73
|
-
* - track a list of work that needs to be delayed until the
|
77
|
+
* - track a list of core work that needs to be delayed until the base of the
|
74
78
|
* call stack (this provides a convenient mechanism to run callbacks
|
75
79
|
* without worrying about locking issues)
|
76
80
|
* - provide a decision maker (via IsReadyToFinish) that provides a
|
@@ -80,10 +84,19 @@ namespace grpc_core {
|
|
80
84
|
* CONVENTIONS:
|
81
85
|
* - Instance of this must ALWAYS be constructed on the stack, never
|
82
86
|
* heap allocated.
|
83
|
-
* - Exactly one instance of ExecCtx must be created per thread. Instances must
|
84
|
-
* always be called exec_ctx.
|
85
87
|
* - Do not pass exec_ctx as a parameter to a function. Always access it using
|
86
88
|
* grpc_core::ExecCtx::Get().
|
89
|
+
* - NOTE: In the future, the convention is likely to change to allow only one
|
90
|
+
* ExecCtx on a thread's stack at the same time. The TODO below
|
91
|
+
* discusses this plan in more detail.
|
92
|
+
*
|
93
|
+
* TODO(yashykt): Only allow one "active" ExecCtx on a thread at the same time.
|
94
|
+
* Stage 1: If a new one is created on the stack, it should just
|
95
|
+
* pass-through to the underlying ExecCtx deeper in the thread's
|
96
|
+
* stack.
|
97
|
+
* Stage 2: Assert if a 2nd one is ever created on the stack
|
98
|
+
* since that implies a core re-entry outside of application
|
99
|
+
* callbacks.
|
87
100
|
*/
|
88
101
|
class ExecCtx {
|
89
102
|
public:
|
@@ -226,6 +239,122 @@ class ExecCtx {
|
|
226
239
|
GPR_TLS_CLASS_DECL(exec_ctx_);
|
227
240
|
ExecCtx* last_exec_ctx_ = Get();
|
228
241
|
};
|
242
|
+
|
243
|
+
/** Application-callback execution context.
|
244
|
+
* A bag of data that collects information along a callstack.
|
245
|
+
* It is created on the stack at core entry points, and stored internally
|
246
|
+
* as a thread-local variable.
|
247
|
+
*
|
248
|
+
* There are three key differences between this structure and ExecCtx:
|
249
|
+
* 1. ApplicationCallbackExecCtx builds a list of application-level
|
250
|
+
* callbacks, but ExecCtx builds a list of internal callbacks to invoke.
|
251
|
+
* 2. ApplicationCallbackExecCtx invokes its callbacks only at destruction;
|
252
|
+
* there is no explicit Flush method.
|
253
|
+
* 3. If more than one ApplicationCallbackExecCtx is created on the thread's
|
254
|
+
* stack, only the one closest to the base of the stack is actually
|
255
|
+
* active and this is the only one that enqueues application callbacks.
|
256
|
+
* (Unlike ExecCtx, it is not feasible to prevent multiple of these on the
|
257
|
+
* stack since the executing application callback may itself enter core.
|
258
|
+
* However, the new one created will just pass callbacks through to the
|
259
|
+
* base one and those will not be executed until the return to the
|
260
|
+
* destructor of the base one, preventing unlimited stack growth.)
|
261
|
+
*
|
262
|
+
* This structure exists because application callbacks may themselves cause a
|
263
|
+
* core re-entry (e.g., through a public API call) and if that call in turn
|
264
|
+
* causes another application-callback, there could be arbitrarily growing
|
265
|
+
* stacks of core re-entries. Instead, any application callbacks instead should
|
266
|
+
* not be invoked until other core work is done and other application callbacks
|
267
|
+
* have completed. To accomplish this, any application callback should be
|
268
|
+
* enqueued using grpc_core::ApplicationCallbackExecCtx::Enqueue .
|
269
|
+
*
|
270
|
+
* CONVENTIONS:
|
271
|
+
* - Instances of this must ALWAYS be constructed on the stack, never
|
272
|
+
* heap allocated.
|
273
|
+
* - Instances of this are generally constructed before ExecCtx when needed.
|
274
|
+
* The only exception is for ExecCtx's that are explicitly flushed and
|
275
|
+
* that survive beyond the scope of the function that can cause application
|
276
|
+
* callbacks to be invoked (e.g., in the timer thread).
|
277
|
+
*
|
278
|
+
* Generally, core entry points that may trigger application-level callbacks
|
279
|
+
* will have the following declarations:
|
280
|
+
*
|
281
|
+
* grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
|
282
|
+
* grpc_core::ExecCtx exec_ctx;
|
283
|
+
*
|
284
|
+
* This ordering is important to make sure that the ApplicationCallbackExecCtx
|
285
|
+
* is destroyed after the ExecCtx (to prevent the re-entry problem described
|
286
|
+
* above, as well as making sure that ExecCtx core callbacks are invoked first)
|
287
|
+
*
|
288
|
+
*/
|
289
|
+
|
290
|
+
class ApplicationCallbackExecCtx {
|
291
|
+
public:
|
292
|
+
/** Default Constructor */
|
293
|
+
ApplicationCallbackExecCtx() { Set(this, flags_); }
|
294
|
+
|
295
|
+
/** Parameterised Constructor */
|
296
|
+
ApplicationCallbackExecCtx(uintptr_t fl) : flags_(fl) { Set(this, flags_); }
|
297
|
+
|
298
|
+
~ApplicationCallbackExecCtx() {
|
299
|
+
if (reinterpret_cast<ApplicationCallbackExecCtx*>(
|
300
|
+
gpr_tls_get(&callback_exec_ctx_)) == this) {
|
301
|
+
while (head_ != nullptr) {
|
302
|
+
auto* f = head_;
|
303
|
+
head_ = f->internal_next;
|
304
|
+
if (f->internal_next == nullptr) {
|
305
|
+
tail_ = nullptr;
|
306
|
+
}
|
307
|
+
(*f->functor_run)(f, f->internal_success);
|
308
|
+
}
|
309
|
+
gpr_tls_set(&callback_exec_ctx_, reinterpret_cast<intptr_t>(nullptr));
|
310
|
+
if (!(GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD & flags_)) {
|
311
|
+
grpc_core::Fork::DecExecCtxCount();
|
312
|
+
}
|
313
|
+
} else {
|
314
|
+
GPR_DEBUG_ASSERT(head_ == nullptr);
|
315
|
+
GPR_DEBUG_ASSERT(tail_ == nullptr);
|
316
|
+
}
|
317
|
+
}
|
318
|
+
|
319
|
+
static void Set(ApplicationCallbackExecCtx* exec_ctx, uintptr_t flags) {
|
320
|
+
if (reinterpret_cast<ApplicationCallbackExecCtx*>(
|
321
|
+
gpr_tls_get(&callback_exec_ctx_)) == nullptr) {
|
322
|
+
if (!(GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD & flags)) {
|
323
|
+
grpc_core::Fork::IncExecCtxCount();
|
324
|
+
}
|
325
|
+
gpr_tls_set(&callback_exec_ctx_, reinterpret_cast<intptr_t>(exec_ctx));
|
326
|
+
}
|
327
|
+
}
|
328
|
+
|
329
|
+
static void Enqueue(grpc_experimental_completion_queue_functor* functor,
|
330
|
+
int is_success) {
|
331
|
+
functor->internal_success = is_success;
|
332
|
+
functor->internal_next = nullptr;
|
333
|
+
|
334
|
+
auto* ctx = reinterpret_cast<ApplicationCallbackExecCtx*>(
|
335
|
+
gpr_tls_get(&callback_exec_ctx_));
|
336
|
+
|
337
|
+
if (ctx->head_ == nullptr) {
|
338
|
+
ctx->head_ = functor;
|
339
|
+
}
|
340
|
+
if (ctx->tail_ != nullptr) {
|
341
|
+
ctx->tail_->internal_next = functor;
|
342
|
+
}
|
343
|
+
ctx->tail_ = functor;
|
344
|
+
}
|
345
|
+
|
346
|
+
/** Global initialization for ApplicationCallbackExecCtx. Called by init. */
|
347
|
+
static void GlobalInit(void) { gpr_tls_init(&callback_exec_ctx_); }
|
348
|
+
|
349
|
+
/** Global shutdown for ApplicationCallbackExecCtx. Called by init. */
|
350
|
+
static void GlobalShutdown(void) { gpr_tls_destroy(&callback_exec_ctx_); }
|
351
|
+
|
352
|
+
private:
|
353
|
+
uintptr_t flags_{0u};
|
354
|
+
grpc_experimental_completion_queue_functor* head_{nullptr};
|
355
|
+
grpc_experimental_completion_queue_functor* tail_{nullptr};
|
356
|
+
GPR_TLS_CLASS_DECL(callback_exec_ctx_);
|
357
|
+
};
|
229
358
|
} // namespace grpc_core
|
230
359
|
|
231
360
|
#endif /* GRPC_CORE_LIB_IOMGR_EXEC_CTX_H */
|
@@ -32,35 +32,98 @@
|
|
32
32
|
#include "src/core/lib/gpr/useful.h"
|
33
33
|
#include "src/core/lib/gprpp/memory.h"
|
34
34
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
35
|
+
#include "src/core/lib/iomgr/iomgr.h"
|
35
36
|
|
36
37
|
#define MAX_DEPTH 2
|
37
38
|
|
38
|
-
#define EXECUTOR_TRACE(format, ...)
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
#define EXECUTOR_TRACE(format, ...) \
|
40
|
+
do { \
|
41
|
+
if (GRPC_TRACE_FLAG_ENABLED(executor_trace)) { \
|
42
|
+
gpr_log(GPR_INFO, "EXECUTOR " format, __VA_ARGS__); \
|
43
|
+
} \
|
44
|
+
} while (0)
|
42
45
|
|
43
|
-
#define EXECUTOR_TRACE0(str)
|
44
|
-
|
45
|
-
|
46
|
-
|
46
|
+
#define EXECUTOR_TRACE0(str) \
|
47
|
+
do { \
|
48
|
+
if (GRPC_TRACE_FLAG_ENABLED(executor_trace)) { \
|
49
|
+
gpr_log(GPR_INFO, "EXECUTOR " str); \
|
50
|
+
} \
|
51
|
+
} while (0)
|
47
52
|
|
48
|
-
grpc_core
|
53
|
+
namespace grpc_core {
|
54
|
+
namespace {
|
49
55
|
|
50
56
|
GPR_TLS_DECL(g_this_thread_state);
|
51
57
|
|
52
|
-
|
58
|
+
Executor* executors[static_cast<size_t>(ExecutorType::NUM_EXECUTORS)];
|
59
|
+
|
60
|
+
void default_enqueue_short(grpc_closure* closure, grpc_error* error) {
|
61
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Enqueue(
|
62
|
+
closure, error, true /* is_short */);
|
63
|
+
}
|
64
|
+
|
65
|
+
void default_enqueue_long(grpc_closure* closure, grpc_error* error) {
|
66
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Enqueue(
|
67
|
+
closure, error, false /* is_short */);
|
68
|
+
}
|
69
|
+
|
70
|
+
void resolver_enqueue_short(grpc_closure* closure, grpc_error* error) {
|
71
|
+
executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Enqueue(
|
72
|
+
closure, error, true /* is_short */);
|
73
|
+
}
|
74
|
+
|
75
|
+
void resolver_enqueue_long(grpc_closure* closure, grpc_error* error) {
|
76
|
+
executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Enqueue(
|
77
|
+
closure, error, false /* is_short */);
|
78
|
+
}
|
79
|
+
|
80
|
+
const grpc_closure_scheduler_vtable
|
81
|
+
vtables_[static_cast<size_t>(ExecutorType::NUM_EXECUTORS)]
|
82
|
+
[static_cast<size_t>(ExecutorJobType::NUM_JOB_TYPES)] = {
|
83
|
+
{{&default_enqueue_short, &default_enqueue_short,
|
84
|
+
"def-ex-short"},
|
85
|
+
{&default_enqueue_long, &default_enqueue_long, "def-ex-long"}},
|
86
|
+
{{&resolver_enqueue_short, &resolver_enqueue_short,
|
87
|
+
"res-ex-short"},
|
88
|
+
{&resolver_enqueue_long, &resolver_enqueue_long,
|
89
|
+
"res-ex-long"}}};
|
90
|
+
|
91
|
+
grpc_closure_scheduler
|
92
|
+
schedulers_[static_cast<size_t>(ExecutorType::NUM_EXECUTORS)]
|
93
|
+
[static_cast<size_t>(ExecutorJobType::NUM_JOB_TYPES)] = {
|
94
|
+
{{&vtables_[static_cast<size_t>(ExecutorType::DEFAULT)]
|
95
|
+
[static_cast<size_t>(ExecutorJobType::SHORT)]},
|
96
|
+
{&vtables_[static_cast<size_t>(ExecutorType::DEFAULT)]
|
97
|
+
[static_cast<size_t>(ExecutorJobType::LONG)]}},
|
98
|
+
{{&vtables_[static_cast<size_t>(ExecutorType::RESOLVER)]
|
99
|
+
[static_cast<size_t>(ExecutorJobType::SHORT)]},
|
100
|
+
{&vtables_[static_cast<size_t>(ExecutorType::RESOLVER)]
|
101
|
+
[static_cast<size_t>(ExecutorJobType::LONG)]}}};
|
102
|
+
|
103
|
+
} // namespace
|
104
|
+
|
105
|
+
TraceFlag executor_trace(false, "executor");
|
106
|
+
|
107
|
+
Executor::Executor(const char* name) : name_(name) {
|
53
108
|
adding_thread_lock_ = GPR_SPINLOCK_STATIC_INITIALIZER;
|
54
109
|
gpr_atm_rel_store(&num_threads_, 0);
|
55
110
|
max_threads_ = GPR_MAX(1, 2 * gpr_cpu_num_cores());
|
56
111
|
}
|
57
112
|
|
58
|
-
void
|
113
|
+
void Executor::Init() { SetThreading(true); }
|
59
114
|
|
60
|
-
size_t
|
61
|
-
|
115
|
+
size_t Executor::RunClosures(const char* executor_name,
|
116
|
+
grpc_closure_list list) {
|
62
117
|
size_t n = 0;
|
63
118
|
|
119
|
+
// In the executor, the ExecCtx for the thread is declared in the executor
|
120
|
+
// thread itself, but this is the point where we could start seeing
|
121
|
+
// application-level callbacks. No need to create a new ExecCtx, though,
|
122
|
+
// since there already is one and it is flushed (but not destructed) in this
|
123
|
+
// function itself.
|
124
|
+
grpc_core::ApplicationCallbackExecCtx callback_exec_ctx(
|
125
|
+
GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD);
|
126
|
+
|
64
127
|
grpc_closure* c = list.head;
|
65
128
|
while (c != nullptr) {
|
66
129
|
grpc_closure* next = c->next_data.next;
|
@@ -82,11 +145,11 @@ size_t GrpcExecutor::RunClosures(const char* executor_name,
|
|
82
145
|
return n;
|
83
146
|
}
|
84
147
|
|
85
|
-
bool
|
148
|
+
bool Executor::IsThreaded() const {
|
86
149
|
return gpr_atm_acq_load(&num_threads_) > 0;
|
87
150
|
}
|
88
151
|
|
89
|
-
void
|
152
|
+
void Executor::SetThreading(bool threading) {
|
90
153
|
gpr_atm curr_num_threads = gpr_atm_acq_load(&num_threads_);
|
91
154
|
EXECUTOR_TRACE("(%s) SetThreading(%d) begin", name_, threading);
|
92
155
|
|
@@ -112,7 +175,7 @@ void GrpcExecutor::SetThreading(bool threading) {
|
|
112
175
|
}
|
113
176
|
|
114
177
|
thd_state_[0].thd =
|
115
|
-
grpc_core::Thread(name_, &
|
178
|
+
grpc_core::Thread(name_, &Executor::ThreadMain, &thd_state_[0]);
|
116
179
|
thd_state_[0].thd.Start();
|
117
180
|
} else { // !threading
|
118
181
|
if (curr_num_threads == 0) {
|
@@ -148,14 +211,22 @@ void GrpcExecutor::SetThreading(bool threading) {
|
|
148
211
|
|
149
212
|
gpr_free(thd_state_);
|
150
213
|
gpr_tls_destroy(&g_this_thread_state);
|
214
|
+
|
215
|
+
// grpc_iomgr_shutdown_background_closure() will close all the registered
|
216
|
+
// fds in the background poller, and wait for all pending closures to
|
217
|
+
// finish. Thus, never call Executor::SetThreading(false) in the middle of
|
218
|
+
// an application.
|
219
|
+
// TODO(guantaol): create another method to finish all the pending closures
|
220
|
+
// registered in the background poller by grpc_core::Executor.
|
221
|
+
grpc_iomgr_shutdown_background_closure();
|
151
222
|
}
|
152
223
|
|
153
224
|
EXECUTOR_TRACE("(%s) SetThreading(%d) done", name_, threading);
|
154
225
|
}
|
155
226
|
|
156
|
-
void
|
227
|
+
void Executor::Shutdown() { SetThreading(false); }
|
157
228
|
|
158
|
-
void
|
229
|
+
void Executor::ThreadMain(void* arg) {
|
159
230
|
ThreadState* ts = static_cast<ThreadState*>(arg);
|
160
231
|
gpr_tls_set(&g_this_thread_state, reinterpret_cast<intptr_t>(ts));
|
161
232
|
|
@@ -192,8 +263,8 @@ void GrpcExecutor::ThreadMain(void* arg) {
|
|
192
263
|
}
|
193
264
|
}
|
194
265
|
|
195
|
-
void
|
196
|
-
|
266
|
+
void Executor::Enqueue(grpc_closure* closure, grpc_error* error,
|
267
|
+
bool is_short) {
|
197
268
|
bool retry_push;
|
198
269
|
if (is_short) {
|
199
270
|
GRPC_STATS_INC_EXECUTOR_SCHEDULED_SHORT_ITEMS();
|
@@ -220,6 +291,10 @@ void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error,
|
|
220
291
|
return;
|
221
292
|
}
|
222
293
|
|
294
|
+
if (grpc_iomgr_add_closure_to_background_poller(closure, error)) {
|
295
|
+
return;
|
296
|
+
}
|
297
|
+
|
223
298
|
ThreadState* ts = (ThreadState*)gpr_tls_get(&g_this_thread_state);
|
224
299
|
if (ts == nullptr) {
|
225
300
|
ts = &thd_state_[GPR_HASH_POINTER(grpc_core::ExecCtx::Get(),
|
@@ -304,7 +379,7 @@ void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error,
|
|
304
379
|
gpr_atm_rel_store(&num_threads_, cur_thread_count + 1);
|
305
380
|
|
306
381
|
thd_state_[cur_thread_count].thd = grpc_core::Thread(
|
307
|
-
name_, &
|
382
|
+
name_, &Executor::ThreadMain, &thd_state_[cur_thread_count]);
|
308
383
|
thd_state_[cur_thread_count].thd.Start();
|
309
384
|
}
|
310
385
|
gpr_spinlock_unlock(&adding_thread_lock_);
|
@@ -316,85 +391,52 @@ void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error,
|
|
316
391
|
} while (retry_push);
|
317
392
|
}
|
318
393
|
|
319
|
-
|
320
|
-
|
321
|
-
void default_enqueue_short(grpc_closure* closure, grpc_error* error) {
|
322
|
-
executors[GRPC_DEFAULT_EXECUTOR]->Enqueue(closure, error,
|
323
|
-
true /* is_short */);
|
324
|
-
}
|
325
|
-
|
326
|
-
void default_enqueue_long(grpc_closure* closure, grpc_error* error) {
|
327
|
-
executors[GRPC_DEFAULT_EXECUTOR]->Enqueue(closure, error,
|
328
|
-
false /* is_short */);
|
329
|
-
}
|
330
|
-
|
331
|
-
void resolver_enqueue_short(grpc_closure* closure, grpc_error* error) {
|
332
|
-
executors[GRPC_RESOLVER_EXECUTOR]->Enqueue(closure, error,
|
333
|
-
true /* is_short */);
|
334
|
-
}
|
335
|
-
|
336
|
-
void resolver_enqueue_long(grpc_closure* closure, grpc_error* error) {
|
337
|
-
executors[GRPC_RESOLVER_EXECUTOR]->Enqueue(closure, error,
|
338
|
-
false /* is_short */);
|
339
|
-
}
|
340
|
-
|
341
|
-
static const grpc_closure_scheduler_vtable
|
342
|
-
vtables_[GRPC_NUM_EXECUTORS][GRPC_NUM_EXECUTOR_JOB_TYPES] = {
|
343
|
-
{{&default_enqueue_short, &default_enqueue_short, "def-ex-short"},
|
344
|
-
{&default_enqueue_long, &default_enqueue_long, "def-ex-long"}},
|
345
|
-
{{&resolver_enqueue_short, &resolver_enqueue_short, "res-ex-short"},
|
346
|
-
{&resolver_enqueue_long, &resolver_enqueue_long, "res-ex-long"}}};
|
347
|
-
|
348
|
-
static grpc_closure_scheduler
|
349
|
-
schedulers_[GRPC_NUM_EXECUTORS][GRPC_NUM_EXECUTOR_JOB_TYPES] = {
|
350
|
-
{{&vtables_[GRPC_DEFAULT_EXECUTOR][GRPC_EXECUTOR_SHORT]},
|
351
|
-
{&vtables_[GRPC_DEFAULT_EXECUTOR][GRPC_EXECUTOR_LONG]}},
|
352
|
-
{{&vtables_[GRPC_RESOLVER_EXECUTOR][GRPC_EXECUTOR_SHORT]},
|
353
|
-
{&vtables_[GRPC_RESOLVER_EXECUTOR][GRPC_EXECUTOR_LONG]}}};
|
354
|
-
|
355
|
-
// grpc_executor_init() and grpc_executor_shutdown() functions are called in the
|
394
|
+
// Executor::InitAll() and Executor::ShutdownAll() functions are called in the
|
356
395
|
// the grpc_init() and grpc_shutdown() code paths which are protected by a
|
357
396
|
// global mutex. So it is okay to assume that these functions are thread-safe
|
358
|
-
void
|
359
|
-
EXECUTOR_TRACE0("
|
397
|
+
void Executor::InitAll() {
|
398
|
+
EXECUTOR_TRACE0("Executor::InitAll() enter");
|
360
399
|
|
361
|
-
// Return if
|
362
|
-
if (executors[
|
363
|
-
GPR_ASSERT(executors[
|
400
|
+
// Return if Executor::InitAll() is already called earlier
|
401
|
+
if (executors[static_cast<size_t>(ExecutorType::DEFAULT)] != nullptr) {
|
402
|
+
GPR_ASSERT(executors[static_cast<size_t>(ExecutorType::RESOLVER)] !=
|
403
|
+
nullptr);
|
364
404
|
return;
|
365
405
|
}
|
366
406
|
|
367
|
-
executors[
|
368
|
-
grpc_core::New<
|
369
|
-
executors[
|
370
|
-
grpc_core::New<
|
407
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)] =
|
408
|
+
grpc_core::New<Executor>("default-executor");
|
409
|
+
executors[static_cast<size_t>(ExecutorType::RESOLVER)] =
|
410
|
+
grpc_core::New<Executor>("resolver-executor");
|
371
411
|
|
372
|
-
executors[
|
373
|
-
executors[
|
412
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Init();
|
413
|
+
executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Init();
|
374
414
|
|
375
|
-
EXECUTOR_TRACE0("
|
415
|
+
EXECUTOR_TRACE0("Executor::InitAll() done");
|
376
416
|
}
|
377
417
|
|
378
|
-
grpc_closure_scheduler*
|
379
|
-
|
380
|
-
return &schedulers_[executor_type]
|
418
|
+
grpc_closure_scheduler* Executor::Scheduler(ExecutorType executor_type,
|
419
|
+
ExecutorJobType job_type) {
|
420
|
+
return &schedulers_[static_cast<size_t>(executor_type)]
|
421
|
+
[static_cast<size_t>(job_type)];
|
381
422
|
}
|
382
423
|
|
383
|
-
grpc_closure_scheduler*
|
384
|
-
return
|
424
|
+
grpc_closure_scheduler* Executor::Scheduler(ExecutorJobType job_type) {
|
425
|
+
return Executor::Scheduler(ExecutorType::DEFAULT, job_type);
|
385
426
|
}
|
386
427
|
|
387
|
-
void
|
388
|
-
EXECUTOR_TRACE0("
|
428
|
+
void Executor::ShutdownAll() {
|
429
|
+
EXECUTOR_TRACE0("Executor::ShutdownAll() enter");
|
389
430
|
|
390
|
-
// Return if
|
391
|
-
if (executors[
|
392
|
-
GPR_ASSERT(executors[
|
431
|
+
// Return if Executor:SshutdownAll() is already called earlier
|
432
|
+
if (executors[static_cast<size_t>(ExecutorType::DEFAULT)] == nullptr) {
|
433
|
+
GPR_ASSERT(executors[static_cast<size_t>(ExecutorType::RESOLVER)] ==
|
434
|
+
nullptr);
|
393
435
|
return;
|
394
436
|
}
|
395
437
|
|
396
|
-
executors[
|
397
|
-
executors[
|
438
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Shutdown();
|
439
|
+
executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Shutdown();
|
398
440
|
|
399
441
|
// Delete the executor objects.
|
400
442
|
//
|
@@ -408,26 +450,36 @@ void grpc_executor_shutdown() {
|
|
408
450
|
// By ensuring that all executors are shutdown first, we are also ensuring
|
409
451
|
// that no thread is active across all executors.
|
410
452
|
|
411
|
-
grpc_core::Delete<
|
412
|
-
|
413
|
-
|
414
|
-
|
453
|
+
grpc_core::Delete<Executor>(
|
454
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)]);
|
455
|
+
grpc_core::Delete<Executor>(
|
456
|
+
executors[static_cast<size_t>(ExecutorType::RESOLVER)]);
|
457
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)] = nullptr;
|
458
|
+
executors[static_cast<size_t>(ExecutorType::RESOLVER)] = nullptr;
|
415
459
|
|
416
|
-
EXECUTOR_TRACE0("
|
460
|
+
EXECUTOR_TRACE0("Executor::ShutdownAll() done");
|
417
461
|
}
|
418
462
|
|
419
|
-
bool
|
420
|
-
GPR_ASSERT(executor_type <
|
421
|
-
return executors[executor_type]->IsThreaded();
|
463
|
+
bool Executor::IsThreaded(ExecutorType executor_type) {
|
464
|
+
GPR_ASSERT(executor_type < ExecutorType::NUM_EXECUTORS);
|
465
|
+
return executors[static_cast<size_t>(executor_type)]->IsThreaded();
|
422
466
|
}
|
423
467
|
|
424
|
-
bool
|
425
|
-
return
|
468
|
+
bool Executor::IsThreadedDefault() {
|
469
|
+
return Executor::IsThreaded(ExecutorType::DEFAULT);
|
426
470
|
}
|
427
471
|
|
428
|
-
void
|
429
|
-
EXECUTOR_TRACE("
|
430
|
-
for (
|
472
|
+
void Executor::SetThreadingAll(bool enable) {
|
473
|
+
EXECUTOR_TRACE("Executor::SetThreadingAll(%d) called", enable);
|
474
|
+
for (size_t i = 0; i < static_cast<size_t>(ExecutorType::NUM_EXECUTORS);
|
475
|
+
i++) {
|
431
476
|
executors[i]->SetThreading(enable);
|
432
477
|
}
|
433
478
|
}
|
479
|
+
|
480
|
+
void Executor::SetThreadingDefault(bool enable) {
|
481
|
+
EXECUTOR_TRACE("Executor::SetThreadingDefault(%d) called", enable);
|
482
|
+
executors[static_cast<size_t>(ExecutorType::DEFAULT)]->SetThreading(enable);
|
483
|
+
}
|
484
|
+
|
485
|
+
} // namespace grpc_core
|