grpc-z 1.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/Makefile +23896 -0
- data/etc/roots.pem +4475 -0
- data/include/grpc/byte_buffer.h +27 -0
- data/include/grpc/byte_buffer_reader.h +26 -0
- data/include/grpc/census.h +40 -0
- data/include/grpc/compression.h +75 -0
- data/include/grpc/fork.h +26 -0
- data/include/grpc/grpc.h +469 -0
- data/include/grpc/grpc_cronet.h +38 -0
- data/include/grpc/grpc_posix.h +67 -0
- data/include/grpc/grpc_security.h +495 -0
- data/include/grpc/grpc_security_constants.h +107 -0
- data/include/grpc/impl/codegen/atm.h +95 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +91 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +83 -0
- data/include/grpc/impl/codegen/atm_windows.h +126 -0
- data/include/grpc/impl/codegen/byte_buffer.h +88 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +42 -0
- data/include/grpc/impl/codegen/compression_types.h +107 -0
- data/include/grpc/impl/codegen/connectivity_state.h +44 -0
- data/include/grpc/impl/codegen/fork.h +48 -0
- data/include/grpc/impl/codegen/gpr_slice.h +69 -0
- data/include/grpc/impl/codegen/gpr_types.h +59 -0
- data/include/grpc/impl/codegen/grpc_types.h +669 -0
- data/include/grpc/impl/codegen/port_platform.h +507 -0
- data/include/grpc/impl/codegen/propagation_bits.h +52 -0
- data/include/grpc/impl/codegen/slice.h +147 -0
- data/include/grpc/impl/codegen/status.h +153 -0
- data/include/grpc/impl/codegen/sync.h +63 -0
- data/include/grpc/impl/codegen/sync_custom.h +38 -0
- data/include/grpc/impl/codegen/sync_generic.h +48 -0
- data/include/grpc/impl/codegen/sync_posix.h +34 -0
- data/include/grpc/impl/codegen/sync_windows.h +36 -0
- data/include/grpc/load_reporting.h +48 -0
- data/include/grpc/module.modulemap +74 -0
- data/include/grpc/slice.h +172 -0
- data/include/grpc/slice_buffer.h +84 -0
- data/include/grpc/status.h +26 -0
- data/include/grpc/support/alloc.h +68 -0
- data/include/grpc/support/atm.h +26 -0
- data/include/grpc/support/atm_gcc_atomic.h +26 -0
- data/include/grpc/support/atm_gcc_sync.h +26 -0
- data/include/grpc/support/atm_windows.h +26 -0
- data/include/grpc/support/cpu.h +44 -0
- data/include/grpc/support/log.h +104 -0
- data/include/grpc/support/log_windows.h +38 -0
- data/include/grpc/support/port_platform.h +24 -0
- data/include/grpc/support/string_util.h +49 -0
- data/include/grpc/support/sync.h +298 -0
- data/include/grpc/support/sync_custom.h +26 -0
- data/include/grpc/support/sync_generic.h +26 -0
- data/include/grpc/support/sync_posix.h +26 -0
- data/include/grpc/support/sync_windows.h +26 -0
- data/include/grpc/support/thd_id.h +44 -0
- data/include/grpc/support/time.h +92 -0
- data/include/grpc/support/workaround_list.h +31 -0
- data/src/boringssl/err_data.c +1348 -0
- data/src/core/ext/census/grpc_context.cc +38 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +174 -0
- data/src/core/ext/filters/client_channel/backup_poller.h +35 -0
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +248 -0
- data/src/core/ext/filters/client_channel/client_channel.cc +3209 -0
- data/src/core/ext/filters/client_channel/client_channel.h +57 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +67 -0
- data/src/core/ext/filters/client_channel/client_channel_factory.h +74 -0
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +62 -0
- data/src/core/ext/filters/client_channel/connector.cc +41 -0
- data/src/core/ext/filters/client_channel/connector.h +73 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +370 -0
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +34 -0
- data/src/core/ext/filters/client_channel/http_proxy.cc +195 -0
- data/src/core/ext/filters/client_channel/http_proxy.h +24 -0
- data/src/core/ext/filters/client_channel/lb_policy.cc +59 -0
- data/src/core/ext/filters/client_channel/lb_policy.h +201 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +138 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +29 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1906 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +36 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +108 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +152 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +67 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +304 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +88 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +102 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +190 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +591 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +687 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +253 -0
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +136 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.cc +155 -0
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +127 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.cc +97 -0
- data/src/core/ext/filters/client_channel/lb_policy_registry.h +54 -0
- data/src/core/ext/filters/client_channel/method_params.cc +178 -0
- data/src/core/ext/filters/client_channel/method_params.h +74 -0
- data/src/core/ext/filters/client_channel/parse_address.cc +192 -0
- data/src/core/ext/filters/client_channel/parse_address.h +50 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.cc +48 -0
- data/src/core/ext/filters/client_channel/proxy_mapper.h +74 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +122 -0
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +44 -0
- data/src/core/ext/filters/client_channel/resolver.cc +35 -0
- data/src/core/ext/filters/client_channel/resolver.h +134 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +493 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +53 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +351 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +593 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +74 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +59 -0
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +340 -0
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +297 -0
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +83 -0
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +214 -0
- data/src/core/ext/filters/client_channel/resolver_factory.h +71 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +178 -0
- data/src/core/ext/filters/client_channel/resolver_registry.h +83 -0
- data/src/core/ext/filters/client_channel/retry_throttle.cc +191 -0
- data/src/core/ext/filters/client_channel/retry_throttle.h +77 -0
- data/src/core/ext/filters/client_channel/subchannel.cc +815 -0
- data/src/core/ext/filters/client_channel/subchannel.h +183 -0
- data/src/core/ext/filters/client_channel/subchannel_index.cc +254 -0
- data/src/core/ext/filters/client_channel/subchannel_index.h +79 -0
- data/src/core/ext/filters/client_channel/uri_parser.cc +314 -0
- data/src/core/ext/filters/client_channel/uri_parser.h +50 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +386 -0
- data/src/core/ext/filters/deadline/deadline_filter.h +93 -0
- data/src/core/ext/filters/http/client/http_client_filter.cc +558 -0
- data/src/core/ext/filters/http/client/http_client_filter.h +31 -0
- data/src/core/ext/filters/http/client_authority_filter.cc +156 -0
- data/src/core/ext/filters/http/client_authority_filter.h +34 -0
- data/src/core/ext/filters/http/http_filters_plugin.cc +89 -0
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +499 -0
- data/src/core/ext/filters/http/message_compress/message_compress_filter.h +53 -0
- data/src/core/ext/filters/http/server/http_server_filter.cc +434 -0
- data/src/core/ext/filters/http/server/http_server_filter.h +29 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +222 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +30 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +71 -0
- data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +61 -0
- data/src/core/ext/filters/max_age/max_age_filter.cc +543 -0
- data/src/core/ext/filters/max_age/max_age_filter.h +26 -0
- data/src/core/ext/filters/message_size/message_size_filter.cc +324 -0
- data/src/core/ext/filters/message_size/message_size_filter.h +26 -0
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +208 -0
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +27 -0
- data/src/core/ext/filters/workarounds/workaround_utils.cc +53 -0
- data/src/core/ext/filters/workarounds/workaround_utils.h +39 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.cc +44 -0
- data/src/core/ext/transport/chttp2/alpn/alpn.h +36 -0
- data/src/core/ext/transport/chttp2/client/authority.cc +42 -0
- data/src/core/ext/transport/chttp2/client/authority.h +36 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +229 -0
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -0
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +110 -0
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +79 -0
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +230 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +353 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +45 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +74 -0
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +89 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +249 -0
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +56 -0
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +231 -0
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +41 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +35 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3102 -0
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +45 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +405 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +482 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +47 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +314 -0
- data/src/core/ext/transport/chttp2/transport/frame_data.h +84 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +186 -0
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +62 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +131 -0
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +45 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +112 -0
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +43 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +238 -0
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +60 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +122 -0
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +45 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +699 -0
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1680 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +109 -0
- data/src/core/ext/transport/chttp2/transport/hpack_table.cc +368 -0
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +95 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +62 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +62 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.cc +92 -0
- data/src/core/ext/transport/chttp2/transport/huffsyms.h +33 -0
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +73 -0
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +49 -0
- data/src/core/ext/transport/chttp2/transport/internal.h +799 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +745 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +216 -0
- data/src/core/ext/transport/chttp2/transport/stream_map.cc +167 -0
- data/src/core/ext/transport/chttp2/transport/stream_map.h +68 -0
- data/src/core/ext/transport/chttp2/transport/varint.cc +56 -0
- data/src/core/ext/transport/chttp2/transport/varint.h +60 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +641 -0
- data/src/core/ext/transport/inproc/inproc_plugin.cc +28 -0
- data/src/core/ext/transport/inproc/inproc_transport.cc +1240 -0
- data/src/core/ext/transport/inproc/inproc_transport.h +35 -0
- data/src/core/lib/avl/avl.cc +306 -0
- data/src/core/lib/avl/avl.h +94 -0
- data/src/core/lib/backoff/backoff.cc +78 -0
- data/src/core/lib/backoff/backoff.h +89 -0
- data/src/core/lib/channel/channel_args.cc +413 -0
- data/src/core/lib/channel/channel_args.h +127 -0
- data/src/core/lib/channel/channel_stack.cc +258 -0
- data/src/core/lib/channel/channel_stack.h +280 -0
- data/src/core/lib/channel/channel_stack_builder.cc +314 -0
- data/src/core/lib/channel/channel_stack_builder.h +160 -0
- data/src/core/lib/channel/channel_trace.cc +239 -0
- data/src/core/lib/channel/channel_trace.h +133 -0
- data/src/core/lib/channel/channel_trace_registry.cc +80 -0
- data/src/core/lib/channel/channel_trace_registry.h +43 -0
- data/src/core/lib/channel/connected_channel.cc +236 -0
- data/src/core/lib/channel/connected_channel.h +34 -0
- data/src/core/lib/channel/context.h +49 -0
- data/src/core/lib/channel/handshaker.cc +259 -0
- data/src/core/lib/channel/handshaker.h +166 -0
- data/src/core/lib/channel/handshaker_factory.cc +41 -0
- data/src/core/lib/channel/handshaker_factory.h +50 -0
- data/src/core/lib/channel/handshaker_registry.cc +97 -0
- data/src/core/lib/channel/handshaker_registry.h +48 -0
- data/src/core/lib/channel/status_util.cc +100 -0
- data/src/core/lib/channel/status_util.h +58 -0
- data/src/core/lib/compression/algorithm_metadata.h +61 -0
- data/src/core/lib/compression/compression.cc +174 -0
- data/src/core/lib/compression/compression_internal.cc +276 -0
- data/src/core/lib/compression/compression_internal.h +88 -0
- data/src/core/lib/compression/message_compress.cc +187 -0
- data/src/core/lib/compression/message_compress.h +40 -0
- data/src/core/lib/compression/stream_compression.cc +79 -0
- data/src/core/lib/compression/stream_compression.h +116 -0
- data/src/core/lib/compression/stream_compression_gzip.cc +230 -0
- data/src/core/lib/compression/stream_compression_gzip.h +28 -0
- data/src/core/lib/compression/stream_compression_identity.cc +94 -0
- data/src/core/lib/compression/stream_compression_identity.h +29 -0
- data/src/core/lib/debug/stats.cc +178 -0
- data/src/core/lib/debug/stats.h +61 -0
- data/src/core/lib/debug/stats_data.cc +682 -0
- data/src/core/lib/debug/stats_data.h +435 -0
- data/src/core/lib/debug/trace.cc +144 -0
- data/src/core/lib/debug/trace.h +104 -0
- data/src/core/lib/gpr/alloc.cc +99 -0
- data/src/core/lib/gpr/arena.cc +152 -0
- data/src/core/lib/gpr/arena.h +41 -0
- data/src/core/lib/gpr/atm.cc +35 -0
- data/src/core/lib/gpr/cpu_iphone.cc +36 -0
- data/src/core/lib/gpr/cpu_linux.cc +82 -0
- data/src/core/lib/gpr/cpu_posix.cc +81 -0
- data/src/core/lib/gpr/cpu_windows.cc +33 -0
- data/src/core/lib/gpr/env.h +43 -0
- data/src/core/lib/gpr/env_linux.cc +82 -0
- data/src/core/lib/gpr/env_posix.cc +47 -0
- data/src/core/lib/gpr/env_windows.cc +72 -0
- data/src/core/lib/gpr/fork.cc +78 -0
- data/src/core/lib/gpr/fork.h +35 -0
- data/src/core/lib/gpr/host_port.cc +98 -0
- data/src/core/lib/gpr/host_port.h +43 -0
- data/src/core/lib/gpr/log.cc +96 -0
- data/src/core/lib/gpr/log_android.cc +72 -0
- data/src/core/lib/gpr/log_linux.cc +93 -0
- data/src/core/lib/gpr/log_posix.cc +90 -0
- data/src/core/lib/gpr/log_windows.cc +97 -0
- data/src/core/lib/gpr/mpscq.cc +117 -0
- data/src/core/lib/gpr/mpscq.h +86 -0
- data/src/core/lib/gpr/murmur_hash.cc +80 -0
- data/src/core/lib/gpr/murmur_hash.h +29 -0
- data/src/core/lib/gpr/spinlock.h +46 -0
- data/src/core/lib/gpr/string.cc +319 -0
- data/src/core/lib/gpr/string.h +109 -0
- data/src/core/lib/gpr/string_posix.cc +72 -0
- data/src/core/lib/gpr/string_util_windows.cc +82 -0
- data/src/core/lib/gpr/string_windows.cc +69 -0
- data/src/core/lib/gpr/string_windows.h +32 -0
- data/src/core/lib/gpr/sync.cc +124 -0
- data/src/core/lib/gpr/sync_posix.cc +107 -0
- data/src/core/lib/gpr/sync_windows.cc +118 -0
- data/src/core/lib/gpr/time.cc +251 -0
- data/src/core/lib/gpr/time_posix.cc +167 -0
- data/src/core/lib/gpr/time_precise.cc +78 -0
- data/src/core/lib/gpr/time_precise.h +29 -0
- data/src/core/lib/gpr/time_windows.cc +98 -0
- data/src/core/lib/gpr/tls.h +68 -0
- data/src/core/lib/gpr/tls_gcc.h +52 -0
- data/src/core/lib/gpr/tls_msvc.h +52 -0
- data/src/core/lib/gpr/tls_pthread.cc +30 -0
- data/src/core/lib/gpr/tls_pthread.h +56 -0
- data/src/core/lib/gpr/tmpfile.h +32 -0
- data/src/core/lib/gpr/tmpfile_msys.cc +58 -0
- data/src/core/lib/gpr/tmpfile_posix.cc +70 -0
- data/src/core/lib/gpr/tmpfile_windows.cc +69 -0
- data/src/core/lib/gpr/useful.h +65 -0
- data/src/core/lib/gpr/wrap_memcpy.cc +42 -0
- data/src/core/lib/gprpp/abstract.h +34 -0
- data/src/core/lib/gprpp/atomic.h +30 -0
- data/src/core/lib/gprpp/atomic_with_atm.h +57 -0
- data/src/core/lib/gprpp/atomic_with_std.h +35 -0
- data/src/core/lib/gprpp/debug_location.h +52 -0
- data/src/core/lib/gprpp/inlined_vector.h +136 -0
- data/src/core/lib/gprpp/manual_constructor.h +213 -0
- data/src/core/lib/gprpp/memory.h +111 -0
- data/src/core/lib/gprpp/orphanable.h +199 -0
- data/src/core/lib/gprpp/ref_counted.h +169 -0
- data/src/core/lib/gprpp/ref_counted_ptr.h +112 -0
- data/src/core/lib/gprpp/thd.h +135 -0
- data/src/core/lib/gprpp/thd_posix.cc +209 -0
- data/src/core/lib/gprpp/thd_windows.cc +162 -0
- data/src/core/lib/http/format_request.cc +122 -0
- data/src/core/lib/http/format_request.h +34 -0
- data/src/core/lib/http/httpcli.cc +303 -0
- data/src/core/lib/http/httpcli.h +127 -0
- data/src/core/lib/http/httpcli_security_connector.cc +202 -0
- data/src/core/lib/http/parser.cc +371 -0
- data/src/core/lib/http/parser.h +113 -0
- data/src/core/lib/iomgr/block_annotate.h +57 -0
- data/src/core/lib/iomgr/call_combiner.cc +212 -0
- data/src/core/lib/iomgr/call_combiner.h +112 -0
- data/src/core/lib/iomgr/closure.h +351 -0
- data/src/core/lib/iomgr/combiner.cc +358 -0
- data/src/core/lib/iomgr/combiner.h +66 -0
- data/src/core/lib/iomgr/endpoint.cc +63 -0
- data/src/core/lib/iomgr/endpoint.h +98 -0
- data/src/core/lib/iomgr/endpoint_pair.h +34 -0
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +73 -0
- data/src/core/lib/iomgr/endpoint_pair_uv.cc +40 -0
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +87 -0
- data/src/core/lib/iomgr/error.cc +793 -0
- data/src/core/lib/iomgr/error.h +207 -0
- data/src/core/lib/iomgr/error_internal.h +63 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +1248 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.h +31 -0
- data/src/core/lib/iomgr/ev_epollex_linux.cc +1494 -0
- data/src/core/lib/iomgr/ev_epollex_linux.h +30 -0
- data/src/core/lib/iomgr/ev_epollsig_linux.cc +1735 -0
- data/src/core/lib/iomgr/ev_epollsig_linux.h +35 -0
- data/src/core/lib/iomgr/ev_poll_posix.cc +1758 -0
- data/src/core/lib/iomgr/ev_poll_posix.h +29 -0
- data/src/core/lib/iomgr/ev_posix.cc +330 -0
- data/src/core/lib/iomgr/ev_posix.h +145 -0
- data/src/core/lib/iomgr/ev_windows.cc +30 -0
- data/src/core/lib/iomgr/exec_ctx.cc +147 -0
- data/src/core/lib/iomgr/exec_ctx.h +210 -0
- data/src/core/lib/iomgr/executor.cc +301 -0
- data/src/core/lib/iomgr/executor.h +50 -0
- data/src/core/lib/iomgr/fork_posix.cc +89 -0
- data/src/core/lib/iomgr/fork_windows.cc +41 -0
- data/src/core/lib/iomgr/gethostname.h +26 -0
- data/src/core/lib/iomgr/gethostname_fallback.cc +30 -0
- data/src/core/lib/iomgr/gethostname_host_name_max.cc +40 -0
- data/src/core/lib/iomgr/gethostname_sysconf.cc +40 -0
- data/src/core/lib/iomgr/iocp_windows.cc +152 -0
- data/src/core/lib/iomgr/iocp_windows.h +48 -0
- data/src/core/lib/iomgr/iomgr.cc +178 -0
- data/src/core/lib/iomgr/iomgr.h +36 -0
- data/src/core/lib/iomgr/iomgr_custom.cc +63 -0
- data/src/core/lib/iomgr/iomgr_custom.h +47 -0
- data/src/core/lib/iomgr/iomgr_internal.cc +43 -0
- data/src/core/lib/iomgr/iomgr_internal.h +57 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +67 -0
- data/src/core/lib/iomgr/iomgr_posix.h +26 -0
- data/src/core/lib/iomgr/iomgr_uv.cc +40 -0
- data/src/core/lib/iomgr/iomgr_windows.cc +87 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.cc +104 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.h +36 -0
- data/src/core/lib/iomgr/load_file.cc +80 -0
- data/src/core/lib/iomgr/load_file.h +35 -0
- data/src/core/lib/iomgr/lockfree_event.cc +250 -0
- data/src/core/lib/iomgr/lockfree_event.h +72 -0
- data/src/core/lib/iomgr/nameser.h +106 -0
- data/src/core/lib/iomgr/network_status_tracker.cc +36 -0
- data/src/core/lib/iomgr/network_status_tracker.h +32 -0
- data/src/core/lib/iomgr/polling_entity.cc +87 -0
- data/src/core/lib/iomgr/polling_entity.h +68 -0
- data/src/core/lib/iomgr/pollset.cc +56 -0
- data/src/core/lib/iomgr/pollset.h +99 -0
- data/src/core/lib/iomgr/pollset_custom.cc +106 -0
- data/src/core/lib/iomgr/pollset_custom.h +35 -0
- data/src/core/lib/iomgr/pollset_set.cc +55 -0
- data/src/core/lib/iomgr/pollset_set.h +55 -0
- data/src/core/lib/iomgr/pollset_set_custom.cc +48 -0
- data/src/core/lib/iomgr/pollset_set_custom.h +26 -0
- data/src/core/lib/iomgr/pollset_set_windows.cc +51 -0
- data/src/core/lib/iomgr/pollset_set_windows.h +26 -0
- data/src/core/lib/iomgr/pollset_uv.cc +93 -0
- data/src/core/lib/iomgr/pollset_windows.cc +229 -0
- data/src/core/lib/iomgr/pollset_windows.h +70 -0
- data/src/core/lib/iomgr/port.h +147 -0
- data/src/core/lib/iomgr/resolve_address.cc +50 -0
- data/src/core/lib/iomgr/resolve_address.h +83 -0
- data/src/core/lib/iomgr/resolve_address_custom.cc +187 -0
- data/src/core/lib/iomgr/resolve_address_custom.h +43 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +180 -0
- data/src/core/lib/iomgr/resolve_address_windows.cc +165 -0
- data/src/core/lib/iomgr/resource_quota.cc +871 -0
- data/src/core/lib/iomgr/resource_quota.h +142 -0
- data/src/core/lib/iomgr/sockaddr.h +32 -0
- data/src/core/lib/iomgr/sockaddr_custom.h +54 -0
- data/src/core/lib/iomgr/sockaddr_posix.h +55 -0
- data/src/core/lib/iomgr/sockaddr_utils.cc +298 -0
- data/src/core/lib/iomgr/sockaddr_utils.h +84 -0
- data/src/core/lib/iomgr/sockaddr_windows.h +55 -0
- data/src/core/lib/iomgr/socket_factory_posix.cc +94 -0
- data/src/core/lib/iomgr/socket_factory_posix.h +69 -0
- data/src/core/lib/iomgr/socket_mutator.cc +83 -0
- data/src/core/lib/iomgr/socket_mutator.h +61 -0
- data/src/core/lib/iomgr/socket_utils.h +38 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +327 -0
- data/src/core/lib/iomgr/socket_utils_linux.cc +43 -0
- data/src/core/lib/iomgr/socket_utils_posix.cc +59 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +134 -0
- data/src/core/lib/iomgr/socket_utils_uv.cc +45 -0
- data/src/core/lib/iomgr/socket_utils_windows.cc +43 -0
- data/src/core/lib/iomgr/socket_windows.cc +151 -0
- data/src/core/lib/iomgr/socket_windows.h +113 -0
- data/src/core/lib/iomgr/sys_epoll_wrapper.h +30 -0
- data/src/core/lib/iomgr/tcp_client.cc +36 -0
- data/src/core/lib/iomgr/tcp_client.h +52 -0
- data/src/core/lib/iomgr/tcp_client_custom.cc +151 -0
- data/src/core/lib/iomgr/tcp_client_posix.cc +359 -0
- data/src/core/lib/iomgr/tcp_client_posix.h +68 -0
- data/src/core/lib/iomgr/tcp_client_windows.cc +231 -0
- data/src/core/lib/iomgr/tcp_custom.cc +365 -0
- data/src/core/lib/iomgr/tcp_custom.h +81 -0
- data/src/core/lib/iomgr/tcp_posix.cc +814 -0
- data/src/core/lib/iomgr/tcp_posix.h +57 -0
- data/src/core/lib/iomgr/tcp_server.cc +73 -0
- data/src/core/lib/iomgr/tcp_server.h +122 -0
- data/src/core/lib/iomgr/tcp_server_custom.cc +472 -0
- data/src/core/lib/iomgr/tcp_server_posix.cc +582 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +122 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +208 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +184 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +36 -0
- data/src/core/lib/iomgr/tcp_server_windows.cc +559 -0
- data/src/core/lib/iomgr/tcp_uv.cc +417 -0
- data/src/core/lib/iomgr/tcp_windows.cc +455 -0
- data/src/core/lib/iomgr/tcp_windows.h +51 -0
- data/src/core/lib/iomgr/time_averaged_stats.cc +64 -0
- data/src/core/lib/iomgr/time_averaged_stats.h +73 -0
- data/src/core/lib/iomgr/timer.cc +45 -0
- data/src/core/lib/iomgr/timer.h +125 -0
- data/src/core/lib/iomgr/timer_custom.cc +93 -0
- data/src/core/lib/iomgr/timer_custom.h +43 -0
- data/src/core/lib/iomgr/timer_generic.cc +663 -0
- data/src/core/lib/iomgr/timer_heap.cc +135 -0
- data/src/core/lib/iomgr/timer_heap.h +44 -0
- data/src/core/lib/iomgr/timer_manager.cc +347 -0
- data/src/core/lib/iomgr/timer_manager.h +39 -0
- data/src/core/lib/iomgr/timer_uv.cc +63 -0
- data/src/core/lib/iomgr/udp_server.cc +692 -0
- data/src/core/lib/iomgr/udp_server.h +103 -0
- data/src/core/lib/iomgr/unix_sockets_posix.cc +104 -0
- data/src/core/lib/iomgr/unix_sockets_posix.h +43 -0
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +49 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.cc +107 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +69 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +83 -0
- data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +38 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +100 -0
- data/src/core/lib/iomgr/wakeup_fd_pipe.h +28 -0
- data/src/core/lib/iomgr/wakeup_fd_posix.cc +87 -0
- data/src/core/lib/iomgr/wakeup_fd_posix.h +96 -0
- data/src/core/lib/json/json.cc +86 -0
- data/src/core/lib/json/json.h +94 -0
- data/src/core/lib/json/json_common.h +34 -0
- data/src/core/lib/json/json_reader.cc +663 -0
- data/src/core/lib/json/json_reader.h +146 -0
- data/src/core/lib/json/json_string.cc +367 -0
- data/src/core/lib/json/json_writer.cc +245 -0
- data/src/core/lib/json/json_writer.h +84 -0
- data/src/core/lib/profiling/basic_timers.cc +286 -0
- data/src/core/lib/profiling/stap_timers.cc +50 -0
- data/src/core/lib/profiling/timers.h +94 -0
- data/src/core/lib/security/context/security_context.cc +348 -0
- data/src/core/lib/security/context/security_context.h +115 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.cc +119 -0
- data/src/core/lib/security/credentials/alts/alts_credentials.h +102 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +72 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment.h +57 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +67 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +33 -0
- data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +114 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +126 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +46 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +112 -0
- data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +58 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +269 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.h +59 -0
- data/src/core/lib/security/credentials/credentials.cc +286 -0
- data/src/core/lib/security/credentials/credentials.h +246 -0
- data/src/core/lib/security/credentials/credentials_metadata.cc +62 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +136 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.h +64 -0
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +41 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +322 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +45 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +86 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.h +31 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +314 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +75 -0
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +190 -0
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +49 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +934 -0
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +123 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +532 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +106 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +271 -0
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +46 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +349 -0
- data/src/core/lib/security/credentials/ssl/ssl_credentials.h +54 -0
- data/src/core/lib/security/security_connector/alts_security_connector.cc +287 -0
- data/src/core/lib/security/security_connector/alts_security_connector.h +69 -0
- data/src/core/lib/security/security_connector/security_connector.cc +1200 -0
- data/src/core/lib/security/security_connector/security_connector.h +283 -0
- data/src/core/lib/security/transport/auth_filters.h +37 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +418 -0
- data/src/core/lib/security/transport/secure_endpoint.cc +429 -0
- data/src/core/lib/security/transport/secure_endpoint.h +41 -0
- data/src/core/lib/security/transport/security_handshaker.cc +526 -0
- data/src/core/lib/security/transport/security_handshaker.h +34 -0
- data/src/core/lib/security/transport/server_auth_filter.cc +269 -0
- data/src/core/lib/security/transport/target_authority_table.cc +75 -0
- data/src/core/lib/security/transport/target_authority_table.h +40 -0
- data/src/core/lib/security/transport/tsi_error.cc +29 -0
- data/src/core/lib/security/transport/tsi_error.h +29 -0
- data/src/core/lib/security/util/json_util.cc +48 -0
- data/src/core/lib/security/util/json_util.h +42 -0
- data/src/core/lib/slice/b64.cc +240 -0
- data/src/core/lib/slice/b64.h +51 -0
- data/src/core/lib/slice/percent_encoding.cc +169 -0
- data/src/core/lib/slice/percent_encoding.h +65 -0
- data/src/core/lib/slice/slice.cc +489 -0
- data/src/core/lib/slice/slice_buffer.cc +359 -0
- data/src/core/lib/slice/slice_hash_table.h +201 -0
- data/src/core/lib/slice/slice_intern.cc +332 -0
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.cc +118 -0
- data/src/core/lib/slice/slice_string_helpers.h +47 -0
- data/src/core/lib/slice/slice_weak_hash_table.h +105 -0
- data/src/core/lib/surface/api_trace.cc +24 -0
- data/src/core/lib/surface/api_trace.h +52 -0
- data/src/core/lib/surface/byte_buffer.cc +92 -0
- data/src/core/lib/surface/byte_buffer_reader.cc +129 -0
- data/src/core/lib/surface/call.cc +2002 -0
- data/src/core/lib/surface/call.h +109 -0
- data/src/core/lib/surface/call_details.cc +42 -0
- data/src/core/lib/surface/call_log_batch.cc +120 -0
- data/src/core/lib/surface/call_test_only.h +43 -0
- data/src/core/lib/surface/channel.cc +450 -0
- data/src/core/lib/surface/channel.h +83 -0
- data/src/core/lib/surface/channel_init.cc +109 -0
- data/src/core/lib/surface/channel_init.h +73 -0
- data/src/core/lib/surface/channel_ping.cc +65 -0
- data/src/core/lib/surface/channel_stack_type.cc +58 -0
- data/src/core/lib/surface/channel_stack_type.h +47 -0
- data/src/core/lib/surface/completion_queue.cc +1262 -0
- data/src/core/lib/surface/completion_queue.h +93 -0
- data/src/core/lib/surface/completion_queue_factory.cc +79 -0
- data/src/core/lib/surface/completion_queue_factory.h +38 -0
- data/src/core/lib/surface/event_string.cc +68 -0
- data/src/core/lib/surface/event_string.h +29 -0
- data/src/core/lib/surface/init.cc +196 -0
- data/src/core/lib/surface/init.h +27 -0
- data/src/core/lib/surface/init_secure.cc +81 -0
- data/src/core/lib/surface/lame_client.cc +180 -0
- data/src/core/lib/surface/lame_client.h +28 -0
- data/src/core/lib/surface/metadata_array.cc +36 -0
- data/src/core/lib/surface/server.cc +1445 -0
- data/src/core/lib/surface/server.h +58 -0
- data/src/core/lib/surface/validate_metadata.cc +95 -0
- data/src/core/lib/surface/validate_metadata.h +30 -0
- data/src/core/lib/surface/version.cc +28 -0
- data/src/core/lib/transport/bdp_estimator.cc +87 -0
- data/src/core/lib/transport/bdp_estimator.h +94 -0
- data/src/core/lib/transport/byte_stream.cc +160 -0
- data/src/core/lib/transport/byte_stream.h +164 -0
- data/src/core/lib/transport/connectivity_state.cc +196 -0
- data/src/core/lib/transport/connectivity_state.h +87 -0
- data/src/core/lib/transport/error_utils.cc +118 -0
- data/src/core/lib/transport/error_utils.h +46 -0
- data/src/core/lib/transport/http2_errors.h +41 -0
- data/src/core/lib/transport/metadata.cc +539 -0
- data/src/core/lib/transport/metadata.h +165 -0
- data/src/core/lib/transport/metadata_batch.cc +329 -0
- data/src/core/lib/transport/metadata_batch.h +150 -0
- data/src/core/lib/transport/pid_controller.cc +51 -0
- data/src/core/lib/transport/pid_controller.h +116 -0
- data/src/core/lib/transport/service_config.cc +106 -0
- data/src/core/lib/transport/service_config.h +249 -0
- data/src/core/lib/transport/static_metadata.cc +601 -0
- data/src/core/lib/transport/static_metadata.h +603 -0
- data/src/core/lib/transport/status_conversion.cc +100 -0
- data/src/core/lib/transport/status_conversion.h +38 -0
- data/src/core/lib/transport/status_metadata.cc +54 -0
- data/src/core/lib/transport/status_metadata.h +30 -0
- data/src/core/lib/transport/timeout_encoding.cc +144 -0
- data/src/core/lib/transport/timeout_encoding.h +37 -0
- data/src/core/lib/transport/transport.cc +278 -0
- data/src/core/lib/transport/transport.h +378 -0
- data/src/core/lib/transport/transport_impl.h +71 -0
- data/src/core/lib/transport/transport_op_string.cc +214 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +97 -0
- data/src/core/tsi/alts/crypt/aes_gcm.cc +687 -0
- data/src/core/tsi/alts/crypt/gsec.cc +189 -0
- data/src/core/tsi/alts/crypt/gsec.h +454 -0
- data/src/core/tsi/alts/frame_protector/alts_counter.cc +118 -0
- data/src/core/tsi/alts/frame_protector/alts_counter.h +98 -0
- data/src/core/tsi/alts/frame_protector/alts_crypter.cc +66 -0
- data/src/core/tsi/alts/frame_protector/alts_crypter.h +255 -0
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +407 -0
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +55 -0
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +114 -0
- data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +114 -0
- data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +105 -0
- data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +103 -0
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +218 -0
- data/src/core/tsi/alts/frame_protector/frame_handler.h +236 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +316 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +137 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc +520 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h +323 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc +143 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +149 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_event.cc +73 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_event.h +93 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +483 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +83 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +52 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +58 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +52 -0
- data/src/core/tsi/alts/handshaker/altscontext.pb.c +48 -0
- data/src/core/tsi/alts/handshaker/altscontext.pb.h +64 -0
- data/src/core/tsi/alts/handshaker/handshaker.pb.c +123 -0
- data/src/core/tsi/alts/handshaker/handshaker.pb.h +255 -0
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +50 -0
- data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +78 -0
- data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +196 -0
- data/src/core/tsi/alts/handshaker/transport_security_common_api.h +163 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +180 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +52 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +144 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +49 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +91 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +174 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +100 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +476 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +199 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +296 -0
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +52 -0
- data/src/core/tsi/alts_transport_security.cc +63 -0
- data/src/core/tsi/alts_transport_security.h +47 -0
- data/src/core/tsi/fake_transport_security.cc +787 -0
- data/src/core/tsi/fake_transport_security.h +45 -0
- data/src/core/tsi/ssl/session_cache/ssl_session.h +73 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +58 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +211 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +93 -0
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +76 -0
- data/src/core/tsi/ssl_transport_security.cc +1831 -0
- data/src/core/tsi/ssl_transport_security.h +314 -0
- data/src/core/tsi/ssl_types.h +42 -0
- data/src/core/tsi/transport_security.cc +326 -0
- data/src/core/tsi/transport_security.h +127 -0
- data/src/core/tsi/transport_security_adapter.cc +235 -0
- data/src/core/tsi/transport_security_adapter.h +41 -0
- data/src/core/tsi/transport_security_grpc.cc +66 -0
- data/src/core/tsi/transport_security_grpc.h +74 -0
- data/src/core/tsi/transport_security_interface.h +454 -0
- data/src/ruby/bin/apis/google/protobuf/empty.rb +29 -0
- data/src/ruby/bin/apis/pubsub_demo.rb +241 -0
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +159 -0
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +88 -0
- data/src/ruby/bin/math_client.rb +132 -0
- data/src/ruby/bin/math_pb.rb +32 -0
- data/src/ruby/bin/math_server.rb +191 -0
- data/src/ruby/bin/math_services_pb.rb +51 -0
- data/src/ruby/bin/noproto_client.rb +93 -0
- data/src/ruby/bin/noproto_server.rb +97 -0
- data/src/ruby/ext/grpc/extconf.rb +118 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.c +64 -0
- data/src/ruby/ext/grpc/rb_byte_buffer.h +35 -0
- data/src/ruby/ext/grpc/rb_call.c +1041 -0
- data/src/ruby/ext/grpc/rb_call.h +53 -0
- data/src/ruby/ext/grpc/rb_call_credentials.c +290 -0
- data/src/ruby/ext/grpc/rb_call_credentials.h +31 -0
- data/src/ruby/ext/grpc/rb_channel.c +828 -0
- data/src/ruby/ext/grpc/rb_channel.h +34 -0
- data/src/ruby/ext/grpc/rb_channel_args.c +155 -0
- data/src/ruby/ext/grpc/rb_channel_args.h +38 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.c +263 -0
- data/src/ruby/ext/grpc/rb_channel_credentials.h +32 -0
- data/src/ruby/ext/grpc/rb_completion_queue.c +100 -0
- data/src/ruby/ext/grpc/rb_completion_queue.h +36 -0
- data/src/ruby/ext/grpc/rb_compression_options.c +468 -0
- data/src/ruby/ext/grpc/rb_compression_options.h +29 -0
- data/src/ruby/ext/grpc/rb_event_thread.c +141 -0
- data/src/ruby/ext/grpc/rb_event_thread.h +21 -0
- data/src/ruby/ext/grpc/rb_grpc.c +340 -0
- data/src/ruby/ext/grpc/rb_grpc.h +72 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +507 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +766 -0
- data/src/ruby/ext/grpc/rb_loader.c +57 -0
- data/src/ruby/ext/grpc/rb_loader.h +25 -0
- data/src/ruby/ext/grpc/rb_server.c +366 -0
- data/src/ruby/ext/grpc/rb_server.h +32 -0
- data/src/ruby/ext/grpc/rb_server_credentials.c +243 -0
- data/src/ruby/ext/grpc/rb_server_credentials.h +32 -0
- data/src/ruby/lib/grpc.rb +35 -0
- data/src/ruby/lib/grpc/core/time_consts.rb +56 -0
- data/src/ruby/lib/grpc/errors.rb +201 -0
- data/src/ruby/lib/grpc/generic/active_call.rb +674 -0
- data/src/ruby/lib/grpc/generic/bidi_call.rb +233 -0
- data/src/ruby/lib/grpc/generic/client_stub.rb +501 -0
- data/src/ruby/lib/grpc/generic/interceptor_registry.rb +53 -0
- data/src/ruby/lib/grpc/generic/interceptors.rb +186 -0
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +204 -0
- data/src/ruby/lib/grpc/generic/rpc_server.rb +490 -0
- data/src/ruby/lib/grpc/generic/service.rb +210 -0
- data/src/ruby/lib/grpc/google_rpc_status_utils.rb +35 -0
- data/src/ruby/lib/grpc/grpc.rb +24 -0
- data/src/ruby/lib/grpc/logconfig.rb +44 -0
- data/src/ruby/lib/grpc/notifier.rb +45 -0
- data/src/ruby/lib/grpc/version.rb +18 -0
- data/src/ruby/pb/README.md +42 -0
- data/src/ruby/pb/generate_proto_ruby.sh +43 -0
- data/src/ruby/pb/grpc/health/checker.rb +76 -0
- data/src/ruby/pb/grpc/health/v1/health_pb.rb +28 -0
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +41 -0
- data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +44 -0
- data/src/ruby/pb/grpc/testing/metrics_pb.rb +28 -0
- data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +49 -0
- data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +15 -0
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +82 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +14 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +102 -0
- data/src/ruby/pb/test/client.rb +764 -0
- data/src/ruby/pb/test/server.rb +252 -0
- data/src/ruby/spec/call_credentials_spec.rb +42 -0
- data/src/ruby/spec/call_spec.rb +180 -0
- data/src/ruby/spec/channel_connection_spec.rb +126 -0
- data/src/ruby/spec/channel_credentials_spec.rb +82 -0
- data/src/ruby/spec/channel_spec.rb +190 -0
- data/src/ruby/spec/client_auth_spec.rb +137 -0
- data/src/ruby/spec/client_server_spec.rb +664 -0
- data/src/ruby/spec/compression_options_spec.rb +149 -0
- data/src/ruby/spec/error_sanity_spec.rb +49 -0
- data/src/ruby/spec/generic/active_call_spec.rb +672 -0
- data/src/ruby/spec/generic/client_interceptors_spec.rb +153 -0
- data/src/ruby/spec/generic/client_stub_spec.rb +1067 -0
- data/src/ruby/spec/generic/interceptor_registry_spec.rb +65 -0
- data/src/ruby/spec/generic/rpc_desc_spec.rb +374 -0
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +127 -0
- data/src/ruby/spec/generic/rpc_server_spec.rb +726 -0
- data/src/ruby/spec/generic/server_interceptors_spec.rb +218 -0
- data/src/ruby/spec/generic/service_spec.rb +261 -0
- data/src/ruby/spec/google_rpc_status_utils_spec.rb +293 -0
- data/src/ruby/spec/pb/duplicate/codegen_spec.rb +56 -0
- data/src/ruby/spec/pb/health/checker_spec.rb +236 -0
- data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +54 -0
- data/src/ruby/spec/pb/package_with_underscore/data.proto +23 -0
- data/src/ruby/spec/pb/package_with_underscore/service.proto +23 -0
- data/src/ruby/spec/server_credentials_spec.rb +79 -0
- data/src/ruby/spec/server_spec.rb +209 -0
- data/src/ruby/spec/spec_helper.rb +60 -0
- data/src/ruby/spec/support/helpers.rb +107 -0
- data/src/ruby/spec/support/services.rb +147 -0
- data/src/ruby/spec/testdata/README +1 -0
- data/src/ruby/spec/testdata/ca.pem +15 -0
- data/src/ruby/spec/testdata/client.key +16 -0
- data/src/ruby/spec/testdata/client.pem +14 -0
- data/src/ruby/spec/testdata/server1.key +16 -0
- data/src/ruby/spec/testdata/server1.pem +16 -0
- data/src/ruby/spec/time_consts_spec.rb +74 -0
- data/third_party/address_sorting/address_sorting.c +369 -0
- data/third_party/address_sorting/address_sorting_internal.h +70 -0
- data/third_party/address_sorting/address_sorting_posix.c +97 -0
- data/third_party/address_sorting/address_sorting_windows.c +55 -0
- data/third_party/address_sorting/include/address_sorting/address_sorting.h +110 -0
- data/third_party/boringssl/crypto/asn1/a_bitstr.c +271 -0
- data/third_party/boringssl/crypto/asn1/a_bool.c +110 -0
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +297 -0
- data/third_party/boringssl/crypto/asn1/a_dup.c +111 -0
- data/third_party/boringssl/crypto/asn1/a_enum.c +195 -0
- data/third_party/boringssl/crypto/asn1/a_gentm.c +261 -0
- data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +150 -0
- data/third_party/boringssl/crypto/asn1/a_int.c +474 -0
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +409 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +275 -0
- data/third_party/boringssl/crypto/asn1/a_octet.c +77 -0
- data/third_party/boringssl/crypto/asn1/a_print.c +93 -0
- data/third_party/boringssl/crypto/asn1/a_strnid.c +312 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +213 -0
- data/third_party/boringssl/crypto/asn1/a_type.c +151 -0
- data/third_party/boringssl/crypto/asn1/a_utctm.c +303 -0
- data/third_party/boringssl/crypto/asn1/a_utf8.c +234 -0
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +442 -0
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +101 -0
- data/third_party/boringssl/crypto/asn1/asn1_par.c +80 -0
- data/third_party/boringssl/crypto/asn1/asn_pack.c +105 -0
- data/third_party/boringssl/crypto/asn1/f_enum.c +93 -0
- data/third_party/boringssl/crypto/asn1/f_int.c +97 -0
- data/third_party/boringssl/crypto/asn1/f_string.c +91 -0
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +1223 -0
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +662 -0
- data/third_party/boringssl/crypto/asn1/tasn_fre.c +244 -0
- data/third_party/boringssl/crypto/asn1/tasn_new.c +387 -0
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +131 -0
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +280 -0
- data/third_party/boringssl/crypto/asn1/time_support.c +206 -0
- data/third_party/boringssl/crypto/base64/base64.c +466 -0
- data/third_party/boringssl/crypto/bio/bio.c +636 -0
- data/third_party/boringssl/crypto/bio/bio_mem.c +330 -0
- data/third_party/boringssl/crypto/bio/connect.c +542 -0
- data/third_party/boringssl/crypto/bio/fd.c +275 -0
- data/third_party/boringssl/crypto/bio/file.c +313 -0
- data/third_party/boringssl/crypto/bio/hexdump.c +192 -0
- data/third_party/boringssl/crypto/bio/internal.h +111 -0
- data/third_party/boringssl/crypto/bio/pair.c +489 -0
- data/third_party/boringssl/crypto/bio/printf.c +115 -0
- data/third_party/boringssl/crypto/bio/socket.c +202 -0
- data/third_party/boringssl/crypto/bio/socket_helper.c +114 -0
- data/third_party/boringssl/crypto/bn_extra/bn_asn1.c +64 -0
- data/third_party/boringssl/crypto/bn_extra/convert.c +465 -0
- data/third_party/boringssl/crypto/buf/buf.c +231 -0
- data/third_party/boringssl/crypto/bytestring/asn1_compat.c +52 -0
- data/third_party/boringssl/crypto/bytestring/ber.c +264 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +568 -0
- data/third_party/boringssl/crypto/bytestring/cbs.c +487 -0
- data/third_party/boringssl/crypto/bytestring/internal.h +75 -0
- data/third_party/boringssl/crypto/chacha/chacha.c +167 -0
- data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +114 -0
- data/third_party/boringssl/crypto/cipher_extra/derive_key.c +152 -0
- data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +281 -0
- data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +867 -0
- data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +326 -0
- data/third_party/boringssl/crypto/cipher_extra/e_null.c +85 -0
- data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +460 -0
- data/third_party/boringssl/crypto/cipher_extra/e_rc4.c +87 -0
- data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +460 -0
- data/third_party/boringssl/crypto/cipher_extra/e_tls.c +681 -0
- data/third_party/boringssl/crypto/cipher_extra/internal.h +128 -0
- data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +482 -0
- data/third_party/boringssl/crypto/cmac/cmac.c +241 -0
- data/third_party/boringssl/crypto/conf/conf.c +803 -0
- data/third_party/boringssl/crypto/conf/conf_def.h +127 -0
- data/third_party/boringssl/crypto/conf/internal.h +31 -0
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +363 -0
- data/third_party/boringssl/crypto/cpu-arm.c +38 -0
- data/third_party/boringssl/crypto/cpu-intel.c +288 -0
- data/third_party/boringssl/crypto/cpu-ppc64le.c +38 -0
- data/third_party/boringssl/crypto/crypto.c +198 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +539 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +247 -0
- data/third_party/boringssl/crypto/dh/check.c +217 -0
- data/third_party/boringssl/crypto/dh/dh.c +519 -0
- data/third_party/boringssl/crypto/dh/dh_asn1.c +160 -0
- data/third_party/boringssl/crypto/dh/params.c +93 -0
- data/third_party/boringssl/crypto/digest_extra/digest_extra.c +240 -0
- data/third_party/boringssl/crypto/dsa/dsa.c +984 -0
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +339 -0
- data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +563 -0
- data/third_party/boringssl/crypto/ecdh/ecdh.c +161 -0
- data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +275 -0
- data/third_party/boringssl/crypto/engine/engine.c +98 -0
- data/third_party/boringssl/crypto/err/err.c +847 -0
- data/third_party/boringssl/crypto/err/internal.h +58 -0
- data/third_party/boringssl/crypto/evp/digestsign.c +231 -0
- data/third_party/boringssl/crypto/evp/evp.c +362 -0
- data/third_party/boringssl/crypto/evp/evp_asn1.c +337 -0
- data/third_party/boringssl/crypto/evp/evp_ctx.c +446 -0
- data/third_party/boringssl/crypto/evp/internal.h +252 -0
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +268 -0
- data/third_party/boringssl/crypto/evp/p_ec.c +239 -0
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +256 -0
- data/third_party/boringssl/crypto/evp/p_ed25519.c +71 -0
- data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +190 -0
- data/third_party/boringssl/crypto/evp/p_rsa.c +634 -0
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +189 -0
- data/third_party/boringssl/crypto/evp/pbkdf.c +146 -0
- data/third_party/boringssl/crypto/evp/print.c +489 -0
- data/third_party/boringssl/crypto/evp/scrypt.c +209 -0
- data/third_party/boringssl/crypto/evp/sign.c +151 -0
- data/third_party/boringssl/crypto/ex_data.c +261 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +1100 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +100 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +138 -0
- data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +112 -0
- data/third_party/boringssl/crypto/fipsmodule/bcm.c +679 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/add.c +371 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +540 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +370 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +269 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +254 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +303 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/div.c +733 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +1390 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +627 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +710 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +413 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +146 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +483 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +207 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +902 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +894 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/random.c +299 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +254 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +53 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +305 -0
- data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +502 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/aead.c +284 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +615 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +1437 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +233 -0
- data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +129 -0
- data/third_party/boringssl/crypto/fipsmodule/delocate.h +88 -0
- data/third_party/boringssl/crypto/fipsmodule/des/des.c +785 -0
- data/third_party/boringssl/crypto/fipsmodule/des/internal.h +238 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +256 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/digests.c +280 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/internal.h +112 -0
- data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +268 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +943 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +517 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +277 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +316 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +404 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +1131 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +1674 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9543 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +456 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +113 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +1052 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/util-64.c +109 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +474 -0
- data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +442 -0
- data/third_party/boringssl/crypto/fipsmodule/hmac/hmac.c +228 -0
- data/third_party/boringssl/crypto/fipsmodule/is_fips.c +27 -0
- data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +254 -0
- data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +298 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +211 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +234 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +220 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +1063 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +384 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +95 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/polyval.c +91 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +200 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +92 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +358 -0
- data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +302 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +263 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +131 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +692 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +857 -0
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +1051 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha1-altivec.c +361 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +375 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +337 -0
- data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +608 -0
- data/third_party/boringssl/crypto/hkdf/hkdf.c +112 -0
- data/third_party/boringssl/crypto/internal.h +676 -0
- data/third_party/boringssl/crypto/lhash/lhash.c +336 -0
- data/third_party/boringssl/crypto/mem.c +237 -0
- data/third_party/boringssl/crypto/obj/obj.c +621 -0
- data/third_party/boringssl/crypto/obj/obj_dat.h +6244 -0
- data/third_party/boringssl/crypto/obj/obj_xref.c +122 -0
- data/third_party/boringssl/crypto/pem/pem_all.c +262 -0
- data/third_party/boringssl/crypto/pem/pem_info.c +379 -0
- data/third_party/boringssl/crypto/pem/pem_lib.c +776 -0
- data/third_party/boringssl/crypto/pem/pem_oth.c +88 -0
- data/third_party/boringssl/crypto/pem/pem_pk8.c +258 -0
- data/third_party/boringssl/crypto/pem/pem_pkey.c +227 -0
- data/third_party/boringssl/crypto/pem/pem_x509.c +65 -0
- data/third_party/boringssl/crypto/pem/pem_xaux.c +65 -0
- data/third_party/boringssl/crypto/pkcs7/internal.h +49 -0
- data/third_party/boringssl/crypto/pkcs7/pkcs7.c +166 -0
- data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +233 -0
- data/third_party/boringssl/crypto/pkcs8/internal.h +120 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +307 -0
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +513 -0
- data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +789 -0
- data/third_party/boringssl/crypto/poly1305/internal.h +41 -0
- data/third_party/boringssl/crypto/poly1305/poly1305.c +318 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +304 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +839 -0
- data/third_party/boringssl/crypto/pool/internal.h +45 -0
- data/third_party/boringssl/crypto/pool/pool.c +200 -0
- data/third_party/boringssl/crypto/rand_extra/deterministic.c +48 -0
- data/third_party/boringssl/crypto/rand_extra/forkunsafe.c +46 -0
- data/third_party/boringssl/crypto/rand_extra/fuchsia.c +43 -0
- data/third_party/boringssl/crypto/rand_extra/rand_extra.c +70 -0
- data/third_party/boringssl/crypto/rand_extra/windows.c +53 -0
- data/third_party/boringssl/crypto/rc4/rc4.c +98 -0
- data/third_party/boringssl/crypto/refcount_c11.c +67 -0
- data/third_party/boringssl/crypto/refcount_lock.c +53 -0
- data/third_party/boringssl/crypto/rsa_extra/rsa_asn1.c +325 -0
- data/third_party/boringssl/crypto/stack/stack.c +380 -0
- data/third_party/boringssl/crypto/thread.c +110 -0
- data/third_party/boringssl/crypto/thread_none.c +59 -0
- data/third_party/boringssl/crypto/thread_pthread.c +176 -0
- data/third_party/boringssl/crypto/thread_win.c +237 -0
- data/third_party/boringssl/crypto/x509/a_digest.c +96 -0
- data/third_party/boringssl/crypto/x509/a_sign.c +128 -0
- data/third_party/boringssl/crypto/x509/a_strex.c +633 -0
- data/third_party/boringssl/crypto/x509/a_verify.c +115 -0
- data/third_party/boringssl/crypto/x509/algorithm.c +153 -0
- data/third_party/boringssl/crypto/x509/asn1_gen.c +841 -0
- data/third_party/boringssl/crypto/x509/by_dir.c +451 -0
- data/third_party/boringssl/crypto/x509/by_file.c +274 -0
- data/third_party/boringssl/crypto/x509/charmap.h +15 -0
- data/third_party/boringssl/crypto/x509/i2d_pr.c +83 -0
- 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_crl.c +128 -0
- data/third_party/boringssl/crypto/x509/t_req.c +246 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +547 -0
- data/third_party/boringssl/crypto/x509/t_x509a.c +111 -0
- data/third_party/boringssl/crypto/x509/vpm_int.h +70 -0
- data/third_party/boringssl/crypto/x509/x509.c +157 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +381 -0
- data/third_party/boringssl/crypto/x509/x509_cmp.c +477 -0
- data/third_party/boringssl/crypto/x509/x509_d2.c +106 -0
- data/third_party/boringssl/crypto/x509/x509_def.c +103 -0
- data/third_party/boringssl/crypto/x509/x509_ext.c +206 -0
- data/third_party/boringssl/crypto/x509/x509_lu.c +725 -0
- data/third_party/boringssl/crypto/x509/x509_obj.c +198 -0
- data/third_party/boringssl/crypto/x509/x509_r2x.c +117 -0
- data/third_party/boringssl/crypto/x509/x509_req.c +322 -0
- data/third_party/boringssl/crypto/x509/x509_set.c +164 -0
- data/third_party/boringssl/crypto/x509/x509_trs.c +326 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +205 -0
- data/third_party/boringssl/crypto/x509/x509_v3.c +278 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +2472 -0
- data/third_party/boringssl/crypto/x509/x509_vpm.c +648 -0
- data/third_party/boringssl/crypto/x509/x509cset.c +170 -0
- data/third_party/boringssl/crypto/x509/x509name.c +389 -0
- data/third_party/boringssl/crypto/x509/x509rset.c +81 -0
- data/third_party/boringssl/crypto/x509/x509spki.c +137 -0
- data/third_party/boringssl/crypto/x509/x_algor.c +151 -0
- data/third_party/boringssl/crypto/x509/x_all.c +501 -0
- data/third_party/boringssl/crypto/x509/x_attrib.c +111 -0
- data/third_party/boringssl/crypto/x509/x_crl.c +541 -0
- data/third_party/boringssl/crypto/x509/x_exten.c +75 -0
- data/third_party/boringssl/crypto/x509/x_info.c +98 -0
- data/third_party/boringssl/crypto/x509/x_name.c +541 -0
- data/third_party/boringssl/crypto/x509/x_pkey.c +106 -0
- data/third_party/boringssl/crypto/x509/x_pubkey.c +368 -0
- data/third_party/boringssl/crypto/x509/x_req.c +109 -0
- data/third_party/boringssl/crypto/x509/x_sig.c +69 -0
- data/third_party/boringssl/crypto/x509/x_spki.c +80 -0
- data/third_party/boringssl/crypto/x509/x_val.c +69 -0
- data/third_party/boringssl/crypto/x509/x_x509.c +328 -0
- data/third_party/boringssl/crypto/x509/x_x509a.c +198 -0
- data/third_party/boringssl/crypto/x509v3/ext_dat.h +143 -0
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +284 -0
- data/third_party/boringssl/crypto/x509v3/pcy_data.c +130 -0
- data/third_party/boringssl/crypto/x509v3/pcy_int.h +217 -0
- data/third_party/boringssl/crypto/x509v3/pcy_lib.c +155 -0
- data/third_party/boringssl/crypto/x509v3/pcy_map.c +130 -0
- data/third_party/boringssl/crypto/x509v3/pcy_node.c +188 -0
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +840 -0
- data/third_party/boringssl/crypto/x509v3/v3_akey.c +204 -0
- data/third_party/boringssl/crypto/x509v3/v3_akeya.c +72 -0
- data/third_party/boringssl/crypto/x509v3/v3_alt.c +623 -0
- data/third_party/boringssl/crypto/x509v3/v3_bcons.c +133 -0
- data/third_party/boringssl/crypto/x509v3/v3_bitst.c +141 -0
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +462 -0
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +502 -0
- data/third_party/boringssl/crypto/x509v3/v3_crld.c +561 -0
- data/third_party/boringssl/crypto/x509v3/v3_enum.c +100 -0
- data/third_party/boringssl/crypto/x509v3/v3_extku.c +148 -0
- data/third_party/boringssl/crypto/x509v3/v3_genn.c +251 -0
- data/third_party/boringssl/crypto/x509v3/v3_ia5.c +122 -0
- data/third_party/boringssl/crypto/x509v3/v3_info.c +219 -0
- data/third_party/boringssl/crypto/x509v3/v3_int.c +91 -0
- data/third_party/boringssl/crypto/x509v3/v3_lib.c +370 -0
- data/third_party/boringssl/crypto/x509v3/v3_ncons.c +501 -0
- data/third_party/boringssl/crypto/x509v3/v3_pci.c +287 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcia.c +57 -0
- data/third_party/boringssl/crypto/x509v3/v3_pcons.c +139 -0
- data/third_party/boringssl/crypto/x509v3/v3_pku.c +110 -0
- data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +154 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +229 -0
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +866 -0
- data/third_party/boringssl/crypto/x509v3/v3_skey.c +152 -0
- data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +274 -0
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +1352 -0
- data/third_party/boringssl/include/openssl/aead.h +423 -0
- data/third_party/boringssl/include/openssl/aes.h +170 -0
- data/third_party/boringssl/include/openssl/arm_arch.h +121 -0
- data/third_party/boringssl/include/openssl/asn1.h +982 -0
- data/third_party/boringssl/include/openssl/asn1_mac.h +18 -0
- data/third_party/boringssl/include/openssl/asn1t.h +892 -0
- data/third_party/boringssl/include/openssl/base.h +469 -0
- data/third_party/boringssl/include/openssl/base64.h +187 -0
- data/third_party/boringssl/include/openssl/bio.h +902 -0
- data/third_party/boringssl/include/openssl/blowfish.h +93 -0
- data/third_party/boringssl/include/openssl/bn.h +975 -0
- data/third_party/boringssl/include/openssl/buf.h +137 -0
- data/third_party/boringssl/include/openssl/buffer.h +18 -0
- data/third_party/boringssl/include/openssl/bytestring.h +480 -0
- data/third_party/boringssl/include/openssl/cast.h +96 -0
- data/third_party/boringssl/include/openssl/chacha.h +41 -0
- data/third_party/boringssl/include/openssl/cipher.h +608 -0
- data/third_party/boringssl/include/openssl/cmac.h +87 -0
- data/third_party/boringssl/include/openssl/conf.h +183 -0
- data/third_party/boringssl/include/openssl/cpu.h +196 -0
- data/third_party/boringssl/include/openssl/crypto.h +118 -0
- data/third_party/boringssl/include/openssl/curve25519.h +201 -0
- data/third_party/boringssl/include/openssl/des.h +177 -0
- data/third_party/boringssl/include/openssl/dh.h +298 -0
- data/third_party/boringssl/include/openssl/digest.h +316 -0
- data/third_party/boringssl/include/openssl/dsa.h +435 -0
- data/third_party/boringssl/include/openssl/dtls1.h +16 -0
- data/third_party/boringssl/include/openssl/ec.h +407 -0
- data/third_party/boringssl/include/openssl/ec_key.h +341 -0
- data/third_party/boringssl/include/openssl/ecdh.h +101 -0
- data/third_party/boringssl/include/openssl/ecdsa.h +199 -0
- data/third_party/boringssl/include/openssl/engine.h +109 -0
- data/third_party/boringssl/include/openssl/err.h +458 -0
- data/third_party/boringssl/include/openssl/evp.h +873 -0
- data/third_party/boringssl/include/openssl/ex_data.h +203 -0
- data/third_party/boringssl/include/openssl/hkdf.h +64 -0
- data/third_party/boringssl/include/openssl/hmac.h +186 -0
- data/third_party/boringssl/include/openssl/is_boringssl.h +16 -0
- data/third_party/boringssl/include/openssl/lhash.h +174 -0
- data/third_party/boringssl/include/openssl/lhash_macros.h +174 -0
- data/third_party/boringssl/include/openssl/md4.h +106 -0
- data/third_party/boringssl/include/openssl/md5.h +107 -0
- data/third_party/boringssl/include/openssl/mem.h +156 -0
- data/third_party/boringssl/include/openssl/nid.h +4242 -0
- data/third_party/boringssl/include/openssl/obj.h +233 -0
- data/third_party/boringssl/include/openssl/obj_mac.h +18 -0
- data/third_party/boringssl/include/openssl/objects.h +18 -0
- data/third_party/boringssl/include/openssl/opensslconf.h +67 -0
- data/third_party/boringssl/include/openssl/opensslv.h +18 -0
- data/third_party/boringssl/include/openssl/ossl_typ.h +18 -0
- data/third_party/boringssl/include/openssl/pem.h +397 -0
- data/third_party/boringssl/include/openssl/pkcs12.h +18 -0
- data/third_party/boringssl/include/openssl/pkcs7.h +82 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +230 -0
- data/third_party/boringssl/include/openssl/poly1305.h +51 -0
- data/third_party/boringssl/include/openssl/pool.h +91 -0
- data/third_party/boringssl/include/openssl/rand.h +125 -0
- data/third_party/boringssl/include/openssl/rc4.h +96 -0
- data/third_party/boringssl/include/openssl/ripemd.h +107 -0
- data/third_party/boringssl/include/openssl/rsa.h +731 -0
- data/third_party/boringssl/include/openssl/safestack.h +16 -0
- data/third_party/boringssl/include/openssl/sha.h +256 -0
- data/third_party/boringssl/include/openssl/span.h +191 -0
- data/third_party/boringssl/include/openssl/srtp.h +18 -0
- data/third_party/boringssl/include/openssl/ssl.h +4592 -0
- data/third_party/boringssl/include/openssl/ssl3.h +333 -0
- data/third_party/boringssl/include/openssl/stack.h +485 -0
- data/third_party/boringssl/include/openssl/thread.h +191 -0
- data/third_party/boringssl/include/openssl/tls1.h +610 -0
- data/third_party/boringssl/include/openssl/type_check.h +91 -0
- data/third_party/boringssl/include/openssl/x509.h +1176 -0
- data/third_party/boringssl/include/openssl/x509_vfy.h +614 -0
- data/third_party/boringssl/include/openssl/x509v3.h +826 -0
- data/third_party/boringssl/ssl/bio_ssl.cc +179 -0
- data/third_party/boringssl/ssl/custom_extensions.cc +265 -0
- data/third_party/boringssl/ssl/d1_both.cc +837 -0
- data/third_party/boringssl/ssl/d1_lib.cc +267 -0
- data/third_party/boringssl/ssl/d1_pkt.cc +274 -0
- data/third_party/boringssl/ssl/d1_srtp.cc +232 -0
- data/third_party/boringssl/ssl/dtls_method.cc +193 -0
- data/third_party/boringssl/ssl/dtls_record.cc +353 -0
- data/third_party/boringssl/ssl/handshake.cc +616 -0
- data/third_party/boringssl/ssl/handshake_client.cc +1836 -0
- data/third_party/boringssl/ssl/handshake_server.cc +1662 -0
- data/third_party/boringssl/ssl/internal.h +3011 -0
- data/third_party/boringssl/ssl/s3_both.cc +585 -0
- data/third_party/boringssl/ssl/s3_lib.cc +224 -0
- data/third_party/boringssl/ssl/s3_pkt.cc +443 -0
- data/third_party/boringssl/ssl/ssl_aead_ctx.cc +415 -0
- data/third_party/boringssl/ssl/ssl_asn1.cc +840 -0
- data/third_party/boringssl/ssl/ssl_buffer.cc +286 -0
- data/third_party/boringssl/ssl/ssl_cert.cc +913 -0
- data/third_party/boringssl/ssl/ssl_cipher.cc +1777 -0
- data/third_party/boringssl/ssl/ssl_file.cc +583 -0
- data/third_party/boringssl/ssl/ssl_key_share.cc +250 -0
- data/third_party/boringssl/ssl/ssl_lib.cc +2650 -0
- data/third_party/boringssl/ssl/ssl_privkey.cc +488 -0
- data/third_party/boringssl/ssl/ssl_session.cc +1221 -0
- data/third_party/boringssl/ssl/ssl_stat.cc +224 -0
- data/third_party/boringssl/ssl/ssl_transcript.cc +398 -0
- data/third_party/boringssl/ssl/ssl_versions.cc +472 -0
- data/third_party/boringssl/ssl/ssl_x509.cc +1299 -0
- data/third_party/boringssl/ssl/t1_enc.cc +503 -0
- data/third_party/boringssl/ssl/t1_lib.cc +3457 -0
- data/third_party/boringssl/ssl/tls13_both.cc +551 -0
- data/third_party/boringssl/ssl/tls13_client.cc +977 -0
- data/third_party/boringssl/ssl/tls13_enc.cc +563 -0
- data/third_party/boringssl/ssl/tls13_server.cc +1068 -0
- data/third_party/boringssl/ssl/tls_method.cc +291 -0
- data/third_party/boringssl/ssl/tls_record.cc +712 -0
- data/third_party/boringssl/third_party/fiat/curve25519.c +5062 -0
- data/third_party/boringssl/third_party/fiat/internal.h +142 -0
- data/third_party/cares/ares_build.h +223 -0
- data/third_party/cares/cares/ares.h +658 -0
- data/third_party/cares/cares/ares__close_sockets.c +61 -0
- data/third_party/cares/cares/ares__get_hostent.c +261 -0
- data/third_party/cares/cares/ares__read_line.c +73 -0
- data/third_party/cares/cares/ares__timeval.c +111 -0
- data/third_party/cares/cares/ares_cancel.c +63 -0
- data/third_party/cares/cares/ares_create_query.c +202 -0
- data/third_party/cares/cares/ares_data.c +221 -0
- data/third_party/cares/cares/ares_data.h +72 -0
- data/third_party/cares/cares/ares_destroy.c +108 -0
- data/third_party/cares/cares/ares_dns.h +103 -0
- data/third_party/cares/cares/ares_expand_name.c +209 -0
- data/third_party/cares/cares/ares_expand_string.c +70 -0
- data/third_party/cares/cares/ares_fds.c +59 -0
- data/third_party/cares/cares/ares_free_hostent.c +41 -0
- data/third_party/cares/cares/ares_free_string.c +25 -0
- data/third_party/cares/cares/ares_getenv.c +30 -0
- data/third_party/cares/cares/ares_getenv.h +26 -0
- data/third_party/cares/cares/ares_gethostbyaddr.c +294 -0
- data/third_party/cares/cares/ares_gethostbyname.c +518 -0
- data/third_party/cares/cares/ares_getnameinfo.c +442 -0
- data/third_party/cares/cares/ares_getopt.c +122 -0
- data/third_party/cares/cares/ares_getopt.h +53 -0
- data/third_party/cares/cares/ares_getsock.c +66 -0
- data/third_party/cares/cares/ares_inet_net_pton.h +25 -0
- data/third_party/cares/cares/ares_init.c +2514 -0
- data/third_party/cares/cares/ares_iphlpapi.h +221 -0
- data/third_party/cares/cares/ares_ipv6.h +78 -0
- data/third_party/cares/cares/ares_library_init.c +177 -0
- data/third_party/cares/cares/ares_library_init.h +43 -0
- data/third_party/cares/cares/ares_llist.c +63 -0
- data/third_party/cares/cares/ares_llist.h +39 -0
- data/third_party/cares/cares/ares_mkquery.c +24 -0
- data/third_party/cares/cares/ares_nowarn.c +260 -0
- data/third_party/cares/cares/ares_nowarn.h +61 -0
- data/third_party/cares/cares/ares_options.c +402 -0
- data/third_party/cares/cares/ares_parse_a_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_aaaa_reply.c +264 -0
- data/third_party/cares/cares/ares_parse_mx_reply.c +170 -0
- data/third_party/cares/cares/ares_parse_naptr_reply.c +193 -0
- data/third_party/cares/cares/ares_parse_ns_reply.c +183 -0
- data/third_party/cares/cares/ares_parse_ptr_reply.c +219 -0
- data/third_party/cares/cares/ares_parse_soa_reply.c +133 -0
- data/third_party/cares/cares/ares_parse_srv_reply.c +179 -0
- data/third_party/cares/cares/ares_parse_txt_reply.c +220 -0
- data/third_party/cares/cares/ares_platform.c +11035 -0
- data/third_party/cares/cares/ares_platform.h +43 -0
- data/third_party/cares/cares/ares_private.h +374 -0
- data/third_party/cares/cares/ares_process.c +1448 -0
- data/third_party/cares/cares/ares_query.c +186 -0
- data/third_party/cares/cares/ares_rules.h +125 -0
- data/third_party/cares/cares/ares_search.c +316 -0
- data/third_party/cares/cares/ares_send.c +131 -0
- data/third_party/cares/cares/ares_setup.h +217 -0
- data/third_party/cares/cares/ares_strcasecmp.c +66 -0
- data/third_party/cares/cares/ares_strcasecmp.h +30 -0
- data/third_party/cares/cares/ares_strdup.c +49 -0
- data/third_party/cares/cares/ares_strdup.h +24 -0
- data/third_party/cares/cares/ares_strerror.c +56 -0
- data/third_party/cares/cares/ares_timeout.c +88 -0
- data/third_party/cares/cares/ares_version.c +11 -0
- data/third_party/cares/cares/ares_version.h +24 -0
- data/third_party/cares/cares/ares_writev.c +79 -0
- data/third_party/cares/cares/bitncmp.c +59 -0
- data/third_party/cares/cares/bitncmp.h +26 -0
- data/third_party/cares/cares/config-win32.h +351 -0
- data/third_party/cares/cares/inet_net_pton.c +450 -0
- data/third_party/cares/cares/inet_ntop.c +208 -0
- data/third_party/cares/cares/setup_once.h +554 -0
- data/third_party/cares/cares/windows_port.c +22 -0
- data/third_party/cares/config_darwin/ares_config.h +425 -0
- data/third_party/cares/config_freebsd/ares_config.h +502 -0
- data/third_party/cares/config_linux/ares_config.h +458 -0
- data/third_party/cares/config_openbsd/ares_config.h +502 -0
- data/third_party/nanopb/pb.h +579 -0
- data/third_party/nanopb/pb_common.c +97 -0
- data/third_party/nanopb/pb_common.h +42 -0
- data/third_party/nanopb/pb_decode.c +1347 -0
- data/third_party/nanopb/pb_decode.h +149 -0
- data/third_party/nanopb/pb_encode.c +696 -0
- data/third_party/nanopb/pb_encode.h +154 -0
- data/third_party/zlib/adler32.c +186 -0
- data/third_party/zlib/compress.c +86 -0
- data/third_party/zlib/crc32.c +442 -0
- data/third_party/zlib/crc32.h +441 -0
- data/third_party/zlib/deflate.c +2163 -0
- data/third_party/zlib/deflate.h +349 -0
- data/third_party/zlib/gzclose.c +25 -0
- data/third_party/zlib/gzguts.h +218 -0
- data/third_party/zlib/gzlib.c +637 -0
- data/third_party/zlib/gzread.c +654 -0
- data/third_party/zlib/gzwrite.c +665 -0
- data/third_party/zlib/infback.c +640 -0
- data/third_party/zlib/inffast.c +323 -0
- data/third_party/zlib/inffast.h +11 -0
- data/third_party/zlib/inffixed.h +94 -0
- data/third_party/zlib/inflate.c +1561 -0
- data/third_party/zlib/inflate.h +125 -0
- data/third_party/zlib/inftrees.c +304 -0
- data/third_party/zlib/inftrees.h +62 -0
- data/third_party/zlib/trees.c +1203 -0
- data/third_party/zlib/trees.h +128 -0
- data/third_party/zlib/uncompr.c +93 -0
- data/third_party/zlib/zconf.h +534 -0
- data/third_party/zlib/zlib.h +1912 -0
- data/third_party/zlib/zutil.c +325 -0
- data/third_party/zlib/zutil.h +271 -0
- metadata +1586 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2015 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#ifndef GRPC_CORE_LIB_SURFACE_CHANNEL_H
|
|
20
|
+
#define GRPC_CORE_LIB_SURFACE_CHANNEL_H
|
|
21
|
+
|
|
22
|
+
#include <grpc/support/port_platform.h>
|
|
23
|
+
|
|
24
|
+
#include "src/core/lib/channel/channel_stack.h"
|
|
25
|
+
#include "src/core/lib/channel/channel_stack_builder.h"
|
|
26
|
+
#include "src/core/lib/surface/channel_stack_type.h"
|
|
27
|
+
|
|
28
|
+
grpc_channel* grpc_channel_create(const char* target,
|
|
29
|
+
const grpc_channel_args* args,
|
|
30
|
+
grpc_channel_stack_type channel_stack_type,
|
|
31
|
+
grpc_transport* optional_transport);
|
|
32
|
+
|
|
33
|
+
grpc_channel* grpc_channel_create_with_builder(
|
|
34
|
+
grpc_channel_stack_builder* builder,
|
|
35
|
+
grpc_channel_stack_type channel_stack_type);
|
|
36
|
+
|
|
37
|
+
/** Create a call given a grpc_channel, in order to call \a method.
|
|
38
|
+
Progress is tied to activity on \a pollset_set. The returned call object is
|
|
39
|
+
meant to be used with \a grpc_call_start_batch_and_execute, which relies on
|
|
40
|
+
callbacks to signal completions. \a method and \a host need
|
|
41
|
+
only live through the invocation of this function. If \a parent_call is
|
|
42
|
+
non-NULL, it must be a server-side call. It will be used to propagate
|
|
43
|
+
properties from the server call to this new client call, depending on the
|
|
44
|
+
value of \a propagation_mask (see propagation_bits.h for possible values) */
|
|
45
|
+
grpc_call* grpc_channel_create_pollset_set_call(
|
|
46
|
+
grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
|
|
47
|
+
grpc_pollset_set* pollset_set, grpc_slice method, const grpc_slice* host,
|
|
48
|
+
grpc_millis deadline, void* reserved);
|
|
49
|
+
|
|
50
|
+
/** Get a (borrowed) pointer to this channels underlying channel stack */
|
|
51
|
+
grpc_channel_stack* grpc_channel_get_channel_stack(grpc_channel* channel);
|
|
52
|
+
|
|
53
|
+
/** Get a grpc_mdelem of grpc-status: X where X is the numeric value of
|
|
54
|
+
status_code.
|
|
55
|
+
|
|
56
|
+
The returned elem is owned by the caller. */
|
|
57
|
+
grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_channel* channel,
|
|
58
|
+
int status_code);
|
|
59
|
+
|
|
60
|
+
size_t grpc_channel_get_call_size_estimate(grpc_channel* channel);
|
|
61
|
+
void grpc_channel_update_call_size_estimate(grpc_channel* channel, size_t size);
|
|
62
|
+
|
|
63
|
+
#ifndef NDEBUG
|
|
64
|
+
void grpc_channel_internal_ref(grpc_channel* channel, const char* reason);
|
|
65
|
+
void grpc_channel_internal_unref(grpc_channel* channel, const char* reason);
|
|
66
|
+
#define GRPC_CHANNEL_INTERNAL_REF(channel, reason) \
|
|
67
|
+
grpc_channel_internal_ref(channel, reason)
|
|
68
|
+
#define GRPC_CHANNEL_INTERNAL_UNREF(channel, reason) \
|
|
69
|
+
grpc_channel_internal_unref(channel, reason)
|
|
70
|
+
#else
|
|
71
|
+
void grpc_channel_internal_ref(grpc_channel* channel);
|
|
72
|
+
void grpc_channel_internal_unref(grpc_channel* channel);
|
|
73
|
+
#define GRPC_CHANNEL_INTERNAL_REF(channel, reason) \
|
|
74
|
+
grpc_channel_internal_ref(channel)
|
|
75
|
+
#define GRPC_CHANNEL_INTERNAL_UNREF(channel, reason) \
|
|
76
|
+
grpc_channel_internal_unref(channel)
|
|
77
|
+
#endif
|
|
78
|
+
|
|
79
|
+
/** Return the channel's compression options. */
|
|
80
|
+
grpc_compression_options grpc_channel_compression_options(
|
|
81
|
+
const grpc_channel* channel);
|
|
82
|
+
|
|
83
|
+
#endif /* GRPC_CORE_LIB_SURFACE_CHANNEL_H */
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2016 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#include <grpc/support/port_platform.h>
|
|
20
|
+
|
|
21
|
+
#include "src/core/lib/surface/channel_init.h"
|
|
22
|
+
|
|
23
|
+
#include <grpc/support/alloc.h>
|
|
24
|
+
|
|
25
|
+
typedef struct stage_slot {
|
|
26
|
+
grpc_channel_init_stage fn;
|
|
27
|
+
void* arg;
|
|
28
|
+
int priority;
|
|
29
|
+
size_t insertion_order;
|
|
30
|
+
} stage_slot;
|
|
31
|
+
|
|
32
|
+
typedef struct stage_slots {
|
|
33
|
+
stage_slot* slots;
|
|
34
|
+
size_t num_slots;
|
|
35
|
+
size_t cap_slots;
|
|
36
|
+
} stage_slots;
|
|
37
|
+
|
|
38
|
+
static stage_slots g_slots[GRPC_NUM_CHANNEL_STACK_TYPES];
|
|
39
|
+
static bool g_finalized;
|
|
40
|
+
|
|
41
|
+
void grpc_channel_init_init(void) {
|
|
42
|
+
for (int i = 0; i < GRPC_NUM_CHANNEL_STACK_TYPES; i++) {
|
|
43
|
+
g_slots[i].slots = nullptr;
|
|
44
|
+
g_slots[i].num_slots = 0;
|
|
45
|
+
g_slots[i].cap_slots = 0;
|
|
46
|
+
}
|
|
47
|
+
g_finalized = false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
void grpc_channel_init_register_stage(grpc_channel_stack_type type,
|
|
51
|
+
int priority,
|
|
52
|
+
grpc_channel_init_stage stage,
|
|
53
|
+
void* stage_arg) {
|
|
54
|
+
GPR_ASSERT(!g_finalized);
|
|
55
|
+
if (g_slots[type].cap_slots == g_slots[type].num_slots) {
|
|
56
|
+
g_slots[type].cap_slots = GPR_MAX(8, 3 * g_slots[type].cap_slots / 2);
|
|
57
|
+
g_slots[type].slots = static_cast<stage_slot*>(
|
|
58
|
+
gpr_realloc(g_slots[type].slots,
|
|
59
|
+
g_slots[type].cap_slots * sizeof(*g_slots[type].slots)));
|
|
60
|
+
}
|
|
61
|
+
stage_slot* s = &g_slots[type].slots[g_slots[type].num_slots++];
|
|
62
|
+
s->insertion_order = g_slots[type].num_slots;
|
|
63
|
+
s->priority = priority;
|
|
64
|
+
s->fn = stage;
|
|
65
|
+
s->arg = stage_arg;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static int compare_slots(const void* a, const void* b) {
|
|
69
|
+
const stage_slot* sa = static_cast<const stage_slot*>(a);
|
|
70
|
+
const stage_slot* sb = static_cast<const stage_slot*>(b);
|
|
71
|
+
|
|
72
|
+
int c = GPR_ICMP(sa->priority, sb->priority);
|
|
73
|
+
if (c != 0) return c;
|
|
74
|
+
return GPR_ICMP(sa->insertion_order, sb->insertion_order);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
void grpc_channel_init_finalize(void) {
|
|
78
|
+
GPR_ASSERT(!g_finalized);
|
|
79
|
+
for (int i = 0; i < GRPC_NUM_CHANNEL_STACK_TYPES; i++) {
|
|
80
|
+
qsort(g_slots[i].slots, g_slots[i].num_slots, sizeof(*g_slots[i].slots),
|
|
81
|
+
compare_slots);
|
|
82
|
+
}
|
|
83
|
+
g_finalized = true;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
void grpc_channel_init_shutdown(void) {
|
|
87
|
+
for (int i = 0; i < GRPC_NUM_CHANNEL_STACK_TYPES; i++) {
|
|
88
|
+
gpr_free(g_slots[i].slots);
|
|
89
|
+
g_slots[i].slots =
|
|
90
|
+
static_cast<stage_slot*>((void*)static_cast<uintptr_t>(0xdeadbeef));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
bool grpc_channel_init_create_stack(grpc_channel_stack_builder* builder,
|
|
95
|
+
grpc_channel_stack_type type) {
|
|
96
|
+
GPR_ASSERT(g_finalized);
|
|
97
|
+
|
|
98
|
+
grpc_channel_stack_builder_set_name(builder,
|
|
99
|
+
grpc_channel_stack_type_string(type));
|
|
100
|
+
|
|
101
|
+
for (size_t i = 0; i < g_slots[type].num_slots; i++) {
|
|
102
|
+
const stage_slot* slot = &g_slots[type].slots[i];
|
|
103
|
+
if (!slot->fn(builder, slot->arg)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2016 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#ifndef GRPC_CORE_LIB_SURFACE_CHANNEL_INIT_H
|
|
20
|
+
#define GRPC_CORE_LIB_SURFACE_CHANNEL_INIT_H
|
|
21
|
+
|
|
22
|
+
#include <grpc/support/port_platform.h>
|
|
23
|
+
|
|
24
|
+
#include "src/core/lib/channel/channel_stack_builder.h"
|
|
25
|
+
#include "src/core/lib/surface/channel_stack_type.h"
|
|
26
|
+
#include "src/core/lib/transport/transport.h"
|
|
27
|
+
|
|
28
|
+
#define GRPC_CHANNEL_INIT_BUILTIN_PRIORITY 10000
|
|
29
|
+
|
|
30
|
+
/// This module provides a way for plugins (and the grpc core library itself)
|
|
31
|
+
/// to register mutators for channel stacks.
|
|
32
|
+
/// It also provides a universal entry path to run those mutators to build
|
|
33
|
+
/// a channel stack for various subsystems.
|
|
34
|
+
|
|
35
|
+
/// One stage of mutation: call functions against \a builder to influence the
|
|
36
|
+
/// finally constructed channel stack
|
|
37
|
+
typedef bool (*grpc_channel_init_stage)(grpc_channel_stack_builder* builder,
|
|
38
|
+
void* arg);
|
|
39
|
+
|
|
40
|
+
/// Global initialization of the system
|
|
41
|
+
void grpc_channel_init_init(void);
|
|
42
|
+
|
|
43
|
+
/// Register one stage of mutators.
|
|
44
|
+
/// Stages are run in priority order (lowest to highest), and then in
|
|
45
|
+
/// registration order (in the case of a tie).
|
|
46
|
+
/// Stages are registered against one of the pre-determined channel stack
|
|
47
|
+
/// types.
|
|
48
|
+
void grpc_channel_init_register_stage(grpc_channel_stack_type type,
|
|
49
|
+
int priority,
|
|
50
|
+
grpc_channel_init_stage stage_fn,
|
|
51
|
+
void* stage_arg);
|
|
52
|
+
|
|
53
|
+
/// Finalize registration. No more calls to grpc_channel_init_register_stage are
|
|
54
|
+
/// allowed.
|
|
55
|
+
void grpc_channel_init_finalize(void);
|
|
56
|
+
/// Shutdown the channel init system
|
|
57
|
+
void grpc_channel_init_shutdown(void);
|
|
58
|
+
|
|
59
|
+
/// Construct a channel stack of some sort: see channel_stack.h for details
|
|
60
|
+
/// \a type is the type of channel stack to create
|
|
61
|
+
/// \a prefix_bytes is the number of bytes before the channel stack to allocate
|
|
62
|
+
/// \a args are configuration arguments for the channel stack
|
|
63
|
+
/// \a initial_refs is the initial refcount to give the channel stack
|
|
64
|
+
/// \a destroy and \a destroy_arg specify how to destroy the channel stack
|
|
65
|
+
/// if destroy_arg is NULL, the returned value from this function will be
|
|
66
|
+
/// substituted
|
|
67
|
+
/// \a optional_transport is either NULL or a constructed transport object
|
|
68
|
+
/// Returns a pointer to the base of the memory allocated (the actual channel
|
|
69
|
+
/// stack object will be prefix_bytes past that pointer)
|
|
70
|
+
bool grpc_channel_init_create_stack(grpc_channel_stack_builder* builder,
|
|
71
|
+
grpc_channel_stack_type type);
|
|
72
|
+
|
|
73
|
+
#endif /* GRPC_CORE_LIB_SURFACE_CHANNEL_INIT_H */
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2015 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#include <grpc/support/port_platform.h>
|
|
20
|
+
|
|
21
|
+
#include "src/core/lib/surface/channel.h"
|
|
22
|
+
|
|
23
|
+
#include <string.h>
|
|
24
|
+
|
|
25
|
+
#include <grpc/support/alloc.h>
|
|
26
|
+
#include <grpc/support/log.h>
|
|
27
|
+
|
|
28
|
+
#include "src/core/lib/surface/api_trace.h"
|
|
29
|
+
#include "src/core/lib/surface/completion_queue.h"
|
|
30
|
+
|
|
31
|
+
typedef struct {
|
|
32
|
+
grpc_closure closure;
|
|
33
|
+
void* tag;
|
|
34
|
+
grpc_completion_queue* cq;
|
|
35
|
+
grpc_cq_completion completion_storage;
|
|
36
|
+
} ping_result;
|
|
37
|
+
|
|
38
|
+
static void ping_destroy(void* arg, grpc_cq_completion* storage) {
|
|
39
|
+
gpr_free(arg);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static void ping_done(void* arg, grpc_error* error) {
|
|
43
|
+
ping_result* pr = static_cast<ping_result*>(arg);
|
|
44
|
+
grpc_cq_end_op(pr->cq, pr->tag, GRPC_ERROR_REF(error), ping_destroy, pr,
|
|
45
|
+
&pr->completion_storage);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void grpc_channel_ping(grpc_channel* channel, grpc_completion_queue* cq,
|
|
49
|
+
void* tag, void* reserved) {
|
|
50
|
+
GRPC_API_TRACE("grpc_channel_ping(channel=%p, cq=%p, tag=%p, reserved=%p)", 4,
|
|
51
|
+
(channel, cq, tag, reserved));
|
|
52
|
+
grpc_transport_op* op = grpc_make_transport_op(nullptr);
|
|
53
|
+
ping_result* pr = static_cast<ping_result*>(gpr_malloc(sizeof(*pr)));
|
|
54
|
+
grpc_channel_element* top_elem =
|
|
55
|
+
grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
|
|
56
|
+
grpc_core::ExecCtx exec_ctx;
|
|
57
|
+
GPR_ASSERT(reserved == nullptr);
|
|
58
|
+
pr->tag = tag;
|
|
59
|
+
pr->cq = cq;
|
|
60
|
+
GRPC_CLOSURE_INIT(&pr->closure, ping_done, pr, grpc_schedule_on_exec_ctx);
|
|
61
|
+
op->send_ping.on_ack = &pr->closure;
|
|
62
|
+
op->bind_pollset = grpc_cq_pollset(cq);
|
|
63
|
+
GPR_ASSERT(grpc_cq_begin_op(cq, tag));
|
|
64
|
+
top_elem->filter->start_transport_op(top_elem, op);
|
|
65
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2016 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#include <grpc/support/port_platform.h>
|
|
20
|
+
|
|
21
|
+
#include <grpc/support/log.h>
|
|
22
|
+
#include "src/core/lib/surface/channel_stack_type.h"
|
|
23
|
+
|
|
24
|
+
bool grpc_channel_stack_type_is_client(grpc_channel_stack_type type) {
|
|
25
|
+
switch (type) {
|
|
26
|
+
case GRPC_CLIENT_CHANNEL:
|
|
27
|
+
return true;
|
|
28
|
+
case GRPC_CLIENT_SUBCHANNEL:
|
|
29
|
+
return true;
|
|
30
|
+
case GRPC_CLIENT_LAME_CHANNEL:
|
|
31
|
+
return true;
|
|
32
|
+
case GRPC_CLIENT_DIRECT_CHANNEL:
|
|
33
|
+
return true;
|
|
34
|
+
case GRPC_SERVER_CHANNEL:
|
|
35
|
+
return false;
|
|
36
|
+
case GRPC_NUM_CHANNEL_STACK_TYPES:
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
GPR_UNREACHABLE_CODE(return true;);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const char* grpc_channel_stack_type_string(grpc_channel_stack_type type) {
|
|
43
|
+
switch (type) {
|
|
44
|
+
case GRPC_CLIENT_CHANNEL:
|
|
45
|
+
return "CLIENT_CHANNEL";
|
|
46
|
+
case GRPC_CLIENT_SUBCHANNEL:
|
|
47
|
+
return "CLIENT_SUBCHANNEL";
|
|
48
|
+
case GRPC_SERVER_CHANNEL:
|
|
49
|
+
return "SERVER_CHANNEL";
|
|
50
|
+
case GRPC_CLIENT_LAME_CHANNEL:
|
|
51
|
+
return "CLIENT_LAME_CHANNEL";
|
|
52
|
+
case GRPC_CLIENT_DIRECT_CHANNEL:
|
|
53
|
+
return "CLIENT_DIRECT_CHANNEL";
|
|
54
|
+
case GRPC_NUM_CHANNEL_STACK_TYPES:
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
GPR_UNREACHABLE_CODE(return "UNKNOWN");
|
|
58
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2015 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
#ifndef GRPC_CORE_LIB_SURFACE_CHANNEL_STACK_TYPE_H
|
|
20
|
+
#define GRPC_CORE_LIB_SURFACE_CHANNEL_STACK_TYPE_H
|
|
21
|
+
|
|
22
|
+
#include <grpc/support/port_platform.h>
|
|
23
|
+
|
|
24
|
+
#include <stdbool.h>
|
|
25
|
+
|
|
26
|
+
typedef enum {
|
|
27
|
+
// normal top-half client channel with load-balancing, connection management
|
|
28
|
+
GRPC_CLIENT_CHANNEL,
|
|
29
|
+
// bottom-half of a client channel: everything that happens post-load
|
|
30
|
+
// balancing (bound to a specific transport)
|
|
31
|
+
GRPC_CLIENT_SUBCHANNEL,
|
|
32
|
+
// a permanently broken client channel
|
|
33
|
+
GRPC_CLIENT_LAME_CHANNEL,
|
|
34
|
+
// a directly connected client channel (without load-balancing, directly talks
|
|
35
|
+
// to a transport)
|
|
36
|
+
GRPC_CLIENT_DIRECT_CHANNEL,
|
|
37
|
+
// server side channel
|
|
38
|
+
GRPC_SERVER_CHANNEL,
|
|
39
|
+
// must be last
|
|
40
|
+
GRPC_NUM_CHANNEL_STACK_TYPES
|
|
41
|
+
} grpc_channel_stack_type;
|
|
42
|
+
|
|
43
|
+
bool grpc_channel_stack_type_is_client(grpc_channel_stack_type type);
|
|
44
|
+
|
|
45
|
+
const char* grpc_channel_stack_type_string(grpc_channel_stack_type type);
|
|
46
|
+
|
|
47
|
+
#endif /* GRPC_CORE_LIB_SURFACE_CHANNEL_STACK_TYPE_H */
|
|
@@ -0,0 +1,1262 @@
|
|
|
1
|
+
/*
|
|
2
|
+
*
|
|
3
|
+
* Copyright 2015-2016 gRPC authors.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
#include <grpc/support/port_platform.h>
|
|
19
|
+
|
|
20
|
+
#include "src/core/lib/surface/completion_queue.h"
|
|
21
|
+
|
|
22
|
+
#include <inttypes.h>
|
|
23
|
+
#include <stdio.h>
|
|
24
|
+
#include <string.h>
|
|
25
|
+
|
|
26
|
+
#include <grpc/support/alloc.h>
|
|
27
|
+
#include <grpc/support/atm.h>
|
|
28
|
+
#include <grpc/support/log.h>
|
|
29
|
+
#include <grpc/support/string_util.h>
|
|
30
|
+
#include <grpc/support/time.h>
|
|
31
|
+
|
|
32
|
+
#include "src/core/lib/debug/stats.h"
|
|
33
|
+
#include "src/core/lib/gpr/spinlock.h"
|
|
34
|
+
#include "src/core/lib/gpr/string.h"
|
|
35
|
+
#include "src/core/lib/gpr/tls.h"
|
|
36
|
+
#include "src/core/lib/iomgr/pollset.h"
|
|
37
|
+
#include "src/core/lib/iomgr/timer.h"
|
|
38
|
+
#include "src/core/lib/profiling/timers.h"
|
|
39
|
+
#include "src/core/lib/surface/api_trace.h"
|
|
40
|
+
#include "src/core/lib/surface/call.h"
|
|
41
|
+
#include "src/core/lib/surface/event_string.h"
|
|
42
|
+
|
|
43
|
+
grpc_core::TraceFlag grpc_trace_operation_failures(false, "op_failure");
|
|
44
|
+
grpc_core::DebugOnlyTraceFlag grpc_trace_pending_tags(false, "pending_tags");
|
|
45
|
+
grpc_core::DebugOnlyTraceFlag grpc_trace_cq_refcount(false, "cq_refcount");
|
|
46
|
+
|
|
47
|
+
// Specifies a cq thread local cache.
|
|
48
|
+
// The first event that occurs on a thread
|
|
49
|
+
// with a cq cache will go into that cache, and
|
|
50
|
+
// will only be returned on the thread that initialized the cache.
|
|
51
|
+
// NOTE: Only one event will ever be cached.
|
|
52
|
+
GPR_TLS_DECL(g_cached_event);
|
|
53
|
+
GPR_TLS_DECL(g_cached_cq);
|
|
54
|
+
|
|
55
|
+
typedef struct {
|
|
56
|
+
grpc_pollset_worker** worker;
|
|
57
|
+
void* tag;
|
|
58
|
+
} plucker;
|
|
59
|
+
|
|
60
|
+
typedef struct {
|
|
61
|
+
bool can_get_pollset;
|
|
62
|
+
bool can_listen;
|
|
63
|
+
size_t (*size)(void);
|
|
64
|
+
void (*init)(grpc_pollset* pollset, gpr_mu** mu);
|
|
65
|
+
grpc_error* (*kick)(grpc_pollset* pollset,
|
|
66
|
+
grpc_pollset_worker* specific_worker);
|
|
67
|
+
grpc_error* (*work)(grpc_pollset* pollset, grpc_pollset_worker** worker,
|
|
68
|
+
grpc_millis deadline);
|
|
69
|
+
void (*shutdown)(grpc_pollset* pollset, grpc_closure* closure);
|
|
70
|
+
void (*destroy)(grpc_pollset* pollset);
|
|
71
|
+
} cq_poller_vtable;
|
|
72
|
+
|
|
73
|
+
typedef struct non_polling_worker {
|
|
74
|
+
gpr_cv cv;
|
|
75
|
+
bool kicked;
|
|
76
|
+
struct non_polling_worker* next;
|
|
77
|
+
struct non_polling_worker* prev;
|
|
78
|
+
} non_polling_worker;
|
|
79
|
+
|
|
80
|
+
typedef struct {
|
|
81
|
+
gpr_mu mu;
|
|
82
|
+
non_polling_worker* root;
|
|
83
|
+
grpc_closure* shutdown;
|
|
84
|
+
} non_polling_poller;
|
|
85
|
+
|
|
86
|
+
static size_t non_polling_poller_size(void) {
|
|
87
|
+
return sizeof(non_polling_poller);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static void non_polling_poller_init(grpc_pollset* pollset, gpr_mu** mu) {
|
|
91
|
+
non_polling_poller* npp = reinterpret_cast<non_polling_poller*>(pollset);
|
|
92
|
+
gpr_mu_init(&npp->mu);
|
|
93
|
+
*mu = &npp->mu;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static void non_polling_poller_destroy(grpc_pollset* pollset) {
|
|
97
|
+
non_polling_poller* npp = reinterpret_cast<non_polling_poller*>(pollset);
|
|
98
|
+
gpr_mu_destroy(&npp->mu);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
static grpc_error* non_polling_poller_work(grpc_pollset* pollset,
|
|
102
|
+
grpc_pollset_worker** worker,
|
|
103
|
+
grpc_millis deadline) {
|
|
104
|
+
non_polling_poller* npp = reinterpret_cast<non_polling_poller*>(pollset);
|
|
105
|
+
if (npp->shutdown) return GRPC_ERROR_NONE;
|
|
106
|
+
non_polling_worker w;
|
|
107
|
+
gpr_cv_init(&w.cv);
|
|
108
|
+
if (worker != nullptr) *worker = reinterpret_cast<grpc_pollset_worker*>(&w);
|
|
109
|
+
if (npp->root == nullptr) {
|
|
110
|
+
npp->root = w.next = w.prev = &w;
|
|
111
|
+
} else {
|
|
112
|
+
w.next = npp->root;
|
|
113
|
+
w.prev = w.next->prev;
|
|
114
|
+
w.next->prev = w.prev->next = &w;
|
|
115
|
+
}
|
|
116
|
+
w.kicked = false;
|
|
117
|
+
gpr_timespec deadline_ts =
|
|
118
|
+
grpc_millis_to_timespec(deadline, GPR_CLOCK_MONOTONIC);
|
|
119
|
+
while (!npp->shutdown && !w.kicked &&
|
|
120
|
+
!gpr_cv_wait(&w.cv, &npp->mu, deadline_ts))
|
|
121
|
+
;
|
|
122
|
+
grpc_core::ExecCtx::Get()->InvalidateNow();
|
|
123
|
+
if (&w == npp->root) {
|
|
124
|
+
npp->root = w.next;
|
|
125
|
+
if (&w == npp->root) {
|
|
126
|
+
if (npp->shutdown) {
|
|
127
|
+
GRPC_CLOSURE_SCHED(npp->shutdown, GRPC_ERROR_NONE);
|
|
128
|
+
}
|
|
129
|
+
npp->root = nullptr;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
w.next->prev = w.prev;
|
|
133
|
+
w.prev->next = w.next;
|
|
134
|
+
gpr_cv_destroy(&w.cv);
|
|
135
|
+
if (worker != nullptr) *worker = nullptr;
|
|
136
|
+
return GRPC_ERROR_NONE;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
static grpc_error* non_polling_poller_kick(
|
|
140
|
+
grpc_pollset* pollset, grpc_pollset_worker* specific_worker) {
|
|
141
|
+
non_polling_poller* p = reinterpret_cast<non_polling_poller*>(pollset);
|
|
142
|
+
if (specific_worker == nullptr)
|
|
143
|
+
specific_worker = reinterpret_cast<grpc_pollset_worker*>(p->root);
|
|
144
|
+
if (specific_worker != nullptr) {
|
|
145
|
+
non_polling_worker* w =
|
|
146
|
+
reinterpret_cast<non_polling_worker*>(specific_worker);
|
|
147
|
+
if (!w->kicked) {
|
|
148
|
+
w->kicked = true;
|
|
149
|
+
gpr_cv_signal(&w->cv);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return GRPC_ERROR_NONE;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static void non_polling_poller_shutdown(grpc_pollset* pollset,
|
|
156
|
+
grpc_closure* closure) {
|
|
157
|
+
non_polling_poller* p = reinterpret_cast<non_polling_poller*>(pollset);
|
|
158
|
+
GPR_ASSERT(closure != nullptr);
|
|
159
|
+
p->shutdown = closure;
|
|
160
|
+
if (p->root == nullptr) {
|
|
161
|
+
GRPC_CLOSURE_SCHED(closure, GRPC_ERROR_NONE);
|
|
162
|
+
} else {
|
|
163
|
+
non_polling_worker* w = p->root;
|
|
164
|
+
do {
|
|
165
|
+
gpr_cv_signal(&w->cv);
|
|
166
|
+
w = w->next;
|
|
167
|
+
} while (w != p->root);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
static const cq_poller_vtable g_poller_vtable_by_poller_type[] = {
|
|
172
|
+
/* GRPC_CQ_DEFAULT_POLLING */
|
|
173
|
+
{true, true, grpc_pollset_size, grpc_pollset_init, grpc_pollset_kick,
|
|
174
|
+
grpc_pollset_work, grpc_pollset_shutdown, grpc_pollset_destroy},
|
|
175
|
+
/* GRPC_CQ_NON_LISTENING */
|
|
176
|
+
{true, false, grpc_pollset_size, grpc_pollset_init, grpc_pollset_kick,
|
|
177
|
+
grpc_pollset_work, grpc_pollset_shutdown, grpc_pollset_destroy},
|
|
178
|
+
/* GRPC_CQ_NON_POLLING */
|
|
179
|
+
{false, false, non_polling_poller_size, non_polling_poller_init,
|
|
180
|
+
non_polling_poller_kick, non_polling_poller_work,
|
|
181
|
+
non_polling_poller_shutdown, non_polling_poller_destroy},
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
typedef struct cq_vtable {
|
|
185
|
+
grpc_cq_completion_type cq_completion_type;
|
|
186
|
+
size_t data_size;
|
|
187
|
+
void (*init)(void* data);
|
|
188
|
+
void (*shutdown)(grpc_completion_queue* cq);
|
|
189
|
+
void (*destroy)(void* data);
|
|
190
|
+
bool (*begin_op)(grpc_completion_queue* cq, void* tag);
|
|
191
|
+
void (*end_op)(grpc_completion_queue* cq, void* tag, grpc_error* error,
|
|
192
|
+
void (*done)(void* done_arg, grpc_cq_completion* storage),
|
|
193
|
+
void* done_arg, grpc_cq_completion* storage);
|
|
194
|
+
grpc_event (*next)(grpc_completion_queue* cq, gpr_timespec deadline,
|
|
195
|
+
void* reserved);
|
|
196
|
+
grpc_event (*pluck)(grpc_completion_queue* cq, void* tag,
|
|
197
|
+
gpr_timespec deadline, void* reserved);
|
|
198
|
+
} cq_vtable;
|
|
199
|
+
|
|
200
|
+
/* Queue that holds the cq_completion_events. Internally uses gpr_mpscq queue
|
|
201
|
+
* (a lockfree multiproducer single consumer queue). It uses a queue_lock
|
|
202
|
+
* to support multiple consumers.
|
|
203
|
+
* Only used in completion queues whose completion_type is GRPC_CQ_NEXT */
|
|
204
|
+
typedef struct grpc_cq_event_queue {
|
|
205
|
+
/* Spinlock to serialize consumers i.e pop() operations */
|
|
206
|
+
gpr_spinlock queue_lock;
|
|
207
|
+
|
|
208
|
+
gpr_mpscq queue;
|
|
209
|
+
|
|
210
|
+
/* A lazy counter of number of items in the queue. This is NOT atomically
|
|
211
|
+
incremented/decremented along with push/pop operations and hence is only
|
|
212
|
+
eventually consistent */
|
|
213
|
+
gpr_atm num_queue_items;
|
|
214
|
+
} grpc_cq_event_queue;
|
|
215
|
+
|
|
216
|
+
typedef struct cq_next_data {
|
|
217
|
+
/** Completed events for completion-queues of type GRPC_CQ_NEXT */
|
|
218
|
+
grpc_cq_event_queue queue;
|
|
219
|
+
|
|
220
|
+
/** Counter of how many things have ever been queued on this completion queue
|
|
221
|
+
useful for avoiding locks to check the queue */
|
|
222
|
+
gpr_atm things_queued_ever;
|
|
223
|
+
|
|
224
|
+
/* Number of outstanding events (+1 if not shut down) */
|
|
225
|
+
gpr_atm pending_events;
|
|
226
|
+
|
|
227
|
+
/** 0 initially. 1 once we initiated shutdown */
|
|
228
|
+
bool shutdown_called;
|
|
229
|
+
} cq_next_data;
|
|
230
|
+
|
|
231
|
+
typedef struct cq_pluck_data {
|
|
232
|
+
/** Completed events for completion-queues of type GRPC_CQ_PLUCK */
|
|
233
|
+
grpc_cq_completion completed_head;
|
|
234
|
+
grpc_cq_completion* completed_tail;
|
|
235
|
+
|
|
236
|
+
/** Number of pending events (+1 if we're not shutdown) */
|
|
237
|
+
gpr_atm pending_events;
|
|
238
|
+
|
|
239
|
+
/** Counter of how many things have ever been queued on this completion queue
|
|
240
|
+
useful for avoiding locks to check the queue */
|
|
241
|
+
gpr_atm things_queued_ever;
|
|
242
|
+
|
|
243
|
+
/** 0 initially. 1 once we completed shutting */
|
|
244
|
+
/* TODO: (sreek) This is not needed since (shutdown == 1) if and only if
|
|
245
|
+
* (pending_events == 0). So consider removing this in future and use
|
|
246
|
+
* pending_events */
|
|
247
|
+
gpr_atm shutdown;
|
|
248
|
+
|
|
249
|
+
/** 0 initially. 1 once we initiated shutdown */
|
|
250
|
+
bool shutdown_called;
|
|
251
|
+
|
|
252
|
+
int num_pluckers;
|
|
253
|
+
plucker pluckers[GRPC_MAX_COMPLETION_QUEUE_PLUCKERS];
|
|
254
|
+
} cq_pluck_data;
|
|
255
|
+
|
|
256
|
+
/* Completion queue structure */
|
|
257
|
+
struct grpc_completion_queue {
|
|
258
|
+
/** Once owning_refs drops to zero, we will destroy the cq */
|
|
259
|
+
gpr_refcount owning_refs;
|
|
260
|
+
|
|
261
|
+
gpr_mu* mu;
|
|
262
|
+
|
|
263
|
+
const cq_vtable* vtable;
|
|
264
|
+
const cq_poller_vtable* poller_vtable;
|
|
265
|
+
|
|
266
|
+
#ifndef NDEBUG
|
|
267
|
+
void** outstanding_tags;
|
|
268
|
+
size_t outstanding_tag_count;
|
|
269
|
+
size_t outstanding_tag_capacity;
|
|
270
|
+
#endif
|
|
271
|
+
|
|
272
|
+
grpc_closure pollset_shutdown_done;
|
|
273
|
+
int num_polls;
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
/* Forward declarations */
|
|
277
|
+
static void cq_finish_shutdown_next(grpc_completion_queue* cq);
|
|
278
|
+
static void cq_finish_shutdown_pluck(grpc_completion_queue* cq);
|
|
279
|
+
static void cq_shutdown_next(grpc_completion_queue* cq);
|
|
280
|
+
static void cq_shutdown_pluck(grpc_completion_queue* cq);
|
|
281
|
+
|
|
282
|
+
static bool cq_begin_op_for_next(grpc_completion_queue* cq, void* tag);
|
|
283
|
+
static bool cq_begin_op_for_pluck(grpc_completion_queue* cq, void* tag);
|
|
284
|
+
|
|
285
|
+
static void cq_end_op_for_next(grpc_completion_queue* cq, void* tag,
|
|
286
|
+
grpc_error* error,
|
|
287
|
+
void (*done)(void* done_arg,
|
|
288
|
+
grpc_cq_completion* storage),
|
|
289
|
+
void* done_arg, grpc_cq_completion* storage);
|
|
290
|
+
|
|
291
|
+
static void cq_end_op_for_pluck(grpc_completion_queue* cq, void* tag,
|
|
292
|
+
grpc_error* error,
|
|
293
|
+
void (*done)(void* done_arg,
|
|
294
|
+
grpc_cq_completion* storage),
|
|
295
|
+
void* done_arg, grpc_cq_completion* storage);
|
|
296
|
+
|
|
297
|
+
static grpc_event cq_next(grpc_completion_queue* cq, gpr_timespec deadline,
|
|
298
|
+
void* reserved);
|
|
299
|
+
|
|
300
|
+
static grpc_event cq_pluck(grpc_completion_queue* cq, void* tag,
|
|
301
|
+
gpr_timespec deadline, void* reserved);
|
|
302
|
+
|
|
303
|
+
static void cq_init_next(void* data);
|
|
304
|
+
static void cq_init_pluck(void* data);
|
|
305
|
+
static void cq_destroy_next(void* data);
|
|
306
|
+
static void cq_destroy_pluck(void* data);
|
|
307
|
+
|
|
308
|
+
/* Completion queue vtables based on the completion-type */
|
|
309
|
+
static const cq_vtable g_cq_vtable[] = {
|
|
310
|
+
/* GRPC_CQ_NEXT */
|
|
311
|
+
{GRPC_CQ_NEXT, sizeof(cq_next_data), cq_init_next, cq_shutdown_next,
|
|
312
|
+
cq_destroy_next, cq_begin_op_for_next, cq_end_op_for_next, cq_next,
|
|
313
|
+
nullptr},
|
|
314
|
+
/* GRPC_CQ_PLUCK */
|
|
315
|
+
{GRPC_CQ_PLUCK, sizeof(cq_pluck_data), cq_init_pluck, cq_shutdown_pluck,
|
|
316
|
+
cq_destroy_pluck, cq_begin_op_for_pluck, cq_end_op_for_pluck, nullptr,
|
|
317
|
+
cq_pluck},
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
#define DATA_FROM_CQ(cq) ((void*)(cq + 1))
|
|
321
|
+
#define POLLSET_FROM_CQ(cq) \
|
|
322
|
+
((grpc_pollset*)(cq->vtable->data_size + (char*)DATA_FROM_CQ(cq)))
|
|
323
|
+
|
|
324
|
+
grpc_core::TraceFlag grpc_cq_pluck_trace(true, "queue_pluck");
|
|
325
|
+
grpc_core::TraceFlag grpc_cq_event_timeout_trace(true, "queue_timeout");
|
|
326
|
+
|
|
327
|
+
#define GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, event) \
|
|
328
|
+
if (grpc_api_trace.enabled() && (grpc_cq_pluck_trace.enabled() || \
|
|
329
|
+
(event)->type != GRPC_QUEUE_TIMEOUT)) { \
|
|
330
|
+
char* _ev = grpc_event_string(event); \
|
|
331
|
+
gpr_log(GPR_INFO, "RETURN_EVENT[%p]: %s", cq, _ev); \
|
|
332
|
+
gpr_free(_ev); \
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
static void on_pollset_shutdown_done(void* cq, grpc_error* error);
|
|
336
|
+
|
|
337
|
+
void grpc_cq_global_init() {
|
|
338
|
+
gpr_tls_init(&g_cached_event);
|
|
339
|
+
gpr_tls_init(&g_cached_cq);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
void grpc_completion_queue_thread_local_cache_init(grpc_completion_queue* cq) {
|
|
343
|
+
if ((grpc_completion_queue*)gpr_tls_get(&g_cached_cq) == nullptr) {
|
|
344
|
+
gpr_tls_set(&g_cached_event, (intptr_t)0);
|
|
345
|
+
gpr_tls_set(&g_cached_cq, (intptr_t)cq);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
int grpc_completion_queue_thread_local_cache_flush(grpc_completion_queue* cq,
|
|
350
|
+
void** tag, int* ok) {
|
|
351
|
+
grpc_cq_completion* storage =
|
|
352
|
+
(grpc_cq_completion*)gpr_tls_get(&g_cached_event);
|
|
353
|
+
int ret = 0;
|
|
354
|
+
if (storage != nullptr &&
|
|
355
|
+
(grpc_completion_queue*)gpr_tls_get(&g_cached_cq) == cq) {
|
|
356
|
+
*tag = storage->tag;
|
|
357
|
+
grpc_core::ExecCtx exec_ctx;
|
|
358
|
+
*ok = (storage->next & static_cast<uintptr_t>(1)) == 1;
|
|
359
|
+
storage->done(storage->done_arg, storage);
|
|
360
|
+
ret = 1;
|
|
361
|
+
cq_next_data* cqd = static_cast<cq_next_data*> DATA_FROM_CQ(cq);
|
|
362
|
+
if (gpr_atm_full_fetch_add(&cqd->pending_events, -1) == 1) {
|
|
363
|
+
GRPC_CQ_INTERNAL_REF(cq, "shutting_down");
|
|
364
|
+
gpr_mu_lock(cq->mu);
|
|
365
|
+
cq_finish_shutdown_next(cq);
|
|
366
|
+
gpr_mu_unlock(cq->mu);
|
|
367
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down");
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
gpr_tls_set(&g_cached_event, (intptr_t)0);
|
|
371
|
+
gpr_tls_set(&g_cached_cq, (intptr_t)0);
|
|
372
|
+
|
|
373
|
+
return ret;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
static void cq_event_queue_init(grpc_cq_event_queue* q) {
|
|
377
|
+
gpr_mpscq_init(&q->queue);
|
|
378
|
+
q->queue_lock = GPR_SPINLOCK_INITIALIZER;
|
|
379
|
+
gpr_atm_no_barrier_store(&q->num_queue_items, 0);
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
static void cq_event_queue_destroy(grpc_cq_event_queue* q) {
|
|
383
|
+
gpr_mpscq_destroy(&q->queue);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
static bool cq_event_queue_push(grpc_cq_event_queue* q, grpc_cq_completion* c) {
|
|
387
|
+
gpr_mpscq_push(&q->queue, reinterpret_cast<gpr_mpscq_node*>(c));
|
|
388
|
+
return gpr_atm_no_barrier_fetch_add(&q->num_queue_items, 1) == 0;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
static grpc_cq_completion* cq_event_queue_pop(grpc_cq_event_queue* q) {
|
|
392
|
+
grpc_cq_completion* c = nullptr;
|
|
393
|
+
grpc_core::ExecCtx exec_ctx;
|
|
394
|
+
|
|
395
|
+
if (gpr_spinlock_trylock(&q->queue_lock)) {
|
|
396
|
+
GRPC_STATS_INC_CQ_EV_QUEUE_TRYLOCK_SUCCESSES();
|
|
397
|
+
|
|
398
|
+
bool is_empty = false;
|
|
399
|
+
c = reinterpret_cast<grpc_cq_completion*>(
|
|
400
|
+
gpr_mpscq_pop_and_check_end(&q->queue, &is_empty));
|
|
401
|
+
gpr_spinlock_unlock(&q->queue_lock);
|
|
402
|
+
|
|
403
|
+
if (c == nullptr && !is_empty) {
|
|
404
|
+
GRPC_STATS_INC_CQ_EV_QUEUE_TRANSIENT_POP_FAILURES();
|
|
405
|
+
}
|
|
406
|
+
} else {
|
|
407
|
+
GRPC_STATS_INC_CQ_EV_QUEUE_TRYLOCK_FAILURES();
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (c) {
|
|
411
|
+
gpr_atm_no_barrier_fetch_add(&q->num_queue_items, -1);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return c;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/* Note: The counter is not incremented/decremented atomically with push/pop.
|
|
418
|
+
* The count is only eventually consistent */
|
|
419
|
+
static long cq_event_queue_num_items(grpc_cq_event_queue* q) {
|
|
420
|
+
return static_cast<long>(gpr_atm_no_barrier_load(&q->num_queue_items));
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
grpc_completion_queue* grpc_completion_queue_create_internal(
|
|
424
|
+
grpc_cq_completion_type completion_type,
|
|
425
|
+
grpc_cq_polling_type polling_type) {
|
|
426
|
+
GPR_TIMER_SCOPE("grpc_completion_queue_create_internal", 0);
|
|
427
|
+
|
|
428
|
+
grpc_completion_queue* cq;
|
|
429
|
+
|
|
430
|
+
GRPC_API_TRACE(
|
|
431
|
+
"grpc_completion_queue_create_internal(completion_type=%d, "
|
|
432
|
+
"polling_type=%d)",
|
|
433
|
+
2, (completion_type, polling_type));
|
|
434
|
+
|
|
435
|
+
const cq_vtable* vtable = &g_cq_vtable[completion_type];
|
|
436
|
+
const cq_poller_vtable* poller_vtable =
|
|
437
|
+
&g_poller_vtable_by_poller_type[polling_type];
|
|
438
|
+
|
|
439
|
+
grpc_core::ExecCtx exec_ctx;
|
|
440
|
+
GRPC_STATS_INC_CQS_CREATED();
|
|
441
|
+
|
|
442
|
+
cq = static_cast<grpc_completion_queue*>(
|
|
443
|
+
gpr_zalloc(sizeof(grpc_completion_queue) + vtable->data_size +
|
|
444
|
+
poller_vtable->size()));
|
|
445
|
+
|
|
446
|
+
cq->vtable = vtable;
|
|
447
|
+
cq->poller_vtable = poller_vtable;
|
|
448
|
+
|
|
449
|
+
/* One for destroy(), one for pollset_shutdown */
|
|
450
|
+
gpr_ref_init(&cq->owning_refs, 2);
|
|
451
|
+
|
|
452
|
+
poller_vtable->init(POLLSET_FROM_CQ(cq), &cq->mu);
|
|
453
|
+
vtable->init(DATA_FROM_CQ(cq));
|
|
454
|
+
|
|
455
|
+
GRPC_CLOSURE_INIT(&cq->pollset_shutdown_done, on_pollset_shutdown_done, cq,
|
|
456
|
+
grpc_schedule_on_exec_ctx);
|
|
457
|
+
return cq;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
static void cq_init_next(void* ptr) {
|
|
461
|
+
cq_next_data* cqd = static_cast<cq_next_data*>(ptr);
|
|
462
|
+
/* Initial count is dropped by grpc_completion_queue_shutdown */
|
|
463
|
+
gpr_atm_no_barrier_store(&cqd->pending_events, 1);
|
|
464
|
+
cqd->shutdown_called = false;
|
|
465
|
+
gpr_atm_no_barrier_store(&cqd->things_queued_ever, 0);
|
|
466
|
+
cq_event_queue_init(&cqd->queue);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
static void cq_destroy_next(void* ptr) {
|
|
470
|
+
cq_next_data* cqd = static_cast<cq_next_data*>(ptr);
|
|
471
|
+
GPR_ASSERT(cq_event_queue_num_items(&cqd->queue) == 0);
|
|
472
|
+
cq_event_queue_destroy(&cqd->queue);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
static void cq_init_pluck(void* ptr) {
|
|
476
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*>(ptr);
|
|
477
|
+
/* Initial count is dropped by grpc_completion_queue_shutdown */
|
|
478
|
+
gpr_atm_no_barrier_store(&cqd->pending_events, 1);
|
|
479
|
+
cqd->completed_tail = &cqd->completed_head;
|
|
480
|
+
cqd->completed_head.next = (uintptr_t)cqd->completed_tail;
|
|
481
|
+
gpr_atm_no_barrier_store(&cqd->shutdown, 0);
|
|
482
|
+
cqd->shutdown_called = false;
|
|
483
|
+
cqd->num_pluckers = 0;
|
|
484
|
+
gpr_atm_no_barrier_store(&cqd->things_queued_ever, 0);
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
static void cq_destroy_pluck(void* ptr) {
|
|
488
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*>(ptr);
|
|
489
|
+
GPR_ASSERT(cqd->completed_head.next == (uintptr_t)&cqd->completed_head);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
grpc_cq_completion_type grpc_get_cq_completion_type(grpc_completion_queue* cq) {
|
|
493
|
+
return cq->vtable->cq_completion_type;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
int grpc_get_cq_poll_num(grpc_completion_queue* cq) {
|
|
497
|
+
int cur_num_polls;
|
|
498
|
+
gpr_mu_lock(cq->mu);
|
|
499
|
+
cur_num_polls = cq->num_polls;
|
|
500
|
+
gpr_mu_unlock(cq->mu);
|
|
501
|
+
return cur_num_polls;
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
#ifndef NDEBUG
|
|
505
|
+
void grpc_cq_internal_ref(grpc_completion_queue* cq, const char* reason,
|
|
506
|
+
const char* file, int line) {
|
|
507
|
+
if (grpc_trace_cq_refcount.enabled()) {
|
|
508
|
+
gpr_atm val = gpr_atm_no_barrier_load(&cq->owning_refs.count);
|
|
509
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
|
510
|
+
"CQ:%p ref %" PRIdPTR " -> %" PRIdPTR " %s", cq, val, val + 1,
|
|
511
|
+
reason);
|
|
512
|
+
}
|
|
513
|
+
#else
|
|
514
|
+
void grpc_cq_internal_ref(grpc_completion_queue* cq) {
|
|
515
|
+
#endif
|
|
516
|
+
gpr_ref(&cq->owning_refs);
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
static void on_pollset_shutdown_done(void* arg, grpc_error* error) {
|
|
520
|
+
grpc_completion_queue* cq = static_cast<grpc_completion_queue*>(arg);
|
|
521
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "pollset_destroy");
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
#ifndef NDEBUG
|
|
525
|
+
void grpc_cq_internal_unref(grpc_completion_queue* cq, const char* reason,
|
|
526
|
+
const char* file, int line) {
|
|
527
|
+
if (grpc_trace_cq_refcount.enabled()) {
|
|
528
|
+
gpr_atm val = gpr_atm_no_barrier_load(&cq->owning_refs.count);
|
|
529
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
|
530
|
+
"CQ:%p unref %" PRIdPTR " -> %" PRIdPTR " %s", cq, val, val - 1,
|
|
531
|
+
reason);
|
|
532
|
+
}
|
|
533
|
+
#else
|
|
534
|
+
void grpc_cq_internal_unref(grpc_completion_queue* cq) {
|
|
535
|
+
#endif
|
|
536
|
+
if (gpr_unref(&cq->owning_refs)) {
|
|
537
|
+
cq->vtable->destroy(DATA_FROM_CQ(cq));
|
|
538
|
+
cq->poller_vtable->destroy(POLLSET_FROM_CQ(cq));
|
|
539
|
+
#ifndef NDEBUG
|
|
540
|
+
gpr_free(cq->outstanding_tags);
|
|
541
|
+
#endif
|
|
542
|
+
gpr_free(cq);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
#ifndef NDEBUG
|
|
547
|
+
static void cq_check_tag(grpc_completion_queue* cq, void* tag, bool lock_cq) {
|
|
548
|
+
int found = 0;
|
|
549
|
+
if (lock_cq) {
|
|
550
|
+
gpr_mu_lock(cq->mu);
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
for (int i = 0; i < static_cast<int>(cq->outstanding_tag_count); i++) {
|
|
554
|
+
if (cq->outstanding_tags[i] == tag) {
|
|
555
|
+
cq->outstanding_tag_count--;
|
|
556
|
+
GPR_SWAP(void*, cq->outstanding_tags[i],
|
|
557
|
+
cq->outstanding_tags[cq->outstanding_tag_count]);
|
|
558
|
+
found = 1;
|
|
559
|
+
break;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
if (lock_cq) {
|
|
564
|
+
gpr_mu_unlock(cq->mu);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
GPR_ASSERT(found);
|
|
568
|
+
}
|
|
569
|
+
#else
|
|
570
|
+
static void cq_check_tag(grpc_completion_queue* cq, void* tag, bool lock_cq) {}
|
|
571
|
+
#endif
|
|
572
|
+
|
|
573
|
+
/* Atomically increments a counter only if the counter is not zero. Returns
|
|
574
|
+
* true if the increment was successful; false if the counter is zero */
|
|
575
|
+
static bool atm_inc_if_nonzero(gpr_atm* counter) {
|
|
576
|
+
while (true) {
|
|
577
|
+
gpr_atm count = gpr_atm_acq_load(counter);
|
|
578
|
+
/* If zero, we are done. If not, we must to a CAS (instead of an atomic
|
|
579
|
+
* increment) to maintain the contract: do not increment the counter if it
|
|
580
|
+
* is zero. */
|
|
581
|
+
if (count == 0) {
|
|
582
|
+
return false;
|
|
583
|
+
} else if (gpr_atm_full_cas(counter, count, count + 1)) {
|
|
584
|
+
break;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
return true;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
static bool cq_begin_op_for_next(grpc_completion_queue* cq, void* tag) {
|
|
592
|
+
cq_next_data* cqd = static_cast<cq_next_data*> DATA_FROM_CQ(cq);
|
|
593
|
+
return atm_inc_if_nonzero(&cqd->pending_events);
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
static bool cq_begin_op_for_pluck(grpc_completion_queue* cq, void* tag) {
|
|
597
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
598
|
+
return atm_inc_if_nonzero(&cqd->pending_events);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
bool grpc_cq_begin_op(grpc_completion_queue* cq, void* tag) {
|
|
602
|
+
#ifndef NDEBUG
|
|
603
|
+
gpr_mu_lock(cq->mu);
|
|
604
|
+
if (cq->outstanding_tag_count == cq->outstanding_tag_capacity) {
|
|
605
|
+
cq->outstanding_tag_capacity = GPR_MAX(4, 2 * cq->outstanding_tag_capacity);
|
|
606
|
+
cq->outstanding_tags = static_cast<void**>(gpr_realloc(
|
|
607
|
+
cq->outstanding_tags,
|
|
608
|
+
sizeof(*cq->outstanding_tags) * cq->outstanding_tag_capacity));
|
|
609
|
+
}
|
|
610
|
+
cq->outstanding_tags[cq->outstanding_tag_count++] = tag;
|
|
611
|
+
gpr_mu_unlock(cq->mu);
|
|
612
|
+
#endif
|
|
613
|
+
return cq->vtable->begin_op(cq, tag);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/* Queue a GRPC_OP_COMPLETED operation to a completion queue (with a
|
|
617
|
+
* completion
|
|
618
|
+
* type of GRPC_CQ_NEXT) */
|
|
619
|
+
static void cq_end_op_for_next(grpc_completion_queue* cq, void* tag,
|
|
620
|
+
grpc_error* error,
|
|
621
|
+
void (*done)(void* done_arg,
|
|
622
|
+
grpc_cq_completion* storage),
|
|
623
|
+
void* done_arg, grpc_cq_completion* storage) {
|
|
624
|
+
GPR_TIMER_SCOPE("cq_end_op_for_next", 0);
|
|
625
|
+
|
|
626
|
+
if (grpc_api_trace.enabled() ||
|
|
627
|
+
(grpc_trace_operation_failures.enabled() && error != GRPC_ERROR_NONE)) {
|
|
628
|
+
const char* errmsg = grpc_error_string(error);
|
|
629
|
+
GRPC_API_TRACE(
|
|
630
|
+
"cq_end_op_for_next(cq=%p, tag=%p, error=%s, "
|
|
631
|
+
"done=%p, done_arg=%p, storage=%p)",
|
|
632
|
+
6, (cq, tag, errmsg, done, done_arg, storage));
|
|
633
|
+
if (grpc_trace_operation_failures.enabled() && error != GRPC_ERROR_NONE) {
|
|
634
|
+
gpr_log(GPR_ERROR, "Operation failed: tag=%p, error=%s", tag, errmsg);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
cq_next_data* cqd = static_cast<cq_next_data*> DATA_FROM_CQ(cq);
|
|
638
|
+
int is_success = (error == GRPC_ERROR_NONE);
|
|
639
|
+
|
|
640
|
+
storage->tag = tag;
|
|
641
|
+
storage->done = done;
|
|
642
|
+
storage->done_arg = done_arg;
|
|
643
|
+
storage->next = static_cast<uintptr_t>(is_success);
|
|
644
|
+
|
|
645
|
+
cq_check_tag(cq, tag, true); /* Used in debug builds only */
|
|
646
|
+
|
|
647
|
+
if ((grpc_completion_queue*)gpr_tls_get(&g_cached_cq) == cq &&
|
|
648
|
+
(grpc_cq_completion*)gpr_tls_get(&g_cached_event) == nullptr) {
|
|
649
|
+
gpr_tls_set(&g_cached_event, (intptr_t)storage);
|
|
650
|
+
} else {
|
|
651
|
+
/* Add the completion to the queue */
|
|
652
|
+
bool is_first = cq_event_queue_push(&cqd->queue, storage);
|
|
653
|
+
gpr_atm_no_barrier_fetch_add(&cqd->things_queued_ever, 1);
|
|
654
|
+
|
|
655
|
+
/* Since we do not hold the cq lock here, it is important to do an 'acquire'
|
|
656
|
+
load here (instead of a 'no_barrier' load) to match with the release
|
|
657
|
+
store
|
|
658
|
+
(done via gpr_atm_full_fetch_add(pending_events, -1)) in cq_shutdown_next
|
|
659
|
+
*/
|
|
660
|
+
bool will_definitely_shutdown = gpr_atm_acq_load(&cqd->pending_events) == 1;
|
|
661
|
+
|
|
662
|
+
if (!will_definitely_shutdown) {
|
|
663
|
+
/* Only kick if this is the first item queued */
|
|
664
|
+
if (is_first) {
|
|
665
|
+
gpr_mu_lock(cq->mu);
|
|
666
|
+
grpc_error* kick_error =
|
|
667
|
+
cq->poller_vtable->kick(POLLSET_FROM_CQ(cq), nullptr);
|
|
668
|
+
gpr_mu_unlock(cq->mu);
|
|
669
|
+
|
|
670
|
+
if (kick_error != GRPC_ERROR_NONE) {
|
|
671
|
+
const char* msg = grpc_error_string(kick_error);
|
|
672
|
+
gpr_log(GPR_ERROR, "Kick failed: %s", msg);
|
|
673
|
+
GRPC_ERROR_UNREF(kick_error);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
if (gpr_atm_full_fetch_add(&cqd->pending_events, -1) == 1) {
|
|
677
|
+
GRPC_CQ_INTERNAL_REF(cq, "shutting_down");
|
|
678
|
+
gpr_mu_lock(cq->mu);
|
|
679
|
+
cq_finish_shutdown_next(cq);
|
|
680
|
+
gpr_mu_unlock(cq->mu);
|
|
681
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down");
|
|
682
|
+
}
|
|
683
|
+
} else {
|
|
684
|
+
GRPC_CQ_INTERNAL_REF(cq, "shutting_down");
|
|
685
|
+
gpr_atm_rel_store(&cqd->pending_events, 0);
|
|
686
|
+
gpr_mu_lock(cq->mu);
|
|
687
|
+
cq_finish_shutdown_next(cq);
|
|
688
|
+
gpr_mu_unlock(cq->mu);
|
|
689
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down");
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
|
|
693
|
+
GRPC_ERROR_UNREF(error);
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
/* Queue a GRPC_OP_COMPLETED operation to a completion queue (with a
|
|
697
|
+
* completion
|
|
698
|
+
* type of GRPC_CQ_PLUCK) */
|
|
699
|
+
static void cq_end_op_for_pluck(grpc_completion_queue* cq, void* tag,
|
|
700
|
+
grpc_error* error,
|
|
701
|
+
void (*done)(void* done_arg,
|
|
702
|
+
grpc_cq_completion* storage),
|
|
703
|
+
void* done_arg, grpc_cq_completion* storage) {
|
|
704
|
+
GPR_TIMER_SCOPE("cq_end_op_for_pluck", 0);
|
|
705
|
+
|
|
706
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
707
|
+
int is_success = (error == GRPC_ERROR_NONE);
|
|
708
|
+
|
|
709
|
+
if (grpc_api_trace.enabled() ||
|
|
710
|
+
(grpc_trace_operation_failures.enabled() && error != GRPC_ERROR_NONE)) {
|
|
711
|
+
const char* errmsg = grpc_error_string(error);
|
|
712
|
+
GRPC_API_TRACE(
|
|
713
|
+
"cq_end_op_for_pluck(cq=%p, tag=%p, error=%s, "
|
|
714
|
+
"done=%p, done_arg=%p, storage=%p)",
|
|
715
|
+
6, (cq, tag, errmsg, done, done_arg, storage));
|
|
716
|
+
if (grpc_trace_operation_failures.enabled() && error != GRPC_ERROR_NONE) {
|
|
717
|
+
gpr_log(GPR_ERROR, "Operation failed: tag=%p, error=%s", tag, errmsg);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
storage->tag = tag;
|
|
722
|
+
storage->done = done;
|
|
723
|
+
storage->done_arg = done_arg;
|
|
724
|
+
storage->next =
|
|
725
|
+
((uintptr_t)&cqd->completed_head) | (static_cast<uintptr_t>(is_success));
|
|
726
|
+
|
|
727
|
+
gpr_mu_lock(cq->mu);
|
|
728
|
+
cq_check_tag(cq, tag, false); /* Used in debug builds only */
|
|
729
|
+
|
|
730
|
+
/* Add to the list of completions */
|
|
731
|
+
gpr_atm_no_barrier_fetch_add(&cqd->things_queued_ever, 1);
|
|
732
|
+
cqd->completed_tail->next =
|
|
733
|
+
((uintptr_t)storage) | (1u & cqd->completed_tail->next);
|
|
734
|
+
cqd->completed_tail = storage;
|
|
735
|
+
|
|
736
|
+
if (gpr_atm_full_fetch_add(&cqd->pending_events, -1) == 1) {
|
|
737
|
+
cq_finish_shutdown_pluck(cq);
|
|
738
|
+
gpr_mu_unlock(cq->mu);
|
|
739
|
+
} else {
|
|
740
|
+
grpc_pollset_worker* pluck_worker = nullptr;
|
|
741
|
+
for (int i = 0; i < cqd->num_pluckers; i++) {
|
|
742
|
+
if (cqd->pluckers[i].tag == tag) {
|
|
743
|
+
pluck_worker = *cqd->pluckers[i].worker;
|
|
744
|
+
break;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
grpc_error* kick_error =
|
|
749
|
+
cq->poller_vtable->kick(POLLSET_FROM_CQ(cq), pluck_worker);
|
|
750
|
+
|
|
751
|
+
gpr_mu_unlock(cq->mu);
|
|
752
|
+
|
|
753
|
+
if (kick_error != GRPC_ERROR_NONE) {
|
|
754
|
+
const char* msg = grpc_error_string(kick_error);
|
|
755
|
+
gpr_log(GPR_ERROR, "Kick failed: %s", msg);
|
|
756
|
+
|
|
757
|
+
GRPC_ERROR_UNREF(kick_error);
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
GRPC_ERROR_UNREF(error);
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
void grpc_cq_end_op(grpc_completion_queue* cq, void* tag, grpc_error* error,
|
|
765
|
+
void (*done)(void* done_arg, grpc_cq_completion* storage),
|
|
766
|
+
void* done_arg, grpc_cq_completion* storage) {
|
|
767
|
+
cq->vtable->end_op(cq, tag, error, done, done_arg, storage);
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
typedef struct {
|
|
771
|
+
gpr_atm last_seen_things_queued_ever;
|
|
772
|
+
grpc_completion_queue* cq;
|
|
773
|
+
grpc_millis deadline;
|
|
774
|
+
grpc_cq_completion* stolen_completion;
|
|
775
|
+
void* tag; /* for pluck */
|
|
776
|
+
bool first_loop;
|
|
777
|
+
} cq_is_finished_arg;
|
|
778
|
+
|
|
779
|
+
class ExecCtxNext : public grpc_core::ExecCtx {
|
|
780
|
+
public:
|
|
781
|
+
ExecCtxNext(void* arg) : ExecCtx(0), check_ready_to_finish_arg_(arg) {}
|
|
782
|
+
|
|
783
|
+
bool CheckReadyToFinish() override {
|
|
784
|
+
cq_is_finished_arg* a =
|
|
785
|
+
static_cast<cq_is_finished_arg*>(check_ready_to_finish_arg_);
|
|
786
|
+
grpc_completion_queue* cq = a->cq;
|
|
787
|
+
cq_next_data* cqd = static_cast<cq_next_data*> DATA_FROM_CQ(cq);
|
|
788
|
+
GPR_ASSERT(a->stolen_completion == nullptr);
|
|
789
|
+
|
|
790
|
+
gpr_atm current_last_seen_things_queued_ever =
|
|
791
|
+
gpr_atm_no_barrier_load(&cqd->things_queued_ever);
|
|
792
|
+
|
|
793
|
+
if (current_last_seen_things_queued_ever !=
|
|
794
|
+
a->last_seen_things_queued_ever) {
|
|
795
|
+
a->last_seen_things_queued_ever =
|
|
796
|
+
gpr_atm_no_barrier_load(&cqd->things_queued_ever);
|
|
797
|
+
|
|
798
|
+
/* Pop a cq_completion from the queue. Returns NULL if the queue is empty
|
|
799
|
+
* might return NULL in some cases even if the queue is not empty; but
|
|
800
|
+
* that
|
|
801
|
+
* is ok and doesn't affect correctness. Might effect the tail latencies a
|
|
802
|
+
* bit) */
|
|
803
|
+
a->stolen_completion = cq_event_queue_pop(&cqd->queue);
|
|
804
|
+
if (a->stolen_completion != nullptr) {
|
|
805
|
+
return true;
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
return !a->first_loop && a->deadline < grpc_core::ExecCtx::Get()->Now();
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
private:
|
|
812
|
+
void* check_ready_to_finish_arg_;
|
|
813
|
+
};
|
|
814
|
+
|
|
815
|
+
#ifndef NDEBUG
|
|
816
|
+
static void dump_pending_tags(grpc_completion_queue* cq) {
|
|
817
|
+
if (!grpc_trace_pending_tags.enabled()) return;
|
|
818
|
+
|
|
819
|
+
gpr_strvec v;
|
|
820
|
+
gpr_strvec_init(&v);
|
|
821
|
+
gpr_strvec_add(&v, gpr_strdup("PENDING TAGS:"));
|
|
822
|
+
gpr_mu_lock(cq->mu);
|
|
823
|
+
for (size_t i = 0; i < cq->outstanding_tag_count; i++) {
|
|
824
|
+
char* s;
|
|
825
|
+
gpr_asprintf(&s, " %p", cq->outstanding_tags[i]);
|
|
826
|
+
gpr_strvec_add(&v, s);
|
|
827
|
+
}
|
|
828
|
+
gpr_mu_unlock(cq->mu);
|
|
829
|
+
char* out = gpr_strvec_flatten(&v, nullptr);
|
|
830
|
+
gpr_strvec_destroy(&v);
|
|
831
|
+
gpr_log(GPR_DEBUG, "%s", out);
|
|
832
|
+
gpr_free(out);
|
|
833
|
+
}
|
|
834
|
+
#else
|
|
835
|
+
static void dump_pending_tags(grpc_completion_queue* cq) {}
|
|
836
|
+
#endif
|
|
837
|
+
|
|
838
|
+
static grpc_event cq_next(grpc_completion_queue* cq, gpr_timespec deadline,
|
|
839
|
+
void* reserved) {
|
|
840
|
+
GPR_TIMER_SCOPE("grpc_completion_queue_next", 0);
|
|
841
|
+
|
|
842
|
+
grpc_event ret;
|
|
843
|
+
cq_next_data* cqd = static_cast<cq_next_data*> DATA_FROM_CQ(cq);
|
|
844
|
+
|
|
845
|
+
GRPC_API_TRACE(
|
|
846
|
+
"grpc_completion_queue_next("
|
|
847
|
+
"cq=%p, "
|
|
848
|
+
"deadline=gpr_timespec { tv_sec: %" PRId64
|
|
849
|
+
", tv_nsec: %d, clock_type: %d }, "
|
|
850
|
+
"reserved=%p)",
|
|
851
|
+
5,
|
|
852
|
+
(cq, deadline.tv_sec, deadline.tv_nsec, (int)deadline.clock_type,
|
|
853
|
+
reserved));
|
|
854
|
+
GPR_ASSERT(!reserved);
|
|
855
|
+
|
|
856
|
+
dump_pending_tags(cq);
|
|
857
|
+
|
|
858
|
+
GRPC_CQ_INTERNAL_REF(cq, "next");
|
|
859
|
+
|
|
860
|
+
grpc_millis deadline_millis = grpc_timespec_to_millis_round_up(deadline);
|
|
861
|
+
cq_is_finished_arg is_finished_arg = {
|
|
862
|
+
gpr_atm_no_barrier_load(&cqd->things_queued_ever),
|
|
863
|
+
cq,
|
|
864
|
+
deadline_millis,
|
|
865
|
+
nullptr,
|
|
866
|
+
nullptr,
|
|
867
|
+
true};
|
|
868
|
+
ExecCtxNext exec_ctx(&is_finished_arg);
|
|
869
|
+
for (;;) {
|
|
870
|
+
grpc_millis iteration_deadline = deadline_millis;
|
|
871
|
+
|
|
872
|
+
if (is_finished_arg.stolen_completion != nullptr) {
|
|
873
|
+
grpc_cq_completion* c = is_finished_arg.stolen_completion;
|
|
874
|
+
is_finished_arg.stolen_completion = nullptr;
|
|
875
|
+
ret.type = GRPC_OP_COMPLETE;
|
|
876
|
+
ret.success = c->next & 1u;
|
|
877
|
+
ret.tag = c->tag;
|
|
878
|
+
c->done(c->done_arg, c);
|
|
879
|
+
break;
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
grpc_cq_completion* c = cq_event_queue_pop(&cqd->queue);
|
|
883
|
+
|
|
884
|
+
if (c != nullptr) {
|
|
885
|
+
ret.type = GRPC_OP_COMPLETE;
|
|
886
|
+
ret.success = c->next & 1u;
|
|
887
|
+
ret.tag = c->tag;
|
|
888
|
+
c->done(c->done_arg, c);
|
|
889
|
+
break;
|
|
890
|
+
} else {
|
|
891
|
+
/* If c == NULL it means either the queue is empty OR in an transient
|
|
892
|
+
inconsistent state. If it is the latter, we shold do a 0-timeout poll
|
|
893
|
+
so that the thread comes back quickly from poll to make a second
|
|
894
|
+
attempt at popping. Not doing this can potentially deadlock this
|
|
895
|
+
thread forever (if the deadline is infinity) */
|
|
896
|
+
if (cq_event_queue_num_items(&cqd->queue) > 0) {
|
|
897
|
+
iteration_deadline = 0;
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
if (gpr_atm_acq_load(&cqd->pending_events) == 0) {
|
|
902
|
+
/* Before returning, check if the queue has any items left over (since
|
|
903
|
+
gpr_mpscq_pop() can sometimes return NULL even if the queue is not
|
|
904
|
+
empty. If so, keep retrying but do not return GRPC_QUEUE_SHUTDOWN */
|
|
905
|
+
if (cq_event_queue_num_items(&cqd->queue) > 0) {
|
|
906
|
+
/* Go to the beginning of the loop. No point doing a poll because
|
|
907
|
+
(cq->shutdown == true) is only possible when there is no pending
|
|
908
|
+
work (i.e cq->pending_events == 0) and any outstanding completion
|
|
909
|
+
events should have already been queued on this cq */
|
|
910
|
+
continue;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
memset(&ret, 0, sizeof(ret));
|
|
914
|
+
ret.type = GRPC_QUEUE_SHUTDOWN;
|
|
915
|
+
break;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
if (!is_finished_arg.first_loop &&
|
|
919
|
+
grpc_core::ExecCtx::Get()->Now() >= deadline_millis) {
|
|
920
|
+
memset(&ret, 0, sizeof(ret));
|
|
921
|
+
ret.type = GRPC_QUEUE_TIMEOUT;
|
|
922
|
+
dump_pending_tags(cq);
|
|
923
|
+
break;
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/* The main polling work happens in grpc_pollset_work */
|
|
927
|
+
gpr_mu_lock(cq->mu);
|
|
928
|
+
cq->num_polls++;
|
|
929
|
+
grpc_error* err = cq->poller_vtable->work(POLLSET_FROM_CQ(cq), nullptr,
|
|
930
|
+
iteration_deadline);
|
|
931
|
+
gpr_mu_unlock(cq->mu);
|
|
932
|
+
|
|
933
|
+
if (err != GRPC_ERROR_NONE) {
|
|
934
|
+
const char* msg = grpc_error_string(err);
|
|
935
|
+
gpr_log(GPR_ERROR, "Completion queue next failed: %s", msg);
|
|
936
|
+
|
|
937
|
+
GRPC_ERROR_UNREF(err);
|
|
938
|
+
memset(&ret, 0, sizeof(ret));
|
|
939
|
+
ret.type = GRPC_QUEUE_TIMEOUT;
|
|
940
|
+
dump_pending_tags(cq);
|
|
941
|
+
break;
|
|
942
|
+
}
|
|
943
|
+
is_finished_arg.first_loop = false;
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
if (cq_event_queue_num_items(&cqd->queue) > 0 &&
|
|
947
|
+
gpr_atm_acq_load(&cqd->pending_events) > 0) {
|
|
948
|
+
gpr_mu_lock(cq->mu);
|
|
949
|
+
cq->poller_vtable->kick(POLLSET_FROM_CQ(cq), nullptr);
|
|
950
|
+
gpr_mu_unlock(cq->mu);
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, &ret);
|
|
954
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "next");
|
|
955
|
+
|
|
956
|
+
GPR_ASSERT(is_finished_arg.stolen_completion == nullptr);
|
|
957
|
+
|
|
958
|
+
return ret;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
/* Finishes the completion queue shutdown. This means that there are no more
|
|
962
|
+
completion events / tags expected from the completion queue
|
|
963
|
+
- Must be called under completion queue lock
|
|
964
|
+
- Must be called only once in completion queue's lifetime
|
|
965
|
+
- grpc_completion_queue_shutdown() MUST have been called before calling
|
|
966
|
+
this function */
|
|
967
|
+
static void cq_finish_shutdown_next(grpc_completion_queue* cq) {
|
|
968
|
+
cq_next_data* cqd = static_cast<cq_next_data*> DATA_FROM_CQ(cq);
|
|
969
|
+
|
|
970
|
+
GPR_ASSERT(cqd->shutdown_called);
|
|
971
|
+
GPR_ASSERT(gpr_atm_no_barrier_load(&cqd->pending_events) == 0);
|
|
972
|
+
|
|
973
|
+
cq->poller_vtable->shutdown(POLLSET_FROM_CQ(cq), &cq->pollset_shutdown_done);
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
static void cq_shutdown_next(grpc_completion_queue* cq) {
|
|
977
|
+
cq_next_data* cqd = static_cast<cq_next_data*> DATA_FROM_CQ(cq);
|
|
978
|
+
|
|
979
|
+
/* Need an extra ref for cq here because:
|
|
980
|
+
* We call cq_finish_shutdown_next() below, that would call pollset shutdown.
|
|
981
|
+
* Pollset shutdown decrements the cq ref count which can potentially destroy
|
|
982
|
+
* the cq (if that happens to be the last ref).
|
|
983
|
+
* Creating an extra ref here prevents the cq from getting destroyed while
|
|
984
|
+
* this function is still active */
|
|
985
|
+
GRPC_CQ_INTERNAL_REF(cq, "shutting_down");
|
|
986
|
+
gpr_mu_lock(cq->mu);
|
|
987
|
+
if (cqd->shutdown_called) {
|
|
988
|
+
gpr_mu_unlock(cq->mu);
|
|
989
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down");
|
|
990
|
+
return;
|
|
991
|
+
}
|
|
992
|
+
cqd->shutdown_called = true;
|
|
993
|
+
/* Doing a full_fetch_add (i.e acq/release) here to match with
|
|
994
|
+
* cq_begin_op_for_next and and cq_end_op_for_next functions which read/write
|
|
995
|
+
* on this counter without necessarily holding a lock on cq */
|
|
996
|
+
if (gpr_atm_full_fetch_add(&cqd->pending_events, -1) == 1) {
|
|
997
|
+
cq_finish_shutdown_next(cq);
|
|
998
|
+
}
|
|
999
|
+
gpr_mu_unlock(cq->mu);
|
|
1000
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down");
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
grpc_event grpc_completion_queue_next(grpc_completion_queue* cq,
|
|
1004
|
+
gpr_timespec deadline, void* reserved) {
|
|
1005
|
+
return cq->vtable->next(cq, deadline, reserved);
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
static int add_plucker(grpc_completion_queue* cq, void* tag,
|
|
1009
|
+
grpc_pollset_worker** worker) {
|
|
1010
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
1011
|
+
if (cqd->num_pluckers == GRPC_MAX_COMPLETION_QUEUE_PLUCKERS) {
|
|
1012
|
+
return 0;
|
|
1013
|
+
}
|
|
1014
|
+
cqd->pluckers[cqd->num_pluckers].tag = tag;
|
|
1015
|
+
cqd->pluckers[cqd->num_pluckers].worker = worker;
|
|
1016
|
+
cqd->num_pluckers++;
|
|
1017
|
+
return 1;
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
static void del_plucker(grpc_completion_queue* cq, void* tag,
|
|
1021
|
+
grpc_pollset_worker** worker) {
|
|
1022
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
1023
|
+
for (int i = 0; i < cqd->num_pluckers; i++) {
|
|
1024
|
+
if (cqd->pluckers[i].tag == tag && cqd->pluckers[i].worker == worker) {
|
|
1025
|
+
cqd->num_pluckers--;
|
|
1026
|
+
GPR_SWAP(plucker, cqd->pluckers[i], cqd->pluckers[cqd->num_pluckers]);
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
GPR_UNREACHABLE_CODE(return );
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
class ExecCtxPluck : public grpc_core::ExecCtx {
|
|
1034
|
+
public:
|
|
1035
|
+
ExecCtxPluck(void* arg) : ExecCtx(0), check_ready_to_finish_arg_(arg) {}
|
|
1036
|
+
|
|
1037
|
+
bool CheckReadyToFinish() override {
|
|
1038
|
+
cq_is_finished_arg* a =
|
|
1039
|
+
static_cast<cq_is_finished_arg*>(check_ready_to_finish_arg_);
|
|
1040
|
+
grpc_completion_queue* cq = a->cq;
|
|
1041
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
1042
|
+
|
|
1043
|
+
GPR_ASSERT(a->stolen_completion == nullptr);
|
|
1044
|
+
gpr_atm current_last_seen_things_queued_ever =
|
|
1045
|
+
gpr_atm_no_barrier_load(&cqd->things_queued_ever);
|
|
1046
|
+
if (current_last_seen_things_queued_ever !=
|
|
1047
|
+
a->last_seen_things_queued_ever) {
|
|
1048
|
+
gpr_mu_lock(cq->mu);
|
|
1049
|
+
a->last_seen_things_queued_ever =
|
|
1050
|
+
gpr_atm_no_barrier_load(&cqd->things_queued_ever);
|
|
1051
|
+
grpc_cq_completion* c;
|
|
1052
|
+
grpc_cq_completion* prev = &cqd->completed_head;
|
|
1053
|
+
while ((c = (grpc_cq_completion*)(prev->next &
|
|
1054
|
+
~static_cast<uintptr_t>(1))) !=
|
|
1055
|
+
&cqd->completed_head) {
|
|
1056
|
+
if (c->tag == a->tag) {
|
|
1057
|
+
prev->next = (prev->next & static_cast<uintptr_t>(1)) |
|
|
1058
|
+
(c->next & ~static_cast<uintptr_t>(1));
|
|
1059
|
+
if (c == cqd->completed_tail) {
|
|
1060
|
+
cqd->completed_tail = prev;
|
|
1061
|
+
}
|
|
1062
|
+
gpr_mu_unlock(cq->mu);
|
|
1063
|
+
a->stolen_completion = c;
|
|
1064
|
+
return true;
|
|
1065
|
+
}
|
|
1066
|
+
prev = c;
|
|
1067
|
+
}
|
|
1068
|
+
gpr_mu_unlock(cq->mu);
|
|
1069
|
+
}
|
|
1070
|
+
return !a->first_loop && a->deadline < grpc_core::ExecCtx::Get()->Now();
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
private:
|
|
1074
|
+
void* check_ready_to_finish_arg_;
|
|
1075
|
+
};
|
|
1076
|
+
|
|
1077
|
+
static grpc_event cq_pluck(grpc_completion_queue* cq, void* tag,
|
|
1078
|
+
gpr_timespec deadline, void* reserved) {
|
|
1079
|
+
GPR_TIMER_SCOPE("grpc_completion_queue_pluck", 0);
|
|
1080
|
+
|
|
1081
|
+
grpc_event ret;
|
|
1082
|
+
grpc_cq_completion* c;
|
|
1083
|
+
grpc_cq_completion* prev;
|
|
1084
|
+
grpc_pollset_worker* worker = nullptr;
|
|
1085
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
1086
|
+
|
|
1087
|
+
if (grpc_cq_pluck_trace.enabled()) {
|
|
1088
|
+
GRPC_API_TRACE(
|
|
1089
|
+
"grpc_completion_queue_pluck("
|
|
1090
|
+
"cq=%p, tag=%p, "
|
|
1091
|
+
"deadline=gpr_timespec { tv_sec: %" PRId64
|
|
1092
|
+
", tv_nsec: %d, clock_type: %d }, "
|
|
1093
|
+
"reserved=%p)",
|
|
1094
|
+
6,
|
|
1095
|
+
(cq, tag, deadline.tv_sec, deadline.tv_nsec, (int)deadline.clock_type,
|
|
1096
|
+
reserved));
|
|
1097
|
+
}
|
|
1098
|
+
GPR_ASSERT(!reserved);
|
|
1099
|
+
|
|
1100
|
+
dump_pending_tags(cq);
|
|
1101
|
+
|
|
1102
|
+
GRPC_CQ_INTERNAL_REF(cq, "pluck");
|
|
1103
|
+
gpr_mu_lock(cq->mu);
|
|
1104
|
+
grpc_millis deadline_millis = grpc_timespec_to_millis_round_up(deadline);
|
|
1105
|
+
cq_is_finished_arg is_finished_arg = {
|
|
1106
|
+
gpr_atm_no_barrier_load(&cqd->things_queued_ever),
|
|
1107
|
+
cq,
|
|
1108
|
+
deadline_millis,
|
|
1109
|
+
nullptr,
|
|
1110
|
+
tag,
|
|
1111
|
+
true};
|
|
1112
|
+
ExecCtxPluck exec_ctx(&is_finished_arg);
|
|
1113
|
+
for (;;) {
|
|
1114
|
+
if (is_finished_arg.stolen_completion != nullptr) {
|
|
1115
|
+
gpr_mu_unlock(cq->mu);
|
|
1116
|
+
c = is_finished_arg.stolen_completion;
|
|
1117
|
+
is_finished_arg.stolen_completion = nullptr;
|
|
1118
|
+
ret.type = GRPC_OP_COMPLETE;
|
|
1119
|
+
ret.success = c->next & 1u;
|
|
1120
|
+
ret.tag = c->tag;
|
|
1121
|
+
c->done(c->done_arg, c);
|
|
1122
|
+
break;
|
|
1123
|
+
}
|
|
1124
|
+
prev = &cqd->completed_head;
|
|
1125
|
+
while (
|
|
1126
|
+
(c = (grpc_cq_completion*)(prev->next & ~static_cast<uintptr_t>(1))) !=
|
|
1127
|
+
&cqd->completed_head) {
|
|
1128
|
+
if (c->tag == tag) {
|
|
1129
|
+
prev->next = (prev->next & static_cast<uintptr_t>(1)) |
|
|
1130
|
+
(c->next & ~static_cast<uintptr_t>(1));
|
|
1131
|
+
if (c == cqd->completed_tail) {
|
|
1132
|
+
cqd->completed_tail = prev;
|
|
1133
|
+
}
|
|
1134
|
+
gpr_mu_unlock(cq->mu);
|
|
1135
|
+
ret.type = GRPC_OP_COMPLETE;
|
|
1136
|
+
ret.success = c->next & 1u;
|
|
1137
|
+
ret.tag = c->tag;
|
|
1138
|
+
c->done(c->done_arg, c);
|
|
1139
|
+
goto done;
|
|
1140
|
+
}
|
|
1141
|
+
prev = c;
|
|
1142
|
+
}
|
|
1143
|
+
if (gpr_atm_no_barrier_load(&cqd->shutdown)) {
|
|
1144
|
+
gpr_mu_unlock(cq->mu);
|
|
1145
|
+
memset(&ret, 0, sizeof(ret));
|
|
1146
|
+
ret.type = GRPC_QUEUE_SHUTDOWN;
|
|
1147
|
+
break;
|
|
1148
|
+
}
|
|
1149
|
+
if (!add_plucker(cq, tag, &worker)) {
|
|
1150
|
+
gpr_log(GPR_DEBUG,
|
|
1151
|
+
"Too many outstanding grpc_completion_queue_pluck calls: maximum "
|
|
1152
|
+
"is %d",
|
|
1153
|
+
GRPC_MAX_COMPLETION_QUEUE_PLUCKERS);
|
|
1154
|
+
gpr_mu_unlock(cq->mu);
|
|
1155
|
+
memset(&ret, 0, sizeof(ret));
|
|
1156
|
+
/* TODO(ctiller): should we use a different result here */
|
|
1157
|
+
ret.type = GRPC_QUEUE_TIMEOUT;
|
|
1158
|
+
dump_pending_tags(cq);
|
|
1159
|
+
break;
|
|
1160
|
+
}
|
|
1161
|
+
if (!is_finished_arg.first_loop &&
|
|
1162
|
+
grpc_core::ExecCtx::Get()->Now() >= deadline_millis) {
|
|
1163
|
+
del_plucker(cq, tag, &worker);
|
|
1164
|
+
gpr_mu_unlock(cq->mu);
|
|
1165
|
+
memset(&ret, 0, sizeof(ret));
|
|
1166
|
+
ret.type = GRPC_QUEUE_TIMEOUT;
|
|
1167
|
+
dump_pending_tags(cq);
|
|
1168
|
+
break;
|
|
1169
|
+
}
|
|
1170
|
+
cq->num_polls++;
|
|
1171
|
+
grpc_error* err =
|
|
1172
|
+
cq->poller_vtable->work(POLLSET_FROM_CQ(cq), &worker, deadline_millis);
|
|
1173
|
+
if (err != GRPC_ERROR_NONE) {
|
|
1174
|
+
del_plucker(cq, tag, &worker);
|
|
1175
|
+
gpr_mu_unlock(cq->mu);
|
|
1176
|
+
const char* msg = grpc_error_string(err);
|
|
1177
|
+
gpr_log(GPR_ERROR, "Completion queue pluck failed: %s", msg);
|
|
1178
|
+
|
|
1179
|
+
GRPC_ERROR_UNREF(err);
|
|
1180
|
+
memset(&ret, 0, sizeof(ret));
|
|
1181
|
+
ret.type = GRPC_QUEUE_TIMEOUT;
|
|
1182
|
+
dump_pending_tags(cq);
|
|
1183
|
+
break;
|
|
1184
|
+
}
|
|
1185
|
+
is_finished_arg.first_loop = false;
|
|
1186
|
+
del_plucker(cq, tag, &worker);
|
|
1187
|
+
}
|
|
1188
|
+
done:
|
|
1189
|
+
GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, &ret);
|
|
1190
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "pluck");
|
|
1191
|
+
|
|
1192
|
+
GPR_ASSERT(is_finished_arg.stolen_completion == nullptr);
|
|
1193
|
+
|
|
1194
|
+
return ret;
|
|
1195
|
+
}
|
|
1196
|
+
|
|
1197
|
+
grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag,
|
|
1198
|
+
gpr_timespec deadline, void* reserved) {
|
|
1199
|
+
return cq->vtable->pluck(cq, tag, deadline, reserved);
|
|
1200
|
+
}
|
|
1201
|
+
|
|
1202
|
+
static void cq_finish_shutdown_pluck(grpc_completion_queue* cq) {
|
|
1203
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
1204
|
+
|
|
1205
|
+
GPR_ASSERT(cqd->shutdown_called);
|
|
1206
|
+
GPR_ASSERT(!gpr_atm_no_barrier_load(&cqd->shutdown));
|
|
1207
|
+
gpr_atm_no_barrier_store(&cqd->shutdown, 1);
|
|
1208
|
+
|
|
1209
|
+
cq->poller_vtable->shutdown(POLLSET_FROM_CQ(cq), &cq->pollset_shutdown_done);
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
/* NOTE: This function is almost exactly identical to cq_shutdown_next() but
|
|
1213
|
+
* merging them is a bit tricky and probably not worth it */
|
|
1214
|
+
static void cq_shutdown_pluck(grpc_completion_queue* cq) {
|
|
1215
|
+
cq_pluck_data* cqd = static_cast<cq_pluck_data*> DATA_FROM_CQ(cq);
|
|
1216
|
+
|
|
1217
|
+
/* Need an extra ref for cq here because:
|
|
1218
|
+
* We call cq_finish_shutdown_pluck() below, that would call pollset shutdown.
|
|
1219
|
+
* Pollset shutdown decrements the cq ref count which can potentially destroy
|
|
1220
|
+
* the cq (if that happens to be the last ref).
|
|
1221
|
+
* Creating an extra ref here prevents the cq from getting destroyed while
|
|
1222
|
+
* this function is still active */
|
|
1223
|
+
GRPC_CQ_INTERNAL_REF(cq, "shutting_down (pluck cq)");
|
|
1224
|
+
gpr_mu_lock(cq->mu);
|
|
1225
|
+
if (cqd->shutdown_called) {
|
|
1226
|
+
gpr_mu_unlock(cq->mu);
|
|
1227
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (pluck cq)");
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1230
|
+
cqd->shutdown_called = true;
|
|
1231
|
+
if (gpr_atm_full_fetch_add(&cqd->pending_events, -1) == 1) {
|
|
1232
|
+
cq_finish_shutdown_pluck(cq);
|
|
1233
|
+
}
|
|
1234
|
+
gpr_mu_unlock(cq->mu);
|
|
1235
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (pluck cq)");
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
/* Shutdown simply drops a ref that we reserved at creation time; if we drop
|
|
1239
|
+
to zero here, then enter shutdown mode and wake up any waiters */
|
|
1240
|
+
void grpc_completion_queue_shutdown(grpc_completion_queue* cq) {
|
|
1241
|
+
GPR_TIMER_SCOPE("grpc_completion_queue_shutdown", 0);
|
|
1242
|
+
grpc_core::ExecCtx exec_ctx;
|
|
1243
|
+
GRPC_API_TRACE("grpc_completion_queue_shutdown(cq=%p)", 1, (cq));
|
|
1244
|
+
cq->vtable->shutdown(cq);
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
void grpc_completion_queue_destroy(grpc_completion_queue* cq) {
|
|
1248
|
+
GPR_TIMER_SCOPE("grpc_completion_queue_destroy", 0);
|
|
1249
|
+
GRPC_API_TRACE("grpc_completion_queue_destroy(cq=%p)", 1, (cq));
|
|
1250
|
+
grpc_completion_queue_shutdown(cq);
|
|
1251
|
+
|
|
1252
|
+
grpc_core::ExecCtx exec_ctx;
|
|
1253
|
+
GRPC_CQ_INTERNAL_UNREF(cq, "destroy");
|
|
1254
|
+
}
|
|
1255
|
+
|
|
1256
|
+
grpc_pollset* grpc_cq_pollset(grpc_completion_queue* cq) {
|
|
1257
|
+
return cq->poller_vtable->can_get_pollset ? POLLSET_FROM_CQ(cq) : nullptr;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
bool grpc_cq_can_listen(grpc_completion_queue* cq) {
|
|
1261
|
+
return cq->poller_vtable->can_listen;
|
|
1262
|
+
}
|