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
@@ -45,7 +45,8 @@
45
45
  typedef struct grpc_chttp2_hpack_parser grpc_chttp2_hpack_parser;
46
46
 
47
47
  typedef grpc_error *(*grpc_chttp2_hpack_parser_state)(
48
- grpc_chttp2_hpack_parser *p, const uint8_t *beg, const uint8_t *end);
48
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, const uint8_t *beg,
49
+ const uint8_t *end);
49
50
 
50
51
  typedef struct {
51
52
  char *str;
@@ -55,7 +56,7 @@ typedef struct {
55
56
 
56
57
  struct grpc_chttp2_hpack_parser {
57
58
  /* user specified callback for each header output */
58
- void (*on_header)(void *user_data, grpc_mdelem *md);
59
+ void (*on_header)(grpc_exec_ctx *exec_ctx, void *user_data, grpc_mdelem *md);
59
60
  void *on_header_user_data;
60
61
 
61
62
  grpc_error *last_error;
@@ -98,21 +99,25 @@ struct grpc_chttp2_hpack_parser {
98
99
  grpc_chttp2_hptbl table;
99
100
  };
100
101
 
101
- void grpc_chttp2_hpack_parser_init(grpc_chttp2_hpack_parser *p);
102
- void grpc_chttp2_hpack_parser_destroy(grpc_chttp2_hpack_parser *p);
102
+ void grpc_chttp2_hpack_parser_init(grpc_exec_ctx *exec_ctx,
103
+ grpc_chttp2_hpack_parser *p);
104
+ void grpc_chttp2_hpack_parser_destroy(grpc_exec_ctx *exec_ctx,
105
+ grpc_chttp2_hpack_parser *p);
103
106
 
104
107
  void grpc_chttp2_hpack_parser_set_has_priority(grpc_chttp2_hpack_parser *p);
105
108
 
106
109
  /* returns 1 on success, 0 on error */
107
- grpc_error *grpc_chttp2_hpack_parser_parse(grpc_chttp2_hpack_parser *p,
110
+ grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx,
111
+ grpc_chttp2_hpack_parser *p,
108
112
  const uint8_t *beg,
109
113
  const uint8_t *end);
110
114
 
111
115
  /* wraps grpc_chttp2_hpack_parser_parse to provide a frame level parser for
112
116
  the transport */
113
- grpc_error *grpc_chttp2_header_parser_parse(
114
- grpc_exec_ctx *exec_ctx, void *hpack_parser,
115
- grpc_chttp2_transport_parsing *transport_parsing,
116
- grpc_chttp2_stream_parsing *stream_parsing, gpr_slice slice, int is_last);
117
+ grpc_error *grpc_chttp2_header_parser_parse(grpc_exec_ctx *exec_ctx,
118
+ void *hpack_parser,
119
+ grpc_chttp2_transport *t,
120
+ grpc_chttp2_stream *s,
121
+ grpc_slice slice, int is_last);
117
122
 
118
123
  #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_PARSER_H */
@@ -179,7 +179,7 @@ static uint32_t entries_for_bytes(uint32_t bytes) {
179
179
  GRPC_CHTTP2_HPACK_ENTRY_OVERHEAD;
180
180
  }
181
181
 
182
- void grpc_chttp2_hptbl_init(grpc_chttp2_hptbl *tbl) {
182
+ void grpc_chttp2_hptbl_init(grpc_exec_ctx *exec_ctx, grpc_chttp2_hptbl *tbl) {
183
183
  size_t i;
184
184
 
185
185
  memset(tbl, 0, sizeof(*tbl));
@@ -190,18 +190,20 @@ void grpc_chttp2_hptbl_init(grpc_chttp2_hptbl *tbl) {
190
190
  tbl->ents = gpr_malloc(sizeof(*tbl->ents) * tbl->cap_entries);
191
191
  memset(tbl->ents, 0, sizeof(*tbl->ents) * tbl->cap_entries);
192
192
  for (i = 1; i <= GRPC_CHTTP2_LAST_STATIC_ENTRY; i++) {
193
- tbl->static_ents[i - 1] =
194
- grpc_mdelem_from_strings(static_table[i].key, static_table[i].value);
193
+ tbl->static_ents[i - 1] = grpc_mdelem_from_strings(
194
+ exec_ctx, static_table[i].key, static_table[i].value);
195
195
  }
196
196
  }
197
197
 
198
- void grpc_chttp2_hptbl_destroy(grpc_chttp2_hptbl *tbl) {
198
+ void grpc_chttp2_hptbl_destroy(grpc_exec_ctx *exec_ctx,
199
+ grpc_chttp2_hptbl *tbl) {
199
200
  size_t i;
200
201
  for (i = 0; i < GRPC_CHTTP2_LAST_STATIC_ENTRY; i++) {
201
- GRPC_MDELEM_UNREF(tbl->static_ents[i]);
202
+ GRPC_MDELEM_UNREF(exec_ctx, tbl->static_ents[i]);
202
203
  }
203
204
  for (i = 0; i < tbl->num_ents; i++) {
204
- GRPC_MDELEM_UNREF(tbl->ents[(tbl->first_ent + i) % tbl->cap_entries]);
205
+ GRPC_MDELEM_UNREF(exec_ctx,
206
+ tbl->ents[(tbl->first_ent + i) % tbl->cap_entries]);
205
207
  }
206
208
  gpr_free(tbl->ents);
207
209
  }
@@ -224,16 +226,16 @@ grpc_mdelem *grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl *tbl,
224
226
  }
225
227
 
226
228
  /* Evict one element from the table */
227
- static void evict1(grpc_chttp2_hptbl *tbl) {
229
+ static void evict1(grpc_exec_ctx *exec_ctx, grpc_chttp2_hptbl *tbl) {
228
230
  grpc_mdelem *first_ent = tbl->ents[tbl->first_ent];
229
- size_t elem_bytes = GPR_SLICE_LENGTH(first_ent->key->slice) +
230
- GPR_SLICE_LENGTH(first_ent->value->slice) +
231
+ size_t elem_bytes = GRPC_SLICE_LENGTH(first_ent->key->slice) +
232
+ GRPC_SLICE_LENGTH(first_ent->value->slice) +
231
233
  GRPC_CHTTP2_HPACK_ENTRY_OVERHEAD;
232
234
  GPR_ASSERT(elem_bytes <= tbl->mem_used);
233
235
  tbl->mem_used -= (uint32_t)elem_bytes;
234
236
  tbl->first_ent = ((tbl->first_ent + 1) % tbl->cap_entries);
235
237
  tbl->num_ents--;
236
- GRPC_MDELEM_UNREF(first_ent);
238
+ GRPC_MDELEM_UNREF(exec_ctx, first_ent);
237
239
  }
238
240
 
239
241
  static void rebuild_ents(grpc_chttp2_hptbl *tbl, uint32_t new_cap) {
@@ -249,7 +251,8 @@ static void rebuild_ents(grpc_chttp2_hptbl *tbl, uint32_t new_cap) {
249
251
  tbl->first_ent = 0;
250
252
  }
251
253
 
252
- void grpc_chttp2_hptbl_set_max_bytes(grpc_chttp2_hptbl *tbl,
254
+ void grpc_chttp2_hptbl_set_max_bytes(grpc_exec_ctx *exec_ctx,
255
+ grpc_chttp2_hptbl *tbl,
253
256
  uint32_t max_bytes) {
254
257
  if (tbl->max_bytes == max_bytes) {
255
258
  return;
@@ -258,12 +261,13 @@ void grpc_chttp2_hptbl_set_max_bytes(grpc_chttp2_hptbl *tbl,
258
261
  gpr_log(GPR_DEBUG, "Update hpack parser max size to %d", max_bytes);
259
262
  }
260
263
  while (tbl->mem_used > max_bytes) {
261
- evict1(tbl);
264
+ evict1(exec_ctx, tbl);
262
265
  }
263
266
  tbl->max_bytes = max_bytes;
264
267
  }
265
268
 
266
- grpc_error *grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl *tbl,
269
+ grpc_error *grpc_chttp2_hptbl_set_current_table_size(grpc_exec_ctx *exec_ctx,
270
+ grpc_chttp2_hptbl *tbl,
267
271
  uint32_t bytes) {
268
272
  if (tbl->current_table_bytes == bytes) {
269
273
  return GRPC_ERROR_NONE;
@@ -281,7 +285,7 @@ grpc_error *grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl *tbl,
281
285
  gpr_log(GPR_DEBUG, "Update hpack parser table size to %d", bytes);
282
286
  }
283
287
  while (tbl->mem_used > bytes) {
284
- evict1(tbl);
288
+ evict1(exec_ctx, tbl);
285
289
  }
286
290
  tbl->current_table_bytes = bytes;
287
291
  tbl->max_entries = entries_for_bytes(bytes);
@@ -296,10 +300,11 @@ grpc_error *grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl *tbl,
296
300
  return GRPC_ERROR_NONE;
297
301
  }
298
302
 
299
- grpc_error *grpc_chttp2_hptbl_add(grpc_chttp2_hptbl *tbl, grpc_mdelem *md) {
303
+ grpc_error *grpc_chttp2_hptbl_add(grpc_exec_ctx *exec_ctx,
304
+ grpc_chttp2_hptbl *tbl, grpc_mdelem *md) {
300
305
  /* determine how many bytes of buffer this entry represents */
301
- size_t elem_bytes = GPR_SLICE_LENGTH(md->key->slice) +
302
- GPR_SLICE_LENGTH(md->value->slice) +
306
+ size_t elem_bytes = GRPC_SLICE_LENGTH(md->key->slice) +
307
+ GRPC_SLICE_LENGTH(md->value->slice) +
303
308
  GRPC_CHTTP2_HPACK_ENTRY_OVERHEAD;
304
309
 
305
310
  if (tbl->current_table_bytes > tbl->max_bytes) {
@@ -326,14 +331,14 @@ grpc_error *grpc_chttp2_hptbl_add(grpc_chttp2_hptbl *tbl, grpc_mdelem *md) {
326
331
  * empty table.
327
332
  */
328
333
  while (tbl->num_ents) {
329
- evict1(tbl);
334
+ evict1(exec_ctx, tbl);
330
335
  }
331
336
  return GRPC_ERROR_NONE;
332
337
  }
333
338
 
334
339
  /* evict entries to ensure no overflow */
335
340
  while (elem_bytes > (size_t)tbl->current_table_bytes - tbl->mem_used) {
336
- evict1(tbl);
341
+ evict1(exec_ctx, tbl);
337
342
  }
338
343
 
339
344
  /* copy the finalized entry in */
@@ -34,8 +34,8 @@
34
34
  #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_TABLE_H
35
35
  #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_HPACK_TABLE_H
36
36
 
37
+ #include <grpc/slice.h>
37
38
  #include <grpc/support/port_platform.h>
38
- #include <grpc/support/slice.h>
39
39
  #include "src/core/lib/iomgr/error.h"
40
40
  #include "src/core/lib/transport/metadata.h"
41
41
 
@@ -84,18 +84,21 @@ typedef struct {
84
84
  } grpc_chttp2_hptbl;
85
85
 
86
86
  /* initialize a hpack table */
87
- void grpc_chttp2_hptbl_init(grpc_chttp2_hptbl *tbl);
88
- void grpc_chttp2_hptbl_destroy(grpc_chttp2_hptbl *tbl);
89
- void grpc_chttp2_hptbl_set_max_bytes(grpc_chttp2_hptbl *tbl,
87
+ void grpc_chttp2_hptbl_init(grpc_exec_ctx *exec_ctx, grpc_chttp2_hptbl *tbl);
88
+ void grpc_chttp2_hptbl_destroy(grpc_exec_ctx *exec_ctx, grpc_chttp2_hptbl *tbl);
89
+ void grpc_chttp2_hptbl_set_max_bytes(grpc_exec_ctx *exec_ctx,
90
+ grpc_chttp2_hptbl *tbl,
90
91
  uint32_t max_bytes);
91
- grpc_error *grpc_chttp2_hptbl_set_current_table_size(grpc_chttp2_hptbl *tbl,
92
+ grpc_error *grpc_chttp2_hptbl_set_current_table_size(grpc_exec_ctx *exec_ctx,
93
+ grpc_chttp2_hptbl *tbl,
92
94
  uint32_t bytes);
93
95
 
94
96
  /* lookup a table entry based on its hpack index */
95
97
  grpc_mdelem *grpc_chttp2_hptbl_lookup(const grpc_chttp2_hptbl *tbl,
96
98
  uint32_t index);
97
99
  /* add a table entry to the index */
98
- grpc_error *grpc_chttp2_hptbl_add(grpc_chttp2_hptbl *tbl,
100
+ grpc_error *grpc_chttp2_hptbl_add(grpc_exec_ctx *exec_ctx,
101
+ grpc_chttp2_hptbl *tbl,
99
102
  grpc_mdelem *md) GRPC_MUST_USE_RESULT;
100
103
  /* Find a key/value pair in the table... returns the index in the table of the
101
104
  most similar entry, or 0 if the value was not found */
@@ -46,11 +46,11 @@ void grpc_chttp2_incoming_metadata_buffer_init(
46
46
  }
47
47
 
48
48
  void grpc_chttp2_incoming_metadata_buffer_destroy(
49
- grpc_chttp2_incoming_metadata_buffer *buffer) {
49
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer) {
50
50
  size_t i;
51
51
  if (!buffer->published) {
52
52
  for (i = 0; i < buffer->count; i++) {
53
- GRPC_MDELEM_UNREF(buffer->elems[i].md);
53
+ GRPC_MDELEM_UNREF(exec_ctx, buffer->elems[i].md);
54
54
  }
55
55
  }
56
56
  gpr_free(buffer->elems);
@@ -49,7 +49,7 @@ typedef struct {
49
49
  void grpc_chttp2_incoming_metadata_buffer_init(
50
50
  grpc_chttp2_incoming_metadata_buffer *buffer);
51
51
  void grpc_chttp2_incoming_metadata_buffer_destroy(
52
- grpc_chttp2_incoming_metadata_buffer *buffer);
52
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer);
53
53
  void grpc_chttp2_incoming_metadata_buffer_publish(
54
54
  grpc_chttp2_incoming_metadata_buffer *buffer, grpc_metadata_batch *batch);
55
55
 
@@ -48,35 +48,30 @@
48
48
  #include "src/core/ext/transport/chttp2/transport/hpack_parser.h"
49
49
  #include "src/core/ext/transport/chttp2/transport/incoming_metadata.h"
50
50
  #include "src/core/ext/transport/chttp2/transport/stream_map.h"
51
+ #include "src/core/lib/iomgr/combiner.h"
51
52
  #include "src/core/lib/iomgr/endpoint.h"
52
53
  #include "src/core/lib/transport/connectivity_state.h"
53
54
  #include "src/core/lib/transport/transport_impl.h"
54
55
 
55
- typedef struct grpc_chttp2_transport grpc_chttp2_transport;
56
- typedef struct grpc_chttp2_stream grpc_chttp2_stream;
57
-
58
56
  /* streams are kept in various linked lists depending on what things need to
59
57
  happen to them... this enum labels each list */
60
58
  typedef enum {
61
- GRPC_CHTTP2_LIST_ALL_STREAMS,
62
- GRPC_CHTTP2_LIST_CHECK_READ_OPS,
63
- GRPC_CHTTP2_LIST_UNANNOUNCED_INCOMING_WINDOW_AVAILABLE,
64
59
  GRPC_CHTTP2_LIST_WRITABLE,
65
60
  GRPC_CHTTP2_LIST_WRITING,
66
- GRPC_CHTTP2_LIST_WRITTEN,
67
- GRPC_CHTTP2_LIST_PARSING_SEEN,
68
- GRPC_CHTTP2_LIST_CLOSED_WAITING_FOR_PARSING,
69
- GRPC_CHTTP2_LIST_CLOSED_WAITING_FOR_WRITING,
70
61
  GRPC_CHTTP2_LIST_STALLED_BY_TRANSPORT,
71
- /* streams waiting for the outgoing window in the writing path, they will be
72
- * merged to the stalled list or writable list under transport lock. */
73
- GRPC_CHTTP2_LIST_WRITING_STALLED_BY_TRANSPORT,
74
62
  /** streams that are waiting to start because there are too many concurrent
75
63
  streams on the connection */
76
64
  GRPC_CHTTP2_LIST_WAITING_FOR_CONCURRENCY,
77
65
  STREAM_LIST_COUNT /* must be last */
78
66
  } grpc_chttp2_stream_list_id;
79
67
 
68
+ typedef enum {
69
+ GRPC_CHTTP2_WRITE_STATE_IDLE,
70
+ GRPC_CHTTP2_WRITE_STATE_WRITING,
71
+ GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE,
72
+ GRPC_CHTTP2_WRITE_STATE_WRITING_WITH_MORE_AND_COVERED_BY_POLLER,
73
+ } grpc_chttp2_write_state;
74
+
80
75
  /* deframer state for the overall http2 stream of bytes */
81
76
  typedef enum {
82
77
  /* prefix: one entry per http2 connection prefix byte */
@@ -143,6 +138,12 @@ typedef enum {
143
138
  GRPC_NUM_SETTING_SETS
144
139
  } grpc_chttp2_setting_set;
145
140
 
141
+ typedef enum {
142
+ GRPC_CHTTP2_NO_GOAWAY_SEND,
143
+ GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED,
144
+ GRPC_CHTTP2_GOAWAY_SENT,
145
+ } grpc_chttp2_sent_goaway_state;
146
+
146
147
  /* Outstanding ping request data */
147
148
  typedef struct grpc_chttp2_outstanding_ping {
148
149
  uint8_t id[8];
@@ -151,6 +152,12 @@ typedef struct grpc_chttp2_outstanding_ping {
151
152
  struct grpc_chttp2_outstanding_ping *prev;
152
153
  } grpc_chttp2_outstanding_ping;
153
154
 
155
+ typedef struct grpc_chttp2_write_cb {
156
+ int64_t call_at_byte;
157
+ grpc_closure *closure;
158
+ struct grpc_chttp2_write_cb *next;
159
+ } grpc_chttp2_write_cb;
160
+
154
161
  /* forward declared in frame_data.h */
155
162
  struct grpc_chttp2_incoming_byte_stream {
156
163
  grpc_byte_stream base;
@@ -160,30 +167,97 @@ struct grpc_chttp2_incoming_byte_stream {
160
167
 
161
168
  grpc_chttp2_transport *transport;
162
169
  grpc_chttp2_stream *stream;
163
- int is_tail;
164
- gpr_slice_buffer slices;
170
+ bool is_tail;
171
+
172
+ gpr_mu slice_mu; // protects slices, on_next
173
+ grpc_slice_buffer slices;
165
174
  grpc_closure *on_next;
166
- gpr_slice *next;
175
+ grpc_slice *next;
176
+ uint32_t remaining_bytes;
177
+
178
+ struct {
179
+ grpc_closure closure;
180
+ grpc_slice *slice;
181
+ size_t max_size_hint;
182
+ grpc_closure *on_complete;
183
+ } next_action;
184
+ grpc_closure destroy_action;
185
+ grpc_closure finished_action;
167
186
  };
168
187
 
169
- typedef struct {
170
- /** data to write next write */
171
- gpr_slice_buffer qbuf;
188
+ struct grpc_chttp2_transport {
189
+ grpc_transport base; /* must be first */
190
+ gpr_refcount refs;
191
+ grpc_endpoint *ep;
192
+ char *peer_string;
172
193
 
173
- /** window available for us to send to peer */
194
+ grpc_combiner *combiner;
195
+
196
+ /** write execution state of the transport */
197
+ grpc_chttp2_write_state write_state;
198
+
199
+ /** is the transport destroying itself? */
200
+ uint8_t destroying;
201
+ /** has the upper layer closed the transport? */
202
+ uint8_t closed;
203
+
204
+ /** is there a read request to the endpoint outstanding? */
205
+ uint8_t endpoint_reading;
206
+
207
+ /** various lists of streams */
208
+ grpc_chttp2_stream_list lists[STREAM_LIST_COUNT];
209
+
210
+ /** maps stream id to grpc_chttp2_stream objects */
211
+ grpc_chttp2_stream_map stream_map;
212
+
213
+ grpc_closure write_action_begin_locked;
214
+ grpc_closure write_action;
215
+ grpc_closure write_action_end_locked;
216
+
217
+ grpc_closure read_action_locked;
218
+
219
+ /** incoming read bytes */
220
+ grpc_slice_buffer read_buffer;
221
+
222
+ /** address to place a newly accepted stream - set and unset by
223
+ grpc_chttp2_parsing_accept_stream; used by init_stream to
224
+ publish the accepted server stream */
225
+ grpc_chttp2_stream **accepting_stream;
226
+
227
+ struct {
228
+ /* accept stream callback */
229
+ void (*accept_stream)(grpc_exec_ctx *exec_ctx, void *user_data,
230
+ grpc_transport *transport, const void *server_data);
231
+ void *accept_stream_user_data;
232
+
233
+ /** connectivity tracking */
234
+ grpc_connectivity_state_tracker state_tracker;
235
+ } channel_callback;
236
+
237
+ /** data to write now */
238
+ grpc_slice_buffer outbuf;
239
+ /** hpack encoding */
240
+ grpc_chttp2_hpack_compressor hpack_compressor;
174
241
  int64_t outgoing_window;
242
+ /** is this a client? */
243
+ uint8_t is_client;
244
+
245
+ /** data to write next write */
246
+ grpc_slice_buffer qbuf;
247
+
175
248
  /** window available to announce to peer */
176
249
  int64_t announce_incoming_window;
177
250
  /** how much window would we like to have for incoming_window */
178
251
  uint32_t connection_window_target;
252
+ /** how much data are we willing to buffer when the WRITE_BUFFER_HINT is set?
253
+ */
254
+ uint32_t write_buffer_size;
179
255
 
180
256
  /** have we seen a goaway */
181
257
  uint8_t seen_goaway;
182
258
  /** have we sent a goaway */
183
- uint8_t sent_goaway;
259
+ grpc_chttp2_sent_goaway_state sent_goaway_state;
184
260
 
185
- /** is this transport a client? */
186
- uint8_t is_client;
187
261
  /** are the local settings dirty and need to be sent? */
188
262
  uint8_t dirtied_local_settings;
189
263
  /** have local settings been sent? */
@@ -200,47 +274,14 @@ typedef struct {
200
274
  /** how far to lookahead in a stream? */
201
275
  uint32_t stream_lookahead;
202
276
 
203
- /** last received stream id */
204
- uint32_t last_incoming_stream_id;
277
+ /** last new stream id */
278
+ uint32_t last_new_stream_id;
205
279
 
206
280
  /** pings awaiting responses */
207
281
  grpc_chttp2_outstanding_ping pings;
208
282
  /** next payload for an outgoing ping */
209
283
  uint64_t ping_counter;
210
284
 
211
- /** concurrent stream count: updated when not parsing,
212
- so this is a strict over-estimation on the client */
213
- uint32_t concurrent_stream_count;
214
- } grpc_chttp2_transport_global;
215
-
216
- typedef struct {
217
- /** data to write now */
218
- gpr_slice_buffer outbuf;
219
- /** hpack encoding */
220
- grpc_chttp2_hpack_compressor hpack_compressor;
221
- int64_t outgoing_window;
222
- /** is this a client? */
223
- uint8_t is_client;
224
- /** callback for when writing is done */
225
- grpc_closure done_cb;
226
- } grpc_chttp2_transport_writing;
227
-
228
- struct grpc_chttp2_transport_parsing {
229
- /** is this transport a client? (boolean) */
230
- uint8_t is_client;
231
-
232
- /** were settings updated? */
233
- uint8_t settings_updated;
234
- /** was a settings ack received? */
235
- uint8_t settings_ack_received;
236
- /** was a goaway frame received? */
237
- uint8_t goaway_received;
238
-
239
- /** initial window change */
240
- int64_t initial_window_update;
241
-
242
- /** data to write later - after parsing */
243
- gpr_slice_buffer qbuf;
244
285
  /** parser for headers */
245
286
  grpc_chttp2_hpack_parser hpack_parser;
246
287
  /** simple one shot parsers */
@@ -253,13 +294,12 @@ struct grpc_chttp2_transport_parsing {
253
294
  /** parser for goaway frames */
254
295
  grpc_chttp2_goaway_parser goaway_parser;
255
296
 
297
+ /** initial window change */
298
+ int64_t initial_window_update;
299
+
256
300
  /** window available for peer to send to us */
257
301
  int64_t incoming_window;
258
302
 
259
- /** next stream id available at the time of beginning parsing */
260
- uint32_t next_stream_id;
261
- uint32_t last_incoming_stream_id;
262
-
263
303
  /* deframing */
264
304
  grpc_chttp2_deframe_transport_state deframe_state;
265
305
  uint8_t incoming_frame_type;
@@ -270,142 +310,55 @@ struct grpc_chttp2_transport_parsing {
270
310
  uint32_t incoming_frame_size;
271
311
  uint32_t incoming_stream_id;
272
312
 
273
- /* current max frame size */
274
- uint32_t max_frame_size;
275
-
276
313
  /* active parser */
277
314
  void *parser_data;
278
- grpc_chttp2_stream_parsing *incoming_stream;
315
+ grpc_chttp2_stream *incoming_stream;
279
316
  grpc_error *(*parser)(grpc_exec_ctx *exec_ctx, void *parser_user_data,
280
- grpc_chttp2_transport_parsing *transport_parsing,
281
- grpc_chttp2_stream_parsing *stream_parsing,
282
- gpr_slice slice, int is_last);
283
-
284
- /* received settings */
285
- uint32_t settings[GRPC_CHTTP2_NUM_SETTINGS];
286
- /* last settings that were sent */
287
- uint32_t last_sent_settings[GRPC_CHTTP2_NUM_SETTINGS];
317
+ grpc_chttp2_transport *t, grpc_chttp2_stream *s,
318
+ grpc_slice slice, int is_last);
288
319
 
289
320
  /* goaway data */
290
321
  grpc_status_code goaway_error;
291
322
  uint32_t goaway_last_stream_index;
292
- gpr_slice goaway_text;
293
-
294
- int64_t outgoing_window;
323
+ grpc_slice goaway_text;
324
+
325
+ grpc_chttp2_write_cb *write_cb_pool;
326
+
327
+ /* if non-NULL, close the transport with this error when writes are finished
328
+ */
329
+ grpc_error *close_transport_on_writes_finished;
330
+
331
+ /* a list of closures to run after writes are finished */
332
+ grpc_closure_list run_after_write;
333
+
334
+ /* buffer pool state */
335
+ /** have we scheduled a benign cleanup? */
336
+ bool benign_reclaimer_registered;
337
+ /** have we scheduled a destructive cleanup? */
338
+ bool destructive_reclaimer_registered;
339
+ /** benign cleanup closure */
340
+ grpc_closure benign_reclaimer_locked;
341
+ /** destructive cleanup closure */
342
+ grpc_closure destructive_reclaimer_locked;
295
343
  };
296
344
 
297
- typedef void (*grpc_chttp2_locked_action)(grpc_exec_ctx *ctx,
298
- grpc_chttp2_transport *t,
299
- grpc_chttp2_stream *s, void *arg);
300
-
301
- typedef struct grpc_chttp2_executor_action_header {
302
- grpc_chttp2_stream *stream;
303
- grpc_chttp2_locked_action action;
304
- struct grpc_chttp2_executor_action_header *next;
305
- void *arg;
306
- } grpc_chttp2_executor_action_header;
307
-
308
345
  typedef enum {
309
- /** no writing activity */
310
- GRPC_CHTTP2_WRITING_INACTIVE,
311
- /** write has been requested, but not scheduled yet */
312
- GRPC_CHTTP2_WRITE_REQUESTED_WITH_POLLER,
313
- GRPC_CHTTP2_WRITE_REQUESTED_NO_POLLER,
314
- /** write has been requested and scheduled against the workqueue */
315
- GRPC_CHTTP2_WRITE_SCHEDULED,
316
- /** write has been initiated after being reaped from the workqueue */
317
- GRPC_CHTTP2_WRITING,
318
- /** write has been initiated, AND another write needs to be started once it's
319
- done */
320
- GRPC_CHTTP2_WRITING_STALE_WITH_POLLER,
321
- GRPC_CHTTP2_WRITING_STALE_NO_POLLER,
322
- } grpc_chttp2_write_state;
323
-
324
- struct grpc_chttp2_transport {
325
- grpc_transport base; /* must be first */
326
- gpr_refcount refs;
327
- grpc_endpoint *ep;
328
- char *peer_string;
329
-
330
- /** when this drops to zero it's safe to shutdown the endpoint */
331
- gpr_refcount shutdown_ep_refs;
332
-
333
- struct {
334
- gpr_mu mu;
335
-
336
- /** is a thread currently in the global lock */
337
- bool global_active;
338
- /** is a thread currently parsing */
339
- bool parsing_active;
340
- /** write execution state of the transport */
341
- grpc_chttp2_write_state write_state;
342
-
343
- grpc_chttp2_executor_action_header *pending_actions_head;
344
- grpc_chttp2_executor_action_header *pending_actions_tail;
345
- } executor;
346
-
347
- /** is the transport destroying itself? */
348
- uint8_t destroying;
349
- /** has the upper layer closed the transport? */
350
- uint8_t closed;
351
-
352
- /** is there a read request to the endpoint outstanding? */
353
- uint8_t endpoint_reading;
354
-
355
- /** various lists of streams */
356
- grpc_chttp2_stream_list lists[STREAM_LIST_COUNT];
357
-
358
- /** global state for reading/writing */
359
- grpc_chttp2_transport_global global;
360
- /** state only accessible by the chain of execution that
361
- set writing_state >= GRPC_WRITING, and only by the writing closure
362
- chain. */
363
- grpc_chttp2_transport_writing writing;
364
- /** state only accessible by the chain of execution that
365
- set parsing_active=1 */
366
- grpc_chttp2_transport_parsing parsing;
367
-
368
- /** maps stream id to grpc_chttp2_stream objects;
369
- owned by the parsing thread when parsing */
370
- grpc_chttp2_stream_map parsing_stream_map;
371
-
372
- /** streams created by the client (possibly during parsing);
373
- merged with parsing_stream_map during unlock when no
374
- parsing is occurring */
375
- grpc_chttp2_stream_map new_stream_map;
376
-
377
- /** closure to execute writing */
378
- grpc_closure writing_action;
379
- /** closure to start reading from the endpoint */
380
- grpc_closure reading_action;
381
- /** closure to actually do parsing */
382
- grpc_closure parsing_action;
383
- /** closure to initiate writing */
384
- grpc_closure initiate_writing;
346
+ GRPC_METADATA_NOT_PUBLISHED,
347
+ GRPC_METADATA_SYNTHESIZED_FROM_FAKE,
348
+ GRPC_METADATA_PUBLISHED_FROM_WIRE,
349
+ GPRC_METADATA_PUBLISHED_AT_CLOSE
350
+ } grpc_published_metadata_method;
385
351
 
386
- /** incoming read bytes */
387
- gpr_slice_buffer read_buffer;
388
-
389
- /** address to place a newly accepted stream - set and unset by
390
- grpc_chttp2_parsing_accept_stream; used by init_stream to
391
- publish the accepted server stream */
392
- grpc_chttp2_stream **accepting_stream;
352
+ struct grpc_chttp2_stream {
353
+ grpc_chttp2_transport *t;
354
+ grpc_stream_refcount *refcount;
393
355
 
394
- struct {
395
- /* accept stream callback */
396
- void (*accept_stream)(grpc_exec_ctx *exec_ctx, void *user_data,
397
- grpc_transport *transport, const void *server_data);
398
- void *accept_stream_user_data;
356
+ grpc_closure destroy_stream;
357
+ void *destroy_stream_arg;
399
358
 
400
- /** connectivity tracking */
401
- grpc_connectivity_state_tracker state_tracker;
402
- } channel_callback;
403
-
404
- /** Transport op to be applied post-parsing */
405
- grpc_transport_op *post_parsing_op;
406
- };
359
+ grpc_chttp2_stream_link links[STREAM_LIST_COUNT];
360
+ uint8_t included[STREAM_LIST_COUNT];
407
361
 
408
- typedef struct {
409
362
  /** HTTP2 stream id for this stream, or zero if one has not been assigned */
410
363
  uint32_t id;
411
364
 
@@ -415,20 +368,22 @@ typedef struct {
415
368
  As the upper layer offers more bytes, this value increases.
416
369
  As bytes are read, this value decreases. */
417
370
  uint32_t max_recv_bytes;
418
- /** The number of bytes the upper layer has offered to read but we have
419
- not yet announced to HTTP2 flow control.
420
- As the upper layers offer to read more bytes, this value increases.
421
- As we advertise incoming flow control window, this value decreases. */
422
- uint32_t unannounced_incoming_window_for_parse;
423
- uint32_t unannounced_incoming_window_for_writing;
424
371
  /** things the upper layers would like to send */
425
372
  grpc_metadata_batch *send_initial_metadata;
426
373
  grpc_closure *send_initial_metadata_finished;
427
- grpc_byte_stream *send_message;
428
- grpc_closure *send_message_finished;
429
374
  grpc_metadata_batch *send_trailing_metadata;
430
375
  grpc_closure *send_trailing_metadata_finished;
431
376
 
377
+ grpc_byte_stream *fetching_send_message;
378
+ uint32_t fetched_send_message_length;
379
+ grpc_slice fetching_slice;
380
+ int64_t next_message_end_offset;
381
+ int64_t flow_controlled_bytes_written;
382
+ bool complete_fetch_covered_by_poller;
383
+ grpc_closure complete_fetch;
384
+ grpc_closure complete_fetch_locked;
385
+ grpc_closure *fetching_send_message_finished;
386
+
432
387
  grpc_metadata_batch *recv_initial_metadata;
433
388
  grpc_closure *recv_initial_metadata_ready;
434
389
  grpc_byte_stream **recv_message;
@@ -448,90 +403,47 @@ typedef struct {
448
403
  bool read_closed;
449
404
  /** Are all published incoming byte streams closed. */
450
405
  bool all_incoming_byte_streams_finished;
451
- /** Is this stream in the stream map. */
452
- bool in_stream_map;
453
406
  /** Has this stream seen an error.
454
407
  If true, then pending incoming frames can be thrown away. */
455
408
  bool seen_error;
456
- bool exceeded_metadata_size;
409
+ /** Are we buffering writes on this stream? If yes, we won't become writable
410
+ until there's enough queued up in the flow_controlled_buffer */
411
+ bool write_buffering;
457
412
 
458
413
  /** the error that resulted in this stream being read-closed */
459
414
  grpc_error *read_closed_error;
460
415
  /** the error that resulted in this stream being write-closed */
461
416
  grpc_error *write_closed_error;
462
417
 
463
- bool published_initial_metadata;
464
- bool published_trailing_metadata;
418
+ grpc_published_metadata_method published_metadata[2];
465
419
  bool final_metadata_requested;
466
420
 
467
- grpc_chttp2_incoming_metadata_buffer received_initial_metadata;
468
- grpc_chttp2_incoming_metadata_buffer received_trailing_metadata;
421
+ grpc_chttp2_incoming_metadata_buffer metadata_buffer[2];
469
422
 
470
423
  grpc_chttp2_incoming_frame_queue incoming_frames;
471
424
 
472
425
  gpr_timespec deadline;
473
- } grpc_chttp2_stream_global;
474
426
 
475
- typedef struct {
476
- /** HTTP2 stream id for this stream, or zero if one has not been assigned */
477
- uint32_t id;
478
- uint8_t fetching;
479
- bool sent_initial_metadata;
480
- uint8_t sent_message;
481
- uint8_t sent_trailing_metadata;
482
- uint8_t read_closed;
483
- /** send this initial metadata */
484
- grpc_metadata_batch *send_initial_metadata;
485
- grpc_byte_stream *send_message;
486
- grpc_metadata_batch *send_trailing_metadata;
487
- int64_t outgoing_window;
488
- /** how much window should we announce? */
489
- uint32_t announce_window;
490
- gpr_slice_buffer flow_controlled_buffer;
491
- gpr_slice fetching_slice;
492
- size_t stream_fetched;
493
- grpc_closure finished_fetch;
494
- /** stats gathered during the write */
495
- grpc_transport_one_way_stats stats;
496
- } grpc_chttp2_stream_writing;
497
-
498
- struct grpc_chttp2_stream_parsing {
499
427
  /** saw some stream level error */
500
428
  grpc_error *forced_close_error;
501
- /** HTTP2 stream id for this stream, or zero if one has not been assigned */
502
- uint32_t id;
503
- /** has this stream received a close */
504
- uint8_t received_close;
505
429
  /** how many header frames have we received? */
506
430
  uint8_t header_frames_received;
507
- /** which metadata did we get (on this parse) */
508
- uint8_t got_metadata_on_parse[2];
509
- /** should we raise the seen_error flag in transport_global */
510
- bool seen_error;
511
- bool exceeded_metadata_size;
512
431
  /** window available for peer to send to us */
513
432
  int64_t incoming_window;
514
433
  /** parsing state for data frames */
515
434
  grpc_chttp2_data_parser data_parser;
516
- /** amount of window given */
517
- int64_t outgoing_window;
518
435
  /** number of bytes received - reset at end of parse thread execution */
519
436
  int64_t received_bytes;
520
- /** stats gathered during the parse */
521
- grpc_transport_stream_stats stats;
522
437
 
523
- /** incoming metadata */
524
- grpc_chttp2_incoming_metadata_buffer metadata_buffer[2];
525
- };
526
-
527
- struct grpc_chttp2_stream {
528
- grpc_stream_refcount *refcount;
529
- grpc_chttp2_stream_global global;
530
- grpc_chttp2_stream_writing writing;
531
- grpc_chttp2_stream_parsing parsing;
438
+ bool sent_initial_metadata;
439
+ bool sent_trailing_metadata;
440
+ /** how much window should we announce? */
441
+ uint32_t announce_window;
442
+ grpc_slice_buffer flow_controlled_buffer;
532
443
 
533
- grpc_chttp2_stream_link links[STREAM_LIST_COUNT];
534
- uint8_t included[STREAM_LIST_COUNT];
444
+ grpc_chttp2_write_cb *on_write_finished_cbs;
445
+ grpc_chttp2_write_cb *finish_after_write;
446
+ size_t sending_bytes;
535
447
  };
536
448
 
537
449
  /** Transport writing call flow:
@@ -547,168 +459,74 @@ struct grpc_chttp2_stream {
547
459
  The actual call chain is documented in the implementation of this function.
548
460
  */
549
461
  void grpc_chttp2_initiate_write(grpc_exec_ctx *exec_ctx,
550
- grpc_chttp2_transport_global *transport_global,
462
+ grpc_chttp2_transport *t,
551
463
  bool covered_by_poller, const char *reason);
552
464
 
553
465
  /** Someone is unlocking the transport mutex: check to see if writes
554
- are required, and schedule them if so */
555
- int grpc_chttp2_unlocking_check_writes(grpc_exec_ctx *exec_ctx,
556
- grpc_chttp2_transport_global *global,
557
- grpc_chttp2_transport_writing *writing);
558
- void grpc_chttp2_perform_writes(
559
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_writing *transport_writing,
560
- grpc_endpoint *endpoint);
561
- void grpc_chttp2_terminate_writing(grpc_exec_ctx *exec_ctx,
562
- void *transport_writing, grpc_error *error);
563
- void grpc_chttp2_cleanup_writing(grpc_exec_ctx *exec_ctx,
564
- grpc_chttp2_transport_global *global,
565
- grpc_chttp2_transport_writing *writing);
566
-
567
- void grpc_chttp2_prepare_to_read(grpc_chttp2_transport_global *global,
568
- grpc_chttp2_transport_parsing *parsing);
466
+ are required, and frame them if so */
467
+ bool grpc_chttp2_begin_write(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t);
468
+ void grpc_chttp2_end_write(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
469
+ grpc_error *error);
470
+
569
471
  /** Process one slice of incoming data; return 1 if the connection is still
570
472
  viable after reading, or 0 if the connection should be torn down */
571
- grpc_error *grpc_chttp2_perform_read(
572
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
573
- gpr_slice slice);
574
- void grpc_chttp2_publish_reads(grpc_exec_ctx *exec_ctx,
575
- grpc_chttp2_transport_global *global,
576
- grpc_chttp2_transport_parsing *parsing);
577
-
578
- bool grpc_chttp2_list_add_writable_stream(
579
- grpc_chttp2_transport_global *transport_global,
580
- grpc_chttp2_stream_global *stream_global);
473
+ grpc_error *grpc_chttp2_perform_read(grpc_exec_ctx *exec_ctx,
474
+ grpc_chttp2_transport *t,
475
+ grpc_slice slice);
476
+
477
+ bool grpc_chttp2_list_add_writable_stream(grpc_chttp2_transport *t,
478
+ grpc_chttp2_stream *s);
581
479
  /** Get a writable stream
582
480
  returns non-zero if there was a stream available */
583
- int grpc_chttp2_list_pop_writable_stream(
584
- grpc_chttp2_transport_global *transport_global,
585
- grpc_chttp2_transport_writing *transport_writing,
586
- grpc_chttp2_stream_global **stream_global,
587
- grpc_chttp2_stream_writing **stream_writing);
481
+ int grpc_chttp2_list_pop_writable_stream(grpc_chttp2_transport *t,
482
+ grpc_chttp2_stream **s);
588
483
  bool grpc_chttp2_list_remove_writable_stream(
589
- grpc_chttp2_transport_global *transport_global,
590
- grpc_chttp2_stream_global *stream_global) GRPC_MUST_USE_RESULT;
591
-
592
- void grpc_chttp2_list_add_writing_stream(
593
- grpc_chttp2_transport_writing *transport_writing,
594
- grpc_chttp2_stream_writing *stream_writing);
595
- int grpc_chttp2_list_have_writing_streams(
596
- grpc_chttp2_transport_writing *transport_writing);
597
- int grpc_chttp2_list_pop_writing_stream(
598
- grpc_chttp2_transport_writing *transport_writing,
599
- grpc_chttp2_stream_writing **stream_writing);
600
-
601
- void grpc_chttp2_list_add_written_stream(
602
- grpc_chttp2_transport_writing *transport_writing,
603
- grpc_chttp2_stream_writing *stream_writing);
604
- int grpc_chttp2_list_pop_written_stream(
605
- grpc_chttp2_transport_global *transport_global,
606
- grpc_chttp2_transport_writing *transport_writing,
607
- grpc_chttp2_stream_global **stream_global,
608
- grpc_chttp2_stream_writing **stream_writing);
609
-
610
- void grpc_chttp2_list_add_parsing_seen_stream(
611
- grpc_chttp2_transport_parsing *transport_parsing,
612
- grpc_chttp2_stream_parsing *stream_parsing);
613
- int grpc_chttp2_list_pop_parsing_seen_stream(
614
- grpc_chttp2_transport_global *transport_global,
615
- grpc_chttp2_transport_parsing *transport_parsing,
616
- grpc_chttp2_stream_global **stream_global,
617
- grpc_chttp2_stream_parsing **stream_parsing);
618
-
619
- void grpc_chttp2_list_add_waiting_for_concurrency(
620
- grpc_chttp2_transport_global *transport_global,
621
- grpc_chttp2_stream_global *stream_global);
622
- int grpc_chttp2_list_pop_waiting_for_concurrency(
623
- grpc_chttp2_transport_global *transport_global,
624
- grpc_chttp2_stream_global **stream_global);
625
-
626
- void grpc_chttp2_list_add_check_read_ops(
627
- grpc_chttp2_transport_global *transport_global,
628
- grpc_chttp2_stream_global *stream_global);
629
- bool grpc_chttp2_list_remove_check_read_ops(
630
- grpc_chttp2_transport_global *transport_global,
631
- grpc_chttp2_stream_global *stream_global);
632
- int grpc_chttp2_list_pop_check_read_ops(
633
- grpc_chttp2_transport_global *transport_global,
634
- grpc_chttp2_stream_global **stream_global);
635
-
636
- void grpc_chttp2_list_add_writing_stalled_by_transport(
637
- grpc_chttp2_transport_writing *transport_writing,
638
- grpc_chttp2_stream_writing *stream_writing);
639
- bool grpc_chttp2_list_flush_writing_stalled_by_transport(
640
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_writing *transport_writing);
641
-
642
- void grpc_chttp2_list_add_stalled_by_transport(
643
- grpc_chttp2_transport_writing *transport_writing,
644
- grpc_chttp2_stream_writing *stream_writing);
645
- int grpc_chttp2_list_pop_stalled_by_transport(
646
- grpc_chttp2_transport_global *transport_global,
647
- grpc_chttp2_stream_global **stream_global);
648
- void grpc_chttp2_list_remove_stalled_by_transport(
649
- grpc_chttp2_transport_global *transport_global,
650
- grpc_chttp2_stream_global *stream_global);
651
-
652
- void grpc_chttp2_list_add_unannounced_incoming_window_available(
653
- grpc_chttp2_transport_global *transport_global,
654
- grpc_chttp2_stream_global *stream_global);
655
- void grpc_chttp2_list_remove_unannounced_incoming_window_available(
656
- grpc_chttp2_transport_global *transport_global,
657
- grpc_chttp2_stream_global *stream_global);
658
- int grpc_chttp2_list_pop_unannounced_incoming_window_available(
659
- grpc_chttp2_transport_global *transport_global,
660
- grpc_chttp2_transport_parsing *transport_parsing,
661
- grpc_chttp2_stream_global **stream_global,
662
- grpc_chttp2_stream_parsing **stream_parsing);
663
-
664
- void grpc_chttp2_list_add_closed_waiting_for_parsing(
665
- grpc_chttp2_transport_global *transport_global,
666
- grpc_chttp2_stream_global *stream_global);
667
- int grpc_chttp2_list_pop_closed_waiting_for_parsing(
668
- grpc_chttp2_transport_global *transport_global,
669
- grpc_chttp2_stream_global **stream_global);
670
-
671
- void grpc_chttp2_list_add_closed_waiting_for_writing(
672
- grpc_chttp2_transport_global *transport_global,
673
- grpc_chttp2_stream_global *stream_global);
674
- int grpc_chttp2_list_pop_closed_waiting_for_writing(
675
- grpc_chttp2_transport_global *transport_global,
676
- grpc_chttp2_stream_global **stream_global);
677
-
678
- grpc_chttp2_stream_parsing *grpc_chttp2_parsing_lookup_stream(
679
- grpc_chttp2_transport_parsing *transport_parsing, uint32_t id);
680
- grpc_chttp2_stream_parsing *grpc_chttp2_parsing_accept_stream(
681
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
682
- uint32_t id);
683
-
684
- void grpc_chttp2_add_incoming_goaway(
685
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
686
- uint32_t goaway_error, gpr_slice goaway_text);
687
-
688
- void grpc_chttp2_register_stream(grpc_chttp2_transport *t,
689
- grpc_chttp2_stream *s);
690
- /* returns 1 if this is the last stream, 0 otherwise */
691
- int grpc_chttp2_unregister_stream(grpc_chttp2_transport *t,
692
- grpc_chttp2_stream *s) GRPC_MUST_USE_RESULT;
693
- int grpc_chttp2_has_streams(grpc_chttp2_transport *t);
694
- void grpc_chttp2_for_all_streams(
695
- grpc_chttp2_transport_global *transport_global, void *user_data,
696
- void (*cb)(grpc_chttp2_transport_global *transport_global, void *user_data,
697
- grpc_chttp2_stream_global *stream_global));
698
-
699
- void grpc_chttp2_parsing_become_skip_parser(
700
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing);
701
-
702
- void grpc_chttp2_complete_closure_step(
703
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
704
- grpc_chttp2_stream_global *stream_global, grpc_closure **pclosure,
705
- grpc_error *error);
706
-
707
- void grpc_chttp2_run_with_global_lock(grpc_exec_ctx *exec_ctx,
708
- grpc_chttp2_transport *transport,
709
- grpc_chttp2_stream *optional_stream,
710
- grpc_chttp2_locked_action action,
711
- void *arg, size_t sizeof_arg);
484
+ grpc_chttp2_transport *t, grpc_chttp2_stream *s) GRPC_MUST_USE_RESULT;
485
+
486
+ bool grpc_chttp2_list_add_writing_stream(grpc_chttp2_transport *t,
487
+ grpc_chttp2_stream *s);
488
+ int grpc_chttp2_list_have_writing_streams(grpc_chttp2_transport *t);
489
+ int grpc_chttp2_list_pop_writing_stream(grpc_chttp2_transport *t,
490
+ grpc_chttp2_stream **s);
491
+
492
+ void grpc_chttp2_list_add_written_stream(grpc_chttp2_transport *t,
493
+ grpc_chttp2_stream *s);
494
+ int grpc_chttp2_list_pop_written_stream(grpc_chttp2_transport *t,
495
+ grpc_chttp2_stream **s);
496
+
497
+ void grpc_chttp2_list_add_waiting_for_concurrency(grpc_chttp2_transport *t,
498
+ grpc_chttp2_stream *s);
499
+ int grpc_chttp2_list_pop_waiting_for_concurrency(grpc_chttp2_transport *t,
500
+ grpc_chttp2_stream **s);
501
+ void grpc_chttp2_list_remove_waiting_for_concurrency(grpc_chttp2_transport *t,
502
+ grpc_chttp2_stream *s);
503
+
504
+ void grpc_chttp2_list_add_stalled_by_transport(grpc_chttp2_transport *t,
505
+ grpc_chttp2_stream *s);
506
+ int grpc_chttp2_list_pop_stalled_by_transport(grpc_chttp2_transport *t,
507
+ grpc_chttp2_stream **s);
508
+ void grpc_chttp2_list_remove_stalled_by_transport(grpc_chttp2_transport *t,
509
+ grpc_chttp2_stream *s);
510
+
511
+ grpc_chttp2_stream *grpc_chttp2_parsing_lookup_stream(grpc_chttp2_transport *t,
512
+ uint32_t id);
513
+ grpc_chttp2_stream *grpc_chttp2_parsing_accept_stream(grpc_exec_ctx *exec_ctx,
514
+ grpc_chttp2_transport *t,
515
+ uint32_t id);
516
+
517
+ void grpc_chttp2_add_incoming_goaway(grpc_exec_ctx *exec_ctx,
518
+ grpc_chttp2_transport *t,
519
+ uint32_t goaway_error,
520
+ grpc_slice goaway_text);
521
+
522
+ void grpc_chttp2_parsing_become_skip_parser(grpc_exec_ctx *exec_ctx,
523
+ grpc_chttp2_transport *t);
524
+
525
+ void grpc_chttp2_complete_closure_step(grpc_exec_ctx *exec_ctx,
526
+ grpc_chttp2_transport *t,
527
+ grpc_chttp2_stream *s,
528
+ grpc_closure **pclosure,
529
+ grpc_error *error, const char *desc);
712
530
 
713
531
  #define GRPC_CHTTP2_CLIENT_CONNECT_STRING "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
714
532
  #define GRPC_CHTTP2_CLIENT_CONNECT_STRLEN \
@@ -799,57 +617,87 @@ void grpc_chttp2_flowctl_trace(const char *file, int line, const char *phase,
799
617
  const char *var2, int is_client,
800
618
  uint32_t stream_id, int64_t val1, int64_t val2);
801
619
 
802
- void grpc_chttp2_fake_status(grpc_exec_ctx *exec_ctx,
803
- grpc_chttp2_transport_global *transport_global,
804
- grpc_chttp2_stream_global *stream,
805
- grpc_status_code status, gpr_slice *details);
806
- void grpc_chttp2_mark_stream_closed(
807
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
808
- grpc_chttp2_stream_global *stream_global, int close_reads, int close_writes,
809
- grpc_error *error);
620
+ void grpc_chttp2_fake_status(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
621
+ grpc_chttp2_stream *stream,
622
+ grpc_status_code status, grpc_slice *details);
623
+ void grpc_chttp2_mark_stream_closed(grpc_exec_ctx *exec_ctx,
624
+ grpc_chttp2_transport *t,
625
+ grpc_chttp2_stream *s, int close_reads,
626
+ int close_writes, grpc_error *error);
810
627
  void grpc_chttp2_start_writing(grpc_exec_ctx *exec_ctx,
811
- grpc_chttp2_transport_global *transport_global);
628
+ grpc_chttp2_transport *t);
812
629
 
813
630
  #ifdef GRPC_STREAM_REFCOUNT_DEBUG
814
- #define GRPC_CHTTP2_STREAM_REF(stream_global, reason) \
815
- grpc_chttp2_stream_ref(stream_global, reason)
816
- #define GRPC_CHTTP2_STREAM_UNREF(exec_ctx, stream_global, reason) \
817
- grpc_chttp2_stream_unref(exec_ctx, stream_global, reason)
818
- void grpc_chttp2_stream_ref(grpc_chttp2_stream_global *stream_global,
819
- const char *reason);
820
- void grpc_chttp2_stream_unref(grpc_exec_ctx *exec_ctx,
821
- grpc_chttp2_stream_global *stream_global,
631
+ #define GRPC_CHTTP2_STREAM_REF(stream, reason) \
632
+ grpc_chttp2_stream_ref(stream, reason)
633
+ #define GRPC_CHTTP2_STREAM_UNREF(exec_ctx, stream, reason) \
634
+ grpc_chttp2_stream_unref(exec_ctx, stream, reason)
635
+ void grpc_chttp2_stream_ref(grpc_chttp2_stream *s, const char *reason);
636
+ void grpc_chttp2_stream_unref(grpc_exec_ctx *exec_ctx, grpc_chttp2_stream *s,
822
637
  const char *reason);
823
638
  #else
824
- #define GRPC_CHTTP2_STREAM_REF(stream_global, reason) \
825
- grpc_chttp2_stream_ref(stream_global)
826
- #define GRPC_CHTTP2_STREAM_UNREF(exec_ctx, stream_global, reason) \
827
- grpc_chttp2_stream_unref(exec_ctx, stream_global)
828
- void grpc_chttp2_stream_ref(grpc_chttp2_stream_global *stream_global);
829
- void grpc_chttp2_stream_unref(grpc_exec_ctx *exec_ctx,
830
- grpc_chttp2_stream_global *stream_global);
639
+ #define GRPC_CHTTP2_STREAM_REF(stream, reason) grpc_chttp2_stream_ref(stream)
640
+ #define GRPC_CHTTP2_STREAM_UNREF(exec_ctx, stream, reason) \
641
+ grpc_chttp2_stream_unref(exec_ctx, stream)
642
+ void grpc_chttp2_stream_ref(grpc_chttp2_stream *s);
643
+ void grpc_chttp2_stream_unref(grpc_exec_ctx *exec_ctx, grpc_chttp2_stream *s);
644
+ #endif
645
+
646
+ //#define GRPC_CHTTP2_REFCOUNTING_DEBUG 1
647
+ #ifdef GRPC_CHTTP2_REFCOUNTING_DEBUG
648
+ #define GRPC_CHTTP2_REF_TRANSPORT(t, r) \
649
+ grpc_chttp2_ref_transport(t, r, __FILE__, __LINE__)
650
+ #define GRPC_CHTTP2_UNREF_TRANSPORT(cl, t, r) \
651
+ grpc_chttp2_unref_transport(cl, t, r, __FILE__, __LINE__)
652
+ void grpc_chttp2_unref_transport(grpc_exec_ctx *exec_ctx,
653
+ grpc_chttp2_transport *t, const char *reason,
654
+ const char *file, int line);
655
+ void grpc_chttp2_ref_transport(grpc_chttp2_transport *t, const char *reason,
656
+ const char *file, int line);
657
+ #else
658
+ #define GRPC_CHTTP2_REF_TRANSPORT(t, r) grpc_chttp2_ref_transport(t)
659
+ #define GRPC_CHTTP2_UNREF_TRANSPORT(cl, t, r) grpc_chttp2_unref_transport(cl, t)
660
+ void grpc_chttp2_unref_transport(grpc_exec_ctx *exec_ctx,
661
+ grpc_chttp2_transport *t);
662
+ void grpc_chttp2_ref_transport(grpc_chttp2_transport *t);
831
663
  #endif
832
664
 
833
665
  grpc_chttp2_incoming_byte_stream *grpc_chttp2_incoming_byte_stream_create(
834
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_parsing *transport_parsing,
835
- grpc_chttp2_stream_parsing *stream_parsing, uint32_t frame_size,
836
- uint32_t flags, grpc_chttp2_incoming_frame_queue *add_to_queue);
666
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_chttp2_stream *s,
667
+ uint32_t frame_size, uint32_t flags);
837
668
  void grpc_chttp2_incoming_byte_stream_push(grpc_exec_ctx *exec_ctx,
838
669
  grpc_chttp2_incoming_byte_stream *bs,
839
- gpr_slice slice);
670
+ grpc_slice slice);
840
671
  void grpc_chttp2_incoming_byte_stream_finished(
841
672
  grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_byte_stream *bs,
842
- grpc_error *error, int from_parsing_thread);
673
+ grpc_error *error);
843
674
 
844
- void grpc_chttp2_ack_ping(grpc_exec_ctx *exec_ctx,
845
- grpc_chttp2_transport_parsing *parsing,
675
+ void grpc_chttp2_ack_ping(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
846
676
  const uint8_t *opaque_8bytes);
847
677
 
848
678
  /** add a ref to the stream and add it to the writable list;
849
679
  ref will be dropped in writing.c */
850
680
  void grpc_chttp2_become_writable(grpc_exec_ctx *exec_ctx,
851
- grpc_chttp2_transport_global *transport_global,
852
- grpc_chttp2_stream_global *stream_global,
853
- bool covered_by_poller, const char *reason);
681
+ grpc_chttp2_transport *t,
682
+ grpc_chttp2_stream *s, bool covered_by_poller,
683
+ const char *reason);
684
+
685
+ void grpc_chttp2_cancel_stream(grpc_exec_ctx *exec_ctx,
686
+ grpc_chttp2_transport *t, grpc_chttp2_stream *s,
687
+ grpc_error *due_to_error);
688
+
689
+ void grpc_chttp2_maybe_complete_recv_initial_metadata(grpc_exec_ctx *exec_ctx,
690
+ grpc_chttp2_transport *t,
691
+ grpc_chttp2_stream *s);
692
+ void grpc_chttp2_maybe_complete_recv_message(grpc_exec_ctx *exec_ctx,
693
+ grpc_chttp2_transport *t,
694
+ grpc_chttp2_stream *s);
695
+ void grpc_chttp2_maybe_complete_recv_trailing_metadata(grpc_exec_ctx *exec_ctx,
696
+ grpc_chttp2_transport *t,
697
+ grpc_chttp2_stream *s);
698
+
699
+ void grpc_chttp2_fail_pending_writes(grpc_exec_ctx *exec_ctx,
700
+ grpc_chttp2_transport *t,
701
+ grpc_chttp2_stream *s, grpc_error *error);
854
702
 
855
703
  #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_INTERNAL_H */