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.

Files changed (705) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3696 -867
  3. data/etc/roots.pem +39 -111
  4. data/include/grpc/byte_buffer.h +64 -1
  5. data/include/grpc/census.h +40 -96
  6. data/include/grpc/compression.h +2 -1
  7. data/include/grpc/grpc.h +42 -7
  8. data/include/grpc/grpc_posix.h +8 -5
  9. data/include/grpc/impl/codegen/atm.h +3 -0
  10. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  11. data/include/grpc/impl/codegen/atm_gcc_sync.h +8 -0
  12. data/include/grpc/impl/codegen/atm_windows.h +4 -0
  13. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -4
  14. data/include/grpc/impl/codegen/compression_types.h +1 -1
  15. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  16. data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
  17. data/include/grpc/impl/codegen/gpr_slice.h +84 -0
  18. data/include/grpc/impl/codegen/{alloc.h → gpr_types.h} +30 -29
  19. data/include/grpc/impl/codegen/grpc_types.h +91 -9
  20. data/include/grpc/impl/codegen/port_platform.h +25 -92
  21. data/include/grpc/impl/codegen/slice.h +54 -97
  22. data/include/grpc/impl/codegen/sync.h +0 -253
  23. data/include/grpc/module.modulemap +0 -2
  24. data/include/grpc/slice.h +132 -0
  25. data/include/grpc/{impl/codegen/slice_buffer.h → slice_buffer.h} +22 -39
  26. data/include/grpc/support/alloc.h +40 -1
  27. data/include/grpc/support/log.h +80 -1
  28. data/include/grpc/support/log_windows.h +2 -0
  29. data/include/grpc/support/string_util.h +1 -1
  30. data/include/grpc/support/sync.h +252 -0
  31. data/include/grpc/support/time.h +67 -1
  32. data/src/boringssl/err_data.c +639 -627
  33. data/src/core/ext/census/base_resources.c +71 -0
  34. data/src/core/ext/census/base_resources.h +39 -0
  35. data/src/core/ext/census/gen/census.pb.c +26 -29
  36. data/src/core/ext/census/gen/census.pb.h +68 -67
  37. data/src/core/ext/census/gen/trace_context.pb.c +81 -0
  38. data/src/core/ext/census/gen/trace_context.pb.h +99 -0
  39. data/src/core/ext/census/grpc_filter.c +22 -16
  40. data/src/core/ext/census/grpc_plugin.c +2 -1
  41. data/src/core/ext/census/initialize.c +16 -4
  42. data/src/core/ext/census/mlog.h +1 -1
  43. data/src/core/ext/census/placeholders.c +0 -45
  44. data/src/core/ext/census/resource.c +312 -0
  45. data/src/core/ext/census/resource.h +63 -0
  46. data/src/core/ext/census/trace_context.c +86 -0
  47. data/src/core/ext/census/trace_context.h +68 -0
  48. data/src/core/ext/census/tracing.c +8 -2
  49. data/src/core/ext/{client_config → client_channel}/channel_connectivity.c +8 -4
  50. data/src/core/ext/client_channel/client_channel.c +1218 -0
  51. data/src/core/ext/{client_config → client_channel}/client_channel.h +8 -11
  52. data/src/core/ext/{client_config → client_channel}/client_channel_factory.c +33 -3
  53. data/src/core/ext/{client_config → client_channel}/client_channel_factory.h +15 -8
  54. data/src/core/ext/{client_config/client_config_plugin.c → client_channel/client_channel_plugin.c} +16 -15
  55. data/src/core/ext/{client_config → client_channel}/connector.c +1 -1
  56. data/src/core/ext/{client_config → client_channel}/connector.h +5 -8
  57. data/{include/grpc/support/slice_buffer.h → src/core/ext/client_channel/default_initial_connect_string.c} +4 -5
  58. data/src/core/ext/client_channel/http_connect_handshaker.c +399 -0
  59. data/src/core/ext/client_channel/http_connect_handshaker.h +52 -0
  60. data/src/core/ext/{client_config → client_channel}/initial_connect_string.c +6 -7
  61. data/src/core/ext/{client_config → client_channel}/initial_connect_string.h +10 -10
  62. data/src/core/ext/{client_config → client_channel}/lb_policy.c +11 -11
  63. data/src/core/ext/{client_config → client_channel}/lb_policy.h +68 -27
  64. data/src/core/ext/client_channel/lb_policy_factory.c +163 -0
  65. data/src/core/ext/{client_config → client_channel}/lb_policy_factory.h +64 -9
  66. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.c +6 -4
  67. data/src/core/ext/{client_config → client_channel}/lb_policy_registry.h +4 -4
  68. data/src/core/ext/{client_config → client_channel}/parse_address.c +21 -14
  69. data/src/core/ext/{client_config → client_channel}/parse_address.h +8 -10
  70. data/src/core/ext/{client_config → client_channel}/resolver.c +3 -4
  71. data/src/core/ext/{client_config → client_channel}/resolver.h +11 -15
  72. data/src/core/ext/{client_config → client_channel}/resolver_factory.c +4 -3
  73. data/src/core/ext/{client_config → client_channel}/resolver_factory.h +13 -11
  74. data/src/core/ext/{client_config → client_channel}/resolver_registry.c +54 -34
  75. data/src/core/ext/{client_config → client_channel}/resolver_registry.h +21 -8
  76. data/src/core/ext/{client_config → client_channel}/subchannel.c +208 -119
  77. data/src/core/ext/{client_config → client_channel}/subchannel.h +21 -11
  78. data/src/core/ext/{client_config → client_channel}/subchannel_index.c +6 -17
  79. data/src/core/ext/{client_config → client_channel}/subchannel_index.h +7 -7
  80. data/src/core/ext/{client_config → client_channel}/uri_parser.c +21 -28
  81. data/src/core/ext/{client_config → client_channel}/uri_parser.h +3 -3
  82. data/src/core/ext/lb_policy/grpclb/grpclb.c +1406 -0
  83. data/src/core/ext/lb_policy/grpclb/grpclb.h +44 -0
  84. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +117 -37
  85. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +31 -12
  86. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +6 -36
  87. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +22 -42
  88. data/src/core/ext/lb_policy/pick_first/pick_first.c +64 -46
  89. data/src/core/ext/lb_policy/round_robin/round_robin.c +324 -160
  90. data/src/core/ext/load_reporting/load_reporting.c +7 -56
  91. data/src/core/ext/load_reporting/load_reporting.h +41 -28
  92. data/src/core/ext/load_reporting/load_reporting_filter.c +132 -42
  93. data/src/core/ext/load_reporting/load_reporting_filter.h +1 -0
  94. data/src/core/ext/resolver/dns/native/dns_resolver.c +88 -80
  95. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +57 -102
  96. data/src/core/ext/transport/chttp2/alpn/alpn.c +1 -1
  97. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +253 -0
  98. data/src/core/{lib/iomgr/ev_poll_and_epoll_posix.h → ext/transport/chttp2/client/chttp2_connector.h} +5 -5
  99. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +31 -160
  100. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +5 -5
  101. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +44 -243
  102. data/src/core/ext/transport/chttp2/server/chttp2_server.c +342 -0
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
  104. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +11 -124
  105. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +20 -9
  106. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +28 -236
  107. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +31 -27
  108. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +5 -4
  109. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +25 -22
  110. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -7
  111. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +0 -3
  112. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +1345 -1521
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -1
  114. data/src/core/ext/transport/chttp2/transport/frame.h +3 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_data.c +50 -47
  116. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -9
  117. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +19 -21
  118. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +9 -8
  119. data/src/core/ext/transport/chttp2/transport/frame_ping.c +13 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_ping.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +31 -19
  122. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +8 -7
  123. data/src/core/ext/transport/chttp2/transport/frame_settings.c +22 -25
  124. data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -8
  125. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +26 -18
  126. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
  127. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +68 -58
  128. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -5
  129. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +327 -214
  130. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +14 -9
  131. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -19
  132. data/src/core/ext/transport/chttp2/transport/hpack_table.h +9 -6
  133. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +2 -2
  134. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -1
  135. data/src/core/ext/transport/chttp2/transport/internal.h +284 -436
  136. data/src/core/ext/transport/chttp2/transport/parsing.c +355 -590
  137. data/src/core/ext/transport/chttp2/transport/stream_lists.c +36 -309
  138. data/src/core/ext/transport/chttp2/transport/stream_map.c +13 -34
  139. data/src/core/ext/transport/chttp2/transport/stream_map.h +3 -4
  140. data/src/core/ext/transport/chttp2/transport/writing.c +174 -286
  141. data/src/core/lib/channel/channel_args.c +70 -13
  142. data/src/core/lib/channel/channel_args.h +28 -2
  143. data/src/core/lib/channel/channel_stack.c +77 -28
  144. data/src/core/lib/channel/channel_stack.h +61 -23
  145. data/src/core/lib/channel/channel_stack_builder.c +33 -25
  146. data/src/core/lib/channel/channel_stack_builder.h +17 -8
  147. data/src/core/lib/channel/compress_filter.c +52 -36
  148. data/src/core/lib/channel/connected_channel.c +20 -12
  149. data/src/core/lib/channel/connected_channel.h +2 -1
  150. data/src/core/lib/channel/context.h +13 -1
  151. data/src/core/lib/channel/deadline_filter.c +344 -0
  152. data/src/core/lib/channel/deadline_filter.h +99 -0
  153. data/src/core/lib/channel/handshaker.c +240 -0
  154. data/src/core/lib/channel/handshaker.h +164 -0
  155. data/src/core/lib/{security/credentials/google_default/credentials_windows.c → channel/handshaker_factory.c} +16 -23
  156. data/src/core/lib/channel/handshaker_factory.h +66 -0
  157. data/src/core/lib/channel/handshaker_registry.c +113 -0
  158. data/src/core/{ext/client_config/client_config.h → lib/channel/handshaker_registry.h} +26 -16
  159. data/src/core/lib/channel/http_client_filter.c +248 -46
  160. data/src/core/lib/channel/http_client_filter.h +3 -0
  161. data/src/core/lib/channel/http_server_filter.c +136 -24
  162. data/src/core/lib/channel/message_size_filter.c +261 -0
  163. data/src/core/lib/channel/message_size_filter.h +39 -0
  164. data/src/core/lib/compression/message_compress.c +43 -37
  165. data/src/core/lib/compression/message_compress.h +7 -5
  166. data/src/core/lib/http/format_request.c +26 -11
  167. data/src/core/lib/http/format_request.h +7 -5
  168. data/src/core/lib/http/httpcli.c +45 -27
  169. data/src/core/lib/http/httpcli.h +4 -4
  170. data/src/core/lib/http/httpcli_security_connector.c +56 -46
  171. data/src/core/lib/http/parser.c +17 -14
  172. data/src/core/lib/http/parser.h +4 -2
  173. data/src/core/lib/iomgr/closure.c +49 -7
  174. data/src/core/lib/iomgr/closure.h +56 -14
  175. data/src/core/lib/iomgr/combiner.c +422 -0
  176. data/src/core/lib/iomgr/combiner.h +64 -0
  177. data/src/core/lib/iomgr/endpoint.c +8 -2
  178. data/src/core/lib/iomgr/endpoint.h +17 -7
  179. data/src/core/lib/iomgr/endpoint_pair.h +3 -2
  180. data/src/core/lib/iomgr/endpoint_pair_posix.c +9 -8
  181. data/src/core/{ext/client_config/lb_policy_factory.c → lib/iomgr/endpoint_pair_uv.c} +18 -13
  182. data/src/core/lib/iomgr/endpoint_pair_windows.c +7 -6
  183. data/src/core/lib/iomgr/error.c +72 -6
  184. data/src/core/lib/iomgr/error.h +30 -3
  185. data/src/core/lib/iomgr/ev_epoll_linux.c +500 -382
  186. data/src/core/lib/iomgr/ev_epoll_linux.h +3 -2
  187. data/src/core/lib/iomgr/ev_poll_posix.c +317 -30
  188. data/src/core/lib/iomgr/ev_poll_posix.h +1 -0
  189. data/src/core/lib/iomgr/ev_posix.c +26 -5
  190. data/src/core/lib/iomgr/ev_posix.h +12 -1
  191. data/src/core/lib/iomgr/exec_ctx.c +27 -94
  192. data/src/core/lib/iomgr/exec_ctx.h +19 -22
  193. data/src/core/lib/iomgr/executor.c +29 -8
  194. data/src/core/lib/iomgr/executor.h +2 -4
  195. data/src/core/lib/iomgr/iocp_windows.c +3 -4
  196. data/src/core/lib/iomgr/iomgr.c +14 -10
  197. data/src/core/lib/iomgr/iomgr.h +6 -2
  198. data/src/core/lib/iomgr/iomgr_posix.c +2 -2
  199. data/src/core/lib/iomgr/iomgr_uv.c +49 -0
  200. data/src/core/lib/iomgr/iomgr_windows.c +2 -2
  201. data/src/core/lib/iomgr/load_file.c +3 -3
  202. data/src/core/lib/iomgr/load_file.h +2 -2
  203. data/src/core/lib/iomgr/network_status_tracker.c +1 -1
  204. data/src/core/lib/iomgr/pollset_set_uv.c +62 -0
  205. data/src/core/lib/iomgr/pollset_set_windows.c +3 -3
  206. data/src/core/lib/iomgr/pollset_uv.c +142 -0
  207. data/src/core/lib/iomgr/pollset_uv.h +42 -0
  208. data/src/core/lib/iomgr/pollset_windows.c +5 -6
  209. data/src/core/lib/iomgr/port.h +129 -0
  210. data/src/core/lib/iomgr/resolve_address.h +2 -1
  211. data/src/core/lib/iomgr/resolve_address_posix.c +14 -13
  212. data/src/core/lib/iomgr/resolve_address_uv.c +233 -0
  213. data/src/core/lib/iomgr/resolve_address_windows.c +14 -12
  214. data/src/core/lib/iomgr/resource_quota.c +832 -0
  215. data/src/core/lib/iomgr/resource_quota.h +159 -0
  216. data/src/core/lib/iomgr/sockaddr.h +10 -2
  217. data/src/core/lib/iomgr/sockaddr_utils.c +63 -36
  218. data/src/core/lib/iomgr/sockaddr_utils.h +14 -14
  219. data/src/core/lib/iomgr/socket_mutator.c +98 -0
  220. data/src/core/lib/iomgr/socket_mutator.h +80 -0
  221. data/src/core/lib/iomgr/socket_utils.h +42 -0
  222. data/src/core/lib/iomgr/socket_utils_common_posix.c +28 -13
  223. data/src/core/lib/iomgr/socket_utils_linux.c +11 -5
  224. data/src/core/lib/iomgr/socket_utils_posix.c +10 -7
  225. data/src/core/lib/iomgr/socket_utils_posix.h +11 -4
  226. data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
  227. data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
  228. data/src/core/lib/iomgr/socket_windows.c +14 -6
  229. data/src/core/lib/iomgr/socket_windows.h +1 -0
  230. data/src/core/lib/iomgr/tcp_client.h +8 -2
  231. data/src/core/lib/iomgr/tcp_client_posix.c +131 -82
  232. data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
  233. data/src/core/lib/iomgr/tcp_client_uv.c +190 -0
  234. data/src/core/lib/iomgr/tcp_client_windows.c +54 -30
  235. data/src/core/lib/iomgr/tcp_posix.c +135 -56
  236. data/src/core/lib/iomgr/tcp_posix.h +2 -2
  237. data/src/core/lib/iomgr/tcp_server.h +14 -6
  238. data/src/core/lib/iomgr/tcp_server_posix.c +154 -118
  239. data/src/core/lib/iomgr/tcp_server_uv.c +388 -0
  240. data/src/core/lib/iomgr/tcp_server_windows.c +127 -100
  241. data/src/core/lib/iomgr/tcp_uv.c +367 -0
  242. data/src/core/lib/iomgr/tcp_uv.h +59 -0
  243. data/src/core/lib/iomgr/tcp_windows.c +65 -48
  244. data/src/core/lib/iomgr/tcp_windows.h +3 -1
  245. data/src/core/lib/iomgr/timer.h +21 -21
  246. data/src/core/lib/iomgr/{timer.c → timer_generic.c} +15 -10
  247. data/src/core/lib/iomgr/timer_generic.h +49 -0
  248. data/src/core/lib/iomgr/timer_heap.c +6 -0
  249. data/src/core/lib/iomgr/timer_uv.c +99 -0
  250. data/src/core/lib/iomgr/timer_uv.h +47 -0
  251. data/src/core/lib/iomgr/udp_server.c +116 -98
  252. data/src/core/lib/iomgr/udp_server.h +5 -3
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +14 -6
  254. data/src/core/lib/iomgr/unix_sockets_posix.h +6 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -4
  256. data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
  257. data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
  258. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +3 -3
  259. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +3 -3
  260. data/src/core/lib/iomgr/wakeup_fd_pipe.c +12 -6
  261. data/src/core/lib/iomgr/wakeup_fd_posix.c +34 -5
  262. data/src/core/lib/iomgr/wakeup_fd_posix.h +5 -0
  263. data/src/core/lib/iomgr/workqueue.h +12 -20
  264. data/src/core/{ext/client_config/client_config.c → lib/iomgr/workqueue_uv.c} +24 -33
  265. data/{include/grpc/support/slice.h → src/core/lib/iomgr/workqueue_uv.h} +4 -6
  266. data/src/core/lib/iomgr/workqueue_windows.c +9 -8
  267. data/src/core/lib/json/json.c +3 -3
  268. data/src/core/lib/json/json.h +11 -11
  269. data/src/core/lib/json/json_reader.c +9 -5
  270. data/src/core/lib/profiling/basic_timers.c +10 -1
  271. data/src/core/lib/profiling/timers.h +2 -0
  272. data/src/core/lib/security/context/security_context.c +13 -3
  273. data/src/core/lib/security/context/security_context.h +20 -0
  274. data/src/core/lib/security/credentials/composite/composite_credentials.c +28 -14
  275. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  276. data/src/core/lib/security/credentials/credentials.c +48 -19
  277. data/src/core/lib/security/credentials/credentials.h +36 -19
  278. data/src/core/lib/security/credentials/credentials_metadata.c +11 -8
  279. data/src/core/lib/security/credentials/fake/fake_credentials.c +15 -11
  280. data/src/core/lib/security/credentials/google_default/{credentials_posix.c → credentials_generic.c} +7 -14
  281. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +33 -21
  282. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +14 -0
  283. data/src/core/lib/security/credentials/iam/iam_credentials.c +3 -2
  284. data/src/core/lib/security/credentials/jwt/json_token.c +1 -0
  285. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  286. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +54 -19
  287. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -1
  288. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +129 -79
  289. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +9 -6
  290. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +63 -28
  291. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  292. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +32 -11
  293. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +13 -9
  294. data/src/core/lib/security/transport/client_auth_filter.c +33 -27
  295. data/src/core/lib/security/transport/secure_endpoint.c +93 -68
  296. data/src/core/lib/security/transport/secure_endpoint.h +2 -2
  297. data/src/core/lib/security/transport/security_connector.c +133 -168
  298. data/src/core/lib/security/transport/security_connector.h +31 -46
  299. data/src/core/lib/security/transport/security_handshaker.c +501 -0
  300. data/src/core/lib/security/transport/{handshake.h → security_handshaker.h} +10 -10
  301. data/src/core/lib/security/transport/server_auth_filter.c +50 -38
  302. data/src/core/lib/security/util/b64.c +11 -8
  303. data/src/core/lib/security/util/b64.h +5 -4
  304. data/src/core/lib/slice/percent_encoding.c +182 -0
  305. data/src/core/lib/slice/percent_encoding.h +78 -0
  306. data/src/core/lib/{support → slice}/slice.c +81 -50
  307. data/src/core/lib/{support → slice}/slice_buffer.c +78 -60
  308. data/src/core/lib/slice/slice_internal.h +49 -0
  309. data/src/core/lib/slice/slice_string_helpers.c +90 -0
  310. data/src/core/lib/{iomgr/workqueue_posix.h → slice/slice_string_helpers.h} +18 -18
  311. data/src/core/lib/support/backoff.c +24 -13
  312. data/src/core/lib/support/backoff.h +5 -2
  313. data/src/core/lib/support/env.h +0 -2
  314. data/src/core/lib/support/log.c +5 -4
  315. data/src/core/lib/support/log_linux.c +0 -1
  316. data/src/core/lib/support/log_posix.c +1 -1
  317. data/src/core/lib/support/mpscq.c +83 -0
  318. data/src/core/lib/support/mpscq.h +65 -0
  319. data/src/core/lib/support/string.c +58 -49
  320. data/src/core/lib/support/string.h +11 -8
  321. data/src/core/lib/support/subprocess_posix.c +5 -2
  322. data/src/core/lib/support/thd.c +1 -1
  323. data/src/core/lib/support/time.c +43 -79
  324. data/src/core/lib/support/time_posix.c +1 -1
  325. data/src/core/lib/support/tmpfile.h +0 -2
  326. data/src/core/lib/surface/alarm.c +4 -1
  327. data/src/core/lib/surface/byte_buffer.c +17 -11
  328. data/src/core/lib/surface/byte_buffer_reader.c +23 -15
  329. data/src/core/lib/surface/call.c +294 -276
  330. data/src/core/lib/surface/call.h +24 -9
  331. data/src/core/lib/surface/call_log_batch.c +5 -3
  332. data/src/core/lib/surface/channel.c +127 -111
  333. data/src/core/lib/surface/channel.h +14 -5
  334. data/src/core/lib/surface/channel_init.c +1 -1
  335. data/src/core/lib/surface/channel_init.h +10 -1
  336. data/src/core/lib/surface/channel_ping.c +7 -6
  337. data/src/core/lib/surface/completion_queue.c +154 -18
  338. data/src/core/lib/surface/completion_queue.h +5 -0
  339. data/src/core/lib/surface/init.c +40 -6
  340. data/src/core/lib/surface/init.h +1 -0
  341. data/src/core/lib/surface/init_secure.c +5 -2
  342. data/src/core/lib/surface/lame_client.c +28 -18
  343. data/src/core/lib/surface/server.c +134 -87
  344. data/src/core/lib/surface/server.h +8 -0
  345. data/src/core/lib/surface/validate_metadata.c +1 -1
  346. data/src/core/lib/surface/version.c +3 -1
  347. data/src/core/lib/transport/byte_stream.c +7 -4
  348. data/src/core/lib/transport/byte_stream.h +6 -10
  349. data/src/core/lib/transport/connectivity_state.c +21 -12
  350. data/src/core/lib/transport/connectivity_state.h +4 -1
  351. data/src/core/lib/transport/mdstr_hash_table.c +118 -0
  352. data/src/core/lib/transport/mdstr_hash_table.h +77 -0
  353. data/src/core/lib/transport/metadata.c +83 -60
  354. data/src/core/lib/transport/metadata.h +41 -23
  355. data/src/core/lib/transport/metadata_batch.c +17 -11
  356. data/src/core/lib/transport/metadata_batch.h +20 -6
  357. data/src/core/lib/transport/pid_controller.c +57 -0
  358. data/src/core/lib/transport/pid_controller.h +64 -0
  359. data/src/core/lib/transport/service_config.c +251 -0
  360. data/src/core/lib/transport/service_config.h +71 -0
  361. data/src/core/lib/transport/static_metadata.c +18 -16
  362. data/src/core/lib/transport/static_metadata.h +113 -107
  363. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.c +3 -3
  364. data/src/core/{ext/transport/chttp2 → lib}/transport/timeout_encoding.h +7 -7
  365. data/src/core/lib/transport/transport.c +84 -23
  366. data/src/core/lib/transport/transport.h +53 -8
  367. data/src/core/lib/transport/transport_impl.h +3 -0
  368. data/src/core/lib/transport/transport_op_string.c +92 -20
  369. data/src/core/lib/tsi/ssl_transport_security.c +3 -1
  370. data/src/core/plugin_registry/grpc_plugin_registry.c +8 -4
  371. data/src/ruby/ext/grpc/extconf.rb +0 -1
  372. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -7
  373. data/src/ruby/ext/grpc/rb_call.c +15 -5
  374. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  375. data/src/ruby/ext/grpc/rb_compression_options.c +466 -0
  376. data/src/{core/ext/client_config/default_initial_connect_string.c → ruby/ext/grpc/rb_compression_options.h} +10 -5
  377. data/src/ruby/ext/grpc/rb_grpc.c +3 -1
  378. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +198 -190
  379. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +306 -294
  380. data/src/ruby/ext/grpc/rb_server.c +18 -12
  381. data/src/ruby/lib/grpc/errors.rb +154 -2
  382. data/src/ruby/lib/grpc/generic/active_call.rb +144 -63
  383. data/src/ruby/lib/grpc/generic/bidi_call.rb +18 -2
  384. data/src/ruby/lib/grpc/generic/client_stub.rb +7 -5
  385. data/src/ruby/lib/grpc/generic/rpc_desc.rb +39 -13
  386. data/src/ruby/lib/grpc/generic/rpc_server.rb +51 -24
  387. data/src/ruby/lib/grpc/generic/service.rb +3 -2
  388. data/src/ruby/lib/grpc/version.rb +1 -1
  389. data/src/ruby/pb/grpc/health/checker.rb +3 -1
  390. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +7 -0
  391. data/src/ruby/pb/test/client.rb +307 -7
  392. data/src/ruby/pb/test/server.rb +26 -1
  393. data/src/ruby/spec/compression_options_spec.rb +164 -0
  394. data/src/ruby/spec/error_sanity_spec.rb +64 -0
  395. data/src/ruby/spec/generic/active_call_spec.rb +290 -12
  396. data/src/ruby/spec/generic/client_stub_spec.rb +91 -41
  397. data/src/ruby/spec/generic/rpc_desc_spec.rb +36 -16
  398. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +22 -28
  399. data/src/ruby/spec/generic/rpc_server_spec.rb +6 -6
  400. data/src/ruby/spec/pb/health/checker_spec.rb +27 -19
  401. data/src/ruby/spec/spec_helper.rb +2 -0
  402. data/third_party/boringssl/crypto/aes/aes.c +12 -12
  403. data/third_party/boringssl/crypto/aes/mode_wrappers.c +6 -2
  404. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +28 -13
  405. data/third_party/boringssl/crypto/asn1/a_gentm.c +2 -0
  406. data/third_party/boringssl/crypto/asn1/a_object.c +7 -3
  407. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  408. data/third_party/boringssl/crypto/asn1/a_time.c +0 -11
  409. data/third_party/boringssl/crypto/asn1/a_type.c +0 -2
  410. data/third_party/boringssl/crypto/asn1/a_utctm.c +1 -30
  411. data/third_party/boringssl/crypto/asn1/asn1_lib.c +56 -76
  412. data/third_party/boringssl/crypto/asn1/asn1_locl.h +0 -10
  413. data/third_party/boringssl/crypto/asn1/asn1_par.c +0 -322
  414. data/third_party/boringssl/crypto/asn1/f_enum.c +1 -108
  415. data/third_party/boringssl/crypto/asn1/f_int.c +1 -106
  416. data/third_party/boringssl/crypto/asn1/f_string.c +1 -106
  417. data/third_party/boringssl/crypto/asn1/tasn_dec.c +10 -14
  418. data/third_party/boringssl/crypto/asn1/tasn_enc.c +17 -11
  419. data/third_party/boringssl/crypto/asn1/tasn_typ.c +29 -42
  420. data/third_party/boringssl/crypto/asn1/tasn_utl.c +1 -1
  421. data/third_party/boringssl/crypto/base64/base64.c +249 -285
  422. data/third_party/boringssl/crypto/bio/bio.c +13 -23
  423. data/third_party/boringssl/crypto/bio/bio_mem.c +3 -2
  424. data/third_party/boringssl/crypto/bio/connect.c +12 -3
  425. data/third_party/boringssl/crypto/bio/fd.c +22 -15
  426. data/third_party/boringssl/crypto/bio/file.c +2 -38
  427. data/third_party/boringssl/crypto/bio/hexdump.c +1 -2
  428. data/third_party/boringssl/crypto/bio/internal.h +3 -0
  429. data/third_party/boringssl/crypto/bio/pair.c +1 -1
  430. data/third_party/boringssl/crypto/bio/socket.c +10 -2
  431. data/third_party/boringssl/crypto/bio/socket_helper.c +2 -2
  432. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +0 -8
  433. data/third_party/boringssl/crypto/bn/bn.c +38 -0
  434. data/third_party/boringssl/crypto/bn/cmp.c +25 -0
  435. data/third_party/boringssl/crypto/bn/convert.c +73 -76
  436. data/third_party/boringssl/crypto/bn/div.c +136 -70
  437. data/third_party/boringssl/crypto/bn/exponentiation.c +86 -381
  438. data/third_party/boringssl/crypto/bn/gcd.c +213 -296
  439. data/third_party/boringssl/crypto/bn/generic.c +0 -80
  440. data/third_party/boringssl/crypto/bn/internal.h +15 -3
  441. data/third_party/boringssl/crypto/bn/montgomery.c +57 -207
  442. data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
  443. data/third_party/boringssl/crypto/bn/mul.c +2 -1
  444. data/third_party/boringssl/crypto/bn/prime.c +24 -8
  445. data/third_party/boringssl/crypto/bn/random.c +47 -33
  446. data/third_party/boringssl/crypto/bn/sqrt.c +4 -5
  447. data/third_party/boringssl/crypto/buf/buf.c +25 -21
  448. data/third_party/boringssl/crypto/bytestring/ber.c +1 -0
  449. data/third_party/boringssl/crypto/bytestring/cbb.c +50 -22
  450. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -4
  451. data/third_party/boringssl/crypto/chacha/{chacha_generic.c → chacha.c} +56 -29
  452. data/third_party/boringssl/crypto/cipher/aead.c +11 -22
  453. data/third_party/boringssl/crypto/cipher/cipher.c +2 -2
  454. data/third_party/boringssl/crypto/cipher/e_aes.c +53 -103
  455. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +2 -8
  456. data/third_party/boringssl/crypto/cipher/e_des.c +3 -5
  457. data/third_party/boringssl/crypto/cipher/e_null.c +1 -1
  458. data/third_party/boringssl/crypto/cipher/e_rc2.c +1 -1
  459. data/third_party/boringssl/crypto/cipher/e_rc4.c +1 -1
  460. data/third_party/boringssl/crypto/cipher/e_ssl3.c +3 -63
  461. data/third_party/boringssl/crypto/cipher/e_tls.c +12 -83
  462. data/third_party/boringssl/crypto/cipher/internal.h +8 -10
  463. data/third_party/boringssl/crypto/cipher/tls_cbc.c +69 -40
  464. data/third_party/boringssl/crypto/conf/conf.c +2 -1
  465. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  466. data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
  467. data/third_party/boringssl/crypto/cpu-arm.c +0 -161
  468. data/third_party/boringssl/crypto/cpu-intel.c +5 -3
  469. data/third_party/boringssl/{ssl/test/scoped_types.h → crypto/cpu-ppc64le.c} +21 -9
  470. data/third_party/boringssl/crypto/crypto.c +29 -7
  471. data/third_party/boringssl/crypto/curve25519/curve25519.c +284 -242
  472. data/third_party/boringssl/crypto/curve25519/internal.h +64 -0
  473. data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
  474. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +21 -0
  475. data/third_party/boringssl/crypto/dh/check.c +22 -6
  476. data/third_party/boringssl/crypto/dh/dh.c +45 -21
  477. data/third_party/boringssl/crypto/dh/dh_asn1.c +96 -20
  478. data/third_party/boringssl/crypto/dh/params.c +30 -78
  479. data/third_party/boringssl/crypto/digest/digest.c +3 -3
  480. data/third_party/boringssl/crypto/dsa/dsa.c +59 -29
  481. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +4 -0
  482. data/third_party/boringssl/crypto/ec/ec.c +84 -140
  483. data/third_party/boringssl/crypto/ec/ec_asn1.c +82 -52
  484. data/third_party/boringssl/crypto/ec/ec_key.c +15 -15
  485. data/third_party/boringssl/crypto/ec/ec_montgomery.c +87 -50
  486. data/third_party/boringssl/crypto/ec/internal.h +12 -36
  487. data/third_party/boringssl/crypto/ec/oct.c +11 -11
  488. data/third_party/boringssl/crypto/ec/p224-64.c +59 -116
  489. data/third_party/boringssl/crypto/ec/p256-64.c +88 -163
  490. data/third_party/boringssl/crypto/ec/p256-x86_64.c +46 -58
  491. data/third_party/boringssl/crypto/ec/simple.c +81 -201
  492. data/third_party/boringssl/crypto/ec/util-64.c +0 -74
  493. data/third_party/boringssl/crypto/ecdh/ecdh.c +7 -1
  494. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +28 -46
  495. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +1 -0
  496. data/third_party/boringssl/crypto/engine/engine.c +1 -1
  497. data/third_party/boringssl/crypto/err/err.c +3 -3
  498. data/third_party/boringssl/crypto/evp/evp.c +14 -59
  499. data/third_party/boringssl/crypto/evp/evp_asn1.c +144 -87
  500. data/third_party/boringssl/crypto/evp/evp_ctx.c +7 -7
  501. data/third_party/boringssl/crypto/evp/internal.h +4 -46
  502. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +8 -157
  503. data/third_party/boringssl/crypto/evp/p_ec.c +1 -1
  504. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +22 -170
  505. data/third_party/boringssl/crypto/evp/p_rsa.c +1 -1
  506. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +10 -548
  507. data/third_party/boringssl/crypto/evp/print.c +520 -0
  508. data/third_party/boringssl/crypto/ex_data.c +4 -6
  509. data/third_party/boringssl/crypto/hkdf/hkdf.c +38 -17
  510. data/third_party/boringssl/crypto/hmac/hmac.c +6 -6
  511. data/third_party/boringssl/crypto/internal.h +57 -77
  512. data/third_party/boringssl/crypto/lhash/lhash.c +6 -10
  513. data/third_party/boringssl/crypto/md4/md4.c +9 -0
  514. data/third_party/boringssl/crypto/mem.c +19 -19
  515. data/third_party/boringssl/crypto/modes/cfb.c +5 -6
  516. data/third_party/boringssl/crypto/modes/ctr.c +10 -18
  517. data/third_party/boringssl/crypto/modes/gcm.c +100 -66
  518. data/third_party/boringssl/crypto/modes/internal.h +15 -27
  519. data/third_party/boringssl/crypto/modes/ofb.c +9 -22
  520. data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
  521. data/third_party/boringssl/crypto/newhope/internal.h +71 -0
  522. data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
  523. data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
  524. data/third_party/boringssl/crypto/newhope/poly.c +183 -0
  525. data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
  526. data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
  527. data/third_party/boringssl/crypto/obj/obj.c +111 -135
  528. data/third_party/boringssl/crypto/obj/obj_dat.h +4 -10
  529. data/third_party/boringssl/crypto/pem/pem_lib.c +6 -43
  530. data/third_party/boringssl/crypto/pem/pem_pkey.c +10 -19
  531. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +1 -0
  532. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +2 -1
  533. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +2 -2
  534. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +95 -87
  535. data/third_party/boringssl/crypto/{test/test_util.h → poly1305/internal.h} +15 -10
  536. data/third_party/boringssl/crypto/poly1305/poly1305.c +8 -15
  537. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +1 -0
  538. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +3 -3
  539. data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
  540. data/third_party/boringssl/crypto/rand/rand.c +4 -1
  541. data/third_party/boringssl/crypto/rand/urandom.c +5 -7
  542. data/third_party/boringssl/crypto/rand/windows.c +5 -8
  543. data/third_party/boringssl/crypto/rc4/rc4.c +24 -209
  544. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  545. data/third_party/boringssl/crypto/rsa/blinding.c +74 -232
  546. data/third_party/boringssl/crypto/rsa/internal.h +5 -13
  547. data/third_party/boringssl/crypto/rsa/padding.c +64 -63
  548. data/third_party/boringssl/crypto/rsa/rsa.c +50 -28
  549. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +8 -16
  550. data/third_party/boringssl/crypto/rsa/rsa_impl.c +134 -122
  551. data/third_party/boringssl/crypto/sha/sha256.c +2 -2
  552. data/third_party/boringssl/crypto/sha/sha512.c +7 -7
  553. data/third_party/boringssl/crypto/stack/stack.c +13 -22
  554. data/third_party/boringssl/crypto/thread.c +21 -12
  555. data/third_party/boringssl/crypto/thread_none.c +6 -2
  556. data/third_party/boringssl/crypto/thread_pthread.c +16 -7
  557. data/third_party/boringssl/crypto/thread_win.c +38 -85
  558. data/third_party/boringssl/crypto/x509/a_sign.c +3 -3
  559. data/third_party/boringssl/crypto/x509/a_strex.c +1 -1
  560. data/third_party/boringssl/crypto/x509/a_verify.c +2 -2
  561. data/third_party/boringssl/crypto/{evp → x509}/algorithm.c +37 -53
  562. data/third_party/boringssl/crypto/x509/asn1_gen.c +1 -2
  563. data/third_party/boringssl/crypto/x509/by_dir.c +6 -6
  564. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  565. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  566. data/third_party/boringssl/crypto/x509/t_x509.c +10 -12
  567. data/third_party/boringssl/crypto/x509/x509.c +5 -0
  568. data/third_party/boringssl/crypto/x509/x509_att.c +9 -3
  569. data/third_party/boringssl/crypto/x509/x509_lu.c +34 -44
  570. data/third_party/boringssl/crypto/x509/x509_obj.c +19 -2
  571. data/third_party/boringssl/crypto/x509/x509_r2x.c +9 -5
  572. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  573. data/third_party/boringssl/crypto/x509/x509_txt.c +5 -0
  574. data/third_party/boringssl/crypto/x509/x509_vfy.c +63 -32
  575. data/third_party/boringssl/crypto/x509/x509_vpm.c +29 -18
  576. data/third_party/boringssl/crypto/x509/x509cset.c +2 -1
  577. data/third_party/boringssl/crypto/x509/x_crl.c +2 -2
  578. data/third_party/boringssl/crypto/x509/x_name.c +14 -17
  579. data/third_party/boringssl/crypto/x509/x_pubkey.c +10 -7
  580. data/third_party/boringssl/crypto/x509/x_x509.c +67 -6
  581. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -2
  582. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +2 -1
  583. data/third_party/boringssl/crypto/x509v3/v3_conf.c +4 -3
  584. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +5 -0
  585. data/third_party/boringssl/crypto/x509v3/v3_prn.c +0 -3
  586. data/third_party/boringssl/crypto/x509v3/v3_purp.c +2 -2
  587. data/third_party/boringssl/crypto/x509v3/v3_utl.c +2 -1
  588. data/third_party/boringssl/include/openssl/aead.h +72 -73
  589. data/third_party/boringssl/include/openssl/arm_arch.h +0 -6
  590. data/third_party/boringssl/include/openssl/asn1.h +103 -235
  591. data/third_party/boringssl/include/openssl/asn1_mac.h +17 -74
  592. data/third_party/boringssl/include/openssl/asn1t.h +1 -11
  593. data/third_party/boringssl/include/openssl/base.h +145 -3
  594. data/third_party/boringssl/include/openssl/base64.h +20 -17
  595. data/third_party/boringssl/include/openssl/bio.h +59 -34
  596. data/third_party/boringssl/include/openssl/bn.h +118 -51
  597. data/third_party/boringssl/include/openssl/buf.h +15 -0
  598. data/third_party/boringssl/include/openssl/bytestring.h +52 -4
  599. data/third_party/boringssl/include/openssl/chacha.h +2 -2
  600. data/third_party/boringssl/include/openssl/cipher.h +18 -1
  601. data/third_party/boringssl/include/openssl/cmac.h +11 -0
  602. data/third_party/boringssl/include/openssl/conf.h +13 -2
  603. data/third_party/boringssl/include/openssl/cpu.h +20 -23
  604. data/third_party/boringssl/include/openssl/crypto.h +22 -1
  605. data/third_party/boringssl/include/openssl/curve25519.h +96 -4
  606. data/third_party/boringssl/include/openssl/dh.h +71 -16
  607. data/third_party/boringssl/include/openssl/digest.h +38 -11
  608. data/third_party/boringssl/include/openssl/dsa.h +40 -4
  609. data/third_party/boringssl/include/openssl/ec.h +44 -18
  610. data/third_party/boringssl/include/openssl/ec_key.h +27 -6
  611. data/third_party/boringssl/include/openssl/ecdsa.h +11 -0
  612. data/third_party/boringssl/include/openssl/engine.h +11 -0
  613. data/third_party/boringssl/include/openssl/evp.h +52 -88
  614. data/third_party/boringssl/include/openssl/hkdf.h +24 -4
  615. data/third_party/boringssl/include/openssl/hmac.h +20 -6
  616. data/third_party/boringssl/include/openssl/md4.h +4 -0
  617. data/third_party/boringssl/include/openssl/mem.h +19 -0
  618. data/third_party/boringssl/include/openssl/newhope.h +158 -0
  619. data/third_party/boringssl/include/openssl/nid.h +4166 -0
  620. data/third_party/boringssl/include/openssl/obj.h +31 -3
  621. data/third_party/boringssl/include/openssl/obj_mac.h +17 -4143
  622. data/third_party/boringssl/include/openssl/{opensslfeatures.h → opensslconf.h} +3 -3
  623. data/third_party/boringssl/include/openssl/pem.h +5 -0
  624. data/third_party/boringssl/include/openssl/pkcs8.h +12 -0
  625. data/third_party/boringssl/include/openssl/rand.h +6 -0
  626. data/third_party/boringssl/include/openssl/rc4.h +6 -0
  627. data/third_party/boringssl/{crypto/dh/internal.h → include/openssl/ripemd.h} +38 -11
  628. data/third_party/boringssl/include/openssl/rsa.h +127 -65
  629. data/third_party/boringssl/include/openssl/sha.h +14 -10
  630. data/third_party/boringssl/include/openssl/ssl.h +561 -275
  631. data/third_party/boringssl/include/openssl/ssl3.h +18 -25
  632. data/third_party/boringssl/include/openssl/stack.h +2 -4
  633. data/third_party/boringssl/include/openssl/stack_macros.h +321 -353
  634. data/third_party/boringssl/include/openssl/thread.h +31 -13
  635. data/third_party/boringssl/include/openssl/time_support.h +1 -0
  636. data/third_party/boringssl/include/openssl/tls1.h +37 -33
  637. data/third_party/boringssl/include/openssl/x509.h +69 -26
  638. data/third_party/boringssl/include/openssl/x509_vfy.h +12 -10
  639. data/third_party/boringssl/include/openssl/x509v3.h +23 -2
  640. data/third_party/boringssl/ssl/custom_extensions.c +3 -5
  641. data/third_party/boringssl/ssl/d1_both.c +463 -499
  642. data/third_party/boringssl/ssl/d1_lib.c +38 -109
  643. data/third_party/boringssl/ssl/d1_pkt.c +173 -334
  644. data/third_party/boringssl/ssl/d1_srtp.c +20 -18
  645. data/third_party/boringssl/ssl/{d1_meth.c → dtls_method.c} +88 -15
  646. data/third_party/boringssl/ssl/dtls_record.c +27 -26
  647. data/third_party/boringssl/ssl/{s3_clnt.c → handshake_client.c} +816 -904
  648. data/third_party/boringssl/ssl/handshake_server.c +1932 -0
  649. data/third_party/boringssl/ssl/internal.h +712 -439
  650. data/third_party/boringssl/ssl/s3_both.c +445 -257
  651. data/third_party/boringssl/ssl/s3_enc.c +53 -36
  652. data/third_party/boringssl/ssl/s3_lib.c +23 -268
  653. data/third_party/boringssl/ssl/s3_pkt.c +168 -364
  654. data/third_party/boringssl/ssl/ssl_aead_ctx.c +46 -17
  655. data/third_party/boringssl/ssl/ssl_asn1.c +56 -26
  656. data/third_party/boringssl/ssl/ssl_buffer.c +16 -24
  657. data/third_party/boringssl/ssl/ssl_cert.c +324 -49
  658. data/third_party/boringssl/ssl/ssl_cipher.c +205 -150
  659. data/third_party/boringssl/ssl/ssl_ecdh.c +287 -51
  660. data/third_party/boringssl/ssl/ssl_file.c +21 -68
  661. data/third_party/boringssl/ssl/ssl_lib.c +881 -510
  662. data/third_party/boringssl/ssl/ssl_rsa.c +404 -34
  663. data/third_party/boringssl/ssl/ssl_session.c +324 -103
  664. data/third_party/boringssl/ssl/ssl_stat.c +6 -88
  665. data/third_party/boringssl/ssl/t1_enc.c +23 -39
  666. data/third_party/boringssl/ssl/t1_lib.c +1120 -622
  667. data/third_party/boringssl/ssl/tls13_both.c +440 -0
  668. data/third_party/boringssl/ssl/tls13_client.c +682 -0
  669. data/third_party/boringssl/ssl/tls13_enc.c +391 -0
  670. data/third_party/boringssl/ssl/tls13_server.c +672 -0
  671. data/third_party/boringssl/ssl/{s3_meth.c → tls_method.c} +100 -21
  672. data/third_party/boringssl/ssl/tls_record.c +159 -77
  673. data/third_party/nanopb/pb.h +60 -28
  674. data/third_party/nanopb/pb_decode.c +120 -92
  675. data/third_party/nanopb/pb_decode.h +3 -3
  676. data/third_party/nanopb/pb_encode.c +73 -67
  677. data/third_party/nanopb/pb_encode.h +4 -4
  678. metadata +155 -89
  679. data/include/grpc/impl/codegen/byte_buffer.h +0 -122
  680. data/include/grpc/impl/codegen/log.h +0 -118
  681. data/include/grpc/impl/codegen/time.h +0 -130
  682. data/src/core/ext/client_config/client_channel.c +0 -593
  683. data/src/core/ext/client_config/subchannel_call_holder.c +0 -272
  684. data/src/core/ext/client_config/subchannel_call_holder.h +0 -99
  685. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +0 -2046
  686. data/src/core/lib/iomgr/workqueue_posix.c +0 -151
  687. data/src/core/lib/security/transport/handshake.c +0 -368
  688. data/third_party/boringssl/crypto/asn1/a_bytes.c +0 -308
  689. data/third_party/boringssl/crypto/asn1/bio_asn1.c +0 -477
  690. data/third_party/boringssl/crypto/asn1/bio_ndef.c +0 -251
  691. data/third_party/boringssl/crypto/asn1/t_pkey.c +0 -110
  692. data/third_party/boringssl/crypto/asn1/tasn_prn.c +0 -596
  693. data/third_party/boringssl/crypto/chacha/chacha_vec.c +0 -328
  694. data/third_party/boringssl/crypto/directory.h +0 -66
  695. data/third_party/boringssl/crypto/directory_posix.c +0 -108
  696. data/third_party/boringssl/crypto/directory_win.c +0 -144
  697. data/third_party/boringssl/crypto/test/scoped_types.h +0 -140
  698. data/third_party/boringssl/include/openssl/pqueue.h +0 -146
  699. data/third_party/boringssl/ssl/d1_clnt.c +0 -561
  700. data/third_party/boringssl/ssl/d1_srvr.c +0 -476
  701. data/third_party/boringssl/ssl/pqueue/pqueue.c +0 -197
  702. data/third_party/boringssl/ssl/s3_srvr.c +0 -2272
  703. data/third_party/boringssl/ssl/test/async_bio.h +0 -45
  704. data/third_party/boringssl/ssl/test/packeted_bio.h +0 -44
  705. 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);
