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,89 @@
|
|
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_IOMGR_TIMER_H
|
35
|
+
#define GRPC_INTERNAL_CORE_IOMGR_TIMER_H
|
36
|
+
|
37
|
+
#include "src/core/iomgr/iomgr.h"
|
38
|
+
#include "src/core/iomgr/exec_ctx.h"
|
39
|
+
#include <grpc/support/port_platform.h>
|
40
|
+
#include <grpc/support/time.h>
|
41
|
+
|
42
|
+
typedef struct grpc_timer {
|
43
|
+
gpr_timespec deadline;
|
44
|
+
gpr_uint32 heap_index; /* INVALID_HEAP_INDEX if not in heap */
|
45
|
+
int triggered;
|
46
|
+
struct grpc_timer *next;
|
47
|
+
struct grpc_timer *prev;
|
48
|
+
grpc_closure closure;
|
49
|
+
} grpc_timer;
|
50
|
+
|
51
|
+
/* Initialize *timer. When expired or canceled, timer_cb will be called with
|
52
|
+
*timer_cb_arg and status to indicate if it expired (SUCCESS) or was
|
53
|
+
canceled (CANCELLED). timer_cb is guaranteed to be called exactly once,
|
54
|
+
and application code should check the status to determine how it was
|
55
|
+
invoked. The application callback is also responsible for maintaining
|
56
|
+
information about when to free up any user-level state. */
|
57
|
+
void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer,
|
58
|
+
gpr_timespec deadline, grpc_iomgr_cb_func timer_cb,
|
59
|
+
void *timer_cb_arg, gpr_timespec now);
|
60
|
+
|
61
|
+
/* Note that there is no timer destroy function. This is because the
|
62
|
+
timer is a one-time occurrence with a guarantee that the callback will
|
63
|
+
be called exactly once, either at expiration or cancellation. Thus, all
|
64
|
+
the internal timer event management state is destroyed just before
|
65
|
+
that callback is invoked. If the user has additional state associated with
|
66
|
+
the timer, the user is responsible for determining when it is safe to
|
67
|
+
destroy that state. */
|
68
|
+
|
69
|
+
/* Cancel an *timer.
|
70
|
+
There are three cases:
|
71
|
+
1. We normally cancel the timer
|
72
|
+
2. The timer has already run
|
73
|
+
3. We can't cancel the timer because it is "in flight".
|
74
|
+
|
75
|
+
In all of these cases, the cancellation is still considered successful.
|
76
|
+
They are essentially distinguished in that the timer_cb will be run
|
77
|
+
exactly once from either the cancellation (with status CANCELLED)
|
78
|
+
or from the activation (with status SUCCESS)
|
79
|
+
|
80
|
+
Note carefully that the callback function MAY occur in the same callstack
|
81
|
+
as grpc_timer_cancel. It's expected that most timers will be cancelled (their
|
82
|
+
primary use is to implement deadlines), and so this code is optimized such
|
83
|
+
that cancellation costs as little as possible. Making callbacks run inline
|
84
|
+
matches this aim.
|
85
|
+
|
86
|
+
Requires: cancel() must happen after add() on a given timer */
|
87
|
+
void grpc_timer_cancel(grpc_exec_ctx *exec_ctx, grpc_timer *timer);
|
88
|
+
|
89
|
+
#endif /* GRPC_INTERNAL_CORE_IOMGR_TIMER_H */
|
@@ -0,0 +1,148 @@
|
|
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/iomgr/timer_heap.h"
|
35
|
+
|
36
|
+
#include <string.h>
|
37
|
+
|
38
|
+
#include <grpc/support/alloc.h>
|
39
|
+
#include <grpc/support/useful.h>
|
40
|
+
|
41
|
+
/* Adjusts a heap so as to move a hole at position i closer to the root,
|
42
|
+
until a suitable position is found for element t. Then, copies t into that
|
43
|
+
position. This functor is called each time immediately after modifying a
|
44
|
+
value in the underlying container, with the offset of the modified element as
|
45
|
+
its argument. */
|
46
|
+
static void adjust_upwards(grpc_timer **first, gpr_uint32 i, grpc_timer *t) {
|
47
|
+
while (i > 0) {
|
48
|
+
gpr_uint32 parent = (gpr_uint32)(((int)i - 1) / 2);
|
49
|
+
if (gpr_time_cmp(first[parent]->deadline, t->deadline) >= 0) break;
|
50
|
+
first[i] = first[parent];
|
51
|
+
first[i]->heap_index = i;
|
52
|
+
i = parent;
|
53
|
+
}
|
54
|
+
first[i] = t;
|
55
|
+
t->heap_index = i;
|
56
|
+
}
|
57
|
+
|
58
|
+
/* Adjusts a heap so as to move a hole at position i farther away from the root,
|
59
|
+
until a suitable position is found for element t. Then, copies t into that
|
60
|
+
position. */
|
61
|
+
static void adjust_downwards(grpc_timer **first, gpr_uint32 i,
|
62
|
+
gpr_uint32 length, grpc_timer *t) {
|
63
|
+
for (;;) {
|
64
|
+
gpr_uint32 left_child = 1u + 2u * i;
|
65
|
+
gpr_uint32 right_child;
|
66
|
+
gpr_uint32 next_i;
|
67
|
+
if (left_child >= length) break;
|
68
|
+
right_child = left_child + 1;
|
69
|
+
next_i = right_child < length &&
|
70
|
+
gpr_time_cmp(first[left_child]->deadline,
|
71
|
+
first[right_child]->deadline) < 0
|
72
|
+
? right_child
|
73
|
+
: left_child;
|
74
|
+
if (gpr_time_cmp(t->deadline, first[next_i]->deadline) >= 0) break;
|
75
|
+
first[i] = first[next_i];
|
76
|
+
first[i]->heap_index = i;
|
77
|
+
i = next_i;
|
78
|
+
}
|
79
|
+
first[i] = t;
|
80
|
+
t->heap_index = i;
|
81
|
+
}
|
82
|
+
|
83
|
+
#define SHRINK_MIN_ELEMS 8
|
84
|
+
#define SHRINK_FULLNESS_FACTOR 2
|
85
|
+
|
86
|
+
static void maybe_shrink(grpc_timer_heap *heap) {
|
87
|
+
if (heap->timer_count >= 8 &&
|
88
|
+
heap->timer_count <= heap->timer_capacity / SHRINK_FULLNESS_FACTOR / 2) {
|
89
|
+
heap->timer_capacity = heap->timer_count * SHRINK_FULLNESS_FACTOR;
|
90
|
+
heap->timers =
|
91
|
+
gpr_realloc(heap->timers, heap->timer_capacity * sizeof(grpc_timer *));
|
92
|
+
}
|
93
|
+
}
|
94
|
+
|
95
|
+
static void note_changed_priority(grpc_timer_heap *heap, grpc_timer *timer) {
|
96
|
+
gpr_uint32 i = timer->heap_index;
|
97
|
+
gpr_uint32 parent = (gpr_uint32)(((int)i - 1) / 2);
|
98
|
+
if (gpr_time_cmp(heap->timers[parent]->deadline, timer->deadline) < 0) {
|
99
|
+
adjust_upwards(heap->timers, i, timer);
|
100
|
+
} else {
|
101
|
+
adjust_downwards(heap->timers, i, heap->timer_count, timer);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
105
|
+
void grpc_timer_heap_init(grpc_timer_heap *heap) {
|
106
|
+
memset(heap, 0, sizeof(*heap));
|
107
|
+
}
|
108
|
+
|
109
|
+
void grpc_timer_heap_destroy(grpc_timer_heap *heap) { gpr_free(heap->timers); }
|
110
|
+
|
111
|
+
int grpc_timer_heap_add(grpc_timer_heap *heap, grpc_timer *timer) {
|
112
|
+
if (heap->timer_count == heap->timer_capacity) {
|
113
|
+
heap->timer_capacity =
|
114
|
+
GPR_MAX(heap->timer_capacity + 1, heap->timer_capacity * 3 / 2);
|
115
|
+
heap->timers =
|
116
|
+
gpr_realloc(heap->timers, heap->timer_capacity * sizeof(grpc_timer *));
|
117
|
+
}
|
118
|
+
timer->heap_index = heap->timer_count;
|
119
|
+
adjust_upwards(heap->timers, heap->timer_count, timer);
|
120
|
+
heap->timer_count++;
|
121
|
+
return timer->heap_index == 0;
|
122
|
+
}
|
123
|
+
|
124
|
+
void grpc_timer_heap_remove(grpc_timer_heap *heap, grpc_timer *timer) {
|
125
|
+
gpr_uint32 i = timer->heap_index;
|
126
|
+
if (i == heap->timer_count - 1) {
|
127
|
+
heap->timer_count--;
|
128
|
+
maybe_shrink(heap);
|
129
|
+
return;
|
130
|
+
}
|
131
|
+
heap->timers[i] = heap->timers[heap->timer_count - 1];
|
132
|
+
heap->timers[i]->heap_index = i;
|
133
|
+
heap->timer_count--;
|
134
|
+
maybe_shrink(heap);
|
135
|
+
note_changed_priority(heap, heap->timers[i]);
|
136
|
+
}
|
137
|
+
|
138
|
+
int grpc_timer_heap_is_empty(grpc_timer_heap *heap) {
|
139
|
+
return heap->timer_count == 0;
|
140
|
+
}
|
141
|
+
|
142
|
+
grpc_timer *grpc_timer_heap_top(grpc_timer_heap *heap) {
|
143
|
+
return heap->timers[0];
|
144
|
+
}
|
145
|
+
|
146
|
+
void grpc_timer_heap_pop(grpc_timer_heap *heap) {
|
147
|
+
grpc_timer_heap_remove(heap, grpc_timer_heap_top(heap));
|
148
|
+
}
|
@@ -0,0 +1,57 @@
|
|
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_IOMGR_TIMER_HEAP_H
|
35
|
+
#define GRPC_INTERNAL_CORE_IOMGR_TIMER_HEAP_H
|
36
|
+
|
37
|
+
#include "src/core/iomgr/timer.h"
|
38
|
+
|
39
|
+
typedef struct {
|
40
|
+
grpc_timer **timers;
|
41
|
+
gpr_uint32 timer_count;
|
42
|
+
gpr_uint32 timer_capacity;
|
43
|
+
} grpc_timer_heap;
|
44
|
+
|
45
|
+
/* return 1 if the new timer is the first timer in the heap */
|
46
|
+
int grpc_timer_heap_add(grpc_timer_heap *heap, grpc_timer *timer);
|
47
|
+
|
48
|
+
void grpc_timer_heap_init(grpc_timer_heap *heap);
|
49
|
+
void grpc_timer_heap_destroy(grpc_timer_heap *heap);
|
50
|
+
|
51
|
+
void grpc_timer_heap_remove(grpc_timer_heap *heap, grpc_timer *timer);
|
52
|
+
grpc_timer *grpc_timer_heap_top(grpc_timer_heap *heap);
|
53
|
+
void grpc_timer_heap_pop(grpc_timer_heap *heap);
|
54
|
+
|
55
|
+
int grpc_timer_heap_is_empty(grpc_timer_heap *heap);
|
56
|
+
|
57
|
+
#endif /* GRPC_INTERNAL_CORE_IOMGR_TIMER_HEAP_H */
|
@@ -0,0 +1,61 @@
|
|
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_IOMGR_TIMER_INTERNAL_H
|
35
|
+
#define GRPC_INTERNAL_CORE_IOMGR_TIMER_INTERNAL_H
|
36
|
+
|
37
|
+
#include "src/core/iomgr/exec_ctx.h"
|
38
|
+
#include <grpc/support/sync.h>
|
39
|
+
#include <grpc/support/time.h>
|
40
|
+
|
41
|
+
/* iomgr internal api for dealing with timers */
|
42
|
+
|
43
|
+
/* Check for timers to be run, and run them.
|
44
|
+
Return non zero if timer callbacks were executed.
|
45
|
+
Drops drop_mu if it is non-null before executing callbacks.
|
46
|
+
If next is non-null, TRY to update *next with the next running timer
|
47
|
+
IF that timer occurs before *next current value.
|
48
|
+
*next is never guaranteed to be updated on any given execution; however,
|
49
|
+
with high probability at least one thread in the system will see an update
|
50
|
+
at any time slice. */
|
51
|
+
|
52
|
+
int grpc_timer_check(grpc_exec_ctx* exec_ctx, gpr_timespec now,
|
53
|
+
gpr_timespec* next);
|
54
|
+
void grpc_timer_list_init(gpr_timespec now);
|
55
|
+
void grpc_timer_list_shutdown(grpc_exec_ctx* exec_ctx);
|
56
|
+
|
57
|
+
/* the following must be implemented by each iomgr implementation */
|
58
|
+
|
59
|
+
void grpc_kick_poller(void);
|
60
|
+
|
61
|
+
#endif /* GRPC_INTERNAL_CORE_IOMGR_TIMER_INTERNAL_H */
|
@@ -0,0 +1,439 @@
|
|
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
|
+
/* FIXME: "posix" files shouldn't be depending on _GNU_SOURCE */
|
35
|
+
#ifndef _GNU_SOURCE
|
36
|
+
#define _GNU_SOURCE
|
37
|
+
#endif
|
38
|
+
|
39
|
+
#include <grpc/support/port_platform.h>
|
40
|
+
|
41
|
+
#ifdef GRPC_NEED_UDP
|
42
|
+
#ifdef GPR_POSIX_SOCKET
|
43
|
+
|
44
|
+
#include "src/core/iomgr/udp_server.h"
|
45
|
+
|
46
|
+
#include <errno.h>
|
47
|
+
#include <fcntl.h>
|
48
|
+
#include <limits.h>
|
49
|
+
#include <netinet/in.h>
|
50
|
+
#include <netinet/tcp.h>
|
51
|
+
#include <string.h>
|
52
|
+
#include <sys/socket.h>
|
53
|
+
#include <sys/stat.h>
|
54
|
+
#include <sys/types.h>
|
55
|
+
#include <sys/un.h>
|
56
|
+
#include <unistd.h>
|
57
|
+
|
58
|
+
#include "src/core/iomgr/fd_posix.h"
|
59
|
+
#include "src/core/iomgr/pollset_posix.h"
|
60
|
+
#include "src/core/iomgr/resolve_address.h"
|
61
|
+
#include "src/core/iomgr/sockaddr_utils.h"
|
62
|
+
#include "src/core/iomgr/socket_utils_posix.h"
|
63
|
+
#include "src/core/support/string.h"
|
64
|
+
#include <grpc/support/alloc.h>
|
65
|
+
#include <grpc/support/log.h>
|
66
|
+
#include <grpc/support/sync.h>
|
67
|
+
#include <grpc/support/string_util.h>
|
68
|
+
#include <grpc/support/time.h>
|
69
|
+
|
70
|
+
#define INIT_PORT_CAP 2
|
71
|
+
|
72
|
+
/* one listening port */
|
73
|
+
typedef struct {
|
74
|
+
int fd;
|
75
|
+
grpc_fd *emfd;
|
76
|
+
grpc_udp_server *server;
|
77
|
+
union {
|
78
|
+
gpr_uint8 untyped[GRPC_MAX_SOCKADDR_SIZE];
|
79
|
+
struct sockaddr sockaddr;
|
80
|
+
struct sockaddr_un un;
|
81
|
+
} addr;
|
82
|
+
size_t addr_len;
|
83
|
+
grpc_closure read_closure;
|
84
|
+
grpc_closure destroyed_closure;
|
85
|
+
grpc_udp_server_read_cb read_cb;
|
86
|
+
} server_port;
|
87
|
+
|
88
|
+
static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) {
|
89
|
+
struct stat st;
|
90
|
+
|
91
|
+
if (stat(un->sun_path, &st) == 0 && (st.st_mode & S_IFMT) == S_IFSOCK) {
|
92
|
+
unlink(un->sun_path);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
|
96
|
+
/* the overall server */
|
97
|
+
struct grpc_udp_server {
|
98
|
+
gpr_mu mu;
|
99
|
+
gpr_cv cv;
|
100
|
+
|
101
|
+
/* active port count: how many ports are actually still listening */
|
102
|
+
size_t active_ports;
|
103
|
+
/* destroyed port count: how many ports are completely destroyed */
|
104
|
+
size_t destroyed_ports;
|
105
|
+
|
106
|
+
/* is this server shutting down? (boolean) */
|
107
|
+
int shutdown;
|
108
|
+
|
109
|
+
/* all listening ports */
|
110
|
+
server_port *ports;
|
111
|
+
size_t nports;
|
112
|
+
size_t port_capacity;
|
113
|
+
|
114
|
+
/* shutdown callback */
|
115
|
+
grpc_closure *shutdown_complete;
|
116
|
+
|
117
|
+
/* all pollsets interested in new connections */
|
118
|
+
grpc_pollset **pollsets;
|
119
|
+
/* number of pollsets in the pollsets array */
|
120
|
+
size_t pollset_count;
|
121
|
+
/* The parent grpc server */
|
122
|
+
grpc_server *grpc_server;
|
123
|
+
};
|
124
|
+
|
125
|
+
grpc_udp_server *grpc_udp_server_create(void) {
|
126
|
+
grpc_udp_server *s = gpr_malloc(sizeof(grpc_udp_server));
|
127
|
+
gpr_mu_init(&s->mu);
|
128
|
+
gpr_cv_init(&s->cv);
|
129
|
+
s->active_ports = 0;
|
130
|
+
s->destroyed_ports = 0;
|
131
|
+
s->shutdown = 0;
|
132
|
+
s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
|
133
|
+
s->nports = 0;
|
134
|
+
s->port_capacity = INIT_PORT_CAP;
|
135
|
+
|
136
|
+
return s;
|
137
|
+
}
|
138
|
+
|
139
|
+
static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) {
|
140
|
+
grpc_exec_ctx_enqueue(exec_ctx, s->shutdown_complete, 1);
|
141
|
+
|
142
|
+
gpr_mu_destroy(&s->mu);
|
143
|
+
gpr_cv_destroy(&s->cv);
|
144
|
+
|
145
|
+
gpr_free(s->ports);
|
146
|
+
gpr_free(s);
|
147
|
+
}
|
148
|
+
|
149
|
+
static void destroyed_port(grpc_exec_ctx *exec_ctx, void *server, int success) {
|
150
|
+
grpc_udp_server *s = server;
|
151
|
+
gpr_mu_lock(&s->mu);
|
152
|
+
s->destroyed_ports++;
|
153
|
+
if (s->destroyed_ports == s->nports) {
|
154
|
+
gpr_mu_unlock(&s->mu);
|
155
|
+
finish_shutdown(exec_ctx, s);
|
156
|
+
} else {
|
157
|
+
gpr_mu_unlock(&s->mu);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
|
161
|
+
/* called when all listening endpoints have been shutdown, so no further
|
162
|
+
events will be received on them - at this point it's safe to destroy
|
163
|
+
things */
|
164
|
+
static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) {
|
165
|
+
size_t i;
|
166
|
+
|
167
|
+
/* delete ALL the things */
|
168
|
+
gpr_mu_lock(&s->mu);
|
169
|
+
|
170
|
+
if (!s->shutdown) {
|
171
|
+
gpr_mu_unlock(&s->mu);
|
172
|
+
return;
|
173
|
+
}
|
174
|
+
|
175
|
+
if (s->nports) {
|
176
|
+
for (i = 0; i < s->nports; i++) {
|
177
|
+
server_port *sp = &s->ports[i];
|
178
|
+
if (sp->addr.sockaddr.sa_family == AF_UNIX) {
|
179
|
+
unlink_if_unix_domain_socket(&sp->addr.un);
|
180
|
+
}
|
181
|
+
sp->destroyed_closure.cb = destroyed_port;
|
182
|
+
sp->destroyed_closure.cb_arg = s;
|
183
|
+
grpc_fd_orphan(exec_ctx, sp->emfd, &sp->destroyed_closure, NULL,
|
184
|
+
"udp_listener_shutdown");
|
185
|
+
}
|
186
|
+
gpr_mu_unlock(&s->mu);
|
187
|
+
} else {
|
188
|
+
gpr_mu_unlock(&s->mu);
|
189
|
+
finish_shutdown(exec_ctx, s);
|
190
|
+
}
|
191
|
+
}
|
192
|
+
|
193
|
+
void grpc_udp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_udp_server *s,
|
194
|
+
grpc_closure *on_done) {
|
195
|
+
size_t i;
|
196
|
+
gpr_mu_lock(&s->mu);
|
197
|
+
|
198
|
+
GPR_ASSERT(!s->shutdown);
|
199
|
+
s->shutdown = 1;
|
200
|
+
|
201
|
+
s->shutdown_complete = on_done;
|
202
|
+
|
203
|
+
/* shutdown all fd's */
|
204
|
+
if (s->active_ports) {
|
205
|
+
for (i = 0; i < s->nports; i++) {
|
206
|
+
grpc_fd_shutdown(exec_ctx, s->ports[i].emfd);
|
207
|
+
}
|
208
|
+
gpr_mu_unlock(&s->mu);
|
209
|
+
} else {
|
210
|
+
gpr_mu_unlock(&s->mu);
|
211
|
+
deactivated_all_ports(exec_ctx, s);
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
215
|
+
/* Prepare a recently-created socket for listening. */
|
216
|
+
static int prepare_socket(int fd, const struct sockaddr *addr,
|
217
|
+
size_t addr_len) {
|
218
|
+
struct sockaddr_storage sockname_temp;
|
219
|
+
socklen_t sockname_len;
|
220
|
+
int get_local_ip;
|
221
|
+
int rc;
|
222
|
+
|
223
|
+
if (fd < 0) {
|
224
|
+
goto error;
|
225
|
+
}
|
226
|
+
|
227
|
+
if (!grpc_set_socket_nonblocking(fd, 1) || !grpc_set_socket_cloexec(fd, 1)) {
|
228
|
+
gpr_log(GPR_ERROR, "Unable to configure socket %d: %s", fd,
|
229
|
+
strerror(errno));
|
230
|
+
}
|
231
|
+
|
232
|
+
get_local_ip = 1;
|
233
|
+
rc = setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
|
234
|
+
sizeof(get_local_ip));
|
235
|
+
if (rc == 0 && addr->sa_family == AF_INET6) {
|
236
|
+
#if !defined(__APPLE__)
|
237
|
+
rc = setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip,
|
238
|
+
sizeof(get_local_ip));
|
239
|
+
#endif
|
240
|
+
}
|
241
|
+
|
242
|
+
GPR_ASSERT(addr_len < ~(socklen_t)0);
|
243
|
+
if (bind(fd, addr, (socklen_t)addr_len) < 0) {
|
244
|
+
char *addr_str;
|
245
|
+
grpc_sockaddr_to_string(&addr_str, addr, 0);
|
246
|
+
gpr_log(GPR_ERROR, "bind addr=%s: %s", addr_str, strerror(errno));
|
247
|
+
gpr_free(addr_str);
|
248
|
+
goto error;
|
249
|
+
}
|
250
|
+
|
251
|
+
sockname_len = sizeof(sockname_temp);
|
252
|
+
if (getsockname(fd, (struct sockaddr *)&sockname_temp, &sockname_len) < 0) {
|
253
|
+
goto error;
|
254
|
+
}
|
255
|
+
|
256
|
+
return grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
|
257
|
+
|
258
|
+
error:
|
259
|
+
if (fd >= 0) {
|
260
|
+
close(fd);
|
261
|
+
}
|
262
|
+
return -1;
|
263
|
+
}
|
264
|
+
|
265
|
+
/* event manager callback when reads are ready */
|
266
|
+
static void on_read(grpc_exec_ctx *exec_ctx, void *arg, int success) {
|
267
|
+
server_port *sp = arg;
|
268
|
+
|
269
|
+
if (success == 0) {
|
270
|
+
gpr_mu_lock(&sp->server->mu);
|
271
|
+
if (0 == --sp->server->active_ports) {
|
272
|
+
gpr_mu_unlock(&sp->server->mu);
|
273
|
+
deactivated_all_ports(exec_ctx, sp->server);
|
274
|
+
} else {
|
275
|
+
gpr_mu_unlock(&sp->server->mu);
|
276
|
+
}
|
277
|
+
return;
|
278
|
+
}
|
279
|
+
|
280
|
+
/* Tell the registered callback that data is available to read. */
|
281
|
+
GPR_ASSERT(sp->read_cb);
|
282
|
+
sp->read_cb(exec_ctx, sp->emfd, sp->server->grpc_server);
|
283
|
+
|
284
|
+
/* Re-arm the notification event so we get another chance to read. */
|
285
|
+
grpc_fd_notify_on_read(exec_ctx, sp->emfd, &sp->read_closure);
|
286
|
+
}
|
287
|
+
|
288
|
+
static int add_socket_to_server(grpc_udp_server *s, int fd,
|
289
|
+
const struct sockaddr *addr, size_t addr_len,
|
290
|
+
grpc_udp_server_read_cb read_cb) {
|
291
|
+
server_port *sp;
|
292
|
+
int port;
|
293
|
+
char *addr_str;
|
294
|
+
char *name;
|
295
|
+
|
296
|
+
port = prepare_socket(fd, addr, addr_len);
|
297
|
+
if (port >= 0) {
|
298
|
+
grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1);
|
299
|
+
gpr_asprintf(&name, "udp-server-listener:%s", addr_str);
|
300
|
+
gpr_free(addr_str);
|
301
|
+
gpr_mu_lock(&s->mu);
|
302
|
+
/* append it to the list under a lock */
|
303
|
+
if (s->nports == s->port_capacity) {
|
304
|
+
s->port_capacity *= 2;
|
305
|
+
s->ports = gpr_realloc(s->ports, sizeof(server_port) * s->port_capacity);
|
306
|
+
}
|
307
|
+
sp = &s->ports[s->nports++];
|
308
|
+
sp->server = s;
|
309
|
+
sp->fd = fd;
|
310
|
+
sp->emfd = grpc_fd_create(fd, name);
|
311
|
+
memcpy(sp->addr.untyped, addr, addr_len);
|
312
|
+
sp->addr_len = addr_len;
|
313
|
+
sp->read_cb = read_cb;
|
314
|
+
GPR_ASSERT(sp->emfd);
|
315
|
+
gpr_mu_unlock(&s->mu);
|
316
|
+
gpr_free(name);
|
317
|
+
}
|
318
|
+
|
319
|
+
return port;
|
320
|
+
}
|
321
|
+
|
322
|
+
int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr,
|
323
|
+
size_t addr_len, grpc_udp_server_read_cb read_cb) {
|
324
|
+
int allocated_port1 = -1;
|
325
|
+
int allocated_port2 = -1;
|
326
|
+
unsigned i;
|
327
|
+
int fd;
|
328
|
+
grpc_dualstack_mode dsmode;
|
329
|
+
struct sockaddr_in6 addr6_v4mapped;
|
330
|
+
struct sockaddr_in wild4;
|
331
|
+
struct sockaddr_in6 wild6;
|
332
|
+
struct sockaddr_in addr4_copy;
|
333
|
+
struct sockaddr *allocated_addr = NULL;
|
334
|
+
struct sockaddr_storage sockname_temp;
|
335
|
+
socklen_t sockname_len;
|
336
|
+
int port;
|
337
|
+
|
338
|
+
if (((struct sockaddr *)addr)->sa_family == AF_UNIX) {
|
339
|
+
unlink_if_unix_domain_socket(addr);
|
340
|
+
}
|
341
|
+
|
342
|
+
/* Check if this is a wildcard port, and if so, try to keep the port the same
|
343
|
+
as some previously created listener. */
|
344
|
+
if (grpc_sockaddr_get_port(addr) == 0) {
|
345
|
+
for (i = 0; i < s->nports; i++) {
|
346
|
+
sockname_len = sizeof(sockname_temp);
|
347
|
+
if (0 == getsockname(s->ports[i].fd, (struct sockaddr *)&sockname_temp,
|
348
|
+
&sockname_len)) {
|
349
|
+
port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
|
350
|
+
if (port > 0) {
|
351
|
+
allocated_addr = malloc(addr_len);
|
352
|
+
memcpy(allocated_addr, addr, addr_len);
|
353
|
+
grpc_sockaddr_set_port(allocated_addr, port);
|
354
|
+
addr = allocated_addr;
|
355
|
+
break;
|
356
|
+
}
|
357
|
+
}
|
358
|
+
}
|
359
|
+
}
|
360
|
+
|
361
|
+
if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
|
362
|
+
addr = (const struct sockaddr *)&addr6_v4mapped;
|
363
|
+
addr_len = sizeof(addr6_v4mapped);
|
364
|
+
}
|
365
|
+
|
366
|
+
/* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
|
367
|
+
if (grpc_sockaddr_is_wildcard(addr, &port)) {
|
368
|
+
grpc_sockaddr_make_wildcards(port, &wild4, &wild6);
|
369
|
+
|
370
|
+
/* Try listening on IPv6 first. */
|
371
|
+
addr = (struct sockaddr *)&wild6;
|
372
|
+
addr_len = sizeof(wild6);
|
373
|
+
fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode);
|
374
|
+
allocated_port1 = add_socket_to_server(s, fd, addr, addr_len, read_cb);
|
375
|
+
if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) {
|
376
|
+
goto done;
|
377
|
+
}
|
378
|
+
|
379
|
+
/* If we didn't get a dualstack socket, also listen on 0.0.0.0. */
|
380
|
+
if (port == 0 && allocated_port1 > 0) {
|
381
|
+
grpc_sockaddr_set_port((struct sockaddr *)&wild4, allocated_port1);
|
382
|
+
}
|
383
|
+
addr = (struct sockaddr *)&wild4;
|
384
|
+
addr_len = sizeof(wild4);
|
385
|
+
}
|
386
|
+
|
387
|
+
fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode);
|
388
|
+
if (fd < 0) {
|
389
|
+
gpr_log(GPR_ERROR, "Unable to create socket: %s", strerror(errno));
|
390
|
+
}
|
391
|
+
if (dsmode == GRPC_DSMODE_IPV4 &&
|
392
|
+
grpc_sockaddr_is_v4mapped(addr, &addr4_copy)) {
|
393
|
+
addr = (struct sockaddr *)&addr4_copy;
|
394
|
+
addr_len = sizeof(addr4_copy);
|
395
|
+
}
|
396
|
+
allocated_port2 = add_socket_to_server(s, fd, addr, addr_len, read_cb);
|
397
|
+
|
398
|
+
done:
|
399
|
+
gpr_free(allocated_addr);
|
400
|
+
return allocated_port1 >= 0 ? allocated_port1 : allocated_port2;
|
401
|
+
}
|
402
|
+
|
403
|
+
int grpc_udp_server_get_fd(grpc_udp_server *s, unsigned port_index) {
|
404
|
+
return (port_index < s->nports) ? s->ports[port_index].fd : -1;
|
405
|
+
}
|
406
|
+
|
407
|
+
void grpc_udp_server_start(grpc_exec_ctx *exec_ctx, grpc_udp_server *s,
|
408
|
+
grpc_pollset **pollsets, size_t pollset_count,
|
409
|
+
grpc_server *server) {
|
410
|
+
size_t i, j;
|
411
|
+
gpr_mu_lock(&s->mu);
|
412
|
+
GPR_ASSERT(s->active_ports == 0);
|
413
|
+
s->pollsets = pollsets;
|
414
|
+
s->grpc_server = server;
|
415
|
+
for (i = 0; i < s->nports; i++) {
|
416
|
+
for (j = 0; j < pollset_count; j++) {
|
417
|
+
grpc_pollset_add_fd(exec_ctx, pollsets[j], s->ports[i].emfd);
|
418
|
+
}
|
419
|
+
s->ports[i].read_closure.cb = on_read;
|
420
|
+
s->ports[i].read_closure.cb_arg = &s->ports[i];
|
421
|
+
grpc_fd_notify_on_read(exec_ctx, s->ports[i].emfd,
|
422
|
+
&s->ports[i].read_closure);
|
423
|
+
s->active_ports++;
|
424
|
+
}
|
425
|
+
gpr_mu_unlock(&s->mu);
|
426
|
+
}
|
427
|
+
|
428
|
+
/* TODO(rjshade): Add a test for this method. */
|
429
|
+
void grpc_udp_server_write(server_port *sp, const char *buffer, size_t buf_len,
|
430
|
+
const struct sockaddr *peer_address) {
|
431
|
+
ssize_t rc;
|
432
|
+
rc = sendto(sp->fd, buffer, buf_len, 0, peer_address, sizeof(peer_address));
|
433
|
+
if (rc < 0) {
|
434
|
+
gpr_log(GPR_ERROR, "Unable to send data: %s", strerror(errno));
|
435
|
+
}
|
436
|
+
}
|
437
|
+
|
438
|
+
#endif
|
439
|
+
#endif
|