grpc 0.11.0 → 0.12.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 +29456 -0
- data/Rakefile +13 -8
- data/etc/roots.pem +5114 -0
- data/include/grpc/byte_buffer.h +120 -0
- data/include/grpc/byte_buffer_reader.h +58 -0
- data/include/grpc/census.h +488 -0
- data/include/grpc/compression.h +106 -0
- data/include/grpc/grpc.h +732 -0
- data/include/grpc/grpc_security.h +374 -0
- data/include/grpc/grpc_zookeeper.h +59 -0
- data/include/grpc/status.h +163 -0
- data/include/grpc/support/alloc.h +72 -0
- data/include/grpc/support/atm.h +92 -0
- data/include/grpc/support/atm_gcc_atomic.h +72 -0
- data/include/grpc/support/atm_gcc_sync.h +87 -0
- data/include/grpc/support/atm_win32.h +125 -0
- data/include/grpc/support/avl.h +91 -0
- data/include/grpc/support/cmdline.h +101 -0
- data/include/grpc/support/cpu.h +57 -0
- data/include/grpc/support/histogram.h +76 -0
- data/include/grpc/support/host_port.h +64 -0
- data/include/grpc/support/log.h +108 -0
- data/include/grpc/support/log_win32.h +51 -0
- data/include/grpc/support/port_platform.h +356 -0
- data/include/grpc/support/slice.h +182 -0
- data/include/grpc/support/slice_buffer.h +102 -0
- data/include/grpc/support/string_util.h +61 -0
- data/include/grpc/support/subprocess.h +57 -0
- data/include/grpc/support/sync.h +315 -0
- data/include/grpc/support/sync_generic.h +55 -0
- data/include/grpc/support/sync_posix.h +47 -0
- data/include/grpc/support/sync_win32.h +49 -0
- data/include/grpc/support/thd.h +91 -0
- data/include/grpc/support/time.h +128 -0
- data/include/grpc/support/tls.h +77 -0
- data/include/grpc/support/tls_gcc.h +56 -0
- data/include/grpc/support/tls_msvc.h +56 -0
- data/include/grpc/support/tls_pthread.h +60 -0
- data/include/grpc/support/useful.h +75 -0
- data/src/core/census/aggregation.h +66 -0
- data/src/core/census/context.c +46 -0
- data/src/core/census/context.h +47 -0
- data/src/core/census/grpc_context.c +53 -0
- data/src/core/census/grpc_filter.c +184 -0
- data/src/core/census/grpc_filter.h +44 -0
- data/src/core/census/initialize.c +57 -0
- data/src/core/census/operation.c +63 -0
- data/src/core/census/rpc_metric_id.h +51 -0
- data/src/core/census/tracing.c +45 -0
- data/src/core/channel/channel_args.c +209 -0
- data/src/core/channel/channel_args.h +88 -0
- data/src/core/channel/channel_stack.c +262 -0
- data/src/core/channel/channel_stack.h +260 -0
- data/src/core/channel/client_channel.c +524 -0
- data/src/core/channel/client_channel.h +63 -0
- data/src/core/channel/client_uchannel.c +243 -0
- data/src/core/channel/client_uchannel.h +60 -0
- data/src/core/channel/compress_filter.c +297 -0
- data/src/core/channel/compress_filter.h +65 -0
- data/src/core/channel/connected_channel.c +167 -0
- data/src/core/channel/connected_channel.h +51 -0
- data/src/core/channel/context.h +49 -0
- data/src/core/channel/http_client_filter.c +248 -0
- data/src/core/channel/http_client_filter.h +44 -0
- data/src/core/channel/http_server_filter.c +233 -0
- data/src/core/channel/http_server_filter.h +42 -0
- data/src/core/channel/subchannel_call_holder.c +259 -0
- data/src/core/channel/subchannel_call_holder.h +98 -0
- data/src/core/client_config/client_config.c +72 -0
- data/src/core/client_config/client_config.h +53 -0
- data/src/core/client_config/connector.c +54 -0
- data/src/core/client_config/connector.h +95 -0
- data/src/core/client_config/default_initial_connect_string.c +39 -0
- data/src/core/client_config/initial_connect_string.c +53 -0
- data/src/core/client_config/initial_connect_string.h +50 -0
- data/src/core/client_config/lb_policies/pick_first.c +398 -0
- data/src/core/client_config/lb_policies/pick_first.h +43 -0
- data/src/core/client_config/lb_policies/round_robin.c +537 -0
- data/src/core/client_config/lb_policies/round_robin.h +46 -0
- data/src/core/client_config/lb_policy.c +134 -0
- data/src/core/client_config/lb_policy.h +143 -0
- data/src/core/client_config/lb_policy_factory.c +48 -0
- data/src/core/client_config/lb_policy_factory.h +73 -0
- data/src/core/client_config/lb_policy_registry.c +88 -0
- data/src/core/client_config/lb_policy_registry.h +54 -0
- data/src/core/client_config/resolver.c +82 -0
- data/src/core/client_config/resolver.h +94 -0
- data/src/core/client_config/resolver_factory.c +55 -0
- data/src/core/client_config/resolver_factory.h +82 -0
- data/src/core/client_config/resolver_registry.c +137 -0
- data/src/core/client_config/resolver_registry.h +65 -0
- data/src/core/client_config/resolvers/dns_resolver.c +257 -0
- data/src/core/client_config/resolvers/dns_resolver.h +42 -0
- data/src/core/client_config/resolvers/sockaddr_resolver.c +391 -0
- data/src/core/client_config/resolvers/sockaddr_resolver.h +50 -0
- data/src/core/client_config/subchannel.c +697 -0
- data/src/core/client_config/subchannel.h +165 -0
- data/src/core/client_config/subchannel_factory.c +49 -0
- data/src/core/client_config/subchannel_factory.h +66 -0
- data/src/core/client_config/uri_parser.c +242 -0
- data/src/core/client_config/uri_parser.h +51 -0
- data/src/core/compression/algorithm.c +166 -0
- data/src/core/compression/algorithm_metadata.h +53 -0
- data/src/core/compression/message_compress.c +198 -0
- data/src/core/compression/message_compress.h +52 -0
- data/src/core/debug/trace.c +136 -0
- data/src/core/debug/trace.h +43 -0
- data/src/core/httpcli/format_request.c +120 -0
- data/src/core/httpcli/format_request.h +45 -0
- data/src/core/httpcli/httpcli.c +286 -0
- data/src/core/httpcli/httpcli.h +162 -0
- data/src/core/httpcli/httpcli_security_connector.c +189 -0
- data/src/core/httpcli/parser.c +211 -0
- data/src/core/httpcli/parser.h +64 -0
- data/src/core/iomgr/closure.c +98 -0
- data/src/core/iomgr/closure.h +97 -0
- data/src/core/iomgr/endpoint.c +67 -0
- data/src/core/iomgr/endpoint.h +102 -0
- data/src/core/iomgr/endpoint_pair.h +47 -0
- data/src/core/iomgr/endpoint_pair_posix.c +82 -0
- data/src/core/iomgr/endpoint_pair_windows.c +97 -0
- data/src/core/iomgr/exec_ctx.c +72 -0
- data/src/core/iomgr/exec_ctx.h +78 -0
- data/src/core/iomgr/executor.c +143 -0
- data/src/core/iomgr/executor.h +53 -0
- data/src/core/iomgr/fd_posix.c +438 -0
- data/src/core/iomgr/fd_posix.h +189 -0
- data/src/core/iomgr/iocp_windows.c +206 -0
- data/src/core/iomgr/iocp_windows.h +56 -0
- data/src/core/iomgr/iomgr.c +156 -0
- data/src/core/iomgr/iomgr.h +43 -0
- data/src/core/iomgr/iomgr_internal.h +58 -0
- data/src/core/iomgr/iomgr_posix.c +52 -0
- data/src/core/iomgr/iomgr_posix.h +39 -0
- data/src/core/iomgr/iomgr_windows.c +73 -0
- data/src/core/iomgr/pollset.h +95 -0
- data/src/core/iomgr/pollset_multipoller_with_epoll.c +258 -0
- data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +227 -0
- data/src/core/iomgr/pollset_posix.c +638 -0
- data/src/core/iomgr/pollset_posix.h +147 -0
- data/src/core/iomgr/pollset_set.h +67 -0
- data/src/core/iomgr/pollset_set_posix.c +182 -0
- data/src/core/iomgr/pollset_set_posix.h +61 -0
- data/src/core/iomgr/pollset_set_windows.c +60 -0
- data/src/core/iomgr/pollset_set_windows.h +39 -0
- data/src/core/iomgr/pollset_windows.c +248 -0
- data/src/core/iomgr/pollset_windows.h +79 -0
- data/src/core/iomgr/resolve_address.h +72 -0
- data/src/core/iomgr/resolve_address_posix.c +183 -0
- data/src/core/iomgr/resolve_address_windows.c +166 -0
- data/src/core/iomgr/sockaddr.h +47 -0
- data/src/core/iomgr/sockaddr_posix.h +44 -0
- data/src/core/iomgr/sockaddr_utils.c +234 -0
- data/src/core/iomgr/sockaddr_utils.h +89 -0
- data/src/core/iomgr/sockaddr_win32.h +46 -0
- data/src/core/iomgr/socket_utils_common_posix.c +208 -0
- data/src/core/iomgr/socket_utils_linux.c +51 -0
- data/src/core/iomgr/socket_utils_posix.c +70 -0
- data/src/core/iomgr/socket_utils_posix.h +113 -0
- data/src/core/iomgr/socket_windows.c +98 -0
- data/src/core/iomgr/socket_windows.h +111 -0
- data/src/core/iomgr/tcp_client.h +53 -0
- data/src/core/iomgr/tcp_client_posix.c +304 -0
- data/src/core/iomgr/tcp_client_windows.c +221 -0
- data/src/core/iomgr/tcp_posix.c +485 -0
- data/src/core/iomgr/tcp_posix.h +65 -0
- data/src/core/iomgr/tcp_server.h +83 -0
- data/src/core/iomgr/tcp_server_posix.c +562 -0
- data/src/core/iomgr/tcp_server_windows.c +509 -0
- data/src/core/iomgr/tcp_windows.c +406 -0
- data/src/core/iomgr/tcp_windows.h +57 -0
- data/src/core/iomgr/time_averaged_stats.c +77 -0
- data/src/core/iomgr/time_averaged_stats.h +88 -0
- data/src/core/iomgr/timer.c +345 -0
- data/src/core/iomgr/timer.h +89 -0
- data/src/core/iomgr/timer_heap.c +148 -0
- data/src/core/iomgr/timer_heap.h +57 -0
- data/src/core/iomgr/timer_internal.h +61 -0
- data/src/core/iomgr/udp_server.c +439 -0
- data/src/core/iomgr/udp_server.h +83 -0
- data/src/core/iomgr/wakeup_fd_eventfd.c +85 -0
- data/src/core/iomgr/wakeup_fd_nospecial.c +51 -0
- data/src/core/iomgr/wakeup_fd_pipe.c +97 -0
- data/src/core/iomgr/wakeup_fd_pipe.h +41 -0
- data/src/core/iomgr/wakeup_fd_posix.c +72 -0
- data/src/core/iomgr/wakeup_fd_posix.h +101 -0
- data/src/core/iomgr/workqueue.h +85 -0
- data/src/core/iomgr/workqueue_posix.c +143 -0
- data/src/core/iomgr/workqueue_posix.h +51 -0
- data/src/core/iomgr/workqueue_windows.c +40 -0
- data/src/core/iomgr/workqueue_windows.h +37 -0
- data/src/core/json/json.c +64 -0
- data/src/core/json/json.h +88 -0
- data/src/core/json/json_common.h +49 -0
- data/src/core/json/json_reader.c +660 -0
- data/src/core/json/json_reader.h +160 -0
- data/src/core/json/json_string.c +379 -0
- data/src/core/json/json_writer.c +260 -0
- data/src/core/json/json_writer.h +97 -0
- data/src/core/profiling/basic_timers.c +274 -0
- data/src/core/profiling/stap_timers.c +65 -0
- data/src/core/profiling/timers.h +119 -0
- data/src/core/security/auth_filters.h +42 -0
- data/src/core/security/base64.c +233 -0
- data/src/core/security/base64.h +52 -0
- data/src/core/security/client_auth_filter.c +337 -0
- data/src/core/security/credentials.c +1273 -0
- data/src/core/security/credentials.h +376 -0
- data/src/core/security/credentials_metadata.c +101 -0
- data/src/core/security/credentials_posix.c +61 -0
- data/src/core/security/credentials_win32.c +61 -0
- data/src/core/security/google_default_credentials.c +260 -0
- data/src/core/security/handshake.c +327 -0
- data/src/core/security/handshake.h +50 -0
- data/src/core/security/json_token.c +405 -0
- data/src/core/security/json_token.h +118 -0
- data/src/core/security/jwt_verifier.c +842 -0
- data/src/core/security/jwt_verifier.h +136 -0
- data/src/core/security/secure_endpoint.c +383 -0
- data/src/core/security/secure_endpoint.h +49 -0
- data/src/core/security/security_connector.c +756 -0
- data/src/core/security/security_connector.h +246 -0
- data/src/core/security/security_context.c +342 -0
- data/src/core/security/security_context.h +114 -0
- data/src/core/security/server_auth_filter.c +264 -0
- data/src/core/security/server_secure_chttp2.c +268 -0
- data/src/core/statistics/census_interface.h +76 -0
- data/src/core/statistics/census_rpc_stats.h +101 -0
- data/src/core/support/alloc.c +90 -0
- data/src/core/support/avl.c +288 -0
- data/src/core/support/block_annotate.h +48 -0
- data/src/core/support/cmdline.c +347 -0
- data/src/core/support/cpu_iphone.c +49 -0
- data/src/core/support/cpu_linux.c +78 -0
- data/src/core/support/cpu_posix.c +77 -0
- data/src/core/support/cpu_windows.c +47 -0
- data/src/core/support/env.h +60 -0
- data/src/core/support/env_linux.c +62 -0
- data/src/core/support/env_posix.c +57 -0
- data/src/core/support/env_win32.c +65 -0
- data/src/core/support/file.c +91 -0
- data/src/core/support/file.h +63 -0
- data/src/core/support/file_posix.c +85 -0
- data/src/core/support/file_win32.c +84 -0
- data/src/core/support/histogram.c +244 -0
- data/src/core/support/host_port.c +110 -0
- data/src/core/support/log.c +66 -0
- data/src/core/support/log_android.c +87 -0
- data/src/core/support/log_linux.c +105 -0
- data/src/core/support/log_posix.c +102 -0
- data/src/core/support/log_win32.c +125 -0
- data/src/core/support/murmur_hash.c +96 -0
- data/src/core/support/murmur_hash.h +44 -0
- data/src/core/support/slice.c +343 -0
- data/src/core/support/slice_buffer.c +282 -0
- data/src/core/support/stack_lockfree.c +175 -0
- data/src/core/support/stack_lockfree.h +53 -0
- data/src/core/support/string.c +296 -0
- data/src/core/support/string.h +121 -0
- data/src/core/support/string_posix.c +86 -0
- data/src/core/support/string_win32.c +109 -0
- data/src/core/support/string_win32.h +47 -0
- data/src/core/support/subprocess_posix.c +112 -0
- data/src/core/support/sync.c +122 -0
- data/src/core/support/sync_posix.c +104 -0
- data/src/core/support/sync_win32.c +128 -0
- data/src/core/support/thd.c +64 -0
- data/src/core/support/thd_internal.h +39 -0
- data/src/core/support/thd_posix.c +94 -0
- data/src/core/support/thd_win32.c +117 -0
- data/src/core/support/time.c +304 -0
- data/src/core/support/time_posix.c +161 -0
- data/src/core/support/time_precise.c +89 -0
- data/src/core/support/time_precise.h +42 -0
- data/src/core/support/time_win32.c +101 -0
- data/src/core/support/tls_pthread.c +45 -0
- data/src/core/surface/api_trace.c +36 -0
- data/src/core/surface/api_trace.h +65 -0
- data/src/core/surface/byte_buffer.c +97 -0
- data/src/core/surface/byte_buffer_reader.c +123 -0
- data/src/core/surface/call.c +1424 -0
- data/src/core/surface/call.h +109 -0
- data/src/core/surface/call_details.c +50 -0
- data/src/core/surface/call_log_batch.c +118 -0
- data/src/core/surface/call_test_only.h +64 -0
- data/src/core/surface/channel.c +327 -0
- data/src/core/surface/channel.h +74 -0
- data/src/core/surface/channel_connectivity.c +220 -0
- data/src/core/surface/channel_create.c +235 -0
- data/src/core/surface/channel_ping.c +79 -0
- data/src/core/surface/completion_queue.c +481 -0
- data/src/core/surface/completion_queue.h +91 -0
- data/src/core/surface/event_string.c +81 -0
- data/src/core/surface/event_string.h +42 -0
- data/src/core/surface/init.c +168 -0
- data/src/core/surface/init.h +40 -0
- data/src/core/surface/init_secure.c +42 -0
- data/src/core/surface/lame_client.c +149 -0
- data/src/core/surface/metadata_array.c +49 -0
- data/src/core/surface/secure_channel_create.c +336 -0
- data/src/core/surface/server.c +1343 -0
- data/src/core/surface/server.h +67 -0
- data/src/core/surface/server_chttp2.c +149 -0
- data/src/core/surface/server_create.c +51 -0
- data/src/core/surface/surface_trace.h +48 -0
- data/src/core/surface/validate_metadata.c +73 -0
- data/src/core/surface/version.c +39 -0
- data/src/core/transport/byte_stream.c +76 -0
- data/src/core/transport/byte_stream.h +88 -0
- data/src/core/transport/chttp2/alpn.c +56 -0
- data/src/core/transport/chttp2/alpn.h +49 -0
- data/src/core/transport/chttp2/bin_encoder.c +285 -0
- data/src/core/transport/chttp2/bin_encoder.h +54 -0
- data/src/core/transport/chttp2/frame.h +69 -0
- data/src/core/transport/chttp2/frame_data.c +245 -0
- data/src/core/transport/chttp2/frame_data.h +101 -0
- data/src/core/transport/chttp2/frame_goaway.c +193 -0
- data/src/core/transport/chttp2/frame_goaway.h +77 -0
- data/src/core/transport/chttp2/frame_ping.c +97 -0
- data/src/core/transport/chttp2/frame_ping.h +56 -0
- data/src/core/transport/chttp2/frame_rst_stream.c +100 -0
- data/src/core/transport/chttp2/frame_rst_stream.h +55 -0
- data/src/core/transport/chttp2/frame_settings.c +259 -0
- data/src/core/transport/chttp2/frame_settings.h +103 -0
- data/src/core/transport/chttp2/frame_window_update.c +114 -0
- data/src/core/transport/chttp2/frame_window_update.h +58 -0
- data/src/core/transport/chttp2/hpack_encoder.c +572 -0
- data/src/core/transport/chttp2/hpack_encoder.h +95 -0
- data/src/core/transport/chttp2/hpack_parser.c +1449 -0
- data/src/core/transport/chttp2/hpack_parser.h +116 -0
- data/src/core/transport/chttp2/hpack_table.c +361 -0
- data/src/core/transport/chttp2/hpack_table.h +108 -0
- data/src/core/transport/chttp2/http2_errors.h +56 -0
- data/src/core/transport/chttp2/huffsyms.c +297 -0
- data/src/core/transport/chttp2/huffsyms.h +48 -0
- data/src/core/transport/chttp2/incoming_metadata.c +96 -0
- data/src/core/transport/chttp2/incoming_metadata.h +60 -0
- data/src/core/transport/chttp2/internal.h +757 -0
- data/src/core/transport/chttp2/parsing.c +866 -0
- data/src/core/transport/chttp2/status_conversion.c +109 -0
- data/src/core/transport/chttp2/status_conversion.h +50 -0
- data/src/core/transport/chttp2/stream_lists.c +401 -0
- data/src/core/transport/chttp2/stream_map.c +198 -0
- data/src/core/transport/chttp2/stream_map.h +85 -0
- data/src/core/transport/chttp2/timeout_encoding.c +185 -0
- data/src/core/transport/chttp2/timeout_encoding.h +47 -0
- data/src/core/transport/chttp2/varint.c +66 -0
- data/src/core/transport/chttp2/varint.h +76 -0
- data/src/core/transport/chttp2/writing.c +356 -0
- data/src/core/transport/chttp2_transport.c +1692 -0
- data/src/core/transport/chttp2_transport.h +51 -0
- data/src/core/transport/connectivity_state.c +164 -0
- data/src/core/transport/connectivity_state.h +85 -0
- data/src/core/transport/metadata.c +690 -0
- data/src/core/transport/metadata.h +156 -0
- data/src/core/transport/metadata_batch.c +194 -0
- data/src/core/transport/metadata_batch.h +125 -0
- data/src/core/transport/static_metadata.c +90 -0
- data/src/core/transport/static_metadata.h +408 -0
- data/src/core/transport/transport.c +183 -0
- data/src/core/transport/transport.h +222 -0
- data/src/core/transport/transport_impl.h +78 -0
- data/src/core/transport/transport_op_string.c +140 -0
- data/src/core/tsi/fake_transport_security.c +525 -0
- data/src/core/tsi/fake_transport_security.h +61 -0
- data/src/core/tsi/ssl_transport_security.c +1467 -0
- data/src/core/tsi/ssl_transport_security.h +173 -0
- data/src/core/tsi/transport_security.c +284 -0
- data/src/core/tsi/transport_security.h +111 -0
- data/src/core/tsi/transport_security_interface.h +344 -0
- data/{bin → src/ruby/bin}/apis/google/protobuf/empty.rb +0 -0
- data/{bin → src/ruby/bin}/apis/pubsub_demo.rb +7 -15
- data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub.rb +0 -0
- data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub_services.rb +0 -0
- data/{bin → src/ruby/bin}/grpc_ruby_interop_client +0 -0
- data/{bin → src/ruby/bin}/grpc_ruby_interop_server +0 -0
- data/{bin → src/ruby/bin}/interop/interop_client.rb +0 -0
- data/{bin → src/ruby/bin}/interop/interop_server.rb +0 -0
- data/src/ruby/bin/math.rb +32 -0
- data/{bin → src/ruby/bin}/math_client.rb +1 -1
- data/{bin → src/ruby/bin}/math_server.rb +1 -1
- data/src/ruby/bin/math_services.rb +27 -0
- data/{bin → src/ruby/bin}/noproto_client.rb +1 -1
- data/{bin → src/ruby/bin}/noproto_server.rb +1 -1
- data/{ext → src/ruby/ext}/grpc/extconf.rb +24 -40
- data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.c +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_call.c +80 -18
- data/{ext → src/ruby/ext}/grpc/rb_call.h +6 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +315 -0
- data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
- data/{ext → src/ruby/ext}/grpc/rb_channel.c +19 -7
- data/{ext → src/ruby/ext}/grpc/rb_channel.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_channel_args.c +2 -0
- data/{ext → src/ruby/ext}/grpc/rb_channel_args.h +0 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.c +266 -0
- data/{ext/grpc/rb_credentials.h → src/ruby/ext/grpc/rb_channel_credentials.h} +3 -3
- data/{ext → src/ruby/ext}/grpc/rb_completion_queue.c +3 -1
- data/{ext → src/ruby/ext}/grpc/rb_completion_queue.h +0 -0
- data/src/ruby/ext/grpc/rb_event_thread.c +153 -0
- data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
- data/{ext → src/ruby/ext}/grpc/rb_grpc.c +25 -5
- data/{ext → src/ruby/ext}/grpc/rb_grpc.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_server.c +4 -1
- data/{ext → src/ruby/ext}/grpc/rb_server.h +0 -0
- data/{ext → src/ruby/ext}/grpc/rb_server_credentials.c +2 -0
- data/{ext → src/ruby/ext}/grpc/rb_server_credentials.h +0 -0
- data/{lib → src/ruby/lib}/grpc.rb +6 -1
- data/{lib → src/ruby/lib}/grpc/core/time_consts.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/errors.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/generic/active_call.rb +4 -6
- data/{lib → src/ruby/lib}/grpc/generic/bidi_call.rb +16 -4
- data/{lib → src/ruby/lib}/grpc/generic/client_stub.rb +42 -52
- data/{lib → src/ruby/lib}/grpc/generic/rpc_desc.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/generic/rpc_server.rb +15 -8
- data/{lib → src/ruby/lib}/grpc/generic/service.rb +4 -2
- data/src/ruby/lib/grpc/grpc.so +0 -0
- data/{lib → src/ruby/lib}/grpc/logconfig.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/notifier.rb +0 -0
- data/{lib → src/ruby/lib}/grpc/version.rb +2 -2
- data/src/ruby/pb/README.md +42 -0
- data/src/ruby/pb/generate_proto_ruby.sh +51 -0
- data/src/ruby/pb/grpc/health/checker.rb +75 -0
- data/src/ruby/pb/grpc/health/v1alpha/health.rb +29 -0
- data/src/ruby/pb/grpc/health/v1alpha/health_services.rb +28 -0
- data/src/ruby/pb/test/client.rb +469 -0
- data/src/ruby/pb/test/proto/empty.rb +15 -0
- data/src/ruby/pb/test/proto/messages.rb +80 -0
- data/src/ruby/pb/test/proto/test.rb +14 -0
- data/src/ruby/pb/test/proto/test_services.rb +64 -0
- data/src/ruby/pb/test/server.rb +253 -0
- data/{bin/math_services.rb → src/ruby/spec/call_credentials_spec.rb} +19 -18
- data/{spec → src/ruby/spec}/call_spec.rb +10 -1
- data/{spec/credentials_spec.rb → src/ruby/spec/channel_credentials_spec.rb} +38 -12
- data/{spec → src/ruby/spec}/channel_spec.rb +14 -9
- data/{spec → src/ruby/spec}/client_server_spec.rb +31 -2
- data/{spec → src/ruby/spec}/completion_queue_spec.rb +0 -0
- data/{spec → src/ruby/spec}/generic/active_call_spec.rb +2 -1
- data/{spec → src/ruby/spec}/generic/client_stub_spec.rb +27 -67
- data/{spec → src/ruby/spec}/generic/rpc_desc_spec.rb +0 -0
- data/{spec → src/ruby/spec}/generic/rpc_server_pool_spec.rb +0 -0
- data/{spec → src/ruby/spec}/generic/rpc_server_spec.rb +12 -46
- data/{spec → src/ruby/spec}/generic/service_spec.rb +6 -3
- data/{spec → src/ruby/spec}/pb/health/checker_spec.rb +8 -8
- data/{spec → src/ruby/spec}/server_credentials_spec.rb +0 -0
- data/{spec → src/ruby/spec}/server_spec.rb +0 -0
- data/{spec → src/ruby/spec}/spec_helper.rb +0 -0
- data/{spec → src/ruby/spec}/testdata/README +0 -0
- data/{spec → src/ruby/spec}/testdata/ca.pem +0 -0
- data/{spec → src/ruby/spec}/testdata/server1.key +0 -0
- data/src/ruby/spec/testdata/server1.pem +16 -0
- data/{spec → src/ruby/spec}/time_consts_spec.rb +0 -0
- metadata +496 -97
- data/bin/math.proto +0 -80
- data/bin/math.rb +0 -61
- data/ext/grpc/rb_credentials.c +0 -294
- data/lib/grpc/grpc.so +0 -0
- data/spec/testdata/server1.pem +0 -16
@@ -0,0 +1,50 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2015, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
#ifndef GRPC_INTERNAL_CORE_CLIENT_CONFIG_RESOLVERS_UNIX_RESOLVER_H
|
35
|
+
#define GRPC_INTERNAL_CORE_CLIENT_CONFIG_RESOLVERS_UNIX_RESOLVER_H
|
36
|
+
|
37
|
+
#include <grpc/support/port_platform.h>
|
38
|
+
|
39
|
+
#include "src/core/client_config/resolver_factory.h"
|
40
|
+
|
41
|
+
grpc_resolver_factory *grpc_ipv4_resolver_factory_create(void);
|
42
|
+
|
43
|
+
grpc_resolver_factory *grpc_ipv6_resolver_factory_create(void);
|
44
|
+
|
45
|
+
#ifdef GPR_POSIX_SOCKET
|
46
|
+
/** Create a unix resolver factory */
|
47
|
+
grpc_resolver_factory *grpc_unix_resolver_factory_create(void);
|
48
|
+
#endif
|
49
|
+
|
50
|
+
#endif /* GRPC_INTERNAL_CORE_CLIENT_CONFIG_RESOLVERS_UNIX_RESOLVER_H */
|
@@ -0,0 +1,697 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2015, Google Inc.
|
4
|
+
* All rights reserved.
|
5
|
+
*
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
7
|
+
* modification, are permitted provided that the following conditions are
|
8
|
+
* met:
|
9
|
+
*
|
10
|
+
* * Redistributions of source code must retain the above copyright
|
11
|
+
* notice, this list of conditions and the following disclaimer.
|
12
|
+
* * Redistributions in binary form must reproduce the above
|
13
|
+
* copyright notice, this list of conditions and the following disclaimer
|
14
|
+
* in the documentation and/or other materials provided with the
|
15
|
+
* distribution.
|
16
|
+
* * Neither the name of Google Inc. nor the names of its
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
18
|
+
* this software without specific prior written permission.
|
19
|
+
*
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
21
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
22
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
23
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
24
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
25
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
26
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
27
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
28
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
29
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
30
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
31
|
+
*
|
32
|
+
*/
|
33
|
+
|
34
|
+
#include "src/core/client_config/subchannel.h"
|
35
|
+
|
36
|
+
#include <string.h>
|
37
|
+
|
38
|
+
#include <grpc/support/alloc.h>
|
39
|
+
|
40
|
+
#include "src/core/channel/channel_args.h"
|
41
|
+
#include "src/core/channel/client_channel.h"
|
42
|
+
#include "src/core/channel/connected_channel.h"
|
43
|
+
#include "src/core/client_config/initial_connect_string.h"
|
44
|
+
#include "src/core/iomgr/timer.h"
|
45
|
+
#include "src/core/profiling/timers.h"
|
46
|
+
#include "src/core/surface/channel.h"
|
47
|
+
#include "src/core/transport/connectivity_state.h"
|
48
|
+
#include "src/core/transport/connectivity_state.h"
|
49
|
+
|
50
|
+
#define INTERNAL_REF_BITS 16
|
51
|
+
#define STRONG_REF_MASK (~(gpr_atm)((1 << INTERNAL_REF_BITS) - 1))
|
52
|
+
|
53
|
+
#define GRPC_SUBCHANNEL_MIN_CONNECT_TIMEOUT_SECONDS 20
|
54
|
+
#define GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS 1
|
55
|
+
#define GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER 1.6
|
56
|
+
#define GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS 120
|
57
|
+
#define GRPC_SUBCHANNEL_RECONNECT_JITTER 0.2
|
58
|
+
|
59
|
+
#define GET_CONNECTED_SUBCHANNEL(subchannel, barrier) \
|
60
|
+
((grpc_connected_subchannel *)(gpr_atm_##barrier##_load( \
|
61
|
+
&(subchannel)->connected_subchannel)))
|
62
|
+
|
63
|
+
typedef struct {
|
64
|
+
grpc_closure closure;
|
65
|
+
grpc_subchannel *subchannel;
|
66
|
+
grpc_connectivity_state connectivity_state;
|
67
|
+
} state_watcher;
|
68
|
+
|
69
|
+
typedef struct external_state_watcher {
|
70
|
+
grpc_subchannel *subchannel;
|
71
|
+
grpc_pollset_set *pollset_set;
|
72
|
+
grpc_closure *notify;
|
73
|
+
grpc_closure closure;
|
74
|
+
struct external_state_watcher *next;
|
75
|
+
struct external_state_watcher *prev;
|
76
|
+
} external_state_watcher;
|
77
|
+
|
78
|
+
struct grpc_subchannel {
|
79
|
+
grpc_connector *connector;
|
80
|
+
|
81
|
+
/** refcount
|
82
|
+
- lower INTERNAL_REF_BITS bits are for internal references:
|
83
|
+
these do not keep the subchannel open.
|
84
|
+
- upper remaining bits are for public references: these do
|
85
|
+
keep the subchannel open */
|
86
|
+
gpr_atm ref_pair;
|
87
|
+
|
88
|
+
/** non-transport related channel filters */
|
89
|
+
const grpc_channel_filter **filters;
|
90
|
+
size_t num_filters;
|
91
|
+
/** channel arguments */
|
92
|
+
grpc_channel_args *args;
|
93
|
+
/** address to connect to */
|
94
|
+
struct sockaddr *addr;
|
95
|
+
size_t addr_len;
|
96
|
+
|
97
|
+
/** initial string to send to peer */
|
98
|
+
gpr_slice initial_connect_string;
|
99
|
+
|
100
|
+
/** set during connection */
|
101
|
+
grpc_connect_out_args connecting_result;
|
102
|
+
|
103
|
+
/** callback for connection finishing */
|
104
|
+
grpc_closure connected;
|
105
|
+
|
106
|
+
/** pollset_set tracking who's interested in a connection
|
107
|
+
being setup */
|
108
|
+
grpc_pollset_set pollset_set;
|
109
|
+
|
110
|
+
/** active connection, or null; of type grpc_connected_subchannel */
|
111
|
+
gpr_atm connected_subchannel;
|
112
|
+
|
113
|
+
/** mutex protecting remaining elements */
|
114
|
+
gpr_mu mu;
|
115
|
+
|
116
|
+
/** have we seen a disconnection? */
|
117
|
+
int disconnected;
|
118
|
+
/** are we connecting */
|
119
|
+
int connecting;
|
120
|
+
/** connectivity state tracking */
|
121
|
+
grpc_connectivity_state_tracker state_tracker;
|
122
|
+
|
123
|
+
external_state_watcher root_external_state_watcher;
|
124
|
+
|
125
|
+
/** next connect attempt time */
|
126
|
+
gpr_timespec next_attempt;
|
127
|
+
/** amount to backoff each failure */
|
128
|
+
gpr_timespec backoff_delta;
|
129
|
+
/** do we have an active alarm? */
|
130
|
+
int have_alarm;
|
131
|
+
/** our alarm */
|
132
|
+
grpc_timer alarm;
|
133
|
+
/** current random value */
|
134
|
+
gpr_uint32 random;
|
135
|
+
};
|
136
|
+
|
137
|
+
struct grpc_subchannel_call {
|
138
|
+
grpc_connected_subchannel *connection;
|
139
|
+
};
|
140
|
+
|
141
|
+
#define SUBCHANNEL_CALL_TO_CALL_STACK(call) ((grpc_call_stack *)((call) + 1))
|
142
|
+
#define CHANNEL_STACK_FROM_CONNECTION(con) ((grpc_channel_stack *)(con))
|
143
|
+
#define CALLSTACK_TO_SUBCHANNEL_CALL(callstack) \
|
144
|
+
(((grpc_subchannel_call *)(callstack)) - 1)
|
145
|
+
|
146
|
+
static gpr_timespec compute_connect_deadline(grpc_subchannel *c);
|
147
|
+
static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *subchannel,
|
148
|
+
int iomgr_success);
|
149
|
+
|
150
|
+
#ifdef GRPC_STREAM_REFCOUNT_DEBUG
|
151
|
+
#define REF_REASON reason
|
152
|
+
#define REF_LOG(name, p) \
|
153
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "%s: %p ref %d -> %d %s", \
|
154
|
+
(name), (p), (p)->refs.count, (p)->refs.count + 1, reason)
|
155
|
+
#define UNREF_LOG(name, p) \
|
156
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "%s: %p unref %d -> %d %s", \
|
157
|
+
(name), (p), (p)->refs.count, (p)->refs.count - 1, reason)
|
158
|
+
#define REF_MUTATE_EXTRA_ARGS \
|
159
|
+
GRPC_SUBCHANNEL_REF_EXTRA_ARGS, const char *purpose
|
160
|
+
#define REF_MUTATE_PURPOSE(x) , file, line, reason, x
|
161
|
+
#else
|
162
|
+
#define REF_REASON ""
|
163
|
+
#define REF_LOG(name, p) \
|
164
|
+
do { \
|
165
|
+
} while (0)
|
166
|
+
#define UNREF_LOG(name, p) \
|
167
|
+
do { \
|
168
|
+
} while (0)
|
169
|
+
#define REF_MUTATE_EXTRA_ARGS
|
170
|
+
#define REF_MUTATE_PURPOSE(x)
|
171
|
+
#endif
|
172
|
+
|
173
|
+
/*
|
174
|
+
* connection implementation
|
175
|
+
*/
|
176
|
+
|
177
|
+
static void connection_destroy(grpc_exec_ctx *exec_ctx, void *arg,
|
178
|
+
int success) {
|
179
|
+
grpc_connected_subchannel *c = arg;
|
180
|
+
grpc_channel_stack_destroy(exec_ctx, CHANNEL_STACK_FROM_CONNECTION(c));
|
181
|
+
gpr_free(c);
|
182
|
+
}
|
183
|
+
|
184
|
+
void grpc_connected_subchannel_ref(grpc_connected_subchannel *c
|
185
|
+
GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
186
|
+
GRPC_CHANNEL_STACK_REF(CHANNEL_STACK_FROM_CONNECTION(c), REF_REASON);
|
187
|
+
}
|
188
|
+
|
189
|
+
void grpc_connected_subchannel_unref(grpc_exec_ctx *exec_ctx,
|
190
|
+
grpc_connected_subchannel *c
|
191
|
+
GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
192
|
+
GRPC_CHANNEL_STACK_UNREF(exec_ctx, CHANNEL_STACK_FROM_CONNECTION(c),
|
193
|
+
REF_REASON);
|
194
|
+
}
|
195
|
+
|
196
|
+
/*
|
197
|
+
* grpc_subchannel implementation
|
198
|
+
*/
|
199
|
+
|
200
|
+
static void subchannel_destroy(grpc_exec_ctx *exec_ctx, void *arg,
|
201
|
+
int success) {
|
202
|
+
grpc_subchannel *c = arg;
|
203
|
+
gpr_free((void *)c->filters);
|
204
|
+
grpc_channel_args_destroy(c->args);
|
205
|
+
gpr_free(c->addr);
|
206
|
+
gpr_slice_unref(c->initial_connect_string);
|
207
|
+
grpc_connectivity_state_destroy(exec_ctx, &c->state_tracker);
|
208
|
+
grpc_connector_unref(exec_ctx, c->connector);
|
209
|
+
grpc_pollset_set_destroy(&c->pollset_set);
|
210
|
+
gpr_free(c);
|
211
|
+
}
|
212
|
+
|
213
|
+
static gpr_atm ref_mutate(grpc_subchannel *c, gpr_atm delta,
|
214
|
+
int barrier REF_MUTATE_EXTRA_ARGS) {
|
215
|
+
gpr_atm old_val = barrier ? gpr_atm_full_fetch_add(&c->ref_pair, delta)
|
216
|
+
: gpr_atm_no_barrier_fetch_add(&c->ref_pair, delta);
|
217
|
+
#ifdef GRPC_STREAM_REFCOUNT_DEBUG
|
218
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
219
|
+
"SUBCHANNEL: %p % 12s 0x%08x -> 0x%08x [%s]", c, purpose, old_val,
|
220
|
+
old_val + delta, reason);
|
221
|
+
#endif
|
222
|
+
return old_val;
|
223
|
+
}
|
224
|
+
|
225
|
+
void grpc_subchannel_ref(grpc_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
226
|
+
gpr_atm old_refs;
|
227
|
+
old_refs = ref_mutate(c, (1 << INTERNAL_REF_BITS),
|
228
|
+
0 REF_MUTATE_PURPOSE("STRONG_REF"));
|
229
|
+
GPR_ASSERT((old_refs & STRONG_REF_MASK) != 0);
|
230
|
+
}
|
231
|
+
|
232
|
+
void grpc_subchannel_weak_ref(grpc_subchannel *c
|
233
|
+
GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
234
|
+
gpr_atm old_refs;
|
235
|
+
old_refs = ref_mutate(c, 1, 0 REF_MUTATE_PURPOSE("WEAK_REF"));
|
236
|
+
GPR_ASSERT(old_refs != 0);
|
237
|
+
}
|
238
|
+
|
239
|
+
static void disconnect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
|
240
|
+
grpc_connected_subchannel *con;
|
241
|
+
gpr_mu_lock(&c->mu);
|
242
|
+
GPR_ASSERT(!c->disconnected);
|
243
|
+
c->disconnected = 1;
|
244
|
+
grpc_connector_shutdown(exec_ctx, c->connector);
|
245
|
+
con = GET_CONNECTED_SUBCHANNEL(c, no_barrier);
|
246
|
+
if (con != NULL) {
|
247
|
+
GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, con, "connection");
|
248
|
+
gpr_atm_no_barrier_store(&c->connected_subchannel, 0xdeadbeef);
|
249
|
+
}
|
250
|
+
gpr_mu_unlock(&c->mu);
|
251
|
+
}
|
252
|
+
|
253
|
+
void grpc_subchannel_unref(grpc_exec_ctx *exec_ctx,
|
254
|
+
grpc_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
255
|
+
gpr_atm old_refs;
|
256
|
+
old_refs = ref_mutate(c, (gpr_atm)1 - (gpr_atm)(1 << INTERNAL_REF_BITS),
|
257
|
+
1 REF_MUTATE_PURPOSE("STRONG_UNREF"));
|
258
|
+
if ((old_refs & STRONG_REF_MASK) == (1 << INTERNAL_REF_BITS)) {
|
259
|
+
disconnect(exec_ctx, c);
|
260
|
+
}
|
261
|
+
GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "strong-unref");
|
262
|
+
}
|
263
|
+
|
264
|
+
void grpc_subchannel_weak_unref(grpc_exec_ctx *exec_ctx,
|
265
|
+
grpc_subchannel *c
|
266
|
+
GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
267
|
+
gpr_atm old_refs;
|
268
|
+
old_refs = ref_mutate(c, -(gpr_atm)1, 1 REF_MUTATE_PURPOSE("WEAK_UNREF"));
|
269
|
+
if (old_refs == 1) {
|
270
|
+
grpc_exec_ctx_enqueue(exec_ctx, grpc_closure_create(subchannel_destroy, c),
|
271
|
+
1);
|
272
|
+
}
|
273
|
+
}
|
274
|
+
|
275
|
+
static gpr_uint32 random_seed() {
|
276
|
+
return (gpr_uint32)(gpr_time_to_millis(gpr_now(GPR_CLOCK_MONOTONIC)));
|
277
|
+
}
|
278
|
+
|
279
|
+
grpc_subchannel *grpc_subchannel_create(grpc_connector *connector,
|
280
|
+
grpc_subchannel_args *args) {
|
281
|
+
grpc_subchannel *c = gpr_malloc(sizeof(*c));
|
282
|
+
memset(c, 0, sizeof(*c));
|
283
|
+
gpr_atm_no_barrier_store(&c->ref_pair, 1 << INTERNAL_REF_BITS);
|
284
|
+
c->connector = connector;
|
285
|
+
grpc_connector_ref(c->connector);
|
286
|
+
c->num_filters = args->filter_count;
|
287
|
+
c->filters = gpr_malloc(sizeof(grpc_channel_filter *) * c->num_filters);
|
288
|
+
memcpy((void *)c->filters, args->filters,
|
289
|
+
sizeof(grpc_channel_filter *) * c->num_filters);
|
290
|
+
c->addr = gpr_malloc(args->addr_len);
|
291
|
+
memcpy(c->addr, args->addr, args->addr_len);
|
292
|
+
grpc_pollset_set_init(&c->pollset_set);
|
293
|
+
c->addr_len = args->addr_len;
|
294
|
+
grpc_set_initial_connect_string(&c->addr, &c->addr_len,
|
295
|
+
&c->initial_connect_string);
|
296
|
+
c->args = grpc_channel_args_copy(args->args);
|
297
|
+
c->random = random_seed();
|
298
|
+
c->root_external_state_watcher.next = c->root_external_state_watcher.prev =
|
299
|
+
&c->root_external_state_watcher;
|
300
|
+
grpc_closure_init(&c->connected, subchannel_connected, c);
|
301
|
+
grpc_connectivity_state_init(&c->state_tracker, GRPC_CHANNEL_IDLE,
|
302
|
+
"subchannel");
|
303
|
+
gpr_mu_init(&c->mu);
|
304
|
+
return c;
|
305
|
+
}
|
306
|
+
|
307
|
+
static void continue_connect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
|
308
|
+
grpc_connect_in_args args;
|
309
|
+
|
310
|
+
args.interested_parties = &c->pollset_set;
|
311
|
+
args.addr = c->addr;
|
312
|
+
args.addr_len = c->addr_len;
|
313
|
+
args.deadline = compute_connect_deadline(c);
|
314
|
+
args.channel_args = c->args;
|
315
|
+
args.initial_connect_string = c->initial_connect_string;
|
316
|
+
|
317
|
+
grpc_connectivity_state_set(exec_ctx, &c->state_tracker,
|
318
|
+
GRPC_CHANNEL_CONNECTING, "state_change");
|
319
|
+
grpc_connector_connect(exec_ctx, c->connector, &args, &c->connecting_result,
|
320
|
+
&c->connected);
|
321
|
+
}
|
322
|
+
|
323
|
+
static void start_connect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
|
324
|
+
c->backoff_delta = gpr_time_from_seconds(
|
325
|
+
GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS, GPR_TIMESPAN);
|
326
|
+
c->next_attempt =
|
327
|
+
gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), c->backoff_delta);
|
328
|
+
continue_connect(exec_ctx, c);
|
329
|
+
}
|
330
|
+
|
331
|
+
grpc_connectivity_state grpc_subchannel_check_connectivity(grpc_subchannel *c) {
|
332
|
+
grpc_connectivity_state state;
|
333
|
+
gpr_mu_lock(&c->mu);
|
334
|
+
state = grpc_connectivity_state_check(&c->state_tracker);
|
335
|
+
gpr_mu_unlock(&c->mu);
|
336
|
+
return state;
|
337
|
+
}
|
338
|
+
|
339
|
+
static void on_external_state_watcher_done(grpc_exec_ctx *exec_ctx, void *arg,
|
340
|
+
int success) {
|
341
|
+
external_state_watcher *w = arg;
|
342
|
+
grpc_closure *follow_up = w->notify;
|
343
|
+
if (w->pollset_set != NULL) {
|
344
|
+
grpc_pollset_set_del_pollset_set(exec_ctx, &w->subchannel->pollset_set,
|
345
|
+
w->pollset_set);
|
346
|
+
}
|
347
|
+
gpr_mu_lock(&w->subchannel->mu);
|
348
|
+
w->next->prev = w->prev;
|
349
|
+
w->prev->next = w->next;
|
350
|
+
gpr_mu_unlock(&w->subchannel->mu);
|
351
|
+
GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, w->subchannel, "external_state_watcher");
|
352
|
+
gpr_free(w);
|
353
|
+
follow_up->cb(exec_ctx, follow_up->cb_arg, success);
|
354
|
+
}
|
355
|
+
|
356
|
+
void grpc_subchannel_notify_on_state_change(
|
357
|
+
grpc_exec_ctx *exec_ctx, grpc_subchannel *c,
|
358
|
+
grpc_pollset_set *interested_parties, grpc_connectivity_state *state,
|
359
|
+
grpc_closure *notify) {
|
360
|
+
int do_connect = 0;
|
361
|
+
external_state_watcher *w;
|
362
|
+
|
363
|
+
if (state == NULL) {
|
364
|
+
gpr_mu_lock(&c->mu);
|
365
|
+
for (w = c->root_external_state_watcher.next;
|
366
|
+
w != &c->root_external_state_watcher; w = w->next) {
|
367
|
+
if (w->notify == notify) {
|
368
|
+
grpc_connectivity_state_notify_on_state_change(
|
369
|
+
exec_ctx, &c->state_tracker, NULL, &w->closure);
|
370
|
+
}
|
371
|
+
}
|
372
|
+
gpr_mu_unlock(&c->mu);
|
373
|
+
} else {
|
374
|
+
w = gpr_malloc(sizeof(*w));
|
375
|
+
w->subchannel = c;
|
376
|
+
w->pollset_set = interested_parties;
|
377
|
+
w->notify = notify;
|
378
|
+
grpc_closure_init(&w->closure, on_external_state_watcher_done, w);
|
379
|
+
if (interested_parties != NULL) {
|
380
|
+
grpc_pollset_set_add_pollset_set(exec_ctx, &c->pollset_set,
|
381
|
+
interested_parties);
|
382
|
+
}
|
383
|
+
GRPC_SUBCHANNEL_WEAK_REF(c, "external_state_watcher");
|
384
|
+
gpr_mu_lock(&c->mu);
|
385
|
+
w->next = &c->root_external_state_watcher;
|
386
|
+
w->prev = w->next->prev;
|
387
|
+
w->next->prev = w->prev->next = w;
|
388
|
+
if (grpc_connectivity_state_notify_on_state_change(
|
389
|
+
exec_ctx, &c->state_tracker, state, &w->closure)) {
|
390
|
+
do_connect = 1;
|
391
|
+
c->connecting = 1;
|
392
|
+
/* released by connection */
|
393
|
+
GRPC_SUBCHANNEL_WEAK_REF(c, "connecting");
|
394
|
+
}
|
395
|
+
gpr_mu_unlock(&c->mu);
|
396
|
+
}
|
397
|
+
|
398
|
+
if (do_connect) {
|
399
|
+
start_connect(exec_ctx, c);
|
400
|
+
}
|
401
|
+
}
|
402
|
+
|
403
|
+
void grpc_connected_subchannel_process_transport_op(
|
404
|
+
grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con,
|
405
|
+
grpc_transport_op *op) {
|
406
|
+
grpc_channel_stack *channel_stack = CHANNEL_STACK_FROM_CONNECTION(con);
|
407
|
+
grpc_channel_element *top_elem = grpc_channel_stack_element(channel_stack, 0);
|
408
|
+
top_elem->filter->start_transport_op(exec_ctx, top_elem, op);
|
409
|
+
}
|
410
|
+
|
411
|
+
static void subchannel_on_child_state_changed(grpc_exec_ctx *exec_ctx, void *p,
|
412
|
+
int iomgr_success) {
|
413
|
+
state_watcher *sw = p;
|
414
|
+
grpc_subchannel *c = sw->subchannel;
|
415
|
+
gpr_mu *mu = &c->mu;
|
416
|
+
|
417
|
+
gpr_mu_lock(mu);
|
418
|
+
|
419
|
+
/* if we failed just leave this closure */
|
420
|
+
if (iomgr_success) {
|
421
|
+
if (sw->connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
|
422
|
+
/* any errors on a subchannel ==> we're done, create a new one */
|
423
|
+
sw->connectivity_state = GRPC_CHANNEL_FATAL_FAILURE;
|
424
|
+
}
|
425
|
+
grpc_connectivity_state_set(exec_ctx, &c->state_tracker,
|
426
|
+
sw->connectivity_state, "reflect_child");
|
427
|
+
if (sw->connectivity_state != GRPC_CHANNEL_FATAL_FAILURE) {
|
428
|
+
grpc_connected_subchannel_notify_on_state_change(
|
429
|
+
exec_ctx, GET_CONNECTED_SUBCHANNEL(c, no_barrier), NULL,
|
430
|
+
&sw->connectivity_state, &sw->closure);
|
431
|
+
GRPC_SUBCHANNEL_WEAK_REF(c, "state_watcher");
|
432
|
+
sw = NULL;
|
433
|
+
}
|
434
|
+
}
|
435
|
+
|
436
|
+
gpr_mu_unlock(mu);
|
437
|
+
GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "state_watcher");
|
438
|
+
gpr_free(sw);
|
439
|
+
}
|
440
|
+
|
441
|
+
static void connected_subchannel_state_op(grpc_exec_ctx *exec_ctx,
|
442
|
+
grpc_connected_subchannel *con,
|
443
|
+
grpc_pollset_set *interested_parties,
|
444
|
+
grpc_connectivity_state *state,
|
445
|
+
grpc_closure *closure) {
|
446
|
+
grpc_transport_op op;
|
447
|
+
grpc_channel_element *elem;
|
448
|
+
memset(&op, 0, sizeof(op));
|
449
|
+
op.connectivity_state = state;
|
450
|
+
op.on_connectivity_state_change = closure;
|
451
|
+
op.bind_pollset_set = interested_parties;
|
452
|
+
elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CONNECTION(con), 0);
|
453
|
+
elem->filter->start_transport_op(exec_ctx, elem, &op);
|
454
|
+
}
|
455
|
+
|
456
|
+
void grpc_connected_subchannel_notify_on_state_change(
|
457
|
+
grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con,
|
458
|
+
grpc_pollset_set *interested_parties, grpc_connectivity_state *state,
|
459
|
+
grpc_closure *closure) {
|
460
|
+
connected_subchannel_state_op(exec_ctx, con, interested_parties, state,
|
461
|
+
closure);
|
462
|
+
}
|
463
|
+
|
464
|
+
void grpc_connected_subchannel_ping(grpc_exec_ctx *exec_ctx,
|
465
|
+
grpc_connected_subchannel *con,
|
466
|
+
grpc_closure *closure) {
|
467
|
+
grpc_transport_op op;
|
468
|
+
grpc_channel_element *elem;
|
469
|
+
memset(&op, 0, sizeof(op));
|
470
|
+
op.send_ping = closure;
|
471
|
+
elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CONNECTION(con), 0);
|
472
|
+
elem->filter->start_transport_op(exec_ctx, elem, &op);
|
473
|
+
}
|
474
|
+
|
475
|
+
static void publish_transport(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
|
476
|
+
size_t channel_stack_size;
|
477
|
+
grpc_connected_subchannel *con;
|
478
|
+
grpc_channel_stack *stk;
|
479
|
+
size_t num_filters;
|
480
|
+
const grpc_channel_filter **filters;
|
481
|
+
state_watcher *sw_subchannel;
|
482
|
+
|
483
|
+
/* build final filter list */
|
484
|
+
num_filters = c->num_filters + c->connecting_result.num_filters + 1;
|
485
|
+
filters = gpr_malloc(sizeof(*filters) * num_filters);
|
486
|
+
memcpy((void *)filters, c->filters, sizeof(*filters) * c->num_filters);
|
487
|
+
memcpy((void *)(filters + c->num_filters), c->connecting_result.filters,
|
488
|
+
sizeof(*filters) * c->connecting_result.num_filters);
|
489
|
+
filters[num_filters - 1] = &grpc_connected_channel_filter;
|
490
|
+
|
491
|
+
/* construct channel stack */
|
492
|
+
channel_stack_size = grpc_channel_stack_size(filters, num_filters);
|
493
|
+
con = gpr_malloc(channel_stack_size);
|
494
|
+
stk = CHANNEL_STACK_FROM_CONNECTION(con);
|
495
|
+
grpc_channel_stack_init(exec_ctx, 1, connection_destroy, con, filters,
|
496
|
+
num_filters, c->connecting_result.channel_args,
|
497
|
+
"CONNECTED_SUBCHANNEL", stk);
|
498
|
+
grpc_connected_channel_bind_transport(stk, c->connecting_result.transport);
|
499
|
+
gpr_free((void *)c->connecting_result.filters);
|
500
|
+
memset(&c->connecting_result, 0, sizeof(c->connecting_result));
|
501
|
+
|
502
|
+
/* initialize state watcher */
|
503
|
+
sw_subchannel = gpr_malloc(sizeof(*sw_subchannel));
|
504
|
+
sw_subchannel->subchannel = c;
|
505
|
+
sw_subchannel->connectivity_state = GRPC_CHANNEL_READY;
|
506
|
+
grpc_closure_init(&sw_subchannel->closure, subchannel_on_child_state_changed,
|
507
|
+
sw_subchannel);
|
508
|
+
|
509
|
+
gpr_mu_lock(&c->mu);
|
510
|
+
|
511
|
+
if (c->disconnected) {
|
512
|
+
gpr_mu_unlock(&c->mu);
|
513
|
+
gpr_free(sw_subchannel);
|
514
|
+
gpr_free((void *)filters);
|
515
|
+
grpc_channel_stack_destroy(exec_ctx, stk);
|
516
|
+
gpr_free(con);
|
517
|
+
GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
|
518
|
+
return;
|
519
|
+
}
|
520
|
+
|
521
|
+
/* publish */
|
522
|
+
GPR_ASSERT(gpr_atm_no_barrier_cas(&c->connected_subchannel, 0, (gpr_atm)con));
|
523
|
+
c->connecting = 0;
|
524
|
+
|
525
|
+
/* setup subchannel watching connected subchannel for changes; subchannel ref
|
526
|
+
for connecting is donated
|
527
|
+
to the state watcher */
|
528
|
+
GRPC_SUBCHANNEL_WEAK_REF(c, "state_watcher");
|
529
|
+
GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
|
530
|
+
grpc_connected_subchannel_notify_on_state_change(
|
531
|
+
exec_ctx, con, &c->pollset_set, &sw_subchannel->connectivity_state,
|
532
|
+
&sw_subchannel->closure);
|
533
|
+
|
534
|
+
/* signal completion */
|
535
|
+
grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_READY,
|
536
|
+
"connected");
|
537
|
+
|
538
|
+
gpr_mu_unlock(&c->mu);
|
539
|
+
gpr_free((void *)filters);
|
540
|
+
}
|
541
|
+
|
542
|
+
/* Generate a random number between 0 and 1. */
|
543
|
+
static double generate_uniform_random_number(grpc_subchannel *c) {
|
544
|
+
c->random = (1103515245 * c->random + 12345) % ((gpr_uint32)1 << 31);
|
545
|
+
return c->random / (double)((gpr_uint32)1 << 31);
|
546
|
+
}
|
547
|
+
|
548
|
+
/* Update backoff_delta and next_attempt in subchannel */
|
549
|
+
static void update_reconnect_parameters(grpc_subchannel *c) {
|
550
|
+
size_t i;
|
551
|
+
gpr_int32 backoff_delta_millis, jitter;
|
552
|
+
gpr_int32 max_backoff_millis =
|
553
|
+
GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS * 1000;
|
554
|
+
double jitter_range;
|
555
|
+
|
556
|
+
if (c->args) {
|
557
|
+
for (i = 0; i < c->args->num_args; i++) {
|
558
|
+
if (0 == strcmp(c->args->args[i].key,
|
559
|
+
"grpc.testing.fixed_reconnect_backoff")) {
|
560
|
+
GPR_ASSERT(c->args->args[i].type == GRPC_ARG_INTEGER);
|
561
|
+
c->next_attempt = gpr_time_add(
|
562
|
+
gpr_now(GPR_CLOCK_MONOTONIC),
|
563
|
+
gpr_time_from_millis(c->args->args[i].value.integer, GPR_TIMESPAN));
|
564
|
+
return;
|
565
|
+
}
|
566
|
+
}
|
567
|
+
}
|
568
|
+
|
569
|
+
backoff_delta_millis =
|
570
|
+
(gpr_int32)(gpr_time_to_millis(c->backoff_delta) *
|
571
|
+
GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER);
|
572
|
+
if (backoff_delta_millis > max_backoff_millis) {
|
573
|
+
backoff_delta_millis = max_backoff_millis;
|
574
|
+
}
|
575
|
+
c->backoff_delta = gpr_time_from_millis(backoff_delta_millis, GPR_TIMESPAN);
|
576
|
+
c->next_attempt =
|
577
|
+
gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), c->backoff_delta);
|
578
|
+
|
579
|
+
jitter_range = GRPC_SUBCHANNEL_RECONNECT_JITTER * backoff_delta_millis;
|
580
|
+
jitter =
|
581
|
+
(gpr_int32)((2 * generate_uniform_random_number(c) - 1) * jitter_range);
|
582
|
+
c->next_attempt =
|
583
|
+
gpr_time_add(c->next_attempt, gpr_time_from_millis(jitter, GPR_TIMESPAN));
|
584
|
+
}
|
585
|
+
|
586
|
+
static void on_alarm(grpc_exec_ctx *exec_ctx, void *arg, int iomgr_success) {
|
587
|
+
grpc_subchannel *c = arg;
|
588
|
+
gpr_mu_lock(&c->mu);
|
589
|
+
c->have_alarm = 0;
|
590
|
+
if (c->disconnected) {
|
591
|
+
iomgr_success = 0;
|
592
|
+
}
|
593
|
+
gpr_mu_unlock(&c->mu);
|
594
|
+
if (iomgr_success) {
|
595
|
+
update_reconnect_parameters(c);
|
596
|
+
continue_connect(exec_ctx, c);
|
597
|
+
} else {
|
598
|
+
GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
|
599
|
+
}
|
600
|
+
}
|
601
|
+
|
602
|
+
static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *arg,
|
603
|
+
int iomgr_success) {
|
604
|
+
grpc_subchannel *c = arg;
|
605
|
+
|
606
|
+
if (c->connecting_result.transport != NULL) {
|
607
|
+
publish_transport(exec_ctx, c);
|
608
|
+
} else if (c->disconnected) {
|
609
|
+
GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
|
610
|
+
} else {
|
611
|
+
gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
|
612
|
+
gpr_mu_lock(&c->mu);
|
613
|
+
GPR_ASSERT(!c->have_alarm);
|
614
|
+
c->have_alarm = 1;
|
615
|
+
grpc_connectivity_state_set(exec_ctx, &c->state_tracker,
|
616
|
+
GRPC_CHANNEL_TRANSIENT_FAILURE,
|
617
|
+
"connect_failed");
|
618
|
+
grpc_timer_init(exec_ctx, &c->alarm, c->next_attempt, on_alarm, c, now);
|
619
|
+
gpr_mu_unlock(&c->mu);
|
620
|
+
}
|
621
|
+
}
|
622
|
+
|
623
|
+
static gpr_timespec compute_connect_deadline(grpc_subchannel *c) {
|
624
|
+
gpr_timespec current_deadline =
|
625
|
+
gpr_time_add(c->next_attempt, c->backoff_delta);
|
626
|
+
gpr_timespec min_deadline = gpr_time_add(
|
627
|
+
gpr_now(GPR_CLOCK_MONOTONIC),
|
628
|
+
gpr_time_from_seconds(GRPC_SUBCHANNEL_MIN_CONNECT_TIMEOUT_SECONDS,
|
629
|
+
GPR_TIMESPAN));
|
630
|
+
return gpr_time_cmp(current_deadline, min_deadline) > 0 ? current_deadline
|
631
|
+
: min_deadline;
|
632
|
+
}
|
633
|
+
|
634
|
+
/*
|
635
|
+
* grpc_subchannel_call implementation
|
636
|
+
*/
|
637
|
+
|
638
|
+
static void subchannel_call_destroy(grpc_exec_ctx *exec_ctx, void *call,
|
639
|
+
int success) {
|
640
|
+
grpc_subchannel_call *c = call;
|
641
|
+
GPR_TIMER_BEGIN("grpc_subchannel_call_unref.destroy", 0);
|
642
|
+
grpc_call_stack_destroy(exec_ctx, SUBCHANNEL_CALL_TO_CALL_STACK(c));
|
643
|
+
GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, c->connection, "subchannel_call");
|
644
|
+
gpr_free(c);
|
645
|
+
GPR_TIMER_END("grpc_subchannel_call_unref.destroy", 0);
|
646
|
+
}
|
647
|
+
|
648
|
+
void grpc_subchannel_call_ref(grpc_subchannel_call *c
|
649
|
+
GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
650
|
+
GRPC_CALL_STACK_REF(SUBCHANNEL_CALL_TO_CALL_STACK(c), REF_REASON);
|
651
|
+
}
|
652
|
+
|
653
|
+
void grpc_subchannel_call_unref(grpc_exec_ctx *exec_ctx,
|
654
|
+
grpc_subchannel_call *c
|
655
|
+
GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
|
656
|
+
GRPC_CALL_STACK_UNREF(exec_ctx, SUBCHANNEL_CALL_TO_CALL_STACK(c), REF_REASON);
|
657
|
+
}
|
658
|
+
|
659
|
+
char *grpc_subchannel_call_get_peer(grpc_exec_ctx *exec_ctx,
|
660
|
+
grpc_subchannel_call *call) {
|
661
|
+
grpc_call_stack *call_stack = SUBCHANNEL_CALL_TO_CALL_STACK(call);
|
662
|
+
grpc_call_element *top_elem = grpc_call_stack_element(call_stack, 0);
|
663
|
+
return top_elem->filter->get_peer(exec_ctx, top_elem);
|
664
|
+
}
|
665
|
+
|
666
|
+
void grpc_subchannel_call_process_op(grpc_exec_ctx *exec_ctx,
|
667
|
+
grpc_subchannel_call *call,
|
668
|
+
grpc_transport_stream_op *op) {
|
669
|
+
grpc_call_stack *call_stack = SUBCHANNEL_CALL_TO_CALL_STACK(call);
|
670
|
+
grpc_call_element *top_elem = grpc_call_stack_element(call_stack, 0);
|
671
|
+
top_elem->filter->start_transport_stream_op(exec_ctx, top_elem, op);
|
672
|
+
}
|
673
|
+
|
674
|
+
grpc_connected_subchannel *grpc_subchannel_get_connected_subchannel(
|
675
|
+
grpc_subchannel *c) {
|
676
|
+
return GET_CONNECTED_SUBCHANNEL(c, acq);
|
677
|
+
}
|
678
|
+
|
679
|
+
grpc_subchannel_call *grpc_connected_subchannel_create_call(
|
680
|
+
grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con,
|
681
|
+
grpc_pollset *pollset) {
|
682
|
+
grpc_channel_stack *chanstk = CHANNEL_STACK_FROM_CONNECTION(con);
|
683
|
+
grpc_subchannel_call *call =
|
684
|
+
gpr_malloc(sizeof(grpc_subchannel_call) + chanstk->call_stack_size);
|
685
|
+
grpc_call_stack *callstk = SUBCHANNEL_CALL_TO_CALL_STACK(call);
|
686
|
+
call->connection = con;
|
687
|
+
GRPC_CONNECTED_SUBCHANNEL_REF(con, "subchannel_call");
|
688
|
+
grpc_call_stack_init(exec_ctx, chanstk, 1, subchannel_call_destroy, call,
|
689
|
+
NULL, NULL, callstk);
|
690
|
+
grpc_call_stack_set_pollset(exec_ctx, callstk, pollset);
|
691
|
+
return call;
|
692
|
+
}
|
693
|
+
|
694
|
+
grpc_call_stack *grpc_subchannel_call_get_call_stack(
|
695
|
+
grpc_subchannel_call *subchannel_call) {
|
696
|
+
return SUBCHANNEL_CALL_TO_CALL_STACK(subchannel_call);
|
697
|
+
}
|