grpc 1.0.1 → 1.1.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +3696 -867
- data/etc/roots.pem +39 -111
- data/include/grpc/byte_buffer.h +64 -1
- data/include/grpc/census.h +40 -96
- data/include/grpc/compression.h +2 -1
- data/include/grpc/grpc.h +42 -7
- data/include/grpc/grpc_posix.h +8 -5
- data/include/grpc/impl/codegen/atm.h +3 -0
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
- data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
- data/include/grpc/impl/codegen/atm_windows.h +4 -0
- data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
- data/include/grpc/impl/codegen/compression_types.h +1 -1
- data/include/grpc/impl/codegen/connectivity_state.h +2 -0
- data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
- data/include/grpc/impl/codegen/gpr_slice.h +84 -0
- data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
- data/include/grpc/impl/codegen/grpc_types.h +91 -9
- data/include/grpc/impl/codegen/port_platform.h +25 -92
- data/include/grpc/impl/codegen/slice.h +54 -97
- data/include/grpc/impl/codegen/sync.h +0 -253
- data/include/grpc/module.modulemap +0 -2
- data/include/grpc/slice.h +132 -0
- data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
- data/include/grpc/support/alloc.h +40 -1
- data/include/grpc/support/log.h +80 -1
- data/include/grpc/support/log_windows.h +2 -0
- data/include/grpc/support/string_util.h +1 -1
- data/include/grpc/support/sync.h +252 -0
- data/include/grpc/support/time.h +67 -1
- data/src/boringssl/err_data.c +639 -627
- data/src/core/ext/census/base_resources.c +71 -0
- data/src/core/ext/census/base_resources.h +39 -0
- data/src/core/ext/census/gen/census.pb.c +26 -29
- data/src/core/ext/census/gen/census.pb.h +68 -67
- data/src/core/ext/census/gen/trace_context.pb.c +81 -0
- data/src/core/ext/census/gen/trace_context.pb.h +99 -0
- data/src/core/ext/census/grpc_filter.c +22 -16
- data/src/core/ext/census/grpc_plugin.c +2 -1
- data/src/core/ext/census/initialize.c +16 -4
- data/src/core/ext/census/mlog.h +1 -1
- data/src/core/ext/census/placeholders.c +0 -45
- data/src/core/ext/census/resource.c +312 -0
- data/src/core/ext/census/resource.h +63 -0
- data/src/core/ext/census/trace_context.c +86 -0
- data/src/core/ext/census/trace_context.h +68 -0
- data/src/core/ext/census/tracing.c +8 -2
- data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
- data/src/core/ext/client_channel/client_channel.c +1218 -0
- data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
- data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
- data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
- data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
- data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
- data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
- data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
- data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
- data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
- data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
- data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
- data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
- data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
- data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
- data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
- data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
- data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
- data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
- data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
- data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
- data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
- data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
- data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
- data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
- data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
- data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
- data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
- data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
- data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
- data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
- data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
- data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
- data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
- data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
- data/src/core/ext/load_reporting/load_reporting.c +7 -56
- data/src/core/ext/load_reporting/load_reporting.h +41 -28
- data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
- data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
- data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
- data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
- data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
- data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
- data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
- data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
- data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
- data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
- data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
- data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
- data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
- data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
- data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
- data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
- data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
- data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
- data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
- data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
- data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
- data/src/core/lib/channel/channel_args.c +70 -13
- data/src/core/lib/channel/channel_args.h +28 -2
- data/src/core/lib/channel/channel_stack.c +77 -28
- data/src/core/lib/channel/channel_stack.h +61 -23
- data/src/core/lib/channel/channel_stack_builder.c +33 -25
- data/src/core/lib/channel/channel_stack_builder.h +17 -8
- data/src/core/lib/channel/compress_filter.c +52 -36
- data/src/core/lib/channel/connected_channel.c +20 -12
- data/src/core/lib/channel/connected_channel.h +2 -1
- data/src/core/lib/channel/context.h +13 -1
- data/src/core/lib/channel/deadline_filter.c +344 -0
- data/src/core/lib/channel/deadline_filter.h +99 -0
- data/src/core/lib/channel/handshaker.c +240 -0
- data/src/core/lib/channel/handshaker.h +164 -0
- data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
- data/src/core/lib/channel/handshaker_factory.h +66 -0
- data/src/core/lib/channel/handshaker_registry.c +113 -0
- data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
- data/src/core/lib/channel/http_client_filter.c +248 -46
- data/src/core/lib/channel/http_client_filter.h +3 -0
- data/src/core/lib/channel/http_server_filter.c +136 -24
- data/src/core/lib/channel/message_size_filter.c +261 -0
- data/src/core/lib/channel/message_size_filter.h +39 -0
- data/src/core/lib/compression/message_compress.c +43 -37
- data/src/core/lib/compression/message_compress.h +7 -5
- data/src/core/lib/http/format_request.c +26 -11
- data/src/core/lib/http/format_request.h +7 -5
- data/src/core/lib/http/httpcli.c +45 -27
- data/src/core/lib/http/httpcli.h +4 -4
- data/src/core/lib/http/httpcli_security_connector.c +56 -46
- data/src/core/lib/http/parser.c +17 -14
- data/src/core/lib/http/parser.h +4 -2
- data/src/core/lib/iomgr/closure.c +49 -7
- data/src/core/lib/iomgr/closure.h +56 -14
- data/src/core/lib/iomgr/combiner.c +422 -0
- data/src/core/lib/iomgr/combiner.h +64 -0
- data/src/core/lib/iomgr/endpoint.c +8 -2
- data/src/core/lib/iomgr/endpoint.h +17 -7
- data/src/core/lib/iomgr/endpoint_pair.h +3 -2
- data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
- data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
- data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
- data/src/core/lib/iomgr/error.c +72 -6
- data/src/core/lib/iomgr/error.h +30 -3
- data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
- data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
- data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
- data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
- data/src/core/lib/iomgr/ev_posix.c +26 -5
- data/src/core/lib/iomgr/ev_posix.h +12 -1
- data/src/core/lib/iomgr/exec_ctx.c +27 -94
- data/src/core/lib/iomgr/exec_ctx.h +19 -22
- data/src/core/lib/iomgr/executor.c +29 -8
- data/src/core/lib/iomgr/executor.h +2 -4
- data/src/core/lib/iomgr/iocp_windows.c +3 -4
- data/src/core/lib/iomgr/iomgr.c +14 -10
- data/src/core/lib/iomgr/iomgr.h +6 -2
- data/src/core/lib/iomgr/iomgr_posix.c +2 -2
- data/src/core/lib/iomgr/iomgr_uv.c +49 -0
- data/src/core/lib/iomgr/iomgr_windows.c +2 -2
- data/src/core/lib/iomgr/load_file.c +3 -3
- data/src/core/lib/iomgr/load_file.h +2 -2
- data/src/core/lib/iomgr/network_status_tracker.c +1 -1
- data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
- data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
- data/src/core/lib/iomgr/pollset_uv.c +142 -0
- data/src/core/lib/iomgr/pollset_uv.h +42 -0
- data/src/core/lib/iomgr/pollset_windows.c +5 -6
- data/src/core/lib/iomgr/port.h +129 -0
- data/src/core/lib/iomgr/resolve_address.h +2 -1
- data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
- data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
- data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
- data/src/core/lib/iomgr/resource_quota.c +832 -0
- data/src/core/lib/iomgr/resource_quota.h +159 -0
- data/src/core/lib/iomgr/sockaddr.h +10 -2
- data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
- data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
- data/src/core/lib/iomgr/socket_mutator.c +98 -0
- data/src/core/lib/iomgr/socket_mutator.h +80 -0
- data/src/core/lib/iomgr/socket_utils.h +42 -0
- data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
- data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
- data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
- data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
- data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
- data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
- data/src/core/lib/iomgr/socket_windows.c +14 -6
- data/src/core/lib/iomgr/socket_windows.h +1 -0
- data/src/core/lib/iomgr/tcp_client.h +8 -2
- data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
- data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
- data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
- data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
- data/src/core/lib/iomgr/tcp_posix.c +135 -56
- data/src/core/lib/iomgr/tcp_posix.h +2 -2
- data/src/core/lib/iomgr/tcp_server.h +14 -6
- data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
- data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
- data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
- data/src/core/lib/iomgr/tcp_uv.c +367 -0
- data/src/core/lib/iomgr/tcp_uv.h +59 -0
- data/src/core/lib/iomgr/tcp_windows.c +65 -48
- data/src/core/lib/iomgr/tcp_windows.h +3 -1
- data/src/core/lib/iomgr/timer.h +21 -21
- data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
- data/src/core/lib/iomgr/timer_generic.h +49 -0
- data/src/core/lib/iomgr/timer_heap.c +6 -0
- data/src/core/lib/iomgr/timer_uv.c +99 -0
- data/src/core/lib/iomgr/timer_uv.h +47 -0
- data/src/core/lib/iomgr/udp_server.c +116 -98
- data/src/core/lib/iomgr/udp_server.h +5 -3
- data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
- data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
- data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
- data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
- data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
- data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
- data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
- data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
- data/src/core/lib/iomgr/workqueue.h +12 -20
- data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
- data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
- data/src/core/lib/iomgr/workqueue_windows.c +9 -8
- data/src/core/lib/json/json.c +3 -3
- data/src/core/lib/json/json.h +11 -11
- data/src/core/lib/json/json_reader.c +9 -5
- data/src/core/lib/profiling/basic_timers.c +10 -1
- data/src/core/lib/profiling/timers.h +2 -0
- data/src/core/lib/security/context/security_context.c +13 -3
- data/src/core/lib/security/context/security_context.h +20 -0
- data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
- data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
- data/src/core/lib/security/credentials/credentials.c +48 -19
- data/src/core/lib/security/credentials/credentials.h +36 -19
- data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
- data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
- data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
- data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
- data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
- data/src/core/lib/security/transport/client_auth_filter.c +33 -27
- data/src/core/lib/security/transport/secure_endpoint.c +93 -68
- data/src/core/lib/security/transport/secure_endpoint.h +2 -2
- data/src/core/lib/security/transport/security_connector.c +133 -168
- data/src/core/lib/security/transport/security_connector.h +31 -46
- data/src/core/lib/security/transport/security_handshaker.c +501 -0
- data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
- data/src/core/lib/security/transport/server_auth_filter.c +50 -38
- data/src/core/lib/security/util/b64.c +11 -8
- data/src/core/lib/security/util/b64.h +5 -4
- data/src/core/lib/slice/percent_encoding.c +182 -0
- data/src/core/lib/slice/percent_encoding.h +78 -0
- data/src/core/lib/{support → slice}/slice.c +81 -50
- data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
- data/src/core/lib/slice/slice_internal.h +49 -0
- data/src/core/lib/slice/slice_string_helpers.c +90 -0
- data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
- data/src/core/lib/support/backoff.c +24 -13
- data/src/core/lib/support/backoff.h +5 -2
- data/src/core/lib/support/env.h +0 -2
- data/src/core/lib/support/log.c +5 -4
- data/src/core/lib/support/log_linux.c +0 -1
- data/src/core/lib/support/log_posix.c +1 -1
- data/src/core/lib/support/mpscq.c +83 -0
- data/src/core/lib/support/mpscq.h +65 -0
- data/src/core/lib/support/string.c +58 -49
- data/src/core/lib/support/string.h +11 -8
- data/src/core/lib/support/subprocess_posix.c +5 -2
- data/src/core/lib/support/thd.c +1 -1
- data/src/core/lib/support/time.c +43 -79
- data/src/core/lib/support/time_posix.c +1 -1
- data/src/core/lib/support/tmpfile.h +0 -2
- data/src/core/lib/surface/alarm.c +4 -1
- data/src/core/lib/surface/byte_buffer.c +17 -11
- data/src/core/lib/surface/byte_buffer_reader.c +23 -15
- data/src/core/lib/surface/call.c +294 -276
- data/src/core/lib/surface/call.h +24 -9
- data/src/core/lib/surface/call_log_batch.c +5 -3
- data/src/core/lib/surface/channel.c +127 -111
- data/src/core/lib/surface/channel.h +14 -5
- data/src/core/lib/surface/channel_init.c +1 -1
- data/src/core/lib/surface/channel_init.h +10 -1
- data/src/core/lib/surface/channel_ping.c +7 -6
- data/src/core/lib/surface/completion_queue.c +154 -18
- data/src/core/lib/surface/completion_queue.h +5 -0
- data/src/core/lib/surface/init.c +40 -6
- data/src/core/lib/surface/init.h +1 -0
- data/src/core/lib/surface/init_secure.c +5 -2
- data/src/core/lib/surface/lame_client.c +28 -18
- data/src/core/lib/surface/server.c +134 -87
- data/src/core/lib/surface/server.h +8 -0
- data/src/core/lib/surface/validate_metadata.c +1 -1
- data/src/core/lib/surface/version.c +3 -1
- data/src/core/lib/transport/byte_stream.c +7 -4
- data/src/core/lib/transport/byte_stream.h +6 -10
- data/src/core/lib/transport/connectivity_state.c +21 -12
- data/src/core/lib/transport/connectivity_state.h +4 -1
- data/src/core/lib/transport/mdstr_hash_table.c +118 -0
- data/src/core/lib/transport/mdstr_hash_table.h +77 -0
- data/src/core/lib/transport/metadata.c +83 -60
- data/src/core/lib/transport/metadata.h +41 -23
- data/src/core/lib/transport/metadata_batch.c +17 -11
- data/src/core/lib/transport/metadata_batch.h +20 -6
- data/src/core/lib/transport/pid_controller.c +57 -0
- data/src/core/lib/transport/pid_controller.h +64 -0
- data/src/core/lib/transport/service_config.c +251 -0
- data/src/core/lib/transport/service_config.h +71 -0
- data/src/core/lib/transport/static_metadata.c +18 -16
- data/src/core/lib/transport/static_metadata.h +113 -107
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
- data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
- data/src/core/lib/transport/transport.c +84 -23
- data/src/core/lib/transport/transport.h +53 -8
- data/src/core/lib/transport/transport_impl.h +3 -0
- data/src/core/lib/transport/transport_op_string.c +92 -20
- data/src/core/lib/tsi/ssl_transport_security.c +3 -1
- data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
- data/src/ruby/ext/grpc/extconf.rb +0 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
- data/src/ruby/ext/grpc/rb_call.c +15 -5
- data/src/ruby/ext/grpc/rb_channel.c +1 -1
- data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
- data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
- data/src/ruby/ext/grpc/rb_grpc.c +3 -1
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
- data/src/ruby/ext/grpc/rb_server.c +18 -12
- data/src/ruby/lib/grpc/errors.rb +154 -2
- data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
- data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
- data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
- data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
- data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
- data/src/ruby/lib/grpc/generic/service.rb +3 -2
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/checker.rb +3 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
- data/src/ruby/pb/test/client.rb +307 -7
- data/src/ruby/pb/test/server.rb +26 -1
- data/src/ruby/spec/compression_options_spec.rb +164 -0
- data/src/ruby/spec/error_sanity_spec.rb +64 -0
- data/src/ruby/spec/generic/active_call_spec.rb +290 -12
- data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
- data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
- data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
- data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
- data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
- data/src/ruby/spec/spec_helper.rb +2 -0
- data/third_party/boringssl/crypto/aes/aes.c +12 -12
- data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
- data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
- data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
- data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
- data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
- data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
- data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
- data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
- data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
- data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
- data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
- data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
- data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
- data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
- data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
- data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
- data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
- data/third_party/boringssl/crypto/base64/base64.c +249 -285
- data/third_party/boringssl/crypto/bio/bio.c +13 -23
- data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
- data/third_party/boringssl/crypto/bio/connect.c +12 -3
- data/third_party/boringssl/crypto/bio/fd.c +22 -15
- data/third_party/boringssl/crypto/bio/file.c +2 -38
- data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
- data/third_party/boringssl/crypto/bio/internal.h +3 -0
- data/third_party/boringssl/crypto/bio/pair.c +1 -1
- data/third_party/boringssl/crypto/bio/socket.c +10 -2
- data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
- data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
- data/third_party/boringssl/crypto/bn/bn.c +38 -0
- data/third_party/boringssl/crypto/bn/cmp.c +25 -0
- data/third_party/boringssl/crypto/bn/convert.c +73 -76
- data/third_party/boringssl/crypto/bn/div.c +136 -70
- data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
- data/third_party/boringssl/crypto/bn/gcd.c +213 -296
- data/third_party/boringssl/crypto/bn/generic.c +0 -80
- data/third_party/boringssl/crypto/bn/internal.h +15 -3
- data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
- data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
- data/third_party/boringssl/crypto/bn/mul.c +2 -1
- data/third_party/boringssl/crypto/bn/prime.c +24 -8
- data/third_party/boringssl/crypto/bn/random.c +47 -33
- data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
- data/third_party/boringssl/crypto/buf/buf.c +25 -21
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
- data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
- data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
- data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
- data/third_party/boringssl/crypto/cipher/aead.c +11 -22
- data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
- data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
- data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
- data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
- data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
- data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
- data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
- data/third_party/boringssl/crypto/cipher/internal.h +8 -10
- data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
- data/third_party/boringssl/crypto/conf/conf.c +2 -1
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
- data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
- data/third_party/boringssl/crypto/cpu-arm.c +0 -161
- data/third_party/boringssl/crypto/cpu-intel.c +5 -3
- data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
- data/third_party/boringssl/crypto/crypto.c +29 -7
- data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
- data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
- data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
- data/third_party/boringssl/crypto/dh/check.c +22 -6
- data/third_party/boringssl/crypto/dh/dh.c +45 -21
- data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
- data/third_party/boringssl/crypto/dh/params.c +30 -78
- data/third_party/boringssl/crypto/digest/digest.c +3 -3
- data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
- data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
- data/third_party/boringssl/crypto/ec/ec.c +84 -140
- data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
- data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
- data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
- data/third_party/boringssl/crypto/ec/internal.h +12 -36
- data/third_party/boringssl/crypto/ec/oct.c +11 -11
- data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
- data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
- data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
- data/third_party/boringssl/crypto/ec/simple.c +81 -201
- data/third_party/boringssl/crypto/ec/util-64.c +0 -74
- data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
- data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
- data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
- data/third_party/boringssl/crypto/engine/engine.c +1 -1
- data/third_party/boringssl/crypto/err/err.c +3 -3
- data/third_party/boringssl/crypto/evp/evp.c +14 -59
- data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
- data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
- data/third_party/boringssl/crypto/evp/internal.h +4 -46
- data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
- data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
- data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
- data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
- data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
- data/third_party/boringssl/crypto/evp/print.c +520 -0
- data/third_party/boringssl/crypto/ex_data.c +4 -6
- data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
- data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
- data/third_party/boringssl/crypto/internal.h +57 -77
- data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
- data/third_party/boringssl/crypto/md4/md4.c +9 -0
- data/third_party/boringssl/crypto/mem.c +19 -19
- data/third_party/boringssl/crypto/modes/cfb.c +5 -6
- data/third_party/boringssl/crypto/modes/ctr.c +10 -18
- data/third_party/boringssl/crypto/modes/gcm.c +100 -66
- data/third_party/boringssl/crypto/modes/internal.h +15 -27
- data/third_party/boringssl/crypto/modes/ofb.c +9 -22
- data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
- data/third_party/boringssl/crypto/newhope/internal.h +71 -0
- data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
- data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
- data/third_party/boringssl/crypto/newhope/poly.c +183 -0
- data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
- data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
- data/third_party/boringssl/crypto/obj/obj.c +111 -135
- data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
- data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
- data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
- data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
- data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
- data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
- data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
- data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
- data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
- data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
- data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
- data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
- data/third_party/boringssl/crypto/rand/rand.c +4 -1
- data/third_party/boringssl/crypto/rand/urandom.c +5 -7
- data/third_party/boringssl/crypto/rand/windows.c +5 -8
- data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
- data/third_party/boringssl/crypto/refcount_lock.c +2 -2
- data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
- data/third_party/boringssl/crypto/rsa/internal.h +5 -13
- data/third_party/boringssl/crypto/rsa/padding.c +64 -63
- data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
- data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
- data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
- data/third_party/boringssl/crypto/sha/sha256.c +2 -2
- data/third_party/boringssl/crypto/sha/sha512.c +7 -7
- data/third_party/boringssl/crypto/stack/stack.c +13 -22
- data/third_party/boringssl/crypto/thread.c +21 -12
- data/third_party/boringssl/crypto/thread_none.c +6 -2
- data/third_party/boringssl/crypto/thread_pthread.c +16 -7
- data/third_party/boringssl/crypto/thread_win.c +38 -85
- data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
- data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
- data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
- data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
- data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
- data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
- data/third_party/boringssl/crypto/x509/internal.h +66 -0
- data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
- data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
- data/third_party/boringssl/crypto/x509/x509.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
- data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
- data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
- data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
- data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
- data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
- data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
- data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
- data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
- data/third_party/boringssl/crypto/x509/x_name.c +14 -17
- data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
- data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
- data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
- data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
- data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
- data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
- data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
- data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
- data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
- data/third_party/boringssl/include/openssl/aead.h +72 -73
- data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
- data/third_party/boringssl/include/openssl/asn1.h +103 -235
- data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
- data/third_party/boringssl/include/openssl/asn1t.h +1 -11
- data/third_party/boringssl/include/openssl/base.h +145 -3
- data/third_party/boringssl/include/openssl/base64.h +20 -17
- data/third_party/boringssl/include/openssl/bio.h +59 -34
- data/third_party/boringssl/include/openssl/bn.h +118 -51
- data/third_party/boringssl/include/openssl/buf.h +15 -0
- data/third_party/boringssl/include/openssl/bytestring.h +52 -4
- data/third_party/boringssl/include/openssl/chacha.h +2 -2
- data/third_party/boringssl/include/openssl/cipher.h +18 -1
- data/third_party/boringssl/include/openssl/cmac.h +11 -0
- data/third_party/boringssl/include/openssl/conf.h +13 -2
- data/third_party/boringssl/include/openssl/cpu.h +20 -23
- data/third_party/boringssl/include/openssl/crypto.h +22 -1
- data/third_party/boringssl/include/openssl/curve25519.h +96 -4
- data/third_party/boringssl/include/openssl/dh.h +71 -16
- data/third_party/boringssl/include/openssl/digest.h +38 -11
- data/third_party/boringssl/include/openssl/dsa.h +40 -4
- data/third_party/boringssl/include/openssl/ec.h +44 -18
- data/third_party/boringssl/include/openssl/ec_key.h +27 -6
- data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
- data/third_party/boringssl/include/openssl/engine.h +11 -0
- data/third_party/boringssl/include/openssl/evp.h +52 -88
- data/third_party/boringssl/include/openssl/hkdf.h +24 -4
- data/third_party/boringssl/include/openssl/hmac.h +20 -6
- data/third_party/boringssl/include/openssl/md4.h +4 -0
- data/third_party/boringssl/include/openssl/mem.h +19 -0
- data/third_party/boringssl/include/openssl/newhope.h +158 -0
- data/third_party/boringssl/include/openssl/nid.h +4166 -0
- data/third_party/boringssl/include/openssl/obj.h +31 -3
- data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
- data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
- data/third_party/boringssl/include/openssl/pem.h +5 -0
- data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
- data/third_party/boringssl/include/openssl/rand.h +6 -0
- data/third_party/boringssl/include/openssl/rc4.h +6 -0
- data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
- data/third_party/boringssl/include/openssl/rsa.h +127 -65
- data/third_party/boringssl/include/openssl/sha.h +14 -10
- data/third_party/boringssl/include/openssl/ssl.h +561 -275
- data/third_party/boringssl/include/openssl/ssl3.h +18 -25
- data/third_party/boringssl/include/openssl/stack.h +2 -4
- data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
- data/third_party/boringssl/include/openssl/thread.h +31 -13
- data/third_party/boringssl/include/openssl/time_support.h +1 -0
- data/third_party/boringssl/include/openssl/tls1.h +37 -33
- data/third_party/boringssl/include/openssl/x509.h +69 -26
- data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
- data/third_party/boringssl/include/openssl/x509v3.h +23 -2
- data/third_party/boringssl/ssl/custom_extensions.c +3 -5
- data/third_party/boringssl/ssl/d1_both.c +463 -499
- data/third_party/boringssl/ssl/d1_lib.c +38 -109
- data/third_party/boringssl/ssl/d1_pkt.c +173 -334
- data/third_party/boringssl/ssl/d1_srtp.c +20 -18
- data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
- data/third_party/boringssl/ssl/dtls_record.c +27 -26
- data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
- data/third_party/boringssl/ssl/handshake_server.c +1932 -0
- data/third_party/boringssl/ssl/internal.h +712 -439
- data/third_party/boringssl/ssl/s3_both.c +445 -257
- data/third_party/boringssl/ssl/s3_enc.c +53 -36
- data/third_party/boringssl/ssl/s3_lib.c +23 -268
- data/third_party/boringssl/ssl/s3_pkt.c +168 -364
- data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
- data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
- data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
- data/third_party/boringssl/ssl/ssl_cert.c +324 -49
- data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
- data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
- data/third_party/boringssl/ssl/ssl_file.c +21 -68
- data/third_party/boringssl/ssl/ssl_lib.c +881 -510
- data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
- data/third_party/boringssl/ssl/ssl_session.c +324 -103
- data/third_party/boringssl/ssl/ssl_stat.c +6 -88
- data/third_party/boringssl/ssl/t1_enc.c +23 -39
- data/third_party/boringssl/ssl/t1_lib.c +1120 -622
- data/third_party/boringssl/ssl/tls13_both.c +440 -0
- data/third_party/boringssl/ssl/tls13_client.c +682 -0
- data/third_party/boringssl/ssl/tls13_enc.c +391 -0
- data/third_party/boringssl/ssl/tls13_server.c +672 -0
- data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
- data/third_party/boringssl/ssl/tls_record.c +159 -77
- data/third_party/nanopb/pb.h +60 -28
- data/third_party/nanopb/pb_decode.c +120 -92
- data/third_party/nanopb/pb_decode.h +3 -3
- data/third_party/nanopb/pb_encode.c +73 -67
- data/third_party/nanopb/pb_encode.h +4 -4
- metadata +155 -89
- data/include/grpc/impl/codegen/byte_buffer.h +0 -122
- data/include/grpc/impl/codegen/log.h +0 -118
- data/include/grpc/impl/codegen/time.h +0 -130
- data/src/core/ext/client_config/client_channel.c +0 -593
- data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
- data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
- data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
- data/src/core/lib/iomgr/workqueue_posix.c +0 -151
- data/src/core/lib/security/transport/handshake.c +0 -368
- data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
- data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
- data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
- data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
- data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
- data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
- data/third_party/boringssl/crypto/directory.h +0 -66
- data/third_party/boringssl/crypto/directory_posix.c +0 -108
- data/third_party/boringssl/crypto/directory_win.c +0 -144
- data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
- data/third_party/boringssl/include/openssl/pqueue.h +0 -146
- data/third_party/boringssl/ssl/d1_clnt.c +0 -561
- data/third_party/boringssl/ssl/d1_srvr.c +0 -476
- data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
- data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
- data/third_party/boringssl/ssl/test/async_bio.h +0 -45
- data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
- data/third_party/boringssl/ssl/test/test_config.h +0 -110
@@ -40,6 +40,9 @@
|
|
40
40
|
|
41
41
|
extern const grpc_channel_filter grpc_server_top_filter;
|
42
42
|
|
43
|
+
/** Lightweight tracing of server channel state */
|
44
|
+
extern int grpc_server_channel_trace;
|
45
|
+
|
43
46
|
/* Add a listener to the server: when the server starts, it will call start,
|
44
47
|
and when it shuts down, it will call destroy */
|
45
48
|
void grpc_server_add_listener(
|
@@ -60,4 +63,9 @@ const grpc_channel_args *grpc_server_get_channel_args(grpc_server *server);
|
|
60
63
|
|
61
64
|
int grpc_server_has_open_connections(grpc_server *server);
|
62
65
|
|
66
|
+
/* Do not call this before grpc_server_start. Returns the pollsets and the
|
67
|
+
* number of pollsets via 'pollsets' and 'pollset_count'. */
|
68
|
+
void grpc_server_get_pollsets(grpc_server *server, grpc_pollset ***pollsets,
|
69
|
+
size_t *pollset_count);
|
70
|
+
|
63
71
|
#endif /* GRPC_CORE_LIB_SURFACE_SERVER_H */
|
@@ -53,7 +53,7 @@ int grpc_header_key_is_legal(const char *key, size_t length) {
|
|
53
53
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xff, 0x03, 0x00, 0x00, 0x00,
|
54
54
|
0x80, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
55
55
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
56
|
-
if (length == 0) {
|
56
|
+
if (length == 0 || key[0] == ':') {
|
57
57
|
return 0;
|
58
58
|
}
|
59
59
|
return conforms_to(key, length, legal_header_bits);
|
@@ -37,8 +37,10 @@
|
|
37
37
|
|
38
38
|
#include <grpc/support/log.h>
|
39
39
|
|
40
|
+
#include "src/core/lib/slice/slice_internal.h"
|
41
|
+
|
40
42
|
int grpc_byte_stream_next(grpc_exec_ctx *exec_ctx,
|
41
|
-
grpc_byte_stream *byte_stream,
|
43
|
+
grpc_byte_stream *byte_stream, grpc_slice *slice,
|
42
44
|
size_t max_size_hint, grpc_closure *on_complete) {
|
43
45
|
return byte_stream->next(exec_ctx, byte_stream, slice, max_size_hint,
|
44
46
|
on_complete);
|
@@ -53,11 +55,12 @@ void grpc_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
|
|
53
55
|
|
54
56
|
static int slice_buffer_stream_next(grpc_exec_ctx *exec_ctx,
|
55
57
|
grpc_byte_stream *byte_stream,
|
56
|
-
|
58
|
+
grpc_slice *slice, size_t max_size_hint,
|
57
59
|
grpc_closure *on_complete) {
|
58
60
|
grpc_slice_buffer_stream *stream = (grpc_slice_buffer_stream *)byte_stream;
|
59
61
|
GPR_ASSERT(stream->cursor < stream->backing_buffer->count);
|
60
|
-
*slice =
|
62
|
+
*slice =
|
63
|
+
grpc_slice_ref_internal(stream->backing_buffer->slices[stream->cursor]);
|
61
64
|
stream->cursor++;
|
62
65
|
return 1;
|
63
66
|
}
|
@@ -66,7 +69,7 @@ static void slice_buffer_stream_destroy(grpc_exec_ctx *exec_ctx,
|
|
66
69
|
grpc_byte_stream *byte_stream) {}
|
67
70
|
|
68
71
|
void grpc_slice_buffer_stream_init(grpc_slice_buffer_stream *stream,
|
69
|
-
|
72
|
+
grpc_slice_buffer *slice_buffer,
|
70
73
|
uint32_t flags) {
|
71
74
|
GPR_ASSERT(slice_buffer->length <= UINT32_MAX);
|
72
75
|
stream->base.length = (uint32_t)slice_buffer->length;
|
@@ -34,7 +34,7 @@
|
|
34
34
|
#ifndef GRPC_CORE_LIB_TRANSPORT_BYTE_STREAM_H
|
35
35
|
#define GRPC_CORE_LIB_TRANSPORT_BYTE_STREAM_H
|
36
36
|
|
37
|
-
#include <grpc/
|
37
|
+
#include <grpc/slice_buffer.h>
|
38
38
|
#include "src/core/lib/iomgr/exec_ctx.h"
|
39
39
|
|
40
40
|
/** Internal bit flag for grpc_begin_message's \a flags signaling the use of
|
@@ -50,7 +50,7 @@ struct grpc_byte_stream {
|
|
50
50
|
uint32_t length;
|
51
51
|
uint32_t flags;
|
52
52
|
int (*next)(grpc_exec_ctx *exec_ctx, grpc_byte_stream *byte_stream,
|
53
|
-
|
53
|
+
grpc_slice *slice, size_t max_size_hint,
|
54
54
|
grpc_closure *on_complete);
|
55
55
|
void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_byte_stream *byte_stream);
|
56
56
|
};
|
@@ -59,17 +59,13 @@ struct grpc_byte_stream {
|
|
59
59
|
* on_complete will not be called), 0 if the bytes will be available
|
60
60
|
* asynchronously.
|
61
61
|
*
|
62
|
-
*
|
62
|
+
* max_size_hint can be set as a hint as to the maximum number
|
63
63
|
* of bytes that would be acceptable to read.
|
64
64
|
*
|
65
|
-
* fills *buffer, *length, *remaining with the bytes, length of bytes
|
66
|
-
* and length of data remaining to be read before either returning 1
|
67
|
-
* or calling on_complete.
|
68
|
-
*
|
69
65
|
* once a slice is returned into *slice, it is owned by the caller.
|
70
66
|
*/
|
71
67
|
int grpc_byte_stream_next(grpc_exec_ctx *exec_ctx,
|
72
|
-
grpc_byte_stream *byte_stream,
|
68
|
+
grpc_byte_stream *byte_stream, grpc_slice *slice,
|
73
69
|
size_t max_size_hint, grpc_closure *on_complete);
|
74
70
|
|
75
71
|
void grpc_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
|
@@ -78,12 +74,12 @@ void grpc_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
|
|
78
74
|
/* grpc_byte_stream that wraps a slice buffer */
|
79
75
|
typedef struct grpc_slice_buffer_stream {
|
80
76
|
grpc_byte_stream base;
|
81
|
-
|
77
|
+
grpc_slice_buffer *backing_buffer;
|
82
78
|
size_t cursor;
|
83
79
|
} grpc_slice_buffer_stream;
|
84
80
|
|
85
81
|
void grpc_slice_buffer_stream_init(grpc_slice_buffer_stream *stream,
|
86
|
-
|
82
|
+
grpc_slice_buffer *slice_buffer,
|
87
83
|
uint32_t flags);
|
88
84
|
|
89
85
|
#endif /* GRPC_CORE_LIB_TRANSPORT_BYTE_STREAM_H */
|
@@ -43,6 +43,8 @@ int grpc_connectivity_state_trace = 0;
|
|
43
43
|
|
44
44
|
const char *grpc_connectivity_state_name(grpc_connectivity_state state) {
|
45
45
|
switch (state) {
|
46
|
+
case GRPC_CHANNEL_INIT:
|
47
|
+
return "INIT";
|
46
48
|
case GRPC_CHANNEL_IDLE:
|
47
49
|
return "IDLE";
|
48
50
|
case GRPC_CHANNEL_CONNECTING:
|
@@ -79,7 +81,7 @@ void grpc_connectivity_state_destroy(grpc_exec_ctx *exec_ctx,
|
|
79
81
|
} else {
|
80
82
|
error = GRPC_ERROR_CREATE("Shutdown connectivity owner");
|
81
83
|
}
|
82
|
-
|
84
|
+
grpc_closure_sched(exec_ctx, w->notify, error);
|
83
85
|
gpr_free(w);
|
84
86
|
}
|
85
87
|
GRPC_ERROR_UNREF(tracker->current_error);
|
@@ -98,7 +100,12 @@ grpc_connectivity_state grpc_connectivity_state_check(
|
|
98
100
|
return tracker->current_state;
|
99
101
|
}
|
100
102
|
|
101
|
-
|
103
|
+
bool grpc_connectivity_state_has_watchers(
|
104
|
+
grpc_connectivity_state_tracker *connectivity_state) {
|
105
|
+
return connectivity_state->watchers != NULL;
|
106
|
+
}
|
107
|
+
|
108
|
+
bool grpc_connectivity_state_notify_on_state_change(
|
102
109
|
grpc_exec_ctx *exec_ctx, grpc_connectivity_state_tracker *tracker,
|
103
110
|
grpc_connectivity_state *current, grpc_closure *notify) {
|
104
111
|
if (grpc_connectivity_state_trace) {
|
@@ -114,27 +121,27 @@ int grpc_connectivity_state_notify_on_state_change(
|
|
114
121
|
if (current == NULL) {
|
115
122
|
grpc_connectivity_state_watcher *w = tracker->watchers;
|
116
123
|
if (w != NULL && w->notify == notify) {
|
117
|
-
|
124
|
+
grpc_closure_sched(exec_ctx, notify, GRPC_ERROR_CANCELLED);
|
118
125
|
tracker->watchers = w->next;
|
119
126
|
gpr_free(w);
|
120
|
-
return
|
127
|
+
return false;
|
121
128
|
}
|
122
129
|
while (w != NULL) {
|
123
130
|
grpc_connectivity_state_watcher *rm_candidate = w->next;
|
124
131
|
if (rm_candidate != NULL && rm_candidate->notify == notify) {
|
125
|
-
|
132
|
+
grpc_closure_sched(exec_ctx, notify, GRPC_ERROR_CANCELLED);
|
126
133
|
w->next = w->next->next;
|
127
134
|
gpr_free(rm_candidate);
|
128
|
-
return
|
135
|
+
return false;
|
129
136
|
}
|
130
137
|
w = w->next;
|
131
138
|
}
|
132
|
-
return
|
139
|
+
return false;
|
133
140
|
} else {
|
134
141
|
if (tracker->current_state != *current) {
|
135
142
|
*current = tracker->current_state;
|
136
|
-
|
137
|
-
|
143
|
+
grpc_closure_sched(exec_ctx, notify,
|
144
|
+
GRPC_ERROR_REF(tracker->current_error));
|
138
145
|
} else {
|
139
146
|
grpc_connectivity_state_watcher *w = gpr_malloc(sizeof(*w));
|
140
147
|
w->current = current;
|
@@ -159,6 +166,7 @@ void grpc_connectivity_state_set(grpc_exec_ctx *exec_ctx,
|
|
159
166
|
grpc_error_free_string(error_string);
|
160
167
|
}
|
161
168
|
switch (state) {
|
169
|
+
case GRPC_CHANNEL_INIT:
|
162
170
|
case GRPC_CHANNEL_CONNECTING:
|
163
171
|
case GRPC_CHANNEL_IDLE:
|
164
172
|
case GRPC_CHANNEL_READY:
|
@@ -180,10 +188,11 @@ void grpc_connectivity_state_set(grpc_exec_ctx *exec_ctx,
|
|
180
188
|
*w->current = tracker->current_state;
|
181
189
|
tracker->watchers = w->next;
|
182
190
|
if (grpc_connectivity_state_trace) {
|
183
|
-
gpr_log(GPR_DEBUG, "NOTIFY: %p",
|
191
|
+
gpr_log(GPR_DEBUG, "NOTIFY: %p %s: %p", tracker, tracker->name,
|
192
|
+
w->notify);
|
184
193
|
}
|
185
|
-
|
186
|
-
|
194
|
+
grpc_closure_sched(exec_ctx, w->notify,
|
195
|
+
GRPC_ERROR_REF(tracker->current_error));
|
187
196
|
gpr_free(w);
|
188
197
|
}
|
189
198
|
}
|
@@ -75,13 +75,16 @@ void grpc_connectivity_state_set(grpc_exec_ctx *exec_ctx,
|
|
75
75
|
grpc_error *associated_error,
|
76
76
|
const char *reason);
|
77
77
|
|
78
|
+
bool grpc_connectivity_state_has_watchers(
|
79
|
+
grpc_connectivity_state_tracker *tracker);
|
80
|
+
|
78
81
|
grpc_connectivity_state grpc_connectivity_state_check(
|
79
82
|
grpc_connectivity_state_tracker *tracker, grpc_error **current_error);
|
80
83
|
|
81
84
|
/** Return 1 if the channel should start connecting, 0 otherwise.
|
82
85
|
If current==NULL cancel notify if it is already queued (success==0 in that
|
83
86
|
case) */
|
84
|
-
|
87
|
+
bool grpc_connectivity_state_notify_on_state_change(
|
85
88
|
grpc_exec_ctx *exec_ctx, grpc_connectivity_state_tracker *tracker,
|
86
89
|
grpc_connectivity_state *current, grpc_closure *notify);
|
87
90
|
|
@@ -0,0 +1,118 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2016, Google Inc.
|
3
|
+
// All rights reserved.
|
4
|
+
//
|
5
|
+
// Redistribution and use in source and binary forms, with or without
|
6
|
+
// modification, are permitted provided that the following conditions are
|
7
|
+
// met:
|
8
|
+
//
|
9
|
+
// * Redistributions of source code must retain the above copyright
|
10
|
+
// notice, this list of conditions and the following disclaimer.
|
11
|
+
// * Redistributions in binary form must reproduce the above
|
12
|
+
// copyright notice, this list of conditions and the following disclaimer
|
13
|
+
// in the documentation and/or other materials provided with the
|
14
|
+
// distribution.
|
15
|
+
// * Neither the name of Google Inc. nor the names of its
|
16
|
+
// contributors may be used to endorse or promote products derived from
|
17
|
+
// this software without specific prior written permission.
|
18
|
+
//
|
19
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
//
|
31
|
+
|
32
|
+
#include "src/core/lib/transport/mdstr_hash_table.h"
|
33
|
+
|
34
|
+
#include <stdbool.h>
|
35
|
+
#include <string.h>
|
36
|
+
|
37
|
+
#include <grpc/support/alloc.h>
|
38
|
+
#include <grpc/support/log.h>
|
39
|
+
|
40
|
+
#include "src/core/lib/transport/metadata.h"
|
41
|
+
|
42
|
+
struct grpc_mdstr_hash_table {
|
43
|
+
gpr_refcount refs;
|
44
|
+
size_t size;
|
45
|
+
grpc_mdstr_hash_table_entry* entries;
|
46
|
+
};
|
47
|
+
|
48
|
+
// Helper function for insert and get operations that performs quadratic
|
49
|
+
// probing (https://en.wikipedia.org/wiki/Quadratic_probing).
|
50
|
+
static size_t grpc_mdstr_hash_table_find_index(
|
51
|
+
const grpc_mdstr_hash_table* table, const grpc_mdstr* key,
|
52
|
+
bool find_empty) {
|
53
|
+
for (size_t i = 0; i < table->size; ++i) {
|
54
|
+
const size_t idx = (key->hash + i * i) % table->size;
|
55
|
+
if (table->entries[idx].key == NULL) return find_empty ? idx : table->size;
|
56
|
+
if (table->entries[idx].key == key) return idx;
|
57
|
+
}
|
58
|
+
return table->size; // Not found.
|
59
|
+
}
|
60
|
+
|
61
|
+
static void grpc_mdstr_hash_table_add(
|
62
|
+
grpc_mdstr_hash_table* table, grpc_mdstr* key, void* value,
|
63
|
+
const grpc_mdstr_hash_table_vtable* vtable) {
|
64
|
+
GPR_ASSERT(value != NULL);
|
65
|
+
const size_t idx =
|
66
|
+
grpc_mdstr_hash_table_find_index(table, key, true /* find_empty */);
|
67
|
+
GPR_ASSERT(idx != table->size); // Table should never be full.
|
68
|
+
grpc_mdstr_hash_table_entry* entry = &table->entries[idx];
|
69
|
+
entry->key = GRPC_MDSTR_REF(key);
|
70
|
+
entry->value = vtable->copy_value(value);
|
71
|
+
entry->vtable = vtable;
|
72
|
+
}
|
73
|
+
|
74
|
+
grpc_mdstr_hash_table* grpc_mdstr_hash_table_create(
|
75
|
+
size_t num_entries, grpc_mdstr_hash_table_entry* entries) {
|
76
|
+
grpc_mdstr_hash_table* table = gpr_malloc(sizeof(*table));
|
77
|
+
memset(table, 0, sizeof(*table));
|
78
|
+
gpr_ref_init(&table->refs, 1);
|
79
|
+
// Quadratic probing gets best performance when the table is no more
|
80
|
+
// than half full.
|
81
|
+
table->size = num_entries * 2;
|
82
|
+
const size_t entry_size = sizeof(grpc_mdstr_hash_table_entry) * table->size;
|
83
|
+
table->entries = gpr_malloc(entry_size);
|
84
|
+
memset(table->entries, 0, entry_size);
|
85
|
+
for (size_t i = 0; i < num_entries; ++i) {
|
86
|
+
grpc_mdstr_hash_table_entry* entry = &entries[i];
|
87
|
+
grpc_mdstr_hash_table_add(table, entry->key, entry->value, entry->vtable);
|
88
|
+
}
|
89
|
+
return table;
|
90
|
+
}
|
91
|
+
|
92
|
+
grpc_mdstr_hash_table* grpc_mdstr_hash_table_ref(grpc_mdstr_hash_table* table) {
|
93
|
+
if (table != NULL) gpr_ref(&table->refs);
|
94
|
+
return table;
|
95
|
+
}
|
96
|
+
|
97
|
+
void grpc_mdstr_hash_table_unref(grpc_exec_ctx* exec_ctx,
|
98
|
+
grpc_mdstr_hash_table* table) {
|
99
|
+
if (table != NULL && gpr_unref(&table->refs)) {
|
100
|
+
for (size_t i = 0; i < table->size; ++i) {
|
101
|
+
grpc_mdstr_hash_table_entry* entry = &table->entries[i];
|
102
|
+
if (entry->key != NULL) {
|
103
|
+
GRPC_MDSTR_UNREF(exec_ctx, entry->key);
|
104
|
+
entry->vtable->destroy_value(exec_ctx, entry->value);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
gpr_free(table->entries);
|
108
|
+
gpr_free(table);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
void* grpc_mdstr_hash_table_get(const grpc_mdstr_hash_table* table,
|
113
|
+
const grpc_mdstr* key) {
|
114
|
+
const size_t idx =
|
115
|
+
grpc_mdstr_hash_table_find_index(table, key, false /* find_empty */);
|
116
|
+
if (idx == table->size) return NULL; // Not found.
|
117
|
+
return table->entries[idx].value;
|
118
|
+
}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2016, Google Inc.
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* Redistribution and use in source and binary forms, with or without
|
6
|
+
* modification, are permitted provided that the following conditions are
|
7
|
+
* met:
|
8
|
+
*
|
9
|
+
* * Redistributions of source code must retain the above copyright
|
10
|
+
* notice, this list of conditions and the following disclaimer.
|
11
|
+
* * Redistributions in binary form must reproduce the above
|
12
|
+
* copyright notice, this list of conditions and the following disclaimer
|
13
|
+
* in the documentation and/or other materials provided with the
|
14
|
+
* distribution.
|
15
|
+
* * Neither the name of Google Inc. nor the names of its
|
16
|
+
* contributors may be used to endorse or promote products derived from
|
17
|
+
* this software without specific prior written permission.
|
18
|
+
*
|
19
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
+
*/
|
31
|
+
|
32
|
+
#ifndef GRPC_CORE_LIB_TRANSPORT_MDSTR_HASH_TABLE_H
|
33
|
+
#define GRPC_CORE_LIB_TRANSPORT_MDSTR_HASH_TABLE_H
|
34
|
+
|
35
|
+
#include "src/core/lib/transport/metadata.h"
|
36
|
+
|
37
|
+
/** Hash table implementation.
|
38
|
+
*
|
39
|
+
* This implementation uses open addressing
|
40
|
+
* (https://en.wikipedia.org/wiki/Open_addressing) with quadratic
|
41
|
+
* probing (https://en.wikipedia.org/wiki/Quadratic_probing).
|
42
|
+
*
|
43
|
+
* The keys are \a grpc_mdstr objects. The values are arbitrary pointers
|
44
|
+
* with a common vtable.
|
45
|
+
*
|
46
|
+
* Hash tables are intentionally immutable, to avoid the need for locking.
|
47
|
+
*/
|
48
|
+
|
49
|
+
typedef struct grpc_mdstr_hash_table grpc_mdstr_hash_table;
|
50
|
+
|
51
|
+
typedef struct grpc_mdstr_hash_table_vtable {
|
52
|
+
void (*destroy_value)(grpc_exec_ctx* exec_ctx, void* value);
|
53
|
+
void* (*copy_value)(void* value);
|
54
|
+
} grpc_mdstr_hash_table_vtable;
|
55
|
+
|
56
|
+
typedef struct grpc_mdstr_hash_table_entry {
|
57
|
+
grpc_mdstr* key;
|
58
|
+
void* value; /* Must not be NULL. */
|
59
|
+
const grpc_mdstr_hash_table_vtable* vtable;
|
60
|
+
} grpc_mdstr_hash_table_entry;
|
61
|
+
|
62
|
+
/** Creates a new hash table of containing \a entries, which is an array
|
63
|
+
of length \a num_entries.
|
64
|
+
Creates its own copy of all keys and values from \a entries. */
|
65
|
+
grpc_mdstr_hash_table* grpc_mdstr_hash_table_create(
|
66
|
+
size_t num_entries, grpc_mdstr_hash_table_entry* entries);
|
67
|
+
|
68
|
+
grpc_mdstr_hash_table* grpc_mdstr_hash_table_ref(grpc_mdstr_hash_table* table);
|
69
|
+
void grpc_mdstr_hash_table_unref(grpc_exec_ctx* exec_ctx,
|
70
|
+
grpc_mdstr_hash_table* table);
|
71
|
+
|
72
|
+
/** Returns the value from \a table associated with \a key.
|
73
|
+
Returns NULL if \a key is not found. */
|
74
|
+
void* grpc_mdstr_hash_table_get(const grpc_mdstr_hash_table* table,
|
75
|
+
const grpc_mdstr* key);
|
76
|
+
|
77
|
+
#endif /* GRPC_CORE_LIB_TRANSPORT_MDSTR_HASH_TABLE_H */
|
@@ -47,11 +47,12 @@
|
|
47
47
|
|
48
48
|
#include "src/core/lib/iomgr/iomgr_internal.h"
|
49
49
|
#include "src/core/lib/profiling/timers.h"
|
50
|
+
#include "src/core/lib/slice/slice_internal.h"
|
50
51
|
#include "src/core/lib/support/murmur_hash.h"
|
51
52
|
#include "src/core/lib/support/string.h"
|
52
53
|
#include "src/core/lib/transport/static_metadata.h"
|
53
54
|
|
54
|
-
|
55
|
+
grpc_slice (*grpc_chttp2_base64_encode_and_huffman_compress)(grpc_slice input);
|
55
56
|
|
56
57
|
/* There are two kinds of mdelem and mdstr instances.
|
57
58
|
* Static instances are declared in static_metadata.{h,c} and
|
@@ -85,16 +86,16 @@ typedef void (*destroy_user_data_func)(void *user_data);
|
|
85
86
|
/* Shadow structure for grpc_mdstr for non-static values */
|
86
87
|
typedef struct internal_string {
|
87
88
|
/* must be byte compatible with grpc_mdstr */
|
88
|
-
|
89
|
+
grpc_slice slice;
|
89
90
|
uint32_t hash;
|
90
91
|
|
91
92
|
/* private only data */
|
92
93
|
gpr_atm refcnt;
|
93
94
|
|
94
95
|
uint8_t has_base64_and_huffman_encoded;
|
95
|
-
|
96
|
+
grpc_slice_refcount refcount;
|
96
97
|
|
97
|
-
|
98
|
+
grpc_slice base64_and_huffman;
|
98
99
|
|
99
100
|
gpr_atm size_in_decoder_table;
|
100
101
|
|
@@ -153,7 +154,7 @@ static size_t g_static_mdtab_maxprobe;
|
|
153
154
|
static strtab_shard g_strtab_shard[STRTAB_SHARD_COUNT];
|
154
155
|
static mdtab_shard g_mdtab_shard[MDTAB_SHARD_COUNT];
|
155
156
|
|
156
|
-
static void gc_mdtab(mdtab_shard *shard);
|
157
|
+
static void gc_mdtab(grpc_exec_ctx *exec_ctx, mdtab_shard *shard);
|
157
158
|
|
158
159
|
void grpc_test_only_set_metadata_hash_seed(uint32_t seed) {
|
159
160
|
g_hash_seed = seed;
|
@@ -174,7 +175,7 @@ void grpc_mdctx_global_init(void) {
|
|
174
175
|
grpc_mdstr *elem = &grpc_static_mdstr_table[i];
|
175
176
|
const char *str = grpc_static_metadata_strings[i];
|
176
177
|
uint32_t hash = gpr_murmur_hash3(str, strlen(str), g_hash_seed);
|
177
|
-
*(
|
178
|
+
*(grpc_slice *)&elem->slice = grpc_slice_from_static_string(str);
|
178
179
|
*(uint32_t *)&elem->hash = hash;
|
179
180
|
for (j = 0;; j++) {
|
180
181
|
size_t idx = (hash + j) % GPR_ARRAY_SIZE(g_static_strtab);
|
@@ -227,12 +228,12 @@ void grpc_mdctx_global_init(void) {
|
|
227
228
|
}
|
228
229
|
}
|
229
230
|
|
230
|
-
void grpc_mdctx_global_shutdown(
|
231
|
+
void grpc_mdctx_global_shutdown(grpc_exec_ctx *exec_ctx) {
|
231
232
|
size_t i;
|
232
233
|
for (i = 0; i < MDTAB_SHARD_COUNT; i++) {
|
233
234
|
mdtab_shard *shard = &g_mdtab_shard[i];
|
234
235
|
gpr_mu_destroy(&shard->mu);
|
235
|
-
gc_mdtab(shard);
|
236
|
+
gc_mdtab(exec_ctx, shard);
|
236
237
|
/* TODO(ctiller): GPR_ASSERT(shard->count == 0); */
|
237
238
|
if (shard->count != 0) {
|
238
239
|
gpr_log(GPR_DEBUG, "WARNING: %" PRIuPTR " metadata elements were leaked",
|
@@ -278,7 +279,7 @@ static void ref_md_locked(mdtab_shard *shard,
|
|
278
279
|
internal_metadata *md DEBUG_ARGS) {
|
279
280
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG
|
280
281
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
281
|
-
"ELM REF:%p:%
|
282
|
+
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md,
|
282
283
|
gpr_atm_no_barrier_load(&md->refcnt),
|
283
284
|
gpr_atm_no_barrier_load(&md->refcnt) + 1,
|
284
285
|
grpc_mdstr_as_c_string((grpc_mdstr *)md->key),
|
@@ -316,12 +317,13 @@ static void grow_strtab(strtab_shard *shard) {
|
|
316
317
|
GPR_TIMER_END("grow_strtab", 0);
|
317
318
|
}
|
318
319
|
|
319
|
-
static void internal_destroy_string(
|
320
|
+
static void internal_destroy_string(grpc_exec_ctx *exec_ctx,
|
321
|
+
strtab_shard *shard, internal_string *is) {
|
320
322
|
internal_string **prev_next;
|
321
323
|
internal_string *cur;
|
322
324
|
GPR_TIMER_BEGIN("internal_destroy_string", 0);
|
323
325
|
if (is->has_base64_and_huffman_encoded) {
|
324
|
-
|
326
|
+
grpc_slice_unref_internal(exec_ctx, is->base64_and_huffman);
|
325
327
|
}
|
326
328
|
for (prev_next = &shard->strs[TABLE_IDX(is->hash, LOG2_STRTAB_SHARD_COUNT,
|
327
329
|
shard->capacity)],
|
@@ -340,20 +342,20 @@ static void slice_ref(void *p) {
|
|
340
342
|
GRPC_MDSTR_REF((grpc_mdstr *)(is));
|
341
343
|
}
|
342
344
|
|
343
|
-
static void slice_unref(void *p) {
|
345
|
+
static void slice_unref(grpc_exec_ctx *exec_ctx, void *p) {
|
344
346
|
internal_string *is =
|
345
347
|
(internal_string *)((char *)p - offsetof(internal_string, refcount));
|
346
|
-
GRPC_MDSTR_UNREF((grpc_mdstr *)(is));
|
348
|
+
GRPC_MDSTR_UNREF(exec_ctx, (grpc_mdstr *)(is));
|
347
349
|
}
|
348
350
|
|
349
351
|
grpc_mdstr *grpc_mdstr_from_string(const char *str) {
|
350
352
|
return grpc_mdstr_from_buffer((const uint8_t *)str, strlen(str));
|
351
353
|
}
|
352
354
|
|
353
|
-
grpc_mdstr *grpc_mdstr_from_slice(
|
354
|
-
grpc_mdstr *result = grpc_mdstr_from_buffer(
|
355
|
-
|
356
|
-
|
355
|
+
grpc_mdstr *grpc_mdstr_from_slice(grpc_exec_ctx *exec_ctx, grpc_slice slice) {
|
356
|
+
grpc_mdstr *result = grpc_mdstr_from_buffer(GRPC_SLICE_START_PTR(slice),
|
357
|
+
GRPC_SLICE_LENGTH(slice));
|
358
|
+
grpc_slice_unref_internal(exec_ctx, slice);
|
357
359
|
return result;
|
358
360
|
}
|
359
361
|
|
@@ -373,9 +375,9 @@ grpc_mdstr *grpc_mdstr_from_buffer(const uint8_t *buf, size_t length) {
|
|
373
375
|
idx = (hash + i) % GPR_ARRAY_SIZE(g_static_strtab);
|
374
376
|
ss = g_static_strtab[idx];
|
375
377
|
if (ss == NULL) break;
|
376
|
-
if (ss->hash == hash &&
|
378
|
+
if (ss->hash == hash && GRPC_SLICE_LENGTH(ss->slice) == length &&
|
377
379
|
(length == 0 ||
|
378
|
-
0 == memcmp(buf,
|
380
|
+
0 == memcmp(buf, GRPC_SLICE_START_PTR(ss->slice), length))) {
|
379
381
|
GPR_TIMER_END("grpc_mdstr_from_buffer", 0);
|
380
382
|
return ss;
|
381
383
|
}
|
@@ -386,8 +388,8 @@ grpc_mdstr *grpc_mdstr_from_buffer(const uint8_t *buf, size_t length) {
|
|
386
388
|
/* search for an existing string */
|
387
389
|
idx = TABLE_IDX(hash, LOG2_STRTAB_SHARD_COUNT, shard->capacity);
|
388
390
|
for (s = shard->strs[idx]; s; s = s->bucket_next) {
|
389
|
-
if (s->hash == hash &&
|
390
|
-
0 == memcmp(buf,
|
391
|
+
if (s->hash == hash && GRPC_SLICE_LENGTH(s->slice) == length &&
|
392
|
+
0 == memcmp(buf, GRPC_SLICE_START_PTR(s->slice), length)) {
|
391
393
|
if (gpr_atm_full_fetch_add(&s->refcnt, 1) == 0) {
|
392
394
|
/* If we get here, we've added a ref to something that was about to
|
393
395
|
* die - drop it immediately.
|
@@ -404,7 +406,7 @@ grpc_mdstr *grpc_mdstr_from_buffer(const uint8_t *buf, size_t length) {
|
|
404
406
|
}
|
405
407
|
|
406
408
|
/* not found: create a new string */
|
407
|
-
if (length + 1 <
|
409
|
+
if (length + 1 < GRPC_SLICE_INLINED_SIZE) {
|
408
410
|
/* string data goes directly into the slice */
|
409
411
|
s = gpr_malloc(sizeof(internal_string));
|
410
412
|
gpr_atm_rel_store(&s->refcnt, 1);
|
@@ -444,7 +446,7 @@ grpc_mdstr *grpc_mdstr_from_buffer(const uint8_t *buf, size_t length) {
|
|
444
446
|
return (grpc_mdstr *)s;
|
445
447
|
}
|
446
448
|
|
447
|
-
static void gc_mdtab(mdtab_shard *shard) {
|
449
|
+
static void gc_mdtab(grpc_exec_ctx *exec_ctx, mdtab_shard *shard) {
|
448
450
|
size_t i;
|
449
451
|
internal_metadata **prev_next;
|
450
452
|
internal_metadata *md, *next;
|
@@ -457,8 +459,8 @@ static void gc_mdtab(mdtab_shard *shard) {
|
|
457
459
|
void *user_data = (void *)gpr_atm_no_barrier_load(&md->user_data);
|
458
460
|
next = md->bucket_next;
|
459
461
|
if (gpr_atm_acq_load(&md->refcnt) == 0) {
|
460
|
-
GRPC_MDSTR_UNREF((grpc_mdstr *)md->key);
|
461
|
-
GRPC_MDSTR_UNREF((grpc_mdstr *)md->value);
|
462
|
+
GRPC_MDSTR_UNREF(exec_ctx, (grpc_mdstr *)md->key);
|
463
|
+
GRPC_MDSTR_UNREF(exec_ctx, (grpc_mdstr *)md->value);
|
462
464
|
if (md->user_data) {
|
463
465
|
((destroy_user_data_func)gpr_atm_no_barrier_load(
|
464
466
|
&md->destroy_user_data))(user_data);
|
@@ -506,16 +508,17 @@ static void grow_mdtab(mdtab_shard *shard) {
|
|
506
508
|
GPR_TIMER_END("grow_mdtab", 0);
|
507
509
|
}
|
508
510
|
|
509
|
-
static void rehash_mdtab(mdtab_shard *shard) {
|
511
|
+
static void rehash_mdtab(grpc_exec_ctx *exec_ctx, mdtab_shard *shard) {
|
510
512
|
if (gpr_atm_no_barrier_load(&shard->free_estimate) >
|
511
513
|
(gpr_atm)(shard->capacity / 4)) {
|
512
|
-
gc_mdtab(shard);
|
514
|
+
gc_mdtab(exec_ctx, shard);
|
513
515
|
} else {
|
514
516
|
grow_mdtab(shard);
|
515
517
|
}
|
516
518
|
}
|
517
519
|
|
518
|
-
grpc_mdelem *grpc_mdelem_from_metadata_strings(
|
520
|
+
grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_exec_ctx *exec_ctx,
|
521
|
+
grpc_mdstr *mkey,
|
519
522
|
grpc_mdstr *mvalue) {
|
520
523
|
internal_string *key = (internal_string *)mkey;
|
521
524
|
internal_string *value = (internal_string *)mvalue;
|
@@ -547,8 +550,8 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdstr *mkey,
|
|
547
550
|
for (md = shard->elems[idx]; md; md = md->bucket_next) {
|
548
551
|
if (md->key == key && md->value == value) {
|
549
552
|
REF_MD_LOCKED(shard, md);
|
550
|
-
GRPC_MDSTR_UNREF((grpc_mdstr *)key);
|
551
|
-
GRPC_MDSTR_UNREF((grpc_mdstr *)value);
|
553
|
+
GRPC_MDSTR_UNREF(exec_ctx, (grpc_mdstr *)key);
|
554
|
+
GRPC_MDSTR_UNREF(exec_ctx, (grpc_mdstr *)value);
|
552
555
|
gpr_mu_unlock(&shard->mu);
|
553
556
|
GPR_TIMER_END("grpc_mdelem_from_metadata_strings", 0);
|
554
557
|
return (grpc_mdelem *)md;
|
@@ -566,7 +569,7 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdstr *mkey,
|
|
566
569
|
shard->elems[idx] = md;
|
567
570
|
gpr_mu_init(&md->mu_user_data);
|
568
571
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG
|
569
|
-
gpr_log(GPR_DEBUG, "ELM NEW:%p:%
|
572
|
+
gpr_log(GPR_DEBUG, "ELM NEW:%p:%zu: '%s' = '%s'", (void *)md,
|
570
573
|
gpr_atm_no_barrier_load(&md->refcnt),
|
571
574
|
grpc_mdstr_as_c_string((grpc_mdstr *)md->key),
|
572
575
|
grpc_mdstr_as_c_string((grpc_mdstr *)md->value));
|
@@ -574,7 +577,7 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdstr *mkey,
|
|
574
577
|
shard->count++;
|
575
578
|
|
576
579
|
if (shard->count > shard->capacity * 2) {
|
577
|
-
rehash_mdtab(shard);
|
580
|
+
rehash_mdtab(exec_ctx, shard);
|
578
581
|
}
|
579
582
|
|
580
583
|
gpr_mu_unlock(&shard->mu);
|
@@ -584,21 +587,26 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdstr *mkey,
|
|
584
587
|
return (grpc_mdelem *)md;
|
585
588
|
}
|
586
589
|
|
587
|
-
grpc_mdelem *grpc_mdelem_from_strings(
|
588
|
-
|
589
|
-
|
590
|
+
grpc_mdelem *grpc_mdelem_from_strings(grpc_exec_ctx *exec_ctx, const char *key,
|
591
|
+
const char *value) {
|
592
|
+
return grpc_mdelem_from_metadata_strings(
|
593
|
+
exec_ctx, grpc_mdstr_from_string(key), grpc_mdstr_from_string(value));
|
590
594
|
}
|
591
595
|
|
592
|
-
grpc_mdelem *grpc_mdelem_from_slices(
|
593
|
-
|
594
|
-
|
596
|
+
grpc_mdelem *grpc_mdelem_from_slices(grpc_exec_ctx *exec_ctx, grpc_slice key,
|
597
|
+
grpc_slice value) {
|
598
|
+
return grpc_mdelem_from_metadata_strings(
|
599
|
+
exec_ctx, grpc_mdstr_from_slice(exec_ctx, key),
|
600
|
+
grpc_mdstr_from_slice(exec_ctx, value));
|
595
601
|
}
|
596
602
|
|
597
|
-
grpc_mdelem *grpc_mdelem_from_string_and_buffer(
|
603
|
+
grpc_mdelem *grpc_mdelem_from_string_and_buffer(grpc_exec_ctx *exec_ctx,
|
604
|
+
const char *key,
|
598
605
|
const uint8_t *value,
|
599
606
|
size_t value_length) {
|
600
607
|
return grpc_mdelem_from_metadata_strings(
|
601
|
-
grpc_mdstr_from_string(key),
|
608
|
+
exec_ctx, grpc_mdstr_from_string(key),
|
609
|
+
grpc_mdstr_from_buffer(value, value_length));
|
602
610
|
}
|
603
611
|
|
604
612
|
static size_t get_base64_encoded_size(size_t raw_length) {
|
@@ -607,12 +615,12 @@ static size_t get_base64_encoded_size(size_t raw_length) {
|
|
607
615
|
}
|
608
616
|
|
609
617
|
size_t grpc_mdelem_get_size_in_hpack_table(grpc_mdelem *elem) {
|
610
|
-
size_t overhead_and_key = 32 +
|
611
|
-
size_t value_len =
|
618
|
+
size_t overhead_and_key = 32 + GRPC_SLICE_LENGTH(elem->key->slice);
|
619
|
+
size_t value_len = GRPC_SLICE_LENGTH(elem->value->slice);
|
612
620
|
if (is_mdstr_static(elem->value)) {
|
613
621
|
if (grpc_is_binary_header(
|
614
|
-
(const char *)
|
615
|
-
|
622
|
+
(const char *)GRPC_SLICE_START_PTR(elem->key->slice),
|
623
|
+
GRPC_SLICE_LENGTH(elem->key->slice))) {
|
616
624
|
return overhead_and_key + get_base64_encoded_size(value_len);
|
617
625
|
} else {
|
618
626
|
return overhead_and_key + value_len;
|
@@ -622,8 +630,8 @@ size_t grpc_mdelem_get_size_in_hpack_table(grpc_mdelem *elem) {
|
|
622
630
|
gpr_atm current_size = gpr_atm_acq_load(&is->size_in_decoder_table);
|
623
631
|
if (current_size == SIZE_IN_DECODER_TABLE_NOT_SET) {
|
624
632
|
if (grpc_is_binary_header(
|
625
|
-
(const char *)
|
626
|
-
|
633
|
+
(const char *)GRPC_SLICE_START_PTR(elem->key->slice),
|
634
|
+
GRPC_SLICE_LENGTH(elem->key->slice))) {
|
627
635
|
current_size = (gpr_atm)get_base64_encoded_size(value_len);
|
628
636
|
} else {
|
629
637
|
current_size = (gpr_atm)value_len;
|
@@ -639,7 +647,7 @@ grpc_mdelem *grpc_mdelem_ref(grpc_mdelem *gmd DEBUG_ARGS) {
|
|
639
647
|
if (is_mdelem_static(gmd)) return gmd;
|
640
648
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG
|
641
649
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
642
|
-
"ELM REF:%p:%
|
650
|
+
"ELM REF:%p:%zu->%zu: '%s' = '%s'", (void *)md,
|
643
651
|
gpr_atm_no_barrier_load(&md->refcnt),
|
644
652
|
gpr_atm_no_barrier_load(&md->refcnt) + 1,
|
645
653
|
grpc_mdstr_as_c_string((grpc_mdstr *)md->key),
|
@@ -649,25 +657,27 @@ grpc_mdelem *grpc_mdelem_ref(grpc_mdelem *gmd DEBUG_ARGS) {
|
|
649
657
|
this function - meaning that no adjustment to mdtab_free is necessary,
|
650
658
|
simplifying the logic here to be just an atomic increment */
|
651
659
|
/* use C assert to have this removed in opt builds */
|
652
|
-
|
660
|
+
GPR_ASSERT(gpr_atm_no_barrier_load(&md->refcnt) >= 1);
|
653
661
|
gpr_atm_no_barrier_fetch_add(&md->refcnt, 1);
|
654
662
|
return gmd;
|
655
663
|
}
|
656
664
|
|
657
|
-
void grpc_mdelem_unref(grpc_mdelem *gmd DEBUG_ARGS) {
|
665
|
+
void grpc_mdelem_unref(grpc_exec_ctx *exec_ctx, grpc_mdelem *gmd DEBUG_ARGS) {
|
658
666
|
internal_metadata *md = (internal_metadata *)gmd;
|
659
667
|
if (!md) return;
|
660
668
|
if (is_mdelem_static(gmd)) return;
|
661
669
|
#ifdef GRPC_METADATA_REFCOUNT_DEBUG
|
662
670
|
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
|
663
|
-
"ELM UNREF:%p:%
|
671
|
+
"ELM UNREF:%p:%zu->%zu: '%s' = '%s'", (void *)md,
|
664
672
|
gpr_atm_no_barrier_load(&md->refcnt),
|
665
673
|
gpr_atm_no_barrier_load(&md->refcnt) - 1,
|
666
674
|
grpc_mdstr_as_c_string((grpc_mdstr *)md->key),
|
667
675
|
grpc_mdstr_as_c_string((grpc_mdstr *)md->value));
|
668
676
|
#endif
|
669
677
|
uint32_t hash = GRPC_MDSTR_KV_HASH(md->key->hash, md->value->hash);
|
670
|
-
|
678
|
+
const gpr_atm prev_refcount = gpr_atm_full_fetch_add(&md->refcnt, -1);
|
679
|
+
GPR_ASSERT(prev_refcount >= 1);
|
680
|
+
if (1 == prev_refcount) {
|
671
681
|
/* once the refcount hits zero, some other thread can come along and
|
672
682
|
free md at any time: it's unsafe from this point on to access it */
|
673
683
|
mdtab_shard *shard =
|
@@ -676,26 +686,38 @@ void grpc_mdelem_unref(grpc_mdelem *gmd DEBUG_ARGS) {
|
|
676
686
|
}
|
677
687
|
}
|
678
688
|
|
679
|
-
const char *grpc_mdstr_as_c_string(grpc_mdstr *s) {
|
680
|
-
return (const char *)
|
689
|
+
const char *grpc_mdstr_as_c_string(const grpc_mdstr *s) {
|
690
|
+
return (const char *)GRPC_SLICE_START_PTR(s->slice);
|
681
691
|
}
|
682
692
|
|
693
|
+
size_t grpc_mdstr_length(const grpc_mdstr *s) { return GRPC_MDSTR_LENGTH(s); }
|
694
|
+
|
683
695
|
grpc_mdstr *grpc_mdstr_ref(grpc_mdstr *gs DEBUG_ARGS) {
|
684
696
|
internal_string *s = (internal_string *)gs;
|
685
697
|
if (is_mdstr_static(gs)) return gs;
|
698
|
+
#ifdef GRPC_METADATA_REFCOUNT_DEBUG
|
699
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "STR REF:%p:%zu->%zu: '%s'",
|
700
|
+
(void *)s, gpr_atm_no_barrier_load(&s->refcnt),
|
701
|
+
gpr_atm_no_barrier_load(&s->refcnt) + 1, grpc_mdstr_as_c_string(gs));
|
702
|
+
#endif
|
686
703
|
GPR_ASSERT(gpr_atm_full_fetch_add(&s->refcnt, 1) > 0);
|
687
704
|
return gs;
|
688
705
|
}
|
689
706
|
|
690
|
-
void grpc_mdstr_unref(grpc_mdstr *gs DEBUG_ARGS) {
|
707
|
+
void grpc_mdstr_unref(grpc_exec_ctx *exec_ctx, grpc_mdstr *gs DEBUG_ARGS) {
|
691
708
|
internal_string *s = (internal_string *)gs;
|
692
709
|
if (is_mdstr_static(gs)) return;
|
710
|
+
#ifdef GRPC_METADATA_REFCOUNT_DEBUG
|
711
|
+
gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "STR UNREF:%p:%zu->%zu: '%s'",
|
712
|
+
(void *)s, gpr_atm_no_barrier_load(&s->refcnt),
|
713
|
+
gpr_atm_no_barrier_load(&s->refcnt) - 1, grpc_mdstr_as_c_string(gs));
|
714
|
+
#endif
|
693
715
|
if (1 == gpr_atm_full_fetch_add(&s->refcnt, -1)) {
|
694
716
|
strtab_shard *shard =
|
695
717
|
&g_strtab_shard[SHARD_IDX(s->hash, LOG2_STRTAB_SHARD_COUNT)];
|
696
718
|
gpr_mu_lock(&shard->mu);
|
697
719
|
GPR_ASSERT(0 == gpr_atm_no_barrier_load(&s->refcnt));
|
698
|
-
internal_destroy_string(shard, s);
|
720
|
+
internal_destroy_string(exec_ctx, shard, s);
|
699
721
|
gpr_mu_unlock(&shard->mu);
|
700
722
|
}
|
701
723
|
}
|
@@ -714,8 +736,8 @@ void *grpc_mdelem_get_user_data(grpc_mdelem *md, void (*destroy_func)(void *)) {
|
|
714
736
|
return result;
|
715
737
|
}
|
716
738
|
|
717
|
-
void grpc_mdelem_set_user_data(grpc_mdelem *md, void (*destroy_func)(void *),
|
718
|
-
|
739
|
+
void *grpc_mdelem_set_user_data(grpc_mdelem *md, void (*destroy_func)(void *),
|
740
|
+
void *user_data) {
|
719
741
|
internal_metadata *im = (internal_metadata *)md;
|
720
742
|
GPR_ASSERT(!is_mdelem_static(md));
|
721
743
|
GPR_ASSERT((user_data == NULL) == (destroy_func == NULL));
|
@@ -726,16 +748,17 @@ void grpc_mdelem_set_user_data(grpc_mdelem *md, void (*destroy_func)(void *),
|
|
726
748
|
if (destroy_func != NULL) {
|
727
749
|
destroy_func(user_data);
|
728
750
|
}
|
729
|
-
return;
|
751
|
+
return (void *)gpr_atm_no_barrier_load(&im->user_data);
|
730
752
|
}
|
731
753
|
gpr_atm_no_barrier_store(&im->user_data, (gpr_atm)user_data);
|
732
754
|
gpr_atm_rel_store(&im->destroy_user_data, (gpr_atm)destroy_func);
|
733
755
|
gpr_mu_unlock(&im->mu_user_data);
|
756
|
+
return user_data;
|
734
757
|
}
|
735
758
|
|
736
|
-
|
759
|
+
grpc_slice grpc_mdstr_as_base64_encoded_and_huffman_compressed(grpc_mdstr *gs) {
|
737
760
|
internal_string *s = (internal_string *)gs;
|
738
|
-
|
761
|
+
grpc_slice slice;
|
739
762
|
strtab_shard *shard =
|
740
763
|
&g_strtab_shard[SHARD_IDX(s->hash, LOG2_STRTAB_SHARD_COUNT)];
|
741
764
|
gpr_mu_lock(&shard->mu);
|