@@ -36,4 +36,6 @@
36
36
 
37
37
  #include <grpc/grpc.h>
38
38
 
39
- const char *grpc_version_string(void) { return "1.0.1"; }
39
+ const char *grpc_version_string(void) { return "2.0.0"; }
40
+
41
+ const char *grpc_g_stands_for(void) { return "good"; }
@@ -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, gpr_slice *slice,
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
- gpr_slice *slice, size_t max_size_hint,
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 = gpr_slice_ref(stream->backing_buffer->slices[stream->cursor]);
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
- gpr_slice_buffer *slice_buffer,
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/support/slice_buffer.h>
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
- gpr_slice *slice, size_t max_size_hint,
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
- * on entry, *remaining can be set as a hint as to the maximum number
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, gpr_slice *slice,
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
- gpr_slice_buffer *backing_buffer;
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
- gpr_slice_buffer *slice_buffer,
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
- grpc_exec_ctx_sched(exec_ctx, w->notify, error, NULL);
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
- int grpc_connectivity_state_notify_on_state_change(
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
- grpc_exec_ctx_sched(exec_ctx, notify, GRPC_ERROR_CANCELLED, NULL);
124
+ grpc_closure_sched(exec_ctx, notify, GRPC_ERROR_CANCELLED);
118
125
  tracker->watchers = w->next;
119
126
  gpr_free(w);
120
- return 0;
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
- grpc_exec_ctx_sched(exec_ctx, notify, GRPC_ERROR_CANCELLED, NULL);
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 0;
135
+ return false;
129
136
  }
