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
@@ -0,0 +1,375 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#include "src/core/lib/iomgr/port.h"
|
22
|
+
|
23
|
+
#ifdef GRPC_CFSTREAM_ENDPOINT
|
24
|
+
|
25
|
+
#import <CoreFoundation/CoreFoundation.h>
|
26
|
+
#import "src/core/lib/iomgr/endpoint_cfstream.h"
|
27
|
+
|
28
|
+
#include <grpc/slice_buffer.h>
|
29
|
+
#include <grpc/support/alloc.h>
|
30
|
+
#include <grpc/support/string_util.h>
|
31
|
+
|
32
|
+
#include "src/core/lib/gpr/string.h"
|
33
|
+
#include "src/core/lib/iomgr/cfstream_handle.h"
|
34
|
+
#include "src/core/lib/iomgr/closure.h"
|
35
|
+
#include "src/core/lib/iomgr/endpoint.h"
|
36
|
+
#include "src/core/lib/iomgr/error_cfstream.h"
|
37
|
+
#include "src/core/lib/slice/slice_internal.h"
|
38
|
+
#include "src/core/lib/slice/slice_string_helpers.h"
|
39
|
+
|
40
|
+
extern grpc_core::TraceFlag grpc_tcp_trace;
|
41
|
+
|
42
|
+
typedef struct {
|
43
|
+
grpc_endpoint base;
|
44
|
+
gpr_refcount refcount;
|
45
|
+
|
46
|
+
CFReadStreamRef read_stream;
|
47
|
+
CFWriteStreamRef write_stream;
|
48
|
+
CFStreamHandle* stream_sync;
|
49
|
+
|
50
|
+
grpc_closure* read_cb;
|
51
|
+
grpc_closure* write_cb;
|
52
|
+
grpc_slice_buffer* read_slices;
|
53
|
+
grpc_slice_buffer* write_slices;
|
54
|
+
|
55
|
+
grpc_closure read_action;
|
56
|
+
grpc_closure write_action;
|
57
|
+
|
58
|
+
char* peer_string;
|
59
|
+
grpc_resource_user* resource_user;
|
60
|
+
grpc_resource_user_slice_allocator slice_allocator;
|
61
|
+
} CFStreamEndpoint;
|
62
|
+
|
63
|
+
static void CFStreamFree(CFStreamEndpoint* ep) {
|
64
|
+
grpc_resource_user_unref(ep->resource_user);
|
65
|
+
CFRelease(ep->read_stream);
|
66
|
+
CFRelease(ep->write_stream);
|
67
|
+
CFSTREAM_HANDLE_UNREF(ep->stream_sync, "free");
|
68
|
+
gpr_free(ep->peer_string);
|
69
|
+
gpr_free(ep);
|
70
|
+
}
|
71
|
+
|
72
|
+
#ifndef NDEBUG
|
73
|
+
#define EP_REF(ep, reason) CFStreamRef((ep), (reason), __FILE__, __LINE__)
|
74
|
+
#define EP_UNREF(ep, reason) CFStreamUnref((ep), (reason), __FILE__, __LINE__)
|
75
|
+
static void CFStreamUnref(CFStreamEndpoint* ep, const char* reason,
|
76
|
+
const char* file, int line) {
|
77
|
+
if (grpc_tcp_trace.enabled()) {
|
78
|
+
gpr_atm val = gpr_atm_no_barrier_load(&ep->refcount.count);
|
79
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
80
|
+
"CFStream endpoint unref %p : %s %" PRIdPTR " -> %" PRIdPTR, ep,
|
81
|
+
reason, val, val - 1);
|
82
|
+
}
|
83
|
+
if (gpr_unref(&ep->refcount)) {
|
84
|
+
CFStreamFree(ep);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
static void CFStreamRef(CFStreamEndpoint* ep, const char* reason,
|
88
|
+
const char* file, int line) {
|
89
|
+
if (grpc_tcp_trace.enabled()) {
|
90
|
+
gpr_atm val = gpr_atm_no_barrier_load(&ep->refcount.count);
|
91
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
92
|
+
"CFStream endpoint ref %p : %s %" PRIdPTR " -> %" PRIdPTR, ep,
|
93
|
+
reason, val, val + 1);
|
94
|
+
}
|
95
|
+
gpr_ref(&ep->refcount);
|
96
|
+
}
|
97
|
+
#else
|
98
|
+
#define EP_REF(ep, reason) CFStreamRef((ep))
|
99
|
+
#define EP_UNREF(ep, reason) CFStreamUnref((ep))
|
100
|
+
static void CFStreamUnref(CFStreamEndpoint* ep) {
|
101
|
+
if (gpr_unref(&ep->refcount)) {
|
102
|
+
CFStreamFree(ep);
|
103
|
+
}
|
104
|
+
}
|
105
|
+
static void CFStreamRef(CFStreamEndpoint* ep) { gpr_ref(&ep->refcount); }
|
106
|
+
#endif
|
107
|
+
|
108
|
+
static grpc_error* CFStreamAnnotateError(grpc_error* src_error,
|
109
|
+
CFStreamEndpoint* ep) {
|
110
|
+
return grpc_error_set_str(
|
111
|
+
grpc_error_set_int(src_error, GRPC_ERROR_INT_GRPC_STATUS,
|
112
|
+
GRPC_STATUS_UNAVAILABLE),
|
113
|
+
GRPC_ERROR_STR_TARGET_ADDRESS,
|
114
|
+
grpc_slice_from_copied_string(ep->peer_string));
|
115
|
+
}
|
116
|
+
|
117
|
+
static void CallReadCb(CFStreamEndpoint* ep, grpc_error* error) {
|
118
|
+
if (grpc_tcp_trace.enabled()) {
|
119
|
+
gpr_log(GPR_DEBUG, "CFStream endpoint:%p call_read_cb %p %p:%p", ep,
|
120
|
+
ep->read_cb, ep->read_cb->cb, ep->read_cb->cb_arg);
|
121
|
+
size_t i;
|
122
|
+
const char* str = grpc_error_string(error);
|
123
|
+
gpr_log(GPR_DEBUG, "read: error=%s", str);
|
124
|
+
|
125
|
+
for (i = 0; i < ep->read_slices->count; i++) {
|
126
|
+
char* dump = grpc_dump_slice(ep->read_slices->slices[i],
|
127
|
+
GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
128
|
+
gpr_log(GPR_DEBUG, "READ %p (peer=%s): %s", ep, ep->peer_string, dump);
|
129
|
+
gpr_free(dump);
|
130
|
+
}
|
131
|
+
}
|
132
|
+
grpc_closure* cb = ep->read_cb;
|
133
|
+
ep->read_cb = nullptr;
|
134
|
+
ep->read_slices = nullptr;
|
135
|
+
GRPC_CLOSURE_SCHED(cb, error);
|
136
|
+
}
|
137
|
+
|
138
|
+
static void CallWriteCb(CFStreamEndpoint* ep, grpc_error* error) {
|
139
|
+
if (grpc_tcp_trace.enabled()) {
|
140
|
+
gpr_log(GPR_DEBUG, "CFStream endpoint:%p call_write_cb %p %p:%p", ep,
|
141
|
+
ep->write_cb, ep->write_cb->cb, ep->write_cb->cb_arg);
|
142
|
+
const char* str = grpc_error_string(error);
|
143
|
+
gpr_log(GPR_DEBUG, "write: error=%s", str);
|
144
|
+
}
|
145
|
+
grpc_closure* cb = ep->write_cb;
|
146
|
+
ep->write_cb = nullptr;
|
147
|
+
ep->write_slices = nullptr;
|
148
|
+
GRPC_CLOSURE_SCHED(cb, error);
|
149
|
+
}
|
150
|
+
|
151
|
+
static void ReadAction(void* arg, grpc_error* error) {
|
152
|
+
CFStreamEndpoint* ep = static_cast<CFStreamEndpoint*>(arg);
|
153
|
+
GPR_ASSERT(ep->read_cb != nullptr);
|
154
|
+
if (error) {
|
155
|
+
grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
|
156
|
+
CallReadCb(ep, GRPC_ERROR_REF(error));
|
157
|
+
EP_UNREF(ep, "read");
|
158
|
+
return;
|
159
|
+
}
|
160
|
+
|
161
|
+
GPR_ASSERT(ep->read_slices->count == 1);
|
162
|
+
grpc_slice slice = ep->read_slices->slices[0];
|
163
|
+
size_t len = GRPC_SLICE_LENGTH(slice);
|
164
|
+
CFIndex read_size =
|
165
|
+
CFReadStreamRead(ep->read_stream, GRPC_SLICE_START_PTR(slice), len);
|
166
|
+
if (read_size == -1) {
|
167
|
+
grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
|
168
|
+
CFErrorRef stream_error = CFReadStreamCopyError(ep->read_stream);
|
169
|
+
if (stream_error != nullptr) {
|
170
|
+
error = CFStreamAnnotateError(
|
171
|
+
GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "Read error"), ep);
|
172
|
+
CFRelease(stream_error);
|
173
|
+
} else {
|
174
|
+
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Read error");
|
175
|
+
}
|
176
|
+
CallReadCb(ep, error);
|
177
|
+
EP_UNREF(ep, "read");
|
178
|
+
} else if (read_size == 0) {
|
179
|
+
grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
|
180
|
+
CallReadCb(ep,
|
181
|
+
CFStreamAnnotateError(
|
182
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Socket closed"), ep));
|
183
|
+
EP_UNREF(ep, "read");
|
184
|
+
} else {
|
185
|
+
if (read_size < static_cast<CFIndex>(len)) {
|
186
|
+
grpc_slice_buffer_trim_end(ep->read_slices, len - read_size, nullptr);
|
187
|
+
}
|
188
|
+
CallReadCb(ep, GRPC_ERROR_NONE);
|
189
|
+
EP_UNREF(ep, "read");
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
static void WriteAction(void* arg, grpc_error* error) {
|
194
|
+
CFStreamEndpoint* ep = static_cast<CFStreamEndpoint*>(arg);
|
195
|
+
GPR_ASSERT(ep->write_cb != nullptr);
|
196
|
+
if (error) {
|
197
|
+
grpc_slice_buffer_reset_and_unref_internal(ep->write_slices);
|
198
|
+
CallWriteCb(ep, GRPC_ERROR_REF(error));
|
199
|
+
EP_UNREF(ep, "write");
|
200
|
+
return;
|
201
|
+
}
|
202
|
+
|
203
|
+
grpc_slice slice = grpc_slice_buffer_take_first(ep->write_slices);
|
204
|
+
size_t slice_len = GRPC_SLICE_LENGTH(slice);
|
205
|
+
CFIndex write_size = CFWriteStreamWrite(
|
206
|
+
ep->write_stream, GRPC_SLICE_START_PTR(slice), slice_len);
|
207
|
+
if (write_size == -1) {
|
208
|
+
grpc_slice_buffer_reset_and_unref_internal(ep->write_slices);
|
209
|
+
CFErrorRef stream_error = CFWriteStreamCopyError(ep->write_stream);
|
210
|
+
if (stream_error != nullptr) {
|
211
|
+
error = CFStreamAnnotateError(
|
212
|
+
GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "write failed."), ep);
|
213
|
+
CFRelease(stream_error);
|
214
|
+
} else {
|
215
|
+
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("write failed.");
|
216
|
+
}
|
217
|
+
CallWriteCb(ep, error);
|
218
|
+
EP_UNREF(ep, "write");
|
219
|
+
} else {
|
220
|
+
if (write_size < static_cast<CFIndex>(GRPC_SLICE_LENGTH(slice))) {
|
221
|
+
grpc_slice_buffer_undo_take_first(
|
222
|
+
ep->write_slices, grpc_slice_sub(slice, write_size, slice_len));
|
223
|
+
}
|
224
|
+
if (ep->write_slices->length > 0) {
|
225
|
+
ep->stream_sync->NotifyOnWrite(&ep->write_action);
|
226
|
+
} else {
|
227
|
+
CallWriteCb(ep, GRPC_ERROR_NONE);
|
228
|
+
EP_UNREF(ep, "write");
|
229
|
+
}
|
230
|
+
|
231
|
+
if (grpc_tcp_trace.enabled()) {
|
232
|
+
grpc_slice trace_slice = grpc_slice_sub(slice, 0, write_size);
|
233
|
+
char* dump = grpc_dump_slice(trace_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
234
|
+
gpr_log(GPR_DEBUG, "WRITE %p (peer=%s): %s", ep, ep->peer_string, dump);
|
235
|
+
gpr_free(dump);
|
236
|
+
grpc_slice_unref_internal(trace_slice);
|
237
|
+
}
|
238
|
+
}
|
239
|
+
grpc_slice_unref_internal(slice);
|
240
|
+
}
|
241
|
+
|
242
|
+
static void CFStreamReadAllocationDone(void* arg, grpc_error* error) {
|
243
|
+
CFStreamEndpoint* ep = static_cast<CFStreamEndpoint*>(arg);
|
244
|
+
if (error == GRPC_ERROR_NONE) {
|
245
|
+
ep->stream_sync->NotifyOnRead(&ep->read_action);
|
246
|
+
} else {
|
247
|
+
grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
|
248
|
+
CallReadCb(ep, error);
|
249
|
+
EP_UNREF(ep, "read");
|
250
|
+
}
|
251
|
+
}
|
252
|
+
|
253
|
+
static void CFStreamRead(grpc_endpoint* ep, grpc_slice_buffer* slices,
|
254
|
+
grpc_closure* cb, bool urgent) {
|
255
|
+
CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
|
256
|
+
if (grpc_tcp_trace.enabled()) {
|
257
|
+
gpr_log(GPR_DEBUG, "CFStream endpoint:%p read (%p, %p) length:%zu", ep_impl,
|
258
|
+
slices, cb, slices->length);
|
259
|
+
}
|
260
|
+
GPR_ASSERT(ep_impl->read_cb == nullptr);
|
261
|
+
ep_impl->read_cb = cb;
|
262
|
+
ep_impl->read_slices = slices;
|
263
|
+
grpc_slice_buffer_reset_and_unref_internal(slices);
|
264
|
+
grpc_resource_user_alloc_slices(&ep_impl->slice_allocator,
|
265
|
+
GRPC_TCP_DEFAULT_READ_SLICE_SIZE, 1,
|
266
|
+
ep_impl->read_slices);
|
267
|
+
EP_REF(ep_impl, "read");
|
268
|
+
}
|
269
|
+
|
270
|
+
static void CFStreamWrite(grpc_endpoint* ep, grpc_slice_buffer* slices,
|
271
|
+
grpc_closure* cb, void* arg) {
|
272
|
+
CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
|
273
|
+
if (grpc_tcp_trace.enabled()) {
|
274
|
+
gpr_log(GPR_DEBUG, "CFStream endpoint:%p write (%p, %p) length:%zu",
|
275
|
+
ep_impl, slices, cb, slices->length);
|
276
|
+
}
|
277
|
+
GPR_ASSERT(ep_impl->write_cb == nullptr);
|
278
|
+
ep_impl->write_cb = cb;
|
279
|
+
ep_impl->write_slices = slices;
|
280
|
+
EP_REF(ep_impl, "write");
|
281
|
+
ep_impl->stream_sync->NotifyOnWrite(&ep_impl->write_action);
|
282
|
+
}
|
283
|
+
|
284
|
+
void CFStreamShutdown(grpc_endpoint* ep, grpc_error* why) {
|
285
|
+
CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
|
286
|
+
if (grpc_tcp_trace.enabled()) {
|
287
|
+
gpr_log(GPR_DEBUG, "CFStream endpoint:%p shutdown (%p)", ep_impl, why);
|
288
|
+
}
|
289
|
+
CFReadStreamClose(ep_impl->read_stream);
|
290
|
+
CFWriteStreamClose(ep_impl->write_stream);
|
291
|
+
ep_impl->stream_sync->Shutdown(why);
|
292
|
+
grpc_resource_user_shutdown(ep_impl->resource_user);
|
293
|
+
if (grpc_tcp_trace.enabled()) {
|
294
|
+
gpr_log(GPR_DEBUG, "CFStream endpoint:%p shutdown DONE (%p)", ep_impl, why);
|
295
|
+
}
|
296
|
+
}
|
297
|
+
|
298
|
+
void CFStreamDestroy(grpc_endpoint* ep) {
|
299
|
+
CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
|
300
|
+
if (grpc_tcp_trace.enabled()) {
|
301
|
+
gpr_log(GPR_DEBUG, "CFStream endpoint:%p destroy", ep_impl);
|
302
|
+
}
|
303
|
+
EP_UNREF(ep_impl, "destroy");
|
304
|
+
}
|
305
|
+
|
306
|
+
grpc_resource_user* CFStreamGetResourceUser(grpc_endpoint* ep) {
|
307
|
+
CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
|
308
|
+
return ep_impl->resource_user;
|
309
|
+
}
|
310
|
+
|
311
|
+
char* CFStreamGetPeer(grpc_endpoint* ep) {
|
312
|
+
CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
|
313
|
+
return gpr_strdup(ep_impl->peer_string);
|
314
|
+
}
|
315
|
+
|
316
|
+
int CFStreamGetFD(grpc_endpoint* ep) { return 0; }
|
317
|
+
|
318
|
+
bool CFStreamCanTrackErr(grpc_endpoint* ep) { return false; }
|
319
|
+
|
320
|
+
void CFStreamAddToPollset(grpc_endpoint* ep, grpc_pollset* pollset) {}
|
321
|
+
void CFStreamAddToPollsetSet(grpc_endpoint* ep, grpc_pollset_set* pollset) {}
|
322
|
+
void CFStreamDeleteFromPollsetSet(grpc_endpoint* ep,
|
323
|
+
grpc_pollset_set* pollset) {}
|
324
|
+
|
325
|
+
static const grpc_endpoint_vtable vtable = {CFStreamRead,
|
326
|
+
CFStreamWrite,
|
327
|
+
CFStreamAddToPollset,
|
328
|
+
CFStreamAddToPollsetSet,
|
329
|
+
CFStreamDeleteFromPollsetSet,
|
330
|
+
CFStreamShutdown,
|
331
|
+
CFStreamDestroy,
|
332
|
+
CFStreamGetResourceUser,
|
333
|
+
CFStreamGetPeer,
|
334
|
+
CFStreamGetFD,
|
335
|
+
CFStreamCanTrackErr};
|
336
|
+
|
337
|
+
grpc_endpoint* grpc_cfstream_endpoint_create(
|
338
|
+
CFReadStreamRef read_stream, CFWriteStreamRef write_stream,
|
339
|
+
const char* peer_string, grpc_resource_quota* resource_quota,
|
340
|
+
CFStreamHandle* stream_sync) {
|
341
|
+
CFStreamEndpoint* ep_impl =
|
342
|
+
static_cast<CFStreamEndpoint*>(gpr_malloc(sizeof(CFStreamEndpoint)));
|
343
|
+
if (grpc_tcp_trace.enabled()) {
|
344
|
+
gpr_log(GPR_DEBUG,
|
345
|
+
"CFStream endpoint:%p create readStream:%p writeStream: %p",
|
346
|
+
ep_impl, read_stream, write_stream);
|
347
|
+
}
|
348
|
+
ep_impl->base.vtable = &vtable;
|
349
|
+
gpr_ref_init(&ep_impl->refcount, 1);
|
350
|
+
ep_impl->read_stream = read_stream;
|
351
|
+
ep_impl->write_stream = write_stream;
|
352
|
+
CFRetain(read_stream);
|
353
|
+
CFRetain(write_stream);
|
354
|
+
ep_impl->stream_sync = stream_sync;
|
355
|
+
CFSTREAM_HANDLE_REF(ep_impl->stream_sync, "endpoint create");
|
356
|
+
|
357
|
+
ep_impl->peer_string = gpr_strdup(peer_string);
|
358
|
+
ep_impl->read_cb = nil;
|
359
|
+
ep_impl->write_cb = nil;
|
360
|
+
ep_impl->read_slices = nil;
|
361
|
+
ep_impl->write_slices = nil;
|
362
|
+
GRPC_CLOSURE_INIT(&ep_impl->read_action, ReadAction,
|
363
|
+
static_cast<void*>(ep_impl), grpc_schedule_on_exec_ctx);
|
364
|
+
GRPC_CLOSURE_INIT(&ep_impl->write_action, WriteAction,
|
365
|
+
static_cast<void*>(ep_impl), grpc_schedule_on_exec_ctx);
|
366
|
+
ep_impl->resource_user =
|
367
|
+
grpc_resource_user_create(resource_quota, peer_string);
|
368
|
+
grpc_resource_user_slice_allocator_init(&ep_impl->slice_allocator,
|
369
|
+
ep_impl->resource_user,
|
370
|
+
CFStreamReadAllocationDone, ep_impl);
|
371
|
+
|
372
|
+
return &ep_impl->base;
|
373
|
+
}
|
374
|
+
|
375
|
+
#endif /* GRPC_CFSTREAM_ENDPOINT */
|
@@ -0,0 +1,49 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#ifndef GRPC_CORE_LIB_IOMGR_ENDPOINT_CFSTREAM_H
|
20
|
+
#define GRPC_CORE_LIB_IOMGR_ENDPOINT_CFSTREAM_H
|
21
|
+
/*
|
22
|
+
Low level TCP "bottom half" implementation, for use by transports built on
|
23
|
+
top of a TCP connection.
|
24
|
+
|
25
|
+
Note that this file does not (yet) include APIs for creating the socket in
|
26
|
+
the first place.
|
27
|
+
|
28
|
+
All calls passing slice transfer ownership of a slice refcount unless
|
29
|
+
otherwise specified.
|
30
|
+
*/
|
31
|
+
|
32
|
+
#include <grpc/support/port_platform.h>
|
33
|
+
|
34
|
+
#ifdef GRPC_CFSTREAM
|
35
|
+
|
36
|
+
#import <CoreFoundation/CoreFoundation.h>
|
37
|
+
|
38
|
+
#include "src/core/lib/debug/trace.h"
|
39
|
+
#include "src/core/lib/iomgr/cfstream_handle.h"
|
40
|
+
#include "src/core/lib/iomgr/endpoint.h"
|
41
|
+
|
42
|
+
grpc_endpoint* grpc_cfstream_endpoint_create(
|
43
|
+
CFReadStreamRef read_stream, CFWriteStreamRef write_stream,
|
44
|
+
const char* peer_string, grpc_resource_quota* resource_quota,
|
45
|
+
CFStreamHandle* stream_sync);
|
46
|
+
|
47
|
+
#endif /* GRPC_CFSTREAM */
|
48
|
+
|
49
|
+
#endif /* GRPC_CORE_LIB_IOMGR_ENDPOINT_CFSTREAM_H */
|
@@ -41,7 +41,7 @@ static void create_sockets(SOCKET sv[2]) {
|
|
41
41
|
int addr_len = sizeof(addr);
|
42
42
|
|
43
43
|
lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
|
44
|
-
|
44
|
+
grpc_get_default_wsa_socket_flags());
|
45
45
|
GPR_ASSERT(lst_sock != INVALID_SOCKET);
|
46
46
|
|
47
47
|
memset(&addr, 0, sizeof(addr));
|
@@ -54,7 +54,7 @@ static void create_sockets(SOCKET sv[2]) {
|
|
54
54
|
SOCKET_ERROR);
|
55
55
|
|
56
56
|
cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
|
57
|
-
|
57
|
+
grpc_get_default_wsa_socket_flags());
|
58
58
|
GPR_ASSERT(cli_sock != INVALID_SOCKET);
|
59
59
|
|
60
60
|
GPR_ASSERT(WSAConnect(cli_sock, (grpc_sockaddr*)&addr, addr_len, NULL, NULL,
|
data/src/core/lib/iomgr/error.cc
CHANGED
@@ -150,13 +150,12 @@ static void unref_errs(grpc_error* err) {
|
|
150
150
|
}
|
151
151
|
}
|
152
152
|
|
153
|
-
static void unref_slice(grpc_slice slice) { grpc_slice_unref_internal(slice); }
|
154
|
-
|
155
153
|
static void unref_strs(grpc_error* err) {
|
156
154
|
for (size_t which = 0; which < GRPC_ERROR_STR_MAX; ++which) {
|
157
155
|
uint8_t slot = err->strs[which];
|
158
156
|
if (slot != UINT8_MAX) {
|
159
|
-
|
157
|
+
grpc_slice_unref_internal(
|
158
|
+
*reinterpret_cast<grpc_slice*>(err->arena + slot));
|
160
159
|
}
|
161
160
|
}
|
162
161
|
}
|
@@ -231,7 +230,7 @@ static void internal_set_int(grpc_error** err, grpc_error_ints which,
|
|
231
230
|
}
|
232
231
|
|
233
232
|
static void internal_set_str(grpc_error** err, grpc_error_strs which,
|
234
|
-
grpc_slice value) {
|
233
|
+
const grpc_slice& value) {
|
235
234
|
uint8_t slot = (*err)->strs[which];
|
236
235
|
if (slot == UINT8_MAX) {
|
237
236
|
slot = get_placement(err, sizeof(value));
|
@@ -243,7 +242,8 @@ static void internal_set_str(grpc_error** err, grpc_error_strs which,
|
|
243
242
|
return;
|
244
243
|
}
|
245
244
|
} else {
|
246
|
-
|
245
|
+
grpc_slice_unref_internal(
|
246
|
+
*reinterpret_cast<grpc_slice*>((*err)->arena + slot));
|
247
247
|
}
|
248
248
|
(*err)->strs[which] = slot;
|
249
249
|
memcpy((*err)->arena + slot, &value, sizeof(value));
|
@@ -303,14 +303,18 @@ static void internal_add_error(grpc_error** err, grpc_error* new_err) {
|
|
303
303
|
// It is very common to include and extra int and string in an error
|
304
304
|
#define SURPLUS_CAPACITY (2 * SLOTS_PER_INT + SLOTS_PER_TIME)
|
305
305
|
|
306
|
-
static
|
306
|
+
static gpr_atm g_error_creation_allowed = true;
|
307
307
|
|
308
|
-
void grpc_disable_error_creation() {
|
308
|
+
void grpc_disable_error_creation() {
|
309
|
+
gpr_atm_no_barrier_store(&g_error_creation_allowed, false);
|
310
|
+
}
|
309
311
|
|
310
|
-
void grpc_enable_error_creation() {
|
312
|
+
void grpc_enable_error_creation() {
|
313
|
+
gpr_atm_no_barrier_store(&g_error_creation_allowed, true);
|
314
|
+
}
|
311
315
|
|
312
|
-
grpc_error* grpc_error_create(const char* file, int line,
|
313
|
-
grpc_error** referencing,
|
316
|
+
grpc_error* grpc_error_create(const char* file, int line,
|
317
|
+
const grpc_slice& desc, grpc_error** referencing,
|
314
318
|
size_t num_referencing) {
|
315
319
|
GPR_TIMER_SCOPE("grpc_error_create", 0);
|
316
320
|
uint8_t initial_arena_capacity = static_cast<uint8_t>(
|
@@ -323,7 +327,7 @@ grpc_error* grpc_error_create(const char* file, int line, grpc_slice desc,
|
|
323
327
|
return GRPC_ERROR_OOM;
|
324
328
|
}
|
325
329
|
#ifndef NDEBUG
|
326
|
-
if (!g_error_creation_allowed) {
|
330
|
+
if (!gpr_atm_no_barrier_load(&g_error_creation_allowed)) {
|
327
331
|
gpr_log(GPR_ERROR,
|
328
332
|
"Error creation occurred when error creation was disabled [%s:%d]",
|
329
333
|
file, line);
|
@@ -468,7 +472,7 @@ bool grpc_error_get_int(grpc_error* err, grpc_error_ints which, intptr_t* p) {
|
|
468
472
|
}
|
469
473
|
|
470
474
|
grpc_error* grpc_error_set_str(grpc_error* src, grpc_error_strs which,
|
471
|
-
grpc_slice str) {
|
475
|
+
const grpc_slice& str) {
|
472
476
|
GPR_TIMER_SCOPE("grpc_error_set_str", 0);
|
473
477
|
grpc_error* new_err = copy_error_and_unref(src);
|
474
478
|
internal_set_str(&new_err, which, str);
|
@@ -616,7 +620,7 @@ static char* key_str(grpc_error_strs which) {
|
|
616
620
|
return gpr_strdup(error_str_name(which));
|
617
621
|
}
|
618
622
|
|
619
|
-
static char* fmt_str(grpc_slice slice) {
|
623
|
+
static char* fmt_str(const grpc_slice& slice) {
|
620
624
|
char* s = nullptr;
|
621
625
|
size_t sz = 0;
|
622
626
|
size_t cap = 0;
|
@@ -765,7 +769,7 @@ grpc_error* grpc_os_error(const char* file, int line, int err,
|
|
765
769
|
grpc_error_set_str(
|
766
770
|
grpc_error_set_int(
|
767
771
|
grpc_error_create(file, line,
|
768
|
-
grpc_slice_from_static_string(
|
772
|
+
grpc_slice_from_static_string(strerror(err)),
|
769
773
|
nullptr, 0),
|
770
774
|
GRPC_ERROR_INT_ERRNO, err),
|
771
775
|
GRPC_ERROR_STR_OS_ERROR,
|
@@ -791,9 +795,9 @@ grpc_error* grpc_wsa_error(const char* file, int line, int err,
|
|
791
795
|
}
|
792
796
|
#endif
|
793
797
|
|
794
|
-
bool
|
795
|
-
|
796
|
-
|
798
|
+
bool grpc_log_error(const char* what, grpc_error* error, const char* file,
|
799
|
+
int line) {
|
800
|
+
GPR_DEBUG_ASSERT(error != GRPC_ERROR_NONE);
|
797
801
|
const char* msg = grpc_error_string(error);
|
798
802
|
gpr_log(file, line, GPR_LOG_SEVERITY_ERROR, "%s: %s", what, msg);
|
799
803
|
GRPC_ERROR_UNREF(error);
|
data/src/core/lib/iomgr/error.h
CHANGED
@@ -30,6 +30,7 @@
|
|
30
30
|
#include <grpc/support/time.h>
|
31
31
|
|
32
32
|
#include "src/core/lib/debug/trace.h"
|
33
|
+
#include "src/core/lib/gprpp/inlined_vector.h"
|
33
34
|
|
34
35
|
/// Opaque representation of an error.
|
35
36
|
/// See https://github.com/grpc/grpc/blob/master/doc/core/grpc-error.md for a
|
@@ -138,8 +139,9 @@ void grpc_enable_error_creation();
|
|
138
139
|
const char* grpc_error_string(grpc_error* error);
|
139
140
|
|
140
141
|
/// Create an error - but use GRPC_ERROR_CREATE instead
|
141
|
-
grpc_error* grpc_error_create(const char* file, int line,
|
142
|
-
grpc_error** referencing,
|
142
|
+
grpc_error* grpc_error_create(const char* file, int line,
|
143
|
+
const grpc_slice& desc, grpc_error** referencing,
|
144
|
+
size_t num_referencing);
|
143
145
|
/// Create an error (this is the preferred way of generating an error that is
|
144
146
|
/// not due to a system call - for system calls, use GRPC_OS_ERROR or
|
145
147
|
/// GRPC_WSA_ERROR as appropriate)
|
@@ -164,6 +166,9 @@ grpc_error* grpc_error_create(const char* file, int line, grpc_slice desc,
|
|
164
166
|
grpc_error_create(__FILE__, __LINE__, grpc_slice_from_copied_string(desc), \
|
165
167
|
errs, count)
|
166
168
|
|
169
|
+
#define GRPC_ERROR_CREATE_FROM_VECTOR(desc, error_list) \
|
170
|
+
grpc_error_create_from_vector(__FILE__, __LINE__, desc, error_list)
|
171
|
+
|
167
172
|
#ifndef NDEBUG
|
168
173
|
grpc_error* grpc_error_do_ref(grpc_error* err, const char* file, int line);
|
169
174
|
void grpc_error_do_unref(grpc_error* err, const char* file, int line);
|
@@ -192,6 +197,25 @@ inline void grpc_error_unref(grpc_error* err) {
|
|
192
197
|
#define GRPC_ERROR_UNREF(err) grpc_error_unref(err)
|
193
198
|
#endif
|
194
199
|
|
200
|
+
// Consumes all the errors in the vector and forms a referencing error from
|
201
|
+
// them. If the vector is empty, return GRPC_ERROR_NONE.
|
202
|
+
template <size_t N>
|
203
|
+
static grpc_error* grpc_error_create_from_vector(
|
204
|
+
const char* file, int line, const char* desc,
|
205
|
+
grpc_core::InlinedVector<grpc_error*, N>* error_list) {
|
206
|
+
grpc_error* error = GRPC_ERROR_NONE;
|
207
|
+
if (error_list->size() != 0) {
|
208
|
+
error = grpc_error_create(file, line, grpc_slice_from_static_string(desc),
|
209
|
+
error_list->data(), error_list->size());
|
210
|
+
// Remove refs to all errors in error_list.
|
211
|
+
for (size_t i = 0; i < error_list->size(); i++) {
|
212
|
+
GRPC_ERROR_UNREF((*error_list)[i]);
|
213
|
+
}
|
214
|
+
error_list->clear();
|
215
|
+
}
|
216
|
+
return error;
|
217
|
+
}
|
218
|
+
|
195
219
|
grpc_error* grpc_error_set_int(grpc_error* src, grpc_error_ints which,
|
196
220
|
intptr_t value) GRPC_MUST_USE_RESULT;
|
197
221
|
/// It is an error to pass nullptr as `p`. Caller should allocate a dummy
|
@@ -200,7 +224,7 @@ bool grpc_error_get_int(grpc_error* error, grpc_error_ints which, intptr_t* p);
|
|
200
224
|
/// This call takes ownership of the slice; the error is responsible for
|
201
225
|
/// eventually unref-ing it.
|
202
226
|
grpc_error* grpc_error_set_str(grpc_error* src, grpc_error_strs which,
|
203
|
-
grpc_slice str) GRPC_MUST_USE_RESULT;
|
227
|
+
const grpc_slice& str) GRPC_MUST_USE_RESULT;
|
204
228
|
/// Returns false if the specified string is not set.
|
205
229
|
/// Caller does NOT own the slice.
|
206
230
|
bool grpc_error_get_str(grpc_error* error, grpc_error_strs which,
|
@@ -237,9 +261,15 @@ grpc_error* grpc_wsa_error(const char* file, int line, int err,
|
|
237
261
|
#define GRPC_WSA_ERROR(err, call_name) \
|
238
262
|
grpc_wsa_error(__FILE__, __LINE__, err, call_name)
|
239
263
|
|
240
|
-
bool
|
241
|
-
|
264
|
+
bool grpc_log_error(const char* what, grpc_error* error, const char* file,
|
265
|
+
int line);
|
266
|
+
inline bool grpc_log_if_error(const char* what, grpc_error* error,
|
267
|
+
const char* file, int line) {
|
268
|
+
return error == GRPC_ERROR_NONE ? true
|
269
|
+
: grpc_log_error(what, error, file, line);
|
270
|
+
}
|
271
|
+
|
242
272
|
#define GRPC_LOG_IF_ERROR(what, error) \
|
243
|
-
grpc_log_if_error((what), (error), __FILE__, __LINE__)
|
273
|
+
(grpc_log_if_error((what), (error), __FILE__, __LINE__))
|
244
274
|
|
245
275
|
#endif /* GRPC_CORE_LIB_IOMGR_ERROR_H */
|
@@ -0,0 +1,52 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2018 gRPC authors.
|
4
|
+
*
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
* you may not use this file except in compliance with the License.
|
7
|
+
* You may obtain a copy of the License at
|
8
|
+
*
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
*
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
* See the License for the specific language governing permissions and
|
15
|
+
* limitations under the License.
|
16
|
+
*
|
17
|
+
*/
|
18
|
+
|
19
|
+
#include <grpc/support/port_platform.h>
|
20
|
+
|
21
|
+
#ifdef GRPC_CFSTREAM
|
22
|
+
#include <CoreFoundation/CoreFoundation.h>
|
23
|
+
|
24
|
+
#include <grpc/support/alloc.h>
|
25
|
+
#include <grpc/support/string_util.h>
|
26
|
+
|
27
|
+
#include "src/core/lib/iomgr/error.h"
|
28
|
+
|
29
|
+
#define MAX_ERROR_DESCRIPTION 256
|
30
|
+
|
31
|
+
grpc_error* grpc_error_create_from_cferror(const char* file, int line,
|
32
|
+
void* arg, const char* custom_desc) {
|
33
|
+
CFErrorRef error = static_cast<CFErrorRef>(arg);
|
34
|
+
char buf_domain[MAX_ERROR_DESCRIPTION];
|
35
|
+
char buf_desc[MAX_ERROR_DESCRIPTION];
|
36
|
+
char* error_msg;
|
37
|
+
CFErrorDomain domain = CFErrorGetDomain((error));
|
38
|
+
CFIndex code = CFErrorGetCode((error));
|
39
|
+
CFStringRef desc = CFErrorCopyDescription((error));
|
40
|
+
CFStringGetCString(domain, buf_domain, MAX_ERROR_DESCRIPTION,
|
41
|
+
kCFStringEncodingUTF8);
|
42
|
+
CFStringGetCString(desc, buf_desc, MAX_ERROR_DESCRIPTION,
|
43
|
+
kCFStringEncodingUTF8);
|
44
|
+
gpr_asprintf(&error_msg, "%s (error domain:%s, code:%ld, description:%s)",
|
45
|
+
custom_desc, buf_domain, code, buf_desc);
|
46
|
+
CFRelease(desc);
|
47
|
+
grpc_error* return_error = grpc_error_create(
|
48
|
+
file, line, grpc_slice_from_copied_string(error_msg), NULL, 0);
|
49
|
+
gpr_free(error_msg);
|
50
|
+
return return_error;
|
51
|
+
}
|
52
|
+
#endif /* GRPC_CFSTREAM */
|