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
@@ -93,10 +93,10 @@ void grpc_httpcli_context_destroy(grpc_httpcli_context *context);
93
93
  'request' contains request parameters - these are caller owned and can be
94
94
  destroyed once the call returns
95
95
  'deadline' contains a deadline for the request (or gpr_inf_future)
96
- 'on_response' is a callback to report results to (and 'user_data' is a user
97
- supplied pointer to pass to said call) */
96
+ 'on_response' is a callback to report results to */
98
97
  void grpc_httpcli_get(grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
99
98
  grpc_polling_entity *pollent,
99
+ grpc_resource_quota *resource_quota,
100
100
  const grpc_httpcli_request *request,
101
101
  gpr_timespec deadline, grpc_closure *on_complete,
102
102
  grpc_httpcli_response *response);
@@ -113,11 +113,11 @@ void grpc_httpcli_get(grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
113
113
  'deadline' contains a deadline for the request (or gpr_inf_future)
114
114
  'em' points to a caller owned event manager that must be alive for the
115
115
  lifetime of the request
116
- 'on_response' is a callback to report results to (and 'user_data' is a user
117
- supplied pointer to pass to said call)
116
+ 'on_response' is a callback to report results to
118
117
  Does not support ?var1=val1&var2=val2 in the path. */
119
118
  void grpc_httpcli_post(grpc_exec_ctx *exec_ctx, grpc_httpcli_context *context,
120
119
  grpc_polling_entity *pollent,
120
+ grpc_resource_quota *resource_quota,
121
121
  const grpc_httpcli_request *request,
122
122
  const char *body_bytes, size_t body_size,
123
123
  gpr_timespec deadline, grpc_closure *on_complete,
@@ -38,7 +38,10 @@
38
38
  #include <grpc/support/alloc.h>
39
39
  #include <grpc/support/log.h>
40
40
  #include <grpc/support/string_util.h>
41
- #include "src/core/lib/security/transport/handshake.h"
41
+
42
+ #include "src/core/lib/channel/channel_args.h"
43
+ #include "src/core/lib/security/transport/security_handshaker.h"
44
+ #include "src/core/lib/slice/slice_internal.h"
42
45
  #include "src/core/lib/support/string.h"
43
46
  #include "src/core/lib/tsi/ssl_transport_security.h"
44
47
 
@@ -48,7 +51,8 @@ typedef struct {
48
51
  char *secure_peer_name;
49
52
  } grpc_httpcli_ssl_channel_security_connector;
50
53
 
51
- static void httpcli_ssl_destroy(grpc_security_connector *sc) {
54
+ static void httpcli_ssl_destroy(grpc_exec_ctx *exec_ctx,
55
+ grpc_security_connector *sc) {
52
56
  grpc_httpcli_ssl_channel_security_connector *c =
53
57
  (grpc_httpcli_ssl_channel_security_connector *)sc;
54
58
  if (c->handshaker_factory != NULL) {
@@ -58,48 +62,43 @@ static void httpcli_ssl_destroy(grpc_security_connector *sc) {
58
62
  gpr_free(sc);
59
63
  }
60
64
 
61
- static void httpcli_ssl_do_handshake(grpc_exec_ctx *exec_ctx,
62
- grpc_channel_security_connector *sc,
63
- grpc_endpoint *nonsecure_endpoint,
64
- gpr_timespec deadline,
65
- grpc_security_handshake_done_cb cb,
66
- void *user_data) {
65
+ static void httpcli_ssl_add_handshakers(grpc_exec_ctx *exec_ctx,
66
+ grpc_channel_security_connector *sc,
67
+ grpc_handshake_manager *handshake_mgr) {
67
68
  grpc_httpcli_ssl_channel_security_connector *c =
68
69
  (grpc_httpcli_ssl_channel_security_connector *)sc;
69
- tsi_result result = TSI_OK;
70
- tsi_handshaker *handshaker;
71
- if (c->handshaker_factory == NULL) {
72
- cb(exec_ctx, user_data, GRPC_SECURITY_ERROR, NULL, NULL);
73
- return;
74
- }
75
- result = tsi_ssl_handshaker_factory_create_handshaker(
76
- c->handshaker_factory, c->secure_peer_name, &handshaker);
77
- if (result != TSI_OK) {
78
- gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
79
- tsi_result_to_string(result));
80
- cb(exec_ctx, user_data, GRPC_SECURITY_ERROR, NULL, NULL);
81
- } else {
82
- grpc_do_security_handshake(exec_ctx, handshaker, &sc->base, true,
83
- nonsecure_endpoint, deadline, cb, user_data);
70
+ tsi_handshaker *handshaker = NULL;
71
+ if (c->handshaker_factory != NULL) {
72
+ tsi_result result = tsi_ssl_handshaker_factory_create_handshaker(
73
+ c->handshaker_factory, c->secure_peer_name, &handshaker);
74
+ if (result != TSI_OK) {
75
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
76
+ tsi_result_to_string(result));
77
+ }
84
78
  }
79
+ grpc_handshake_manager_add(
80
+ handshake_mgr,
81
+ grpc_security_handshaker_create(exec_ctx, handshaker, &sc->base));
85
82
  }
86
83
 
87
84
  static void httpcli_ssl_check_peer(grpc_exec_ctx *exec_ctx,
88
85
  grpc_security_connector *sc, tsi_peer peer,
89
- grpc_security_peer_check_cb cb,
90
- void *user_data) {
86
+ grpc_auth_context **auth_context,
87
+ grpc_closure *on_peer_checked) {
91
88
  grpc_httpcli_ssl_channel_security_connector *c =
92
89
  (grpc_httpcli_ssl_channel_security_connector *)sc;
93
- grpc_security_status status = GRPC_SECURITY_OK;
90
+ grpc_error *error = GRPC_ERROR_NONE;
94
91
 
95
92
  /* Check the peer name. */
96
93
  if (c->secure_peer_name != NULL &&
97
94
  !tsi_ssl_peer_matches_name(&peer, c->secure_peer_name)) {
98
- gpr_log(GPR_ERROR, "Peer name %s is not in peer certificate",
99
- c->secure_peer_name);
100
- status = GRPC_SECURITY_ERROR;
95
+ char *msg;
96
+ gpr_asprintf(&msg, "Peer name %s is not in peer certificate",
97
+ c->secure_peer_name);
98
+ error = GRPC_ERROR_CREATE(msg);
99
+ gpr_free(msg);
101
100
  }
102
- cb(exec_ctx, user_data, status, NULL);
101
+ grpc_closure_sched(exec_ctx, on_peer_checked, error);
103
102
  tsi_peer_destruct(&peer);
104
103
  }
105
104
 
@@ -107,8 +106,9 @@ static grpc_security_connector_vtable httpcli_ssl_vtable = {
107
106
  httpcli_ssl_destroy, httpcli_ssl_check_peer};
108
107
 
109
108
  static grpc_security_status httpcli_ssl_channel_security_connector_create(
110
- const unsigned char *pem_root_certs, size_t pem_root_certs_size,
111
- const char *secure_peer_name, grpc_channel_security_connector **sc) {
109
+ grpc_exec_ctx *exec_ctx, const unsigned char *pem_root_certs,
110
+ size_t pem_root_certs_size, const char *secure_peer_name,
111
+ grpc_channel_security_connector **sc) {
112
112
  tsi_result result = TSI_OK;
113
113
  grpc_httpcli_ssl_channel_security_connector *c;
114
114
 
@@ -132,11 +132,11 @@ static grpc_security_status httpcli_ssl_channel_security_connector_create(
132
132
  if (result != TSI_OK) {
133
133
  gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
134
134
  tsi_result_to_string(result));
135
- httpcli_ssl_destroy(&c->base.base);
135
+ httpcli_ssl_destroy(exec_ctx, &c->base.base);
136
136
  *sc = NULL;
137
137
  return GRPC_SECURITY_ERROR;
138
138
  }
139
- c->base.do_handshake = httpcli_ssl_do_handshake;
139
+ c->base.add_handshakers = httpcli_ssl_add_handshakers;
140
140
  *sc = &c->base;
141
141
  return GRPC_SECURITY_OK;
142
142
  }
@@ -146,19 +146,25 @@ static grpc_security_status httpcli_ssl_channel_security_connector_create(
146
146
  typedef struct {
147
147
  void (*func)(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *endpoint);
148
148
  void *arg;
149
+ grpc_handshake_manager *handshake_mgr;
149
150
  } on_done_closure;
150
151
 
151
- static void on_secure_transport_setup_done(grpc_exec_ctx *exec_ctx, void *rp,
152
- grpc_security_status status,
153
- grpc_endpoint *secure_endpoint,
154
- grpc_auth_context *auth_context) {
155
- on_done_closure *c = rp;
156
- if (status != GRPC_SECURITY_OK) {
157
- gpr_log(GPR_ERROR, "Secure transport setup failed with error %d.", status);
152
+ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg,
153
+ grpc_error *error) {
154
+ grpc_handshaker_args *args = arg;
155
+ on_done_closure *c = args->user_data;
156
+ if (error != GRPC_ERROR_NONE) {
157
+ const char *msg = grpc_error_string(error);
158
+ gpr_log(GPR_ERROR, "Secure transport setup failed: %s", msg);
159
+ grpc_error_free_string(msg);
158
160
  c->func(exec_ctx, c->arg, NULL);
159
161
  } else {
160
- c->func(exec_ctx, c->arg, secure_endpoint);
162
+ grpc_channel_args_destroy(exec_ctx, args->args);
163
+ grpc_slice_buffer_destroy_internal(exec_ctx, args->read_buffer);
164
+ gpr_free(args->read_buffer);
165
+ c->func(exec_ctx, c->arg, args->endpoint);
161
166
  }
167
+ grpc_handshake_manager_destroy(exec_ctx, c->handshake_mgr);
162
168
  gpr_free(c);
163
169
  }
164
170
 
@@ -179,12 +185,16 @@ static void ssl_handshake(grpc_exec_ctx *exec_ctx, void *arg,
179
185
  }
180
186
  c->func = on_done;
181
187
  c->arg = arg;
188
+ c->handshake_mgr = grpc_handshake_manager_create();
182
189
  GPR_ASSERT(httpcli_ssl_channel_security_connector_create(
183
- pem_root_certs, pem_root_certs_size, host, &sc) ==
190
+ exec_ctx, pem_root_certs, pem_root_certs_size, host, &sc) ==
184
191
  GRPC_SECURITY_OK);
185
- grpc_channel_security_connector_do_handshake(
186
- exec_ctx, sc, tcp, deadline, on_secure_transport_setup_done, c);
187
- GRPC_SECURITY_CONNECTOR_UNREF(&sc->base, "httpcli");
192
+ grpc_channel_security_connector_add_handshakers(exec_ctx, sc,
193
+ c->handshake_mgr);
194
+ grpc_handshake_manager_do_handshake(
195
+ exec_ctx, c->handshake_mgr, tcp, NULL /* channel_args */, deadline,
196
+ NULL /* acceptor */, on_handshake_done, c /* user_data */);
197
+ GRPC_SECURITY_CONNECTOR_UNREF(exec_ctx, &sc->base, "httpcli");
188
198
  }
189
199
 
190
200
  const grpc_httpcli_handshaker grpc_httpcli_ssl = {"https", ssl_handshake};
@@ -33,6 +33,7 @@
33
33
 
34
34
  #include "src/core/lib/http/parser.h"
35
35
 
36
+ #include <stdbool.h>
36
37
  #include <string.h>
37
38
 
38
39
  #include <grpc/support/alloc.h>
@@ -200,7 +201,8 @@ done:
200
201
  return error;
201
202
  }
202
203
 
203
- static grpc_error *finish_line(grpc_http_parser *parser) {
204
+ static grpc_error *finish_line(grpc_http_parser *parser,
205
+ bool *found_body_start) {
204
206
  grpc_error *err;
205
207
  switch (parser->state) {
206
208
  case GRPC_HTTP_FIRST_LINE:
@@ -211,6 +213,7 @@ static grpc_error *finish_line(grpc_http_parser *parser) {
211
213
  case GRPC_HTTP_HEADERS:
212
214
  if (parser->cur_line_length == parser->cur_line_end_length) {
213
215
  parser->state = GRPC_HTTP_BODY;
216
+ *found_body_start = true;
214
217
  break;
215
218
  }
216
219
  err = add_header(parser);
@@ -274,7 +277,8 @@ static bool check_line(grpc_http_parser *parser) {
274
277
  return false;
275
278
  }
276
279
 
277
- static grpc_error *addbyte(grpc_http_parser *parser, uint8_t byte) {
280
+ static grpc_error *addbyte(grpc_http_parser *parser, uint8_t byte,
281
+ bool *found_body_start) {
278
282
  switch (parser->state) {
279
283
  case GRPC_HTTP_FIRST_LINE:
280
284
  case GRPC_HTTP_HEADERS:
@@ -282,20 +286,18 @@ static grpc_error *addbyte(grpc_http_parser *parser, uint8_t byte) {
282
286
  if (grpc_http1_trace)
283
287
  gpr_log(GPR_ERROR, "HTTP client max line length (%d) exceeded",
284
288
  GRPC_HTTP_PARSER_MAX_HEADER_LENGTH);
285
- return 0;
289
+ return GRPC_ERROR_NONE;
286
290
  }
287
291
  parser->cur_line[parser->cur_line_length] = byte;
288
292
  parser->cur_line_length++;
289
293
  if (check_line(parser)) {
290
- return finish_line(parser);
291
- } else {
292
- return GRPC_ERROR_NONE;
294
+ return finish_line(parser, found_body_start);
293
295
  }
294
- GPR_UNREACHABLE_CODE(return 0);
296
+ return GRPC_ERROR_NONE;
295
297
  case GRPC_HTTP_BODY:
296
298
  return addbyte_body(parser, byte);
297
299
  }
298
- GPR_UNREACHABLE_CODE(return 0);
300
+ GPR_UNREACHABLE_CODE(return GRPC_ERROR_NONE);
299
301
  }
300
302
 
301
303
  void grpc_http_parser_init(grpc_http_parser *parser, grpc_http_type type,
@@ -331,14 +333,15 @@ void grpc_http_response_destroy(grpc_http_response *response) {
331
333
  gpr_free(response->hdrs);
332
334
  }
333
335
 
334
- grpc_error *grpc_http_parser_parse(grpc_http_parser *parser, gpr_slice slice) {
335
- size_t i;
336
-
337
- for (i = 0; i < GPR_SLICE_LENGTH(slice); i++) {
338
- grpc_error *err = addbyte(parser, GPR_SLICE_START_PTR(slice)[i]);
336
+ grpc_error *grpc_http_parser_parse(grpc_http_parser *parser, grpc_slice slice,
337
+ size_t *start_of_body) {
338
+ for (size_t i = 0; i < GRPC_SLICE_LENGTH(slice); i++) {
339
+ bool found_body_start = false;
340
+ grpc_error *err =
341
+ addbyte(parser, GRPC_SLICE_START_PTR(slice)[i], &found_body_start);
339
342
  if (err != GRPC_ERROR_NONE) return err;
343
+ if (found_body_start && start_of_body != NULL) *start_of_body = i + 1;
340
344
  }
341
-
342
345
  return GRPC_ERROR_NONE;
343
346
  }
344
347
 
@@ -34,8 +34,8 @@
34
34
  #ifndef GRPC_CORE_LIB_HTTP_PARSER_H
35
35
  #define GRPC_CORE_LIB_HTTP_PARSER_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
 
41
41
  /* Maximum length of a header string of the form 'Key: Value\r\n' */
@@ -113,7 +113,9 @@ void grpc_http_parser_init(grpc_http_parser *parser, grpc_http_type type,
113
113
  void *request_or_response);
114
114
  void grpc_http_parser_destroy(grpc_http_parser *parser);
115
115
 
116
- grpc_error *grpc_http_parser_parse(grpc_http_parser *parser, gpr_slice slice);
116
+ /* Sets \a start_of_body to the offset in \a slice of the start of the body. */
117
+ grpc_error *grpc_http_parser_parse(grpc_http_parser *parser, grpc_slice slice,
118
+ size_t *start_of_body);
117
119
  grpc_error *grpc_http_parser_eof(grpc_http_parser *parser);
118
120
 
119
121
  void grpc_http_request_destroy(grpc_http_request *request);
@@ -35,10 +35,19 @@
35
35
 
36
36
  #include <grpc/support/alloc.h>
37
37
 
38
- void grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
39
- void *cb_arg) {
38
+ #include "src/core/lib/profiling/timers.h"
39
+
40
+ grpc_closure *grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
41
+ void *cb_arg,
42
+ grpc_closure_scheduler *scheduler) {
40
43
  closure->cb = cb;
41
44
  closure->cb_arg = cb_arg;
45
+ closure->scheduler = scheduler;
46
+ return closure;
47
+ }
48
+
49
+ void grpc_closure_list_init(grpc_closure_list *closure_list) {
50
+ closure_list->head = closure_list->tail = NULL;
42
51
  }
43
52
 
44
53
  void grpc_closure_list_append(grpc_closure_list *closure_list,
@@ -47,7 +56,7 @@ void grpc_closure_list_append(grpc_closure_list *closure_list,
47
56
  GRPC_ERROR_UNREF(error);
48
57
  return;
49
58
  }
50
- closure->error = error;
59
+ closure->error_data.error = error;
51
60
  closure->next_data.next = NULL;
52
61
  if (closure_list->head == NULL) {
53
62
  closure_list->head = closure;
@@ -60,8 +69,8 @@ void grpc_closure_list_append(grpc_closure_list *closure_list,
60
69
  void grpc_closure_list_fail_all(grpc_closure_list *list,
61
70
  grpc_error *forced_failure) {
62
71
  for (grpc_closure *c = list->head; c != NULL; c = c->next_data.next) {
63
- if (c->error == GRPC_ERROR_NONE) {
64
- c->error = GRPC_ERROR_REF(forced_failure);
72
+ if (c->error_data.error == GRPC_ERROR_NONE) {
73
+ c->error_data.error = GRPC_ERROR_REF(forced_failure);
65
74
  }
66
75
  }
67
76
  GRPC_ERROR_UNREF(forced_failure);
@@ -99,10 +108,43 @@ static void closure_wrapper(grpc_exec_ctx *exec_ctx, void *arg,
99
108
  cb(exec_ctx, cb_arg, error);
100
109
  }
101
110
 
102
- grpc_closure *grpc_closure_create(grpc_iomgr_cb_func cb, void *cb_arg) {
111
+ grpc_closure *grpc_closure_create(grpc_iomgr_cb_func cb, void *cb_arg,
112
+ grpc_closure_scheduler *scheduler) {
103
113
  wrapped_closure *wc = gpr_malloc(sizeof(*wc));
104
114
  wc->cb = cb;
105
115
  wc->cb_arg = cb_arg;
106
- grpc_closure_init(&wc->wrapper, closure_wrapper, wc);
116
+ grpc_closure_init(&wc->wrapper, closure_wrapper, wc, scheduler);
107
117
  return &wc->wrapper;
108
118
  }
119
+
120
+ void grpc_closure_run(grpc_exec_ctx *exec_ctx, grpc_closure *c,
121
+ grpc_error *error) {
122
+ GPR_TIMER_BEGIN("grpc_closure_run", 0);
123
+ if (c != NULL) {
124
+ c->scheduler->vtable->run(exec_ctx, c, error);
125
+ } else {
126
+ GRPC_ERROR_UNREF(error);
127
+ }
128
+ GPR_TIMER_END("grpc_closure_run", 0);
129
+ }
130
+
131
+ void grpc_closure_sched(grpc_exec_ctx *exec_ctx, grpc_closure *c,
132
+ grpc_error *error) {
133
+ GPR_TIMER_BEGIN("grpc_closure_sched", 0);
134
+ if (c != NULL) {
135
+ c->scheduler->vtable->sched(exec_ctx, c, error);
136
+ } else {
137
+ GRPC_ERROR_UNREF(error);
138
+ }
139
+ GPR_TIMER_END("grpc_closure_sched", 0);
140
+ }
141
+
142
+ void grpc_closure_list_sched(grpc_exec_ctx *exec_ctx, grpc_closure_list *list) {
143
+ grpc_closure *c = list->head;
144
+ while (c != NULL) {
145
+ grpc_closure *next = c->next_data.next;
146
+ c->scheduler->vtable->sched(exec_ctx, c, c->error_data.error);
147
+ c = next;
148
+ }
149
+ list->head = list->tail = NULL;
150
+ }
@@ -35,16 +35,15 @@
35
35
  #define GRPC_CORE_LIB_IOMGR_CLOSURE_H
36
36
 
37
37
  #include <grpc/support/port_platform.h>
38
+
39
+ #include <grpc/impl/codegen/exec_ctx_fwd.h>
38
40
  #include <stdbool.h>
39
41
  #include "src/core/lib/iomgr/error.h"
42
+ #include "src/core/lib/support/mpscq.h"
40
43
 
41
44
  struct grpc_closure;
42
45
  typedef struct grpc_closure grpc_closure;
43
46
 
44
- /* forward declaration for exec_ctx.h */
45
- struct grpc_exec_ctx;
46
- typedef struct grpc_exec_ctx grpc_exec_ctx;
47
-
48
47
  typedef struct grpc_closure_list {
49
48
  grpc_closure *head;
50
49
  grpc_closure *tail;
@@ -58,35 +57,63 @@ typedef struct grpc_closure_list {
58
57
  typedef void (*grpc_iomgr_cb_func)(grpc_exec_ctx *exec_ctx, void *arg,
59
58
  grpc_error *error);
60
59
 
60
+ typedef struct grpc_closure_scheduler grpc_closure_scheduler;
61
+
62
+ typedef struct grpc_closure_scheduler_vtable {
63
+ /* NOTE: for all these functions, closure->scheduler == the scheduler that was
64
+ used to find this vtable */
65
+ void (*run)(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
66
+ grpc_error *error);
67
+ void (*sched)(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
68
+ grpc_error *error);
69
+ } grpc_closure_scheduler_vtable;
70
+
71
+ /** Abstract type that can schedule closures for execution */
72
+ struct grpc_closure_scheduler {
73
+ const grpc_closure_scheduler_vtable *vtable;
74
+ };
75
+
61
76
  /** A closure over a grpc_iomgr_cb_func. */
62
77
  struct grpc_closure {
78
+ /** Once queued, next indicates the next queued closure; before then, scratch
79
+ * space */
80
+ union {
81
+ grpc_closure *next;
82
+ gpr_mpscq_node atm_next;
83
+ uintptr_t scratch;
84
+ } next_data;
85
+
63
86
  /** Bound callback. */
64
87
  grpc_iomgr_cb_func cb;
65
88
 
66
89
  /** Arguments to be passed to "cb". */
67
90
  void *cb_arg;
68
91
 
69
- /** Once queued, the result of the closure. Before then: scratch space */
70
- grpc_error *error;
92
+ /** Scheduler to schedule against: NULL to schedule against current execution
93
+ context */
94
+ grpc_closure_scheduler *scheduler;
71
95
 
72
- /** Once queued, next indicates the next queued closure; before then, scratch
73
- * space */
96
+ /** Once queued, the result of the closure. Before then: scratch space */
74
97
  union {
75
- grpc_closure *next;
98
+ grpc_error *error;
76
99
  uintptr_t scratch;
77
- } next_data;
100
+ } error_data;
78
101
  };
79
102
 
80
- /** Initializes \a closure with \a cb and \a cb_arg. */
81
- void grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
82
- void *cb_arg);
103
+ /** Initializes \a closure with \a cb and \a cb_arg. Returns \a closure. */
104
+ grpc_closure *grpc_closure_init(grpc_closure *closure, grpc_iomgr_cb_func cb,
105
+ void *cb_arg,
106
+ grpc_closure_scheduler *scheduler);
83
107
 
84
108
  /* Create a heap allocated closure: try to avoid except for very rare events */
85
- grpc_closure *grpc_closure_create(grpc_iomgr_cb_func cb, void *cb_arg);
109
+ grpc_closure *grpc_closure_create(grpc_iomgr_cb_func cb, void *cb_arg,
110
+ grpc_closure_scheduler *scheduler);
86
111
 
87
112
  #define GRPC_CLOSURE_LIST_INIT \
88
113
  { NULL, NULL }
89
114
 
115
+ void grpc_closure_list_init(grpc_closure_list *list);
116
+
90
117
  /** add \a closure to the end of \a list
91
118
  and set \a closure's result to \a error */
92
119
  void grpc_closure_list_append(grpc_closure_list *list, grpc_closure *closure,
@@ -102,4 +129,19 @@ void grpc_closure_list_move(grpc_closure_list *src, grpc_closure_list *dst);
102
129
  /** return whether \a list is empty. */
103
130
  bool grpc_closure_list_empty(grpc_closure_list list);
104
131
 
132
+ /** Run a closure directly. Caller ensures that no locks are being held above.
133
+ * Note that calling this at the end of a closure callback function itself is
134
+ * by definition safe. */
135
+ void grpc_closure_run(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
136
+ grpc_error *error);
137
+
138
+ /** Schedule a closure to be run. Does not need to be run from a safe point. */
139
+ void grpc_closure_sched(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
140
+ grpc_error *error);
141
+
142
+ /** Schedule all closures in a list to be run. Does not need to be run from a
143
+ * safe point. */
144
+ void grpc_closure_list_sched(grpc_exec_ctx *exec_ctx,
145
+ grpc_closure_list *closure_list);
146
+
105
147
  #endif /* GRPC_CORE_LIB_IOMGR_CLOSURE_H */