130
137
  w = w->next;
131
138
  }
132
- return 0;
139
+ return false;
133
140
  } else {
134
141
  if (tracker->current_state != *current) {
135
142
  *current = tracker->current_state;
136
- grpc_exec_ctx_sched(exec_ctx, notify,
137
- GRPC_ERROR_REF(tracker->current_error), NULL);
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", w->notify);
191
+ gpr_log(GPR_DEBUG, "NOTIFY: %p %s: %p", tracker, tracker->name,
192
+ w->notify);
184
193
  }
185
- grpc_exec_ctx_sched(exec_ctx, w->notify,
186
- GRPC_ERROR_REF(tracker->current_error), NULL);
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
- int grpc_connectivity_state_notify_on_state_change(
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
- gpr_slice (*grpc_chttp2_base64_encode_and_huffman_compress)(gpr_slice input);
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
- gpr_slice slice;
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
- gpr_slice_refcount refcount;
96
+ grpc_slice_refcount refcount;
96
97
 
97
- gpr_slice base64_and_huffman;
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
- *(gpr_slice *)&elem->slice = gpr_slice_from_static_string(str);
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(void) {
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:%d->%d: '%s' = '%s'", md,
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(strtab_shard *shard, internal_string *is) {
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
- gpr_slice_unref(is->base64_and_huffman);
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(gpr_slice slice) {
354
- grpc_mdstr *result = grpc_mdstr_from_buffer(GPR_SLICE_START_PTR(slice),
355
- GPR_SLICE_LENGTH(slice));
356
- gpr_slice_unref(slice);
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 && GPR_SLICE_LENGTH(ss->slice) == length &&
378
+ if (ss->hash == hash && GRPC_SLICE_LENGTH(ss->slice) == length &&
377
379
  (length == 0 ||
378
- 0 == memcmp(buf, GPR_SLICE_START_PTR(ss->slice), length))) {
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 && GPR_SLICE_LENGTH(s->slice) == length &&
390
- 0 == memcmp(buf, GPR_SLICE_START_PTR(s->slice), length)) {
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 < GPR_SLICE_INLINED_SIZE) {
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(grpc_mdstr *mkey,
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:%d: '%s' = '%s'", md,
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(const char *key, const char *value) {
588
- return grpc_mdelem_from_metadata_strings(grpc_mdstr_from_string(key),
589
- grpc_mdstr_from_string(value));
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(gpr_slice key, gpr_slice value) {
593
- return grpc_mdelem_from_metadata_strings(grpc_mdstr_from_slice(key),
594
- grpc_mdstr_from_slice(value));
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(const char *key,
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), grpc_mdstr_from_buffer(value, value_length));
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 + GPR_SLICE_LENGTH(elem->key->slice);
611
- size_t value_len = GPR_SLICE_LENGTH(elem->value->slice);
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 *)GPR_SLICE_START_PTR(elem->key->slice),
615
- GPR_SLICE_LENGTH(elem->key->slice))) {
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 *)GPR_SLICE_START_PTR(elem->key->slice),
626
- GPR_SLICE_LENGTH(elem->key->slice))) {
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:%d->%d: '%s' = '%s'", md,
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
- assert(gpr_atm_no_barrier_load(&md->refcnt) >= 1);
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:%d->%d: '%s' = '%s'", md,
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
- if (1 == gpr_atm_full_fetch_add(&md->refcnt, -1)) {
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 *)GPR_SLICE_START_PTR(s->slice);
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
- void *user_data) {
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
- gpr_slice grpc_mdstr_as_base64_encoded_and_huffman_compressed(grpc_mdstr *gs) {
759
+ grpc_slice grpc_mdstr_as_base64_encoded_and_huffman_compressed(grpc_mdstr *gs) {
737
760
  internal_string *s = (internal_string *)gs;
738
- gpr_slice slice;
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);