grpc 1.0.1 → 1.1.2
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 +3696 -867
- data/etc/roots.pem +39 -111
- data/include/grpc/byte_buffer.h +64 -1
- data/include/grpc/census.h +40 -96
- data/include/grpc/compression.h +2 -1
- data/include/grpc/grpc.h +42 -7
- data/include/grpc/grpc_posix.h +8 -5
- data/include/grpc/impl/codegen/atm.h +3 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
- data/include/grpc/impl/codegen/atm_windows.h +4 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
- data/include/grpc/impl/codegen/compression_types.h +1 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -0
- data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
- data/include/grpc/impl/codegen/gpr_slice.h +84 -0
- data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
- data/include/grpc/impl/codegen/grpc_types.h +91 -9
- data/include/grpc/impl/codegen/port_platform.h +25 -92
- data/include/grpc/impl/codegen/slice.h +54 -97
- data/include/grpc/impl/codegen/sync.h +0 -253
- data/include/grpc/module.modulemap +0 -2
- data/include/grpc/slice.h +132 -0
- data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
- data/include/grpc/support/alloc.h +40 -1
- data/include/grpc/support/log.h +80 -1
- data/include/grpc/support/log_windows.h +2 -0
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +252 -0
- data/include/grpc/support/time.h +67 -1
- data/src/boringssl/err_data.c +639 -627
- data/src/core/ext/census/base_resources.c +71 -0
- data/src/core/ext/census/base_resources.h +39 -0
- data/src/core/ext/census/gen/census.pb.c +26 -29
- data/src/core/ext/census/gen/census.pb.h +68 -67
- data/src/core/ext/census/gen/trace_context.pb.c +81 -0
- data/src/core/ext/census/gen/trace_context.pb.h +99 -0
- data/src/core/ext/census/grpc_filter.c +22 -16
- data/src/core/ext/census/grpc_plugin.c +2 -1
- data/src/core/ext/census/initialize.c +16 -4
- data/src/core/ext/census/mlog.h +1 -1
- data/src/core/ext/census/placeholders.c +0 -45
- data/src/core/ext/census/resource.c +312 -0
- data/src/core/ext/census/resource.h +63 -0
- data/src/core/ext/census/trace_context.c +86 -0
- data/src/core/ext/census/trace_context.h +68 -0
- data/src/core/ext/census/tracing.c +8 -2
- data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
- data/src/core/ext/client_channel/client_channel.c +1218 -0
- data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
- data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
- data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
- data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
- data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
- data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
- data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
- data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
- data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
- data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
- data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
- data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
- data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
- data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
- data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
- data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
- data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
- data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
- data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
- data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
- data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
- data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
- data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
- data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
- data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
- data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
- data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
- data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
- data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
- data/src/core/ext/load_reporting/load_reporting.c +7 -56
- data/src/core/ext/load_reporting/load_reporting.h +41 -28
- data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
- data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
- data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
- data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
- data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
- data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
- data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
- data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
- data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
- data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
- data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
- data/src/core/lib/channel/channel_args.c +70 -13
- data/src/core/lib/channel/channel_args.h +28 -2
- data/src/core/lib/channel/channel_stack.c +77 -28
- data/src/core/lib/channel/channel_stack.h +61 -23
- data/src/core/lib/channel/channel_stack_builder.c +33 -25
- data/src/core/lib/channel/channel_stack_builder.h +17 -8
- data/src/core/lib/channel/compress_filter.c +52 -36
- data/src/core/lib/channel/connected_channel.c +20 -12
- data/src/core/lib/channel/connected_channel.h +2 -1
- data/src/core/lib/channel/context.h +13 -1
- data/src/core/lib/channel/deadline_filter.c +344 -0
- data/src/core/lib/channel/deadline_filter.h +99 -0
- data/src/core/lib/channel/handshaker.c +240 -0
- data/src/core/lib/channel/handshaker.h +164 -0
- data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
- data/src/core/lib/channel/handshaker_factory.h +66 -0
- data/src/core/lib/channel/handshaker_registry.c +113 -0
- data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
- data/src/core/lib/channel/http_client_filter.c +248 -46
- data/src/core/lib/channel/http_client_filter.h +3 -0
- data/src/core/lib/channel/http_server_filter.c +136 -24
- data/src/core/lib/channel/message_size_filter.c +261 -0
- data/src/core/lib/channel/message_size_filter.h +39 -0
- data/src/core/lib/compression/message_compress.c +43 -37
- data/src/core/lib/compression/message_compress.h +7 -5
- data/src/core/lib/http/format_request.c +26 -11
- data/src/core/lib/http/format_request.h +7 -5
- data/src/core/lib/http/httpcli.c +45 -27
- data/src/core/lib/http/httpcli.h +4 -4
- data/src/core/lib/http/httpcli_security_connector.c +56 -46
- data/src/core/lib/http/parser.c +17 -14
- data/src/core/lib/http/parser.h +4 -2
- data/src/core/lib/iomgr/closure.c +49 -7
- data/src/core/lib/iomgr/closure.h +56 -14
- data/src/core/lib/iomgr/combiner.c +422 -0
- data/src/core/lib/iomgr/combiner.h +64 -0
- data/src/core/lib/iomgr/endpoint.c +8 -2
- data/src/core/lib/iomgr/endpoint.h +17 -7
- data/src/core/lib/iomgr/endpoint_pair.h +3 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
- data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
- data/src/core/lib/iomgr/error.c +72 -6
- data/src/core/lib/iomgr/error.h +30 -3
- data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
- data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
- data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
- data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
- data/src/core/lib/iomgr/ev_posix.c +26 -5
- data/src/core/lib/iomgr/ev_posix.h +12 -1
- data/src/core/lib/iomgr/exec_ctx.c +27 -94
- data/src/core/lib/iomgr/exec_ctx.h +19 -22
- data/src/core/lib/iomgr/executor.c +29 -8
- data/src/core/lib/iomgr/executor.h +2 -4
- data/src/core/lib/iomgr/iocp_windows.c +3 -4
- data/src/core/lib/iomgr/iomgr.c +14 -10
- data/src/core/lib/iomgr/iomgr.h +6 -2
- data/src/core/lib/iomgr/iomgr_posix.c +2 -2
- data/src/core/lib/iomgr/iomgr_uv.c +49 -0
- data/src/core/lib/iomgr/iomgr_windows.c +2 -2
- data/src/core/lib/iomgr/load_file.c +3 -3
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/network_status_tracker.c +1 -1
- data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
- data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
- data/src/core/lib/iomgr/pollset_uv.c +142 -0
- data/src/core/lib/iomgr/pollset_uv.h +42 -0
- data/src/core/lib/iomgr/pollset_windows.c +5 -6
- data/src/core/lib/iomgr/port.h +129 -0
- data/src/core/lib/iomgr/resolve_address.h +2 -1
- data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
- data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
- data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
- data/src/core/lib/iomgr/resource_quota.c +832 -0
- data/src/core/lib/iomgr/resource_quota.h +159 -0
- data/src/core/lib/iomgr/sockaddr.h +10 -2
- data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
- data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
- data/src/core/lib/iomgr/socket_mutator.c +98 -0
- data/src/core/lib/iomgr/socket_mutator.h +80 -0
- data/src/core/lib/iomgr/socket_utils.h +42 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
- data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
- data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
- data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
- data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
- data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
- data/src/core/lib/iomgr/socket_windows.c +14 -6
- data/src/core/lib/iomgr/socket_windows.h +1 -0
- data/src/core/lib/iomgr/tcp_client.h +8 -2
- data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
- data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
- data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
- data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
- data/src/core/lib/iomgr/tcp_posix.c +135 -56
- data/src/core/lib/iomgr/tcp_posix.h +2 -2
- data/src/core/lib/iomgr/tcp_server.h +14 -6
- data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
- data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
- data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
- data/src/core/lib/iomgr/tcp_uv.c +367 -0
- data/src/core/lib/iomgr/tcp_uv.h +59 -0
- data/src/core/lib/iomgr/tcp_windows.c +65 -48
- data/src/core/lib/iomgr/tcp_windows.h +3 -1
- data/src/core/lib/iomgr/timer.h +21 -21
- data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
- data/src/core/lib/iomgr/timer_generic.h +49 -0
- data/src/core/lib/iomgr/timer_heap.c +6 -0
- data/src/core/lib/iomgr/timer_uv.c +99 -0
- data/src/core/lib/iomgr/timer_uv.h +47 -0
- data/src/core/lib/iomgr/udp_server.c +116 -98
- data/src/core/lib/iomgr/udp_server.h +5 -3
- data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
- data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
- data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
- data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
- data/src/core/lib/iomgr/workqueue.h +12 -20
- data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
- data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
- data/src/core/lib/iomgr/workqueue_windows.c +9 -8
- data/src/core/lib/json/json.c +3 -3
- data/src/core/lib/json/json.h +11 -11
- data/src/core/lib/json/json_reader.c +9 -5
- data/src/core/lib/profiling/basic_timers.c +10 -1
- data/src/core/lib/profiling/timers.h +2 -0
- data/src/core/lib/security/context/security_context.c +13 -3
- data/src/core/lib/security/context/security_context.h +20 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.c +48 -19
- data/src/core/lib/security/credentials/credentials.h +36 -19
- data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
- data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
- data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
- data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
- data/src/core/lib/security/transport/client_auth_filter.c +33 -27
- data/src/core/lib/security/transport/secure_endpoint.c +93 -68
- data/src/core/lib/security/transport/secure_endpoint.h +2 -2
- data/src/core/lib/security/transport/security_connector.c +133 -168
- data/src/core/lib/security/transport/security_connector.h +31 -46
- data/src/core/lib/security/transport/security_handshaker.c +501 -0
- data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
- data/src/core/lib/security/transport/server_auth_filter.c +50 -38
- data/src/core/lib/security/util/b64.c +11 -8
- data/src/core/lib/security/util/b64.h +5 -4
- data/src/core/lib/slice/percent_encoding.c +182 -0
- data/src/core/lib/slice/percent_encoding.h +78 -0
- data/src/core/lib/{support → slice}/slice.c +81 -50
- data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.c +90 -0
- data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
- data/src/core/lib/support/backoff.c +24 -13
- data/src/core/lib/support/backoff.h +5 -2
- data/src/core/lib/support/env.h +0 -2
- data/src/core/lib/support/log.c +5 -4
- data/src/core/lib/support/log_linux.c +0 -1
- data/src/core/lib/support/log_posix.c +1 -1
- data/src/core/lib/support/mpscq.c +83 -0
- data/src/core/lib/support/mpscq.h +65 -0
- data/src/core/lib/support/string.c +58 -49
- data/src/core/lib/support/string.h +11 -8
- data/src/core/lib/support/subprocess_posix.c +5 -2
- data/src/core/lib/support/thd.c +1 -1
- data/src/core/lib/support/time.c +43 -79
- data/src/core/lib/support/time_posix.c +1 -1
- data/src/core/lib/support/tmpfile.h +0 -2
- data/src/core/lib/surface/alarm.c +4 -1
- data/src/core/lib/surface/byte_buffer.c +17 -11
- data/src/core/lib/surface/byte_buffer_reader.c +23 -15
- data/src/core/lib/surface/call.c +294 -276
- data/src/core/lib/surface/call.h +24 -9
- data/src/core/lib/surface/call_log_batch.c +5 -3
- data/src/core/lib/surface/channel.c +127 -111
- data/src/core/lib/surface/channel.h +14 -5
- data/src/core/lib/surface/channel_init.c +1 -1
- data/src/core/lib/surface/channel_init.h +10 -1
- data/src/core/lib/surface/channel_ping.c +7 -6
- data/src/core/lib/surface/completion_queue.c +154 -18
- data/src/core/lib/surface/completion_queue.h +5 -0
- data/src/core/lib/surface/init.c +40 -6
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.c +5 -2
- data/src/core/lib/surface/lame_client.c +28 -18
- data/src/core/lib/surface/server.c +134 -87
- data/src/core/lib/surface/server.h +8 -0
- data/src/core/lib/surface/validate_metadata.c +1 -1
- data/src/core/lib/surface/version.c +3 -1
- data/src/core/lib/transport/byte_stream.c +7 -4
- data/src/core/lib/transport/byte_stream.h +6 -10
- data/src/core/lib/transport/connectivity_state.c +21 -12
- data/src/core/lib/transport/connectivity_state.h +4 -1
- data/src/core/lib/transport/mdstr_hash_table.c +118 -0
- data/src/core/lib/transport/mdstr_hash_table.h +77 -0
- data/src/core/lib/transport/metadata.c +83 -60
- data/src/core/lib/transport/metadata.h +41 -23
- data/src/core/lib/transport/metadata_batch.c +17 -11
- data/src/core/lib/transport/metadata_batch.h +20 -6
- data/src/core/lib/transport/pid_controller.c +57 -0
- data/src/core/lib/transport/pid_controller.h +64 -0
- data/src/core/lib/transport/service_config.c +251 -0
- data/src/core/lib/transport/service_config.h +71 -0
- data/src/core/lib/transport/static_metadata.c +18 -16
- data/src/core/lib/transport/static_metadata.h +113 -107
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
- data/src/core/lib/transport/transport.c +84 -23
- data/src/core/lib/transport/transport.h +53 -8
- data/src/core/lib/transport/transport_impl.h +3 -0
- data/src/core/lib/transport/transport_op_string.c +92 -20
- data/src/core/lib/tsi/ssl_transport_security.c +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
- data/src/ruby/ext/grpc/extconf.rb +0 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
- data/src/ruby/ext/grpc/rb_call.c +15 -5
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
- data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
- data/src/ruby/ext/grpc/rb_grpc.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
- data/src/ruby/ext/grpc/rb_server.c +18 -12
- data/src/ruby/lib/grpc/errors.rb +154 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
- data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
- data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
- data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
- data/src/ruby/lib/grpc/generic/service.rb +3 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/checker.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
- data/src/ruby/pb/test/client.rb +307 -7
- data/src/ruby/pb/test/server.rb +26 -1
- data/src/ruby/spec/compression_options_spec.rb +164 -0
- data/src/ruby/spec/error_sanity_spec.rb +64 -0
- data/src/ruby/spec/generic/active_call_spec.rb +290 -12
- data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
- data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
- data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
- data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
- data/src/ruby/spec/spec_helper.rb +2 -0
- data/third_party/boringssl/crypto/aes/aes.c +12 -12
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
- data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
- data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
- data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
- data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
- data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
- data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
- data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
- data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
- data/third_party/boringssl/crypto/base64/base64.c +249 -285
- data/third_party/boringssl/crypto/bio/bio.c +13 -23
- data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
- data/third_party/boringssl/crypto/bio/connect.c +12 -3
- data/third_party/boringssl/crypto/bio/fd.c +22 -15
- data/third_party/boringssl/crypto/bio/file.c +2 -38
- data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
- data/third_party/boringssl/crypto/bio/internal.h +3 -0
- data/third_party/boringssl/crypto/bio/pair.c +1 -1
- data/third_party/boringssl/crypto/bio/socket.c +10 -2
- data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
- data/third_party/boringssl/crypto/bn/bn.c +38 -0
- data/third_party/boringssl/crypto/bn/cmp.c +25 -0
- data/third_party/boringssl/crypto/bn/convert.c +73 -76
- data/third_party/boringssl/crypto/bn/div.c +136 -70
- data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
- data/third_party/boringssl/crypto/bn/gcd.c +213 -296
- data/third_party/boringssl/crypto/bn/generic.c +0 -80
- data/third_party/boringssl/crypto/bn/internal.h +15 -3
- data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
- data/third_party/boringssl/crypto/bn/mul.c +2 -1
- data/third_party/boringssl/crypto/bn/prime.c +24 -8
- data/third_party/boringssl/crypto/bn/random.c +47 -33
- data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
- data/third_party/boringssl/crypto/buf/buf.c +25 -21
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
- data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
- data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
- data/third_party/boringssl/crypto/cipher/aead.c +11 -22
- data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
- data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
- data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
- data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
- data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
- data/third_party/boringssl/crypto/cipher/internal.h +8 -10
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
- data/third_party/boringssl/crypto/conf/conf.c +2 -1
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
- data/third_party/boringssl/crypto/cpu-arm.c +0 -161
- data/third_party/boringssl/crypto/cpu-intel.c +5 -3
- data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
- data/third_party/boringssl/crypto/crypto.c +29 -7
- data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
- data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
- data/third_party/boringssl/crypto/dh/check.c +22 -6
- data/third_party/boringssl/crypto/dh/dh.c +45 -21
- data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
- data/third_party/boringssl/crypto/dh/params.c +30 -78
- data/third_party/boringssl/crypto/digest/digest.c +3 -3
- data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
- data/third_party/boringssl/crypto/ec/ec.c +84 -140
- data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
- data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
- data/third_party/boringssl/crypto/ec/internal.h +12 -36
- data/third_party/boringssl/crypto/ec/oct.c +11 -11
- data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
- data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
- data/third_party/boringssl/crypto/ec/simple.c +81 -201
- data/third_party/boringssl/crypto/ec/util-64.c +0 -74
- data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
- data/third_party/boringssl/crypto/engine/engine.c +1 -1
- data/third_party/boringssl/crypto/err/err.c +3 -3
- data/third_party/boringssl/crypto/evp/evp.c +14 -59
- data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
- data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
- data/third_party/boringssl/crypto/evp/internal.h +4 -46
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
- data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
- data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
- data/third_party/boringssl/crypto/evp/print.c +520 -0
- data/third_party/boringssl/crypto/ex_data.c +4 -6
- data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
- data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
- data/third_party/boringssl/crypto/internal.h +57 -77
- data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
- data/third_party/boringssl/crypto/md4/md4.c +9 -0
- data/third_party/boringssl/crypto/mem.c +19 -19
- data/third_party/boringssl/crypto/modes/cfb.c +5 -6
- data/third_party/boringssl/crypto/modes/ctr.c +10 -18
- data/third_party/boringssl/crypto/modes/gcm.c +100 -66
- data/third_party/boringssl/crypto/modes/internal.h +15 -27
- data/third_party/boringssl/crypto/modes/ofb.c +9 -22
- data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
- data/third_party/boringssl/crypto/newhope/internal.h +71 -0
- data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
- data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
- data/third_party/boringssl/crypto/newhope/poly.c +183 -0
- data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
- data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
- data/third_party/boringssl/crypto/obj/obj.c +111 -135
- data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
- data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
- data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
- data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
- data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
- data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
- data/third_party/boringssl/crypto/rand/rand.c +4 -1
- data/third_party/boringssl/crypto/rand/urandom.c +5 -7
- data/third_party/boringssl/crypto/rand/windows.c +5 -8
- data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
- data/third_party/boringssl/crypto/refcount_lock.c +2 -2
- data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
- data/third_party/boringssl/crypto/rsa/internal.h +5 -13
- data/third_party/boringssl/crypto/rsa/padding.c +64 -63
- data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
- data/third_party/boringssl/crypto/sha/sha256.c +2 -2
- data/third_party/boringssl/crypto/sha/sha512.c +7 -7
- data/third_party/boringssl/crypto/stack/stack.c +13 -22
- data/third_party/boringssl/crypto/thread.c +21 -12
- data/third_party/boringssl/crypto/thread_none.c +6 -2
- data/third_party/boringssl/crypto/thread_pthread.c +16 -7
- data/third_party/boringssl/crypto/thread_win.c +38 -85
- data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
- data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
- data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
- data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
- data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
- data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
- data/third_party/boringssl/crypto/x509/x509.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
- data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
- data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
- data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
- data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
- data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
- data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
- data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
- data/third_party/boringssl/crypto/x509/x_name.c +14 -17
- data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
- data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
- data/third_party/boringssl/include/openssl/aead.h +72 -73
- data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
- data/third_party/boringssl/include/openssl/asn1.h +103 -235
- data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
- data/third_party/boringssl/include/openssl/asn1t.h +1 -11
- data/third_party/boringssl/include/openssl/base.h +145 -3
- data/third_party/boringssl/include/openssl/base64.h +20 -17
- data/third_party/boringssl/include/openssl/bio.h +59 -34
- data/third_party/boringssl/include/openssl/bn.h +118 -51
- data/third_party/boringssl/include/openssl/buf.h +15 -0
- data/third_party/boringssl/include/openssl/bytestring.h +52 -4
- data/third_party/boringssl/include/openssl/chacha.h +2 -2
- data/third_party/boringssl/include/openssl/cipher.h +18 -1
- data/third_party/boringssl/include/openssl/cmac.h +11 -0
- data/third_party/boringssl/include/openssl/conf.h +13 -2
- data/third_party/boringssl/include/openssl/cpu.h +20 -23
- data/third_party/boringssl/include/openssl/crypto.h +22 -1
- data/third_party/boringssl/include/openssl/curve25519.h +96 -4
- data/third_party/boringssl/include/openssl/dh.h +71 -16
- data/third_party/boringssl/include/openssl/digest.h +38 -11
- data/third_party/boringssl/include/openssl/dsa.h +40 -4
- data/third_party/boringssl/include/openssl/ec.h +44 -18
- data/third_party/boringssl/include/openssl/ec_key.h +27 -6
- data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
- data/third_party/boringssl/include/openssl/engine.h +11 -0
- data/third_party/boringssl/include/openssl/evp.h +52 -88
- data/third_party/boringssl/include/openssl/hkdf.h +24 -4
- data/third_party/boringssl/include/openssl/hmac.h +20 -6
- data/third_party/boringssl/include/openssl/md4.h +4 -0
- data/third_party/boringssl/include/openssl/mem.h +19 -0
- data/third_party/boringssl/include/openssl/newhope.h +158 -0
- data/third_party/boringssl/include/openssl/nid.h +4166 -0
- data/third_party/boringssl/include/openssl/obj.h +31 -3
- data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
- data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
- data/third_party/boringssl/include/openssl/pem.h +5 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
- data/third_party/boringssl/include/openssl/rand.h +6 -0
- data/third_party/boringssl/include/openssl/rc4.h +6 -0
- data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
- data/third_party/boringssl/include/openssl/rsa.h +127 -65
- data/third_party/boringssl/include/openssl/sha.h +14 -10
- data/third_party/boringssl/include/openssl/ssl.h +561 -275
- data/third_party/boringssl/include/openssl/ssl3.h +18 -25
- data/third_party/boringssl/include/openssl/stack.h +2 -4
- data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
- data/third_party/boringssl/include/openssl/thread.h +31 -13
- data/third_party/boringssl/include/openssl/time_support.h +1 -0
- data/third_party/boringssl/include/openssl/tls1.h +37 -33
- data/third_party/boringssl/include/openssl/x509.h +69 -26
- data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
- data/third_party/boringssl/include/openssl/x509v3.h +23 -2
- data/third_party/boringssl/ssl/custom_extensions.c +3 -5
- data/third_party/boringssl/ssl/d1_both.c +463 -499
- data/third_party/boringssl/ssl/d1_lib.c +38 -109
- data/third_party/boringssl/ssl/d1_pkt.c +173 -334
- data/third_party/boringssl/ssl/d1_srtp.c +20 -18
- data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
- data/third_party/boringssl/ssl/dtls_record.c +27 -26
- data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
- data/third_party/boringssl/ssl/handshake_server.c +1932 -0
- data/third_party/boringssl/ssl/internal.h +712 -439
- data/third_party/boringssl/ssl/s3_both.c +445 -257
- data/third_party/boringssl/ssl/s3_enc.c +53 -36
- data/third_party/boringssl/ssl/s3_lib.c +23 -268
- data/third_party/boringssl/ssl/s3_pkt.c +168 -364
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
- data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
- data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
- data/third_party/boringssl/ssl/ssl_cert.c +324 -49
- data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
- data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
- data/third_party/boringssl/ssl/ssl_file.c +21 -68
- data/third_party/boringssl/ssl/ssl_lib.c +881 -510
- data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
- data/third_party/boringssl/ssl/ssl_session.c +324 -103
- data/third_party/boringssl/ssl/ssl_stat.c +6 -88
- data/third_party/boringssl/ssl/t1_enc.c +23 -39
- data/third_party/boringssl/ssl/t1_lib.c +1120 -622
- data/third_party/boringssl/ssl/tls13_both.c +440 -0
- data/third_party/boringssl/ssl/tls13_client.c +682 -0
- data/third_party/boringssl/ssl/tls13_enc.c +391 -0
- data/third_party/boringssl/ssl/tls13_server.c +672 -0
- data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
- data/third_party/boringssl/ssl/tls_record.c +159 -77
- data/third_party/nanopb/pb.h +60 -28
- data/third_party/nanopb/pb_decode.c +120 -92
- data/third_party/nanopb/pb_decode.h +3 -3
- data/third_party/nanopb/pb_encode.c +73 -67
- data/third_party/nanopb/pb_encode.h +4 -4
- metadata +155 -89
- data/include/grpc/impl/codegen/byte_buffer.h +0 -122
- data/include/grpc/impl/codegen/log.h +0 -118
- data/include/grpc/impl/codegen/time.h +0 -130
- data/src/core/ext/client_config/client_channel.c +0 -593
- data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
- data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
- data/src/core/lib/iomgr/workqueue_posix.c +0 -151
- data/src/core/lib/security/transport/handshake.c +0 -368
- data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
- data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
- data/third_party/boringssl/crypto/directory.h +0 -66
- data/third_party/boringssl/crypto/directory_posix.c +0 -108
- data/third_party/boringssl/crypto/directory_win.c +0 -144
- data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
- data/third_party/boringssl/include/openssl/pqueue.h +0 -146
- data/third_party/boringssl/ssl/d1_clnt.c +0 -561
- data/third_party/boringssl/ssl/d1_srvr.c +0 -476
- data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
- data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
- data/third_party/boringssl/ssl/test/async_bio.h +0 -45
- data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
- data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -0,0 +1,45 @@
|
|
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_CORE_LIB_IOMGR_TCP_CLIENT_POSIX_H
|
35
|
+
#define GRPC_CORE_LIB_IOMGR_TCP_CLIENT_POSIX_H
|
36
|
+
|
37
|
+
#include "src/core/lib/iomgr/endpoint.h"
|
38
|
+
#include "src/core/lib/iomgr/ev_posix.h"
|
39
|
+
#include "src/core/lib/iomgr/tcp_client.h"
|
40
|
+
|
41
|
+
grpc_endpoint *grpc_tcp_client_create_from_fd(
|
42
|
+
grpc_exec_ctx *exec_ctx, grpc_fd *fd, const grpc_channel_args *channel_args,
|
43
|
+
const char *addr_str);
|
44
|
+
|
45
|
+
#endif /* GRPC_CORE_LIB_IOMGR_TCP_CLIENT_POSIX_H */
|
@@ -0,0 +1,190 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Copyright 2016, 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/lib/iomgr/port.h"
|
35
|
+
|
36
|
+
#ifdef GRPC_UV
|
37
|
+
|
38
|
+
#include <string.h>
|
39
|
+
|
40
|
+
#include <grpc/support/alloc.h>
|
41
|
+
#include <grpc/support/log.h>
|
42
|
+
|
43
|
+
#include "src/core/lib/iomgr/error.h"
|
44
|
+
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
45
|
+
#include "src/core/lib/iomgr/tcp_client.h"
|
46
|
+
#include "src/core/lib/iomgr/tcp_uv.h"
|
47
|
+
#include "src/core/lib/iomgr/timer.h"
|
48
|
+
|
49
|
+
extern int grpc_tcp_trace;
|
50
|
+
|
51
|
+
typedef struct grpc_uv_tcp_connect {
|
52
|
+
uv_connect_t connect_req;
|
53
|
+
grpc_timer alarm;
|
54
|
+
grpc_closure on_alarm;
|
55
|
+
uv_tcp_t *tcp_handle;
|
56
|
+
grpc_closure *closure;
|
57
|
+
grpc_endpoint **endpoint;
|
58
|
+
int refs;
|
59
|
+
char *addr_name;
|
60
|
+
grpc_resource_quota *resource_quota;
|
61
|
+
} grpc_uv_tcp_connect;
|
62
|
+
|
63
|
+
static void uv_tcp_connect_cleanup(grpc_exec_ctx *exec_ctx,
|
64
|
+
grpc_uv_tcp_connect *connect) {
|
65
|
+
grpc_resource_quota_unref_internal(exec_ctx, connect->resource_quota);
|
66
|
+
gpr_free(connect);
|
67
|
+
}
|
68
|
+
|
69
|
+
static void tcp_close_callback(uv_handle_t *handle) { gpr_free(handle); }
|
70
|
+
|
71
|
+
static void uv_tc_on_alarm(grpc_exec_ctx *exec_ctx, void *acp,
|
72
|
+
grpc_error *error) {
|
73
|
+
int done;
|
74
|
+
grpc_uv_tcp_connect *connect = acp;
|
75
|
+
if (grpc_tcp_trace) {
|
76
|
+
const char *str = grpc_error_string(error);
|
77
|
+
gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %s: on_alarm: error=%s",
|
78
|
+
connect->addr_name, str);
|
79
|
+
grpc_error_free_string(str);
|
80
|
+
}
|
81
|
+
if (error == GRPC_ERROR_NONE) {
|
82
|
+
/* error == NONE implies that the timer ran out, and wasn't cancelled. If
|
83
|
+
it was cancelled, then the handler that cancelled it also should close
|
84
|
+
the handle, if applicable */
|
85
|
+
uv_close((uv_handle_t *)connect->tcp_handle, tcp_close_callback);
|
86
|
+
}
|
87
|
+
done = (--connect->refs == 0);
|
88
|
+
if (done) {
|
89
|
+
uv_tcp_connect_cleanup(exec_ctx, connect);
|
90
|
+
}
|
91
|
+
}
|
92
|
+
|
93
|
+
static void uv_tc_on_connect(uv_connect_t *req, int status) {
|
94
|
+
grpc_uv_tcp_connect *connect = req->data;
|
95
|
+
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
|
96
|
+
grpc_error *error = GRPC_ERROR_NONE;
|
97
|
+
int done;
|
98
|
+
grpc_closure *closure = connect->closure;
|
99
|
+
grpc_timer_cancel(&exec_ctx, &connect->alarm);
|
100
|
+
if (status == 0) {
|
101
|
+
*connect->endpoint = grpc_tcp_create(
|
102
|
+
connect->tcp_handle, connect->resource_quota, connect->addr_name);
|
103
|
+
} else {
|
104
|
+
error = GRPC_ERROR_CREATE("Failed to connect to remote host");
|
105
|
+
error = grpc_error_set_int(error, GRPC_ERROR_INT_ERRNO, -status);
|
106
|
+
error =
|
107
|
+
grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status));
|
108
|
+
if (status == UV_ECANCELED) {
|
109
|
+
error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR,
|
110
|
+
"Timeout occurred");
|
111
|
+
// This should only happen if the handle is already closed
|
112
|
+
} else {
|
113
|
+
error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR,
|
114
|
+
uv_strerror(status));
|
115
|
+
uv_close((uv_handle_t *)connect->tcp_handle, tcp_close_callback);
|
116
|
+
}
|
117
|
+
}
|
118
|
+
done = (--connect->refs == 0);
|
119
|
+
if (done) {
|
120
|
+
uv_tcp_connect_cleanup(&exec_ctx, connect);
|
121
|
+
}
|
122
|
+
grpc_closure_sched(&exec_ctx, closure, error);
|
123
|
+
grpc_exec_ctx_finish(&exec_ctx);
|
124
|
+
}
|
125
|
+
|
126
|
+
static void tcp_client_connect_impl(grpc_exec_ctx *exec_ctx,
|
127
|
+
grpc_closure *closure, grpc_endpoint **ep,
|
128
|
+
grpc_pollset_set *interested_parties,
|
129
|
+
const grpc_channel_args *channel_args,
|
130
|
+
const grpc_resolved_address *resolved_addr,
|
131
|
+
gpr_timespec deadline) {
|
132
|
+
grpc_uv_tcp_connect *connect;
|
133
|
+
grpc_resource_quota *resource_quota = grpc_resource_quota_create(NULL);
|
134
|
+
(void)channel_args;
|
135
|
+
(void)interested_parties;
|
136
|
+
|
137
|
+
if (channel_args != NULL) {
|
138
|
+
for (size_t i = 0; i < channel_args->num_args; i++) {
|
139
|
+
if (0 == strcmp(channel_args->args[i].key, GRPC_ARG_RESOURCE_QUOTA)) {
|
140
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
141
|
+
resource_quota = grpc_resource_quota_ref_internal(
|
142
|
+
channel_args->args[i].value.pointer.p);
|
143
|
+
}
|
144
|
+
}
|
145
|
+
}
|
146
|
+
|
147
|
+
connect = gpr_malloc(sizeof(grpc_uv_tcp_connect));
|
148
|
+
memset(connect, 0, sizeof(grpc_uv_tcp_connect));
|
149
|
+
connect->closure = closure;
|
150
|
+
connect->endpoint = ep;
|
151
|
+
connect->tcp_handle = gpr_malloc(sizeof(uv_tcp_t));
|
152
|
+
connect->addr_name = grpc_sockaddr_to_uri(resolved_addr);
|
153
|
+
connect->resource_quota = resource_quota;
|
154
|
+
uv_tcp_init(uv_default_loop(), connect->tcp_handle);
|
155
|
+
connect->connect_req.data = connect;
|
156
|
+
|
157
|
+
if (grpc_tcp_trace) {
|
158
|
+
gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %s: asynchronously connecting",
|
159
|
+
connect->addr_name);
|
160
|
+
}
|
161
|
+
|
162
|
+
// TODO(murgatroid99): figure out what the return value here means
|
163
|
+
uv_tcp_connect(&connect->connect_req, connect->tcp_handle,
|
164
|
+
(const struct sockaddr *)resolved_addr->addr,
|
165
|
+
uv_tc_on_connect);
|
166
|
+
grpc_closure_init(&connect->on_alarm, uv_tc_on_alarm, connect,
|
167
|
+
grpc_schedule_on_exec_ctx);
|
168
|
+
grpc_timer_init(exec_ctx, &connect->alarm,
|
169
|
+
gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC),
|
170
|
+
&connect->on_alarm, gpr_now(GPR_CLOCK_MONOTONIC));
|
171
|
+
}
|
172
|
+
|
173
|
+
// overridden by api_fuzzer.c
|
174
|
+
void (*grpc_tcp_client_connect_impl)(
|
175
|
+
grpc_exec_ctx *exec_ctx, grpc_closure *closure, grpc_endpoint **ep,
|
176
|
+
grpc_pollset_set *interested_parties, const grpc_channel_args *channel_args,
|
177
|
+
const grpc_resolved_address *addr,
|
178
|
+
gpr_timespec deadline) = tcp_client_connect_impl;
|
179
|
+
|
180
|
+
void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
|
181
|
+
grpc_endpoint **ep,
|
182
|
+
grpc_pollset_set *interested_parties,
|
183
|
+
const grpc_channel_args *channel_args,
|
184
|
+
const grpc_resolved_address *addr,
|
185
|
+
gpr_timespec deadline) {
|
186
|
+
grpc_tcp_client_connect_impl(exec_ctx, closure, ep, interested_parties,
|
187
|
+
channel_args, addr, deadline);
|
188
|
+
}
|
189
|
+
|
190
|
+
#endif /* GRPC_UV */
|
@@ -31,18 +31,19 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
-
#include
|
34
|
+
#include "src/core/lib/iomgr/port.h"
|
35
35
|
|
36
|
-
#ifdef
|
36
|
+
#ifdef GRPC_WINSOCK_SOCKET
|
37
37
|
|
38
38
|
#include "src/core/lib/iomgr/sockaddr_windows.h"
|
39
39
|
|
40
|
+
#include <grpc/slice_buffer.h>
|
40
41
|
#include <grpc/support/alloc.h>
|
41
42
|
#include <grpc/support/log.h>
|
42
43
|
#include <grpc/support/log_windows.h>
|
43
|
-
#include <grpc/support/slice_buffer.h>
|
44
44
|
#include <grpc/support/useful.h>
|
45
45
|
|
46
|
+
#include "src/core/lib/channel/channel_args.h"
|
46
47
|
#include "src/core/lib/iomgr/iocp_windows.h"
|
47
48
|
#include "src/core/lib/iomgr/sockaddr.h"
|
48
49
|
#include "src/core/lib/iomgr/sockaddr_utils.h"
|
@@ -57,17 +58,21 @@ typedef struct {
|
|
57
58
|
grpc_winsocket *socket;
|
58
59
|
gpr_timespec deadline;
|
59
60
|
grpc_timer alarm;
|
61
|
+
grpc_closure on_alarm;
|
60
62
|
char *addr_name;
|
61
63
|
int refs;
|
62
64
|
grpc_closure on_connect;
|
63
65
|
grpc_endpoint **endpoint;
|
66
|
+
grpc_resource_quota *resource_quota;
|
64
67
|
} async_connect;
|
65
68
|
|
66
|
-
static void async_connect_unlock_and_cleanup(
|
69
|
+
static void async_connect_unlock_and_cleanup(grpc_exec_ctx *exec_ctx,
|
70
|
+
async_connect *ac,
|
67
71
|
grpc_winsocket *socket) {
|
68
72
|
int done = (--ac->refs == 0);
|
69
73
|
gpr_mu_unlock(&ac->mu);
|
70
74
|
if (done) {
|
75
|
+
grpc_resource_quota_unref_internal(exec_ctx, ac->resource_quota);
|
71
76
|
gpr_mu_destroy(&ac->mu);
|
72
77
|
gpr_free(ac->addr_name);
|
73
78
|
gpr_free(ac);
|
@@ -83,7 +88,7 @@ static void on_alarm(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
|
|
83
88
|
if (socket != NULL) {
|
84
89
|
grpc_winsocket_shutdown(socket);
|
85
90
|
}
|
86
|
-
async_connect_unlock_and_cleanup(ac, socket);
|
91
|
+
async_connect_unlock_and_cleanup(exec_ctx, ac, socket);
|
87
92
|
}
|
88
93
|
|
89
94
|
static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
|
@@ -103,25 +108,29 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
|
|
103
108
|
|
104
109
|
gpr_mu_lock(&ac->mu);
|
105
110
|
|
106
|
-
if (error == GRPC_ERROR_NONE
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
111
|
+
if (error == GRPC_ERROR_NONE) {
|
112
|
+
if (socket != NULL) {
|
113
|
+
DWORD transfered_bytes = 0;
|
114
|
+
DWORD flags;
|
115
|
+
BOOL wsa_success =
|
116
|
+
WSAGetOverlappedResult(socket->socket, &socket->write_info.overlapped,
|
117
|
+
&transfered_bytes, FALSE, &flags);
|
118
|
+
GPR_ASSERT(transfered_bytes == 0);
|
119
|
+
if (!wsa_success) {
|
120
|
+
error = GRPC_WSA_ERROR(WSAGetLastError(), "ConnectEx");
|
121
|
+
} else {
|
122
|
+
*ep = grpc_tcp_create(socket, ac->resource_quota, ac->addr_name);
|
123
|
+
socket = NULL;
|
124
|
+
}
|
115
125
|
} else {
|
116
|
-
|
117
|
-
socket = NULL;
|
126
|
+
error = GRPC_ERROR_CREATE("socket is null");
|
118
127
|
}
|
119
128
|
}
|
120
129
|
|
121
|
-
async_connect_unlock_and_cleanup(ac, socket);
|
130
|
+
async_connect_unlock_and_cleanup(exec_ctx, ac, socket);
|
122
131
|
/* If the connection was aborted, the callback was already called when
|
123
132
|
the deadline was met. */
|
124
|
-
|
133
|
+
grpc_closure_sched(exec_ctx, on_done, error);
|
125
134
|
}
|
126
135
|
|
127
136
|
/* Tries to issue one async connection, then schedules both an IOCP
|
@@ -129,13 +138,14 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
|
|
129
138
|
void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
|
130
139
|
grpc_endpoint **endpoint,
|
131
140
|
grpc_pollset_set *interested_parties,
|
132
|
-
const
|
141
|
+
const grpc_channel_args *channel_args,
|
142
|
+
const grpc_resolved_address *addr,
|
133
143
|
gpr_timespec deadline) {
|
134
144
|
SOCKET sock = INVALID_SOCKET;
|
135
145
|
BOOL success;
|
136
146
|
int status;
|
137
|
-
|
138
|
-
|
147
|
+
grpc_resolved_address addr6_v4mapped;
|
148
|
+
grpc_resolved_address local_address;
|
139
149
|
async_connect *ac;
|
140
150
|
grpc_winsocket *socket = NULL;
|
141
151
|
LPFN_CONNECTEX ConnectEx;
|
@@ -144,12 +154,22 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
|
|
144
154
|
grpc_winsocket_callback_info *info;
|
145
155
|
grpc_error *error = GRPC_ERROR_NONE;
|
146
156
|
|
157
|
+
grpc_resource_quota *resource_quota = grpc_resource_quota_create(NULL);
|
158
|
+
if (channel_args != NULL) {
|
159
|
+
for (size_t i = 0; i < channel_args->num_args; i++) {
|
160
|
+
if (0 == strcmp(channel_args->args[i].key, GRPC_ARG_RESOURCE_QUOTA)) {
|
161
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
162
|
+
resource_quota = grpc_resource_quota_ref_internal(
|
163
|
+
channel_args->args[i].value.pointer.p);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
}
|
167
|
+
|
147
168
|
*endpoint = NULL;
|
148
169
|
|
149
170
|
/* Use dualstack sockets where available. */
|
150
171
|
if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
|
151
|
-
addr =
|
152
|
-
addr_len = sizeof(addr6_v4mapped);
|
172
|
+
addr = &addr6_v4mapped;
|
153
173
|
}
|
154
174
|
|
155
175
|
sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
|
@@ -178,7 +198,8 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
|
|
178
198
|
|
179
199
|
grpc_sockaddr_make_wildcard6(0, &local_address);
|
180
200
|
|
181
|
-
status = bind(sock, (struct sockaddr *)&local_address,
|
201
|
+
status = bind(sock, (struct sockaddr *)&local_address.addr,
|
202
|
+
(int)local_address.len);
|
182
203
|
if (status != 0) {
|
183
204
|
error = GRPC_WSA_ERROR(WSAGetLastError(), "bind");
|
184
205
|
goto failure;
|
@@ -186,8 +207,8 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
|
|
186
207
|
|
187
208
|
socket = grpc_winsocket_create(sock, "client");
|
188
209
|
info = &socket->write_info;
|
189
|
-
success =
|
190
|
-
|
210
|
+
success = ConnectEx(sock, (struct sockaddr *)&addr->addr, (int)addr->len,
|
211
|
+
NULL, 0, NULL, &info->overlapped);
|
191
212
|
|
192
213
|
/* It wouldn't be unusual to get a success immediately. But we'll still get
|
193
214
|
an IOCP notification, so let's ignore it. */
|
@@ -206,9 +227,11 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
|
|
206
227
|
ac->refs = 2;
|
207
228
|
ac->addr_name = grpc_sockaddr_to_uri(addr);
|
208
229
|
ac->endpoint = endpoint;
|
209
|
-
|
230
|
+
ac->resource_quota = resource_quota;
|
231
|
+
grpc_closure_init(&ac->on_connect, on_connect, ac, grpc_schedule_on_exec_ctx);
|
210
232
|
|
211
|
-
|
233
|
+
grpc_closure_init(&ac->on_alarm, on_alarm, ac, grpc_schedule_on_exec_ctx);
|
234
|
+
grpc_timer_init(exec_ctx, &ac->alarm, deadline, &ac->on_alarm,
|
212
235
|
gpr_now(GPR_CLOCK_MONOTONIC));
|
213
236
|
grpc_socket_notify_on_write(exec_ctx, socket, &ac->on_connect);
|
214
237
|
return;
|
@@ -225,7 +248,8 @@ failure:
|
|
225
248
|
} else if (sock != INVALID_SOCKET) {
|
226
249
|
closesocket(sock);
|
227
250
|
}
|
228
|
-
|
251
|
+
grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
|
252
|
+
grpc_closure_sched(exec_ctx, on_done, final_error);
|
229
253
|
}
|
230
254
|
|
231
|
-
#endif /*
|
255
|
+
#endif /* GRPC_WINSOCK_SOCKET */
|
@@ -31,9 +31,9 @@
|
|
31
31
|
*
|
32
32
|
*/
|
33
33
|
|
34
|
-
#include
|
34
|
+
#include "src/core/lib/iomgr/port.h"
|
35
35
|
|
36
|
-
#ifdef
|
36
|
+
#ifdef GRPC_POSIX_SOCKET
|
37
37
|
|
38
38
|
#include "src/core/lib/iomgr/network_status_tracker.h"
|
39
39
|
#include "src/core/lib/iomgr/tcp_posix.h"
|
@@ -46,9 +46,9 @@
|
|
46
46
|
#include <sys/types.h>
|
47
47
|
#include <unistd.h>
|
48
48
|
|
49
|
+
#include <grpc/slice.h>
|
49
50
|
#include <grpc/support/alloc.h>
|
50
51
|
#include <grpc/support/log.h>
|
51
|
-
#include <grpc/support/slice.h>
|
52
52
|
#include <grpc/support/string_util.h>
|
53
53
|
#include <grpc/support/sync.h>
|
54
54
|
#include <grpc/support/time.h>
|
@@ -56,16 +56,18 @@
|
|
56
56
|
#include "src/core/lib/debug/trace.h"
|
57
57
|
#include "src/core/lib/iomgr/ev_posix.h"
|
58
58
|
#include "src/core/lib/profiling/timers.h"
|
59
|
+
#include "src/core/lib/slice/slice_internal.h"
|
60
|
+
#include "src/core/lib/slice/slice_string_helpers.h"
|
59
61
|
#include "src/core/lib/support/string.h"
|
60
62
|
|
61
|
-
#ifdef
|
63
|
+
#ifdef GRPC_HAVE_MSG_NOSIGNAL
|
62
64
|
#define SENDMSG_FLAGS MSG_NOSIGNAL
|
63
65
|
#else
|
64
66
|
#define SENDMSG_FLAGS 0
|
65
67
|
#endif
|
66
68
|
|
67
|
-
#ifdef
|
68
|
-
typedef
|
69
|
+
#ifdef GRPC_MSG_IOVLEN_TYPE
|
70
|
+
typedef GRPC_MSG_IOVLEN_TYPE msg_iovlen_type;
|
69
71
|
#else
|
70
72
|
typedef size_t msg_iovlen_type;
|
71
73
|
#endif
|
@@ -80,12 +82,13 @@ typedef struct {
|
|
80
82
|
msg_iovlen_type iov_size; /* Number of slices to allocate per read attempt */
|
81
83
|
size_t slice_size;
|
82
84
|
gpr_refcount refcount;
|
85
|
+
gpr_atm shutdown_count;
|
83
86
|
|
84
87
|
/* garbage after the last read */
|
85
|
-
|
88
|
+
grpc_slice_buffer last_read_buffer;
|
86
89
|
|
87
|
-
|
88
|
-
|
90
|
+
grpc_slice_buffer *incoming_buffer;
|
91
|
+
grpc_slice_buffer *outgoing_buffer;
|
89
92
|
/** slice within outgoing_buffer to write next */
|
90
93
|
size_t outgoing_slice_idx;
|
91
94
|
/** byte within outgoing_buffer->slices[outgoing_slice_idx] to write next */
|
@@ -100,8 +103,17 @@ typedef struct {
|
|
100
103
|
grpc_closure write_closure;
|
101
104
|
|
102
105
|
char *peer_string;
|
106
|
+
|
107
|
+
grpc_resource_user *resource_user;
|
108
|
+
grpc_resource_user_slice_allocator slice_allocator;
|
103
109
|
} grpc_tcp;
|
104
110
|
|
111
|
+
static grpc_error *tcp_annotate_error(grpc_error *src_error, grpc_tcp *tcp) {
|
112
|
+
return grpc_error_set_str(
|
113
|
+
grpc_error_set_int(src_error, GRPC_ERROR_INT_FD, tcp->fd),
|
114
|
+
GRPC_ERROR_STR_TARGET_ADDRESS, tcp->peer_string);
|
115
|
+
}
|
116
|
+
|
105
117
|
static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
|
106
118
|
grpc_error *error);
|
107
119
|
static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
|
@@ -110,12 +122,14 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
|
|
110
122
|
static void tcp_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
|
111
123
|
grpc_tcp *tcp = (grpc_tcp *)ep;
|
112
124
|
grpc_fd_shutdown(exec_ctx, tcp->em_fd);
|
125
|
+
grpc_resource_user_shutdown(exec_ctx, tcp->resource_user);
|
113
126
|
}
|
114
127
|
|
115
128
|
static void tcp_free(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
116
129
|
grpc_fd_orphan(exec_ctx, tcp->em_fd, tcp->release_fd_cb, tcp->release_fd,
|
117
130
|
"tcp_unref_orphan");
|
118
|
-
|
131
|
+
grpc_slice_buffer_destroy_internal(exec_ctx, &tcp->last_read_buffer);
|
132
|
+
grpc_resource_user_unref(exec_ctx, tcp->resource_user);
|
119
133
|
gpr_free(tcp->peer_string);
|
120
134
|
gpr_free(tcp);
|
121
135
|
}
|
@@ -155,6 +169,7 @@ static void tcp_ref(grpc_tcp *tcp) { gpr_ref(&tcp->refcount); }
|
|
155
169
|
static void tcp_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
|
156
170
|
grpc_network_status_unregister_endpoint(ep);
|
157
171
|
grpc_tcp *tcp = (grpc_tcp *)ep;
|
172
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &tcp->last_read_buffer);
|
158
173
|
TCP_UNREF(exec_ctx, tcp, "destroy");
|
159
174
|
}
|
160
175
|
|
@@ -168,8 +183,8 @@ static void call_read_cb(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp,
|
|
168
183
|
gpr_log(GPR_DEBUG, "read: error=%s", str);
|
169
184
|
grpc_error_free_string(str);
|
170
185
|
for (i = 0; i < tcp->incoming_buffer->count; i++) {
|
171
|
-
char *dump =
|
172
|
-
|
186
|
+
char *dump = grpc_dump_slice(tcp->incoming_buffer->slices[i],
|
187
|
+
GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
173
188
|
gpr_log(GPR_DEBUG, "READ %p (peer=%s): %s", tcp, tcp->peer_string, dump);
|
174
189
|
gpr_free(dump);
|
175
190
|
}
|
@@ -177,11 +192,11 @@ static void call_read_cb(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp,
|
|
177
192
|
|
178
193
|
tcp->read_cb = NULL;
|
179
194
|
tcp->incoming_buffer = NULL;
|
180
|
-
|
195
|
+
grpc_closure_run(exec_ctx, cb, error);
|
181
196
|
}
|
182
197
|
|
183
198
|
#define MAX_READ_IOVEC 4
|
184
|
-
static void
|
199
|
+
static void tcp_do_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
185
200
|
struct msghdr msg;
|
186
201
|
struct iovec iov[MAX_READ_IOVEC];
|
187
202
|
ssize_t read_bytes;
|
@@ -192,13 +207,9 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
|
192
207
|
GPR_ASSERT(tcp->incoming_buffer->count <= MAX_READ_IOVEC);
|
193
208
|
GPR_TIMER_BEGIN("tcp_continue_read", 0);
|
194
209
|
|
195
|
-
while (tcp->incoming_buffer->count < (size_t)tcp->iov_size) {
|
196
|
-
gpr_slice_buffer_add_indexed(tcp->incoming_buffer,
|
197
|
-
gpr_slice_malloc(tcp->slice_size));
|
198
|
-
}
|
199
210
|
for (i = 0; i < tcp->incoming_buffer->count; i++) {
|
200
|
-
iov[i].iov_base =
|
201
|
-
iov[i].iov_len =
|
211
|
+
iov[i].iov_base = GRPC_SLICE_START_PTR(tcp->incoming_buffer->slices[i]);
|
212
|
+
iov[i].iov_len = GRPC_SLICE_LENGTH(tcp->incoming_buffer->slices[i]);
|
202
213
|
}
|
203
214
|
|
204
215
|
msg.msg_name = NULL;
|
@@ -209,11 +220,11 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
|
209
220
|
msg.msg_controllen = 0;
|
210
221
|
msg.msg_flags = 0;
|
211
222
|
|
212
|
-
GPR_TIMER_BEGIN("recvmsg",
|
223
|
+
GPR_TIMER_BEGIN("recvmsg", 0);
|
213
224
|
do {
|
214
225
|
read_bytes = recvmsg(tcp->fd, &msg, 0);
|
215
226
|
} while (read_bytes < 0 && errno == EINTR);
|
216
|
-
GPR_TIMER_END("recvmsg", 0);
|
227
|
+
GPR_TIMER_END("recvmsg", read_bytes >= 0);
|
217
228
|
|
218
229
|
if (read_bytes < 0) {
|
219
230
|
/* NB: After calling call_read_cb a parallel call of the read handler may
|
@@ -225,19 +236,22 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
|
225
236
|
/* We've consumed the edge, request a new one */
|
226
237
|
grpc_fd_notify_on_read(exec_ctx, tcp->em_fd, &tcp->read_closure);
|
227
238
|
} else {
|
228
|
-
|
229
|
-
|
239
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
|
240
|
+
tcp->incoming_buffer);
|
241
|
+
call_read_cb(exec_ctx, tcp,
|
242
|
+
tcp_annotate_error(GRPC_OS_ERROR(errno, "recvmsg"), tcp));
|
230
243
|
TCP_UNREF(exec_ctx, tcp, "read");
|
231
244
|
}
|
232
245
|
} else if (read_bytes == 0) {
|
233
246
|
/* 0 read size ==> end of stream */
|
234
|
-
|
235
|
-
call_read_cb(exec_ctx, tcp,
|
247
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx, tcp->incoming_buffer);
|
248
|
+
call_read_cb(exec_ctx, tcp,
|
249
|
+
tcp_annotate_error(GRPC_ERROR_CREATE("Socket closed"), tcp));
|
236
250
|
TCP_UNREF(exec_ctx, tcp, "read");
|
237
251
|
} else {
|
238
252
|
GPR_ASSERT((size_t)read_bytes <= tcp->incoming_buffer->length);
|
239
253
|
if ((size_t)read_bytes < tcp->incoming_buffer->length) {
|
240
|
-
|
254
|
+
grpc_slice_buffer_trim_end(
|
241
255
|
tcp->incoming_buffer,
|
242
256
|
tcp->incoming_buffer->length - (size_t)read_bytes,
|
243
257
|
&tcp->last_read_buffer);
|
@@ -252,13 +266,40 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
|
252
266
|
GPR_TIMER_END("tcp_continue_read", 0);
|
253
267
|
}
|
254
268
|
|
269
|
+
static void tcp_read_allocation_done(grpc_exec_ctx *exec_ctx, void *tcpp,
|
270
|
+
grpc_error *error) {
|
271
|
+
grpc_tcp *tcp = tcpp;
|
272
|
+
if (error != GRPC_ERROR_NONE) {
|
273
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx, tcp->incoming_buffer);
|
274
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
|
275
|
+
&tcp->last_read_buffer);
|
276
|
+
call_read_cb(exec_ctx, tcp, GRPC_ERROR_REF(error));
|
277
|
+
TCP_UNREF(exec_ctx, tcp, "read");
|
278
|
+
} else {
|
279
|
+
tcp_do_read(exec_ctx, tcp);
|
280
|
+
}
|
281
|
+
}
|
282
|
+
|
283
|
+
static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
|
284
|
+
if (tcp->incoming_buffer->count < (size_t)tcp->iov_size) {
|
285
|
+
grpc_resource_user_alloc_slices(
|
286
|
+
exec_ctx, &tcp->slice_allocator, tcp->slice_size,
|
287
|
+
(size_t)tcp->iov_size - tcp->incoming_buffer->count,
|
288
|
+
tcp->incoming_buffer);
|
289
|
+
} else {
|
290
|
+
tcp_do_read(exec_ctx, tcp);
|
291
|
+
}
|
292
|
+
}
|
293
|
+
|
255
294
|
static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
|
256
295
|
grpc_error *error) {
|
257
296
|
grpc_tcp *tcp = (grpc_tcp *)arg;
|
258
297
|
GPR_ASSERT(!tcp->finished_edge);
|
259
298
|
|
260
299
|
if (error != GRPC_ERROR_NONE) {
|
261
|
-
|
300
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx, tcp->incoming_buffer);
|
301
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
|
302
|
+
&tcp->last_read_buffer);
|
262
303
|
call_read_cb(exec_ctx, tcp, GRPC_ERROR_REF(error));
|
263
304
|
TCP_UNREF(exec_ctx, tcp, "read");
|
264
305
|
} else {
|
@@ -267,24 +308,24 @@ static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
|
|
267
308
|
}
|
268
309
|
|
269
310
|
static void tcp_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
270
|
-
|
311
|
+
grpc_slice_buffer *incoming_buffer, grpc_closure *cb) {
|
271
312
|
grpc_tcp *tcp = (grpc_tcp *)ep;
|
272
313
|
GPR_ASSERT(tcp->read_cb == NULL);
|
273
314
|
tcp->read_cb = cb;
|
274
315
|
tcp->incoming_buffer = incoming_buffer;
|
275
|
-
|
276
|
-
|
316
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx, incoming_buffer);
|
317
|
+
grpc_slice_buffer_swap(incoming_buffer, &tcp->last_read_buffer);
|
277
318
|
TCP_REF(tcp, "read");
|
278
319
|
if (tcp->finished_edge) {
|
279
320
|
tcp->finished_edge = false;
|
280
321
|
grpc_fd_notify_on_read(exec_ctx, tcp->em_fd, &tcp->read_closure);
|
281
322
|
} else {
|
282
|
-
|
323
|
+
grpc_closure_sched(exec_ctx, &tcp->read_closure, GRPC_ERROR_NONE);
|
283
324
|
}
|
284
325
|
}
|
285
326
|
|
286
327
|
/* returns true if done, false if pending; if returning true, *error is set */
|
287
|
-
#define MAX_WRITE_IOVEC
|
328
|
+
#define MAX_WRITE_IOVEC 1000
|
288
329
|
static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
|
289
330
|
struct msghdr msg;
|
290
331
|
struct iovec iov[MAX_WRITE_IOVEC];
|
@@ -303,11 +344,11 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
|
|
303
344
|
iov_size != MAX_WRITE_IOVEC;
|
304
345
|
iov_size++) {
|
305
346
|
iov[iov_size].iov_base =
|
306
|
-
|
347
|
+
GRPC_SLICE_START_PTR(
|
307
348
|
tcp->outgoing_buffer->slices[tcp->outgoing_slice_idx]) +
|
308
349
|
tcp->outgoing_byte_idx;
|
309
350
|
iov[iov_size].iov_len =
|
310
|
-
|
351
|
+
GRPC_SLICE_LENGTH(
|
311
352
|
tcp->outgoing_buffer->slices[tcp->outgoing_slice_idx]) -
|
312
353
|
tcp->outgoing_byte_idx;
|
313
354
|
sending_length += iov[iov_size].iov_len;
|
@@ -336,8 +377,13 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
|
|
336
377
|
tcp->outgoing_slice_idx = unwind_slice_idx;
|
337
378
|
tcp->outgoing_byte_idx = unwind_byte_idx;
|
338
379
|
return false;
|
380
|
+
} else if (errno == EPIPE) {
|
381
|
+
*error = grpc_error_set_int(GRPC_OS_ERROR(errno, "sendmsg"),
|
382
|
+
GRPC_ERROR_INT_GRPC_STATUS,
|
383
|
+
GRPC_STATUS_UNAVAILABLE);
|
384
|
+
return true;
|
339
385
|
} else {
|
340
|
-
*error = GRPC_OS_ERROR(errno, "sendmsg");
|
386
|
+
*error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
|
341
387
|
return true;
|
342
388
|
}
|
343
389
|
}
|
@@ -348,7 +394,7 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
|
|
348
394
|
size_t slice_length;
|
349
395
|
|
350
396
|
tcp->outgoing_slice_idx--;
|
351
|
-
slice_length =
|
397
|
+
slice_length = GRPC_SLICE_LENGTH(
|
352
398
|
tcp->outgoing_buffer->slices[tcp->outgoing_slice_idx]);
|
353
399
|
if (slice_length > trailing) {
|
354
400
|
tcp->outgoing_byte_idx = slice_length - trailing;
|
@@ -379,20 +425,26 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
|
|
379
425
|
}
|
380
426
|
|
381
427
|
if (!tcp_flush(tcp, &error)) {
|
428
|
+
if (grpc_tcp_trace) {
|
429
|
+
gpr_log(GPR_DEBUG, "write: delayed");
|
430
|
+
}
|
382
431
|
grpc_fd_notify_on_write(exec_ctx, tcp->em_fd, &tcp->write_closure);
|
383
432
|
} else {
|
384
433
|
cb = tcp->write_cb;
|
385
434
|
tcp->write_cb = NULL;
|
386
|
-
|
387
|
-
|
388
|
-
|
435
|
+
if (grpc_tcp_trace) {
|
436
|
+
const char *str = grpc_error_string(error);
|
437
|
+
gpr_log(GPR_DEBUG, "write: %s", str);
|
438
|
+
grpc_error_free_string(str);
|
439
|
+
}
|
440
|
+
|
441
|
+
grpc_closure_run(exec_ctx, cb, error);
|
389
442
|
TCP_UNREF(exec_ctx, tcp, "write");
|
390
|
-
GRPC_ERROR_UNREF(error);
|
391
443
|
}
|
392
444
|
}
|
393
445
|
|
394
446
|
static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
395
|
-
|
447
|
+
grpc_slice_buffer *buf, grpc_closure *cb) {
|
396
448
|
grpc_tcp *tcp = (grpc_tcp *)ep;
|
397
449
|
grpc_error *error = GRPC_ERROR_NONE;
|
398
450
|
|
@@ -401,7 +453,7 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
|
401
453
|
|
402
454
|
for (i = 0; i < buf->count; i++) {
|
403
455
|
char *data =
|
404
|
-
|
456
|
+
grpc_dump_slice(buf->slices[i], GPR_DUMP_HEX | GPR_DUMP_ASCII);
|
405
457
|
gpr_log(GPR_DEBUG, "WRITE %p (peer=%s): %s", tcp, tcp->peer_string, data);
|
406
458
|
gpr_free(data);
|
407
459
|
}
|
@@ -412,10 +464,10 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
|
412
464
|
|
413
465
|
if (buf->length == 0) {
|
414
466
|
GPR_TIMER_END("tcp_write", 0);
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
467
|
+
grpc_closure_sched(exec_ctx, cb,
|
468
|
+
grpc_fd_is_shutdown(tcp->em_fd)
|
469
|
+
? tcp_annotate_error(GRPC_ERROR_CREATE("EOF"), tcp)
|
470
|
+
: GRPC_ERROR_NONE);
|
419
471
|
return;
|
420
472
|
}
|
421
473
|
tcp->outgoing_buffer = buf;
|
@@ -425,9 +477,17 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
|
425
477
|
if (!tcp_flush(tcp, &error)) {
|
426
478
|
TCP_REF(tcp, "write");
|
427
479
|
tcp->write_cb = cb;
|
480
|
+
if (grpc_tcp_trace) {
|
481
|
+
gpr_log(GPR_DEBUG, "write: delayed");
|
482
|
+
}
|
428
483
|
grpc_fd_notify_on_write(exec_ctx, tcp->em_fd, &tcp->write_closure);
|
429
484
|
} else {
|
430
|
-
|
485
|
+
if (grpc_tcp_trace) {
|
486
|
+
const char *str = grpc_error_string(error);
|
487
|
+
gpr_log(GPR_DEBUG, "write: %s", str);
|
488
|
+
grpc_error_free_string(str);
|
489
|
+
}
|
490
|
+
grpc_closure_sched(exec_ctx, cb, error);
|
431
491
|
}
|
432
492
|
|
433
493
|
GPR_TIMER_END("tcp_write", 0);
|
@@ -450,11 +510,21 @@ static char *tcp_get_peer(grpc_endpoint *ep) {
|
|
450
510
|
return gpr_strdup(tcp->peer_string);
|
451
511
|
}
|
452
512
|
|
513
|
+
static int tcp_get_fd(grpc_endpoint *ep) {
|
514
|
+
grpc_tcp *tcp = (grpc_tcp *)ep;
|
515
|
+
return tcp->fd;
|
516
|
+
}
|
517
|
+
|
453
518
|
static grpc_workqueue *tcp_get_workqueue(grpc_endpoint *ep) {
|
454
519
|
grpc_tcp *tcp = (grpc_tcp *)ep;
|
455
520
|
return grpc_fd_get_workqueue(tcp->em_fd);
|
456
521
|
}
|
457
522
|
|
523
|
+
static grpc_resource_user *tcp_get_resource_user(grpc_endpoint *ep) {
|
524
|
+
grpc_tcp *tcp = (grpc_tcp *)ep;
|
525
|
+
return tcp->resource_user;
|
526
|
+
}
|
527
|
+
|
458
528
|
static const grpc_endpoint_vtable vtable = {tcp_read,
|
459
529
|
tcp_write,
|
460
530
|
tcp_get_workqueue,
|
@@ -462,10 +532,13 @@ static const grpc_endpoint_vtable vtable = {tcp_read,
|
|
462
532
|
tcp_add_to_pollset_set,
|
463
533
|
tcp_shutdown,
|
464
534
|
tcp_destroy,
|
465
|
-
|
535
|
+
tcp_get_resource_user,
|
536
|
+
tcp_get_peer,
|
537
|
+
tcp_get_fd};
|
466
538
|
|
467
|
-
grpc_endpoint *grpc_tcp_create(grpc_fd *em_fd,
|
468
|
-
|
539
|
+
grpc_endpoint *grpc_tcp_create(grpc_fd *em_fd,
|
540
|
+
grpc_resource_quota *resource_quota,
|
541
|
+
size_t slice_size, const char *peer_string) {
|
469
542
|
grpc_tcp *tcp = (grpc_tcp *)gpr_malloc(sizeof(grpc_tcp));
|
470
543
|
tcp->base.vtable = &vtable;
|
471
544
|
tcp->peer_string = gpr_strdup(peer_string);
|
@@ -480,12 +553,16 @@ grpc_endpoint *grpc_tcp_create(grpc_fd *em_fd, size_t slice_size,
|
|
480
553
|
tcp->finished_edge = true;
|
481
554
|
/* paired with unref in grpc_tcp_destroy */
|
482
555
|
gpr_ref_init(&tcp->refcount, 1);
|
556
|
+
gpr_atm_no_barrier_store(&tcp->shutdown_count, 0);
|
483
557
|
tcp->em_fd = em_fd;
|
484
|
-
tcp->read_closure
|
485
|
-
|
486
|
-
tcp->write_closure
|
487
|
-
|
488
|
-
|
558
|
+
grpc_closure_init(&tcp->read_closure, tcp_handle_read, tcp,
|
559
|
+
grpc_schedule_on_exec_ctx);
|
560
|
+
grpc_closure_init(&tcp->write_closure, tcp_handle_write, tcp,
|
561
|
+
grpc_schedule_on_exec_ctx);
|
562
|
+
grpc_slice_buffer_init(&tcp->last_read_buffer);
|
563
|
+
tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string);
|
564
|
+
grpc_resource_user_slice_allocator_init(
|
565
|
+
&tcp->slice_allocator, tcp->resource_user, tcp_read_allocation_done, tcp);
|
489
566
|
/* Tell network status tracker about new endpoint */
|
490
567
|
grpc_network_status_register_endpoint(&tcp->base);
|
491
568
|
|
@@ -500,10 +577,12 @@ int grpc_tcp_fd(grpc_endpoint *ep) {
|
|
500
577
|
|
501
578
|
void grpc_tcp_destroy_and_release_fd(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
|
502
579
|
int *fd, grpc_closure *done) {
|
580
|
+
grpc_network_status_unregister_endpoint(ep);
|
503
581
|
grpc_tcp *tcp = (grpc_tcp *)ep;
|
504
582
|
GPR_ASSERT(ep->vtable == &vtable);
|
505
583
|
tcp->release_fd = fd;
|
506
584
|
tcp->release_fd_cb = done;
|
585
|
+
grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &tcp->last_read_buffer);
|
507
586
|
TCP_UNREF(exec_ctx, tcp, "destroy");
|
508
587
|
}
|
509
588
|
|