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
@@ -0,0 +1,45 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #ifndef GRPC_CORE_LIB_IOMGR_TCP_CLIENT_POSIX_H
35
+ #define GRPC_CORE_LIB_IOMGR_TCP_CLIENT_POSIX_H
36
+
37
+ #include "src/core/lib/iomgr/endpoint.h"
38
+ #include "src/core/lib/iomgr/ev_posix.h"
39
+ #include "src/core/lib/iomgr/tcp_client.h"
40
+
41
+ grpc_endpoint *grpc_tcp_client_create_from_fd(
42
+ grpc_exec_ctx *exec_ctx, grpc_fd *fd, const grpc_channel_args *channel_args,
43
+ const char *addr_str);
44
+
45
+ #endif /* GRPC_CORE_LIB_IOMGR_TCP_CLIENT_POSIX_H */
@@ -0,0 +1,190 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/lib/iomgr/port.h"
35
+
36
+ #ifdef GRPC_UV
37
+
38
+ #include <string.h>
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+
43
+ #include "src/core/lib/iomgr/error.h"
44
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
45
+ #include "src/core/lib/iomgr/tcp_client.h"
46
+ #include "src/core/lib/iomgr/tcp_uv.h"
47
+ #include "src/core/lib/iomgr/timer.h"
48
+
49
+ extern int grpc_tcp_trace;
50
+
51
+ typedef struct grpc_uv_tcp_connect {
52
+ uv_connect_t connect_req;
53
+ grpc_timer alarm;
54
+ grpc_closure on_alarm;
55
+ uv_tcp_t *tcp_handle;
56
+ grpc_closure *closure;
57
+ grpc_endpoint **endpoint;
58
+ int refs;
59
+ char *addr_name;
60
+ grpc_resource_quota *resource_quota;
61
+ } grpc_uv_tcp_connect;
62
+
63
+ static void uv_tcp_connect_cleanup(grpc_exec_ctx *exec_ctx,
64
+ grpc_uv_tcp_connect *connect) {
65
+ grpc_resource_quota_unref_internal(exec_ctx, connect->resource_quota);
66
+ gpr_free(connect);
67
+ }
68
+
69
+ static void tcp_close_callback(uv_handle_t *handle) { gpr_free(handle); }
70
+
71
+ static void uv_tc_on_alarm(grpc_exec_ctx *exec_ctx, void *acp,
72
+ grpc_error *error) {
73
+ int done;
74
+ grpc_uv_tcp_connect *connect = acp;
75
+ if (grpc_tcp_trace) {
76
+ const char *str = grpc_error_string(error);
77
+ gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %s: on_alarm: error=%s",
78
+ connect->addr_name, str);
79
+ grpc_error_free_string(str);
80
+ }
81
+ if (error == GRPC_ERROR_NONE) {
82
+ /* error == NONE implies that the timer ran out, and wasn't cancelled. If
83
+ it was cancelled, then the handler that cancelled it also should close
84
+ the handle, if applicable */
85
+ uv_close((uv_handle_t *)connect->tcp_handle, tcp_close_callback);
86
+ }
87
+ done = (--connect->refs == 0);
88
+ if (done) {
89
+ uv_tcp_connect_cleanup(exec_ctx, connect);
90
+ }
91
+ }
92
+
93
+ static void uv_tc_on_connect(uv_connect_t *req, int status) {
94
+ grpc_uv_tcp_connect *connect = req->data;
95
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
96
+ grpc_error *error = GRPC_ERROR_NONE;
97
+ int done;
98
+ grpc_closure *closure = connect->closure;
99
+ grpc_timer_cancel(&exec_ctx, &connect->alarm);
100
+ if (status == 0) {
101
+ *connect->endpoint = grpc_tcp_create(
102
+ connect->tcp_handle, connect->resource_quota, connect->addr_name);
103
+ } else {
104
+ error = GRPC_ERROR_CREATE("Failed to connect to remote host");
105
+ error = grpc_error_set_int(error, GRPC_ERROR_INT_ERRNO, -status);
106
+ error =
107
+ grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status));
108
+ if (status == UV_ECANCELED) {
109
+ error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR,
110
+ "Timeout occurred");
111
+ // This should only happen if the handle is already closed
112
+ } else {
113
+ error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR,
114
+ uv_strerror(status));
115
+ uv_close((uv_handle_t *)connect->tcp_handle, tcp_close_callback);
116
+ }
117
+ }
118
+ done = (--connect->refs == 0);
119
+ if (done) {
120
+ uv_tcp_connect_cleanup(&exec_ctx, connect);
121
+ }
122
+ grpc_closure_sched(&exec_ctx, closure, error);
123
+ grpc_exec_ctx_finish(&exec_ctx);
124
+ }
125
+
126
+ static void tcp_client_connect_impl(grpc_exec_ctx *exec_ctx,
127
+ grpc_closure *closure, grpc_endpoint **ep,
128
+ grpc_pollset_set *interested_parties,
129
+ const grpc_channel_args *channel_args,
130
+ const grpc_resolved_address *resolved_addr,
131
+ gpr_timespec deadline) {
132
+ grpc_uv_tcp_connect *connect;
133
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create(NULL);
134
+ (void)channel_args;
135
+ (void)interested_parties;
136
+
137
+ if (channel_args != NULL) {
138
+ for (size_t i = 0; i < channel_args->num_args; i++) {
139
+ if (0 == strcmp(channel_args->args[i].key, GRPC_ARG_RESOURCE_QUOTA)) {
140
+ grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
141
+ resource_quota = grpc_resource_quota_ref_internal(
142
+ channel_args->args[i].value.pointer.p);
143
+ }
144
+ }
145
+ }
146
+
147
+ connect = gpr_malloc(sizeof(grpc_uv_tcp_connect));
148
+ memset(connect, 0, sizeof(grpc_uv_tcp_connect));
149
+ connect->closure = closure;
150
+ connect->endpoint = ep;
151
+ connect->tcp_handle = gpr_malloc(sizeof(uv_tcp_t));
152
+ connect->addr_name = grpc_sockaddr_to_uri(resolved_addr);
153
+ connect->resource_quota = resource_quota;
154
+ uv_tcp_init(uv_default_loop(), connect->tcp_handle);
155
+ connect->connect_req.data = connect;
156
+
157
+ if (grpc_tcp_trace) {
158
+ gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %s: asynchronously connecting",
159
+ connect->addr_name);
160
+ }
161
+
162
+ // TODO(murgatroid99): figure out what the return value here means
163
+ uv_tcp_connect(&connect->connect_req, connect->tcp_handle,
164
+ (const struct sockaddr *)resolved_addr->addr,
165
+ uv_tc_on_connect);
166
+ grpc_closure_init(&connect->on_alarm, uv_tc_on_alarm, connect,
167
+ grpc_schedule_on_exec_ctx);
168
+ grpc_timer_init(exec_ctx, &connect->alarm,
169
+ gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC),
170
+ &connect->on_alarm, gpr_now(GPR_CLOCK_MONOTONIC));
171
+ }
172
+
173
+ // overridden by api_fuzzer.c
174
+ void (*grpc_tcp_client_connect_impl)(
175
+ grpc_exec_ctx *exec_ctx, grpc_closure *closure, grpc_endpoint **ep,
176
+ grpc_pollset_set *interested_parties, const grpc_channel_args *channel_args,
177
+ const grpc_resolved_address *addr,
178
+ gpr_timespec deadline) = tcp_client_connect_impl;
179
+
180
+ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *closure,
181
+ grpc_endpoint **ep,
182
+ grpc_pollset_set *interested_parties,
183
+ const grpc_channel_args *channel_args,
184
+ const grpc_resolved_address *addr,
185
+ gpr_timespec deadline) {
186
+ grpc_tcp_client_connect_impl(exec_ctx, closure, ep, interested_parties,
187
+ channel_args, addr, deadline);
188
+ }
189
+
190
+ #endif /* GRPC_UV */
@@ -31,18 +31,19 @@
31
31
  *
32
32
  */
33
33
 
34
- #include <grpc/support/port_platform.h>
34
+ #include "src/core/lib/iomgr/port.h"
35
35
 
36
- #ifdef GPR_WINSOCK_SOCKET
36
+ #ifdef GRPC_WINSOCK_SOCKET
37
37
 
38
38
  #include "src/core/lib/iomgr/sockaddr_windows.h"
39
39
 
40
+ #include <grpc/slice_buffer.h>
40
41
  #include <grpc/support/alloc.h>
41
42
  #include <grpc/support/log.h>
42
43
  #include <grpc/support/log_windows.h>
43
- #include <grpc/support/slice_buffer.h>
44
44
  #include <grpc/support/useful.h>
45
45
 
46
+ #include "src/core/lib/channel/channel_args.h"
46
47
  #include "src/core/lib/iomgr/iocp_windows.h"
47
48
  #include "src/core/lib/iomgr/sockaddr.h"
48
49
  #include "src/core/lib/iomgr/sockaddr_utils.h"
@@ -57,17 +58,21 @@ typedef struct {
57
58
  grpc_winsocket *socket;
58
59
  gpr_timespec deadline;
59
60
  grpc_timer alarm;
61
+ grpc_closure on_alarm;
60
62
  char *addr_name;
61
63
  int refs;
62
64
  grpc_closure on_connect;
63
65
  grpc_endpoint **endpoint;
66
+ grpc_resource_quota *resource_quota;
64
67
  } async_connect;
65
68
 
66
- static void async_connect_unlock_and_cleanup(async_connect *ac,
69
+ static void async_connect_unlock_and_cleanup(grpc_exec_ctx *exec_ctx,
70
+ async_connect *ac,
67
71
  grpc_winsocket *socket) {
68
72
  int done = (--ac->refs == 0);
69
73
  gpr_mu_unlock(&ac->mu);
70
74
  if (done) {
75
+ grpc_resource_quota_unref_internal(exec_ctx, ac->resource_quota);
71
76
  gpr_mu_destroy(&ac->mu);
72
77
  gpr_free(ac->addr_name);
73
78
  gpr_free(ac);
@@ -83,7 +88,7 @@ static void on_alarm(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
83
88
  if (socket != NULL) {
84
89
  grpc_winsocket_shutdown(socket);
85
90
  }
86
- async_connect_unlock_and_cleanup(ac, socket);
91
+ async_connect_unlock_and_cleanup(exec_ctx, ac, socket);
87
92
  }
88
93
 
89
94
  static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
@@ -103,25 +108,29 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
103
108
 
104
109
  gpr_mu_lock(&ac->mu);
105
110
 
106
- if (error == GRPC_ERROR_NONE && socket != NULL) {
107
- DWORD transfered_bytes = 0;
108
- DWORD flags;
109
- BOOL wsa_success =
110
- WSAGetOverlappedResult(socket->socket, &socket->write_info.overlapped,
111
- &transfered_bytes, FALSE, &flags);
112
- GPR_ASSERT(transfered_bytes == 0);
113
- if (!wsa_success) {
114
- error = GRPC_WSA_ERROR(WSAGetLastError(), "ConnectEx");
111
+ if (error == GRPC_ERROR_NONE) {
112
+ if (socket != NULL) {
113
+ DWORD transfered_bytes = 0;
114
+ DWORD flags;
115
+ BOOL wsa_success =
116
+ WSAGetOverlappedResult(socket->socket, &socket->write_info.overlapped,
117
+ &transfered_bytes, FALSE, &flags);
118
+ GPR_ASSERT(transfered_bytes == 0);
119
+ if (!wsa_success) {
120
+ error = GRPC_WSA_ERROR(WSAGetLastError(), "ConnectEx");
121
+ } else {
122
+ *ep = grpc_tcp_create(socket, ac->resource_quota, ac->addr_name);
123
+ socket = NULL;
124
+ }
115
125
  } else {
116
- *ep = grpc_tcp_create(socket, ac->addr_name);
117
- socket = NULL;
126
+ error = GRPC_ERROR_CREATE("socket is null");
118
127
  }
119
128
  }
120
129
 
121
- async_connect_unlock_and_cleanup(ac, socket);
130
+ async_connect_unlock_and_cleanup(exec_ctx, ac, socket);
122
131
  /* If the connection was aborted, the callback was already called when
123
132
  the deadline was met. */
124
- grpc_exec_ctx_sched(exec_ctx, on_done, error, NULL);
133
+ grpc_closure_sched(exec_ctx, on_done, error);
125
134
  }
126
135
 
127
136
  /* Tries to issue one async connection, then schedules both an IOCP
@@ -129,13 +138,14 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) {
129
138
  void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
130
139
  grpc_endpoint **endpoint,
131
140
  grpc_pollset_set *interested_parties,
132
- const struct sockaddr *addr, size_t addr_len,
141
+ const grpc_channel_args *channel_args,
142
+ const grpc_resolved_address *addr,
133
143
  gpr_timespec deadline) {
134
144
  SOCKET sock = INVALID_SOCKET;
135
145
  BOOL success;
136
146
  int status;
137
- struct sockaddr_in6 addr6_v4mapped;
138
- struct sockaddr_in6 local_address;
147
+ grpc_resolved_address addr6_v4mapped;
148
+ grpc_resolved_address local_address;
139
149
  async_connect *ac;
140
150
  grpc_winsocket *socket = NULL;
141
151
  LPFN_CONNECTEX ConnectEx;
@@ -144,12 +154,22 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
144
154
  grpc_winsocket_callback_info *info;
145
155
  grpc_error *error = GRPC_ERROR_NONE;
146
156
 
157
+ grpc_resource_quota *resource_quota = grpc_resource_quota_create(NULL);
158
+ if (channel_args != NULL) {
159
+ for (size_t i = 0; i < channel_args->num_args; i++) {
160
+ if (0 == strcmp(channel_args->args[i].key, GRPC_ARG_RESOURCE_QUOTA)) {
161
+ grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
162
+ resource_quota = grpc_resource_quota_ref_internal(
163
+ channel_args->args[i].value.pointer.p);
164
+ }
165
+ }
166
+ }
167
+
147
168
  *endpoint = NULL;
148
169
 
149
170
  /* Use dualstack sockets where available. */
150
171
  if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
151
- addr = (const struct sockaddr *)&addr6_v4mapped;
152
- addr_len = sizeof(addr6_v4mapped);
172
+ addr = &addr6_v4mapped;
153
173
  }
154
174
 
155
175
  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
@@ -178,7 +198,8 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
178
198
 
179
199
  grpc_sockaddr_make_wildcard6(0, &local_address);
180
200
 
181
- status = bind(sock, (struct sockaddr *)&local_address, sizeof(local_address));
201
+ status = bind(sock, (struct sockaddr *)&local_address.addr,
202
+ (int)local_address.len);
182
203
  if (status != 0) {
183
204
  error = GRPC_WSA_ERROR(WSAGetLastError(), "bind");
184
205
  goto failure;
@@ -186,8 +207,8 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
186
207
 
187
208
  socket = grpc_winsocket_create(sock, "client");
188
209
  info = &socket->write_info;
189
- success =
190
- ConnectEx(sock, addr, (int)addr_len, NULL, 0, NULL, &info->overlapped);
210
+ success = ConnectEx(sock, (struct sockaddr *)&addr->addr, (int)addr->len,
211
+ NULL, 0, NULL, &info->overlapped);
191
212
 
192
213
  /* It wouldn't be unusual to get a success immediately. But we'll still get
193
214
  an IOCP notification, so let's ignore it. */
@@ -206,9 +227,11 @@ void grpc_tcp_client_connect(grpc_exec_ctx *exec_ctx, grpc_closure *on_done,
206
227
  ac->refs = 2;
207
228
  ac->addr_name = grpc_sockaddr_to_uri(addr);
208
229
  ac->endpoint = endpoint;
209
- grpc_closure_init(&ac->on_connect, on_connect, ac);
230
+ ac->resource_quota = resource_quota;
231
+ grpc_closure_init(&ac->on_connect, on_connect, ac, grpc_schedule_on_exec_ctx);
210
232
 
211
- grpc_timer_init(exec_ctx, &ac->alarm, deadline, on_alarm, ac,
233
+ grpc_closure_init(&ac->on_alarm, on_alarm, ac, grpc_schedule_on_exec_ctx);
234
+ grpc_timer_init(exec_ctx, &ac->alarm, deadline, &ac->on_alarm,
212
235
  gpr_now(GPR_CLOCK_MONOTONIC));
213
236
  grpc_socket_notify_on_write(exec_ctx, socket, &ac->on_connect);
214
237
  return;
@@ -225,7 +248,8 @@ failure:
225
248
  } else if (sock != INVALID_SOCKET) {
226
249
  closesocket(sock);
227
250
  }
228
- grpc_exec_ctx_sched(exec_ctx, on_done, final_error, NULL);
251
+ grpc_resource_quota_unref_internal(exec_ctx, resource_quota);
252
+ grpc_closure_sched(exec_ctx, on_done, final_error);
229
253
  }
230
254
 
231
- #endif /* GPR_WINSOCK_SOCKET */
255
+ #endif /* GRPC_WINSOCK_SOCKET */
@@ -31,9 +31,9 @@
31
31
  *
32
32
  */
33
33
 
34
- #include <grpc/support/port_platform.h>
34
+ #include "src/core/lib/iomgr/port.h"
35
35
 
36
- #ifdef GPR_POSIX_SOCKET
36
+ #ifdef GRPC_POSIX_SOCKET
37
37
 
38
38
  #include "src/core/lib/iomgr/network_status_tracker.h"
39
39
  #include "src/core/lib/iomgr/tcp_posix.h"
@@ -46,9 +46,9 @@
46
46
  #include <sys/types.h>
47
47
  #include <unistd.h>
48
48
 
49
+ #include <grpc/slice.h>
49
50
  #include <grpc/support/alloc.h>
50
51
  #include <grpc/support/log.h>
51
- #include <grpc/support/slice.h>
52
52
  #include <grpc/support/string_util.h>
53
53
  #include <grpc/support/sync.h>
54
54
  #include <grpc/support/time.h>
@@ -56,16 +56,18 @@
56
56
  #include "src/core/lib/debug/trace.h"
57
57
  #include "src/core/lib/iomgr/ev_posix.h"
58
58
  #include "src/core/lib/profiling/timers.h"
59
+ #include "src/core/lib/slice/slice_internal.h"
60
+ #include "src/core/lib/slice/slice_string_helpers.h"
59
61
  #include "src/core/lib/support/string.h"
60
62
 
61
- #ifdef GPR_HAVE_MSG_NOSIGNAL
63
+ #ifdef GRPC_HAVE_MSG_NOSIGNAL
62
64
  #define SENDMSG_FLAGS MSG_NOSIGNAL
63
65
  #else
64
66
  #define SENDMSG_FLAGS 0
65
67
  #endif
66
68
 
67
- #ifdef GPR_MSG_IOVLEN_TYPE
68
- typedef GPR_MSG_IOVLEN_TYPE msg_iovlen_type;
69
+ #ifdef GRPC_MSG_IOVLEN_TYPE
70
+ typedef GRPC_MSG_IOVLEN_TYPE msg_iovlen_type;
69
71
  #else
70
72
  typedef size_t msg_iovlen_type;
71
73
  #endif
@@ -80,12 +82,13 @@ typedef struct {
80
82
  msg_iovlen_type iov_size; /* Number of slices to allocate per read attempt */
81
83
  size_t slice_size;
82
84
  gpr_refcount refcount;
85
+ gpr_atm shutdown_count;
83
86
 
84
87
  /* garbage after the last read */
85
- gpr_slice_buffer last_read_buffer;
88
+ grpc_slice_buffer last_read_buffer;
86
89
 
87
- gpr_slice_buffer *incoming_buffer;
88
- gpr_slice_buffer *outgoing_buffer;
90
+ grpc_slice_buffer *incoming_buffer;
91
+ grpc_slice_buffer *outgoing_buffer;
89
92
  /** slice within outgoing_buffer to write next */
90
93
  size_t outgoing_slice_idx;
91
94
  /** byte within outgoing_buffer->slices[outgoing_slice_idx] to write next */
@@ -100,8 +103,17 @@ typedef struct {
100
103
  grpc_closure write_closure;
101
104
 
102
105
  char *peer_string;
106
+
107
+ grpc_resource_user *resource_user;
108
+ grpc_resource_user_slice_allocator slice_allocator;
103
109
  } grpc_tcp;
104
110
 
111
+ static grpc_error *tcp_annotate_error(grpc_error *src_error, grpc_tcp *tcp) {
112
+ return grpc_error_set_str(
113
+ grpc_error_set_int(src_error, GRPC_ERROR_INT_FD, tcp->fd),
114
+ GRPC_ERROR_STR_TARGET_ADDRESS, tcp->peer_string);
115
+ }
116
+
105
117
  static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
106
118
  grpc_error *error);
107
119
  static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
@@ -110,12 +122,14 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
110
122
  static void tcp_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
111
123
  grpc_tcp *tcp = (grpc_tcp *)ep;
112
124
  grpc_fd_shutdown(exec_ctx, tcp->em_fd);
125
+ grpc_resource_user_shutdown(exec_ctx, tcp->resource_user);
113
126
  }
114
127
 
115
128
  static void tcp_free(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
116
129
  grpc_fd_orphan(exec_ctx, tcp->em_fd, tcp->release_fd_cb, tcp->release_fd,
117
130
  "tcp_unref_orphan");
118
- gpr_slice_buffer_destroy(&tcp->last_read_buffer);
131
+ grpc_slice_buffer_destroy_internal(exec_ctx, &tcp->last_read_buffer);
132
+ grpc_resource_user_unref(exec_ctx, tcp->resource_user);
119
133
  gpr_free(tcp->peer_string);
120
134
  gpr_free(tcp);
121
135
  }
@@ -155,6 +169,7 @@ static void tcp_ref(grpc_tcp *tcp) { gpr_ref(&tcp->refcount); }
155
169
  static void tcp_destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) {
156
170
  grpc_network_status_unregister_endpoint(ep);
157
171
  grpc_tcp *tcp = (grpc_tcp *)ep;
172
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &tcp->last_read_buffer);
158
173
  TCP_UNREF(exec_ctx, tcp, "destroy");
159
174
  }
160
175
 
@@ -168,8 +183,8 @@ static void call_read_cb(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp,
168
183
  gpr_log(GPR_DEBUG, "read: error=%s", str);
169
184
  grpc_error_free_string(str);
170
185
  for (i = 0; i < tcp->incoming_buffer->count; i++) {
171
- char *dump = gpr_dump_slice(tcp->incoming_buffer->slices[i],
172
- GPR_DUMP_HEX | GPR_DUMP_ASCII);
186
+ char *dump = grpc_dump_slice(tcp->incoming_buffer->slices[i],
187
+ GPR_DUMP_HEX | GPR_DUMP_ASCII);
173
188
  gpr_log(GPR_DEBUG, "READ %p (peer=%s): %s", tcp, tcp->peer_string, dump);
174
189
  gpr_free(dump);
175
190
  }
@@ -177,11 +192,11 @@ static void call_read_cb(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp,
177
192
 
178
193
  tcp->read_cb = NULL;
179
194
  tcp->incoming_buffer = NULL;
180
- grpc_exec_ctx_sched(exec_ctx, cb, error, NULL);
195
+ grpc_closure_run(exec_ctx, cb, error);
181
196
  }
182
197
 
183
198
  #define MAX_READ_IOVEC 4
184
- static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
199
+ static void tcp_do_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
185
200
  struct msghdr msg;
186
201
  struct iovec iov[MAX_READ_IOVEC];
187
202
  ssize_t read_bytes;
@@ -192,13 +207,9 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
192
207
  GPR_ASSERT(tcp->incoming_buffer->count <= MAX_READ_IOVEC);
193
208
  GPR_TIMER_BEGIN("tcp_continue_read", 0);
194
209
 
195
- while (tcp->incoming_buffer->count < (size_t)tcp->iov_size) {
196
- gpr_slice_buffer_add_indexed(tcp->incoming_buffer,
197
- gpr_slice_malloc(tcp->slice_size));
198
- }
199
210
  for (i = 0; i < tcp->incoming_buffer->count; i++) {
200
- iov[i].iov_base = GPR_SLICE_START_PTR(tcp->incoming_buffer->slices[i]);
201
- iov[i].iov_len = GPR_SLICE_LENGTH(tcp->incoming_buffer->slices[i]);
211
+ iov[i].iov_base = GRPC_SLICE_START_PTR(tcp->incoming_buffer->slices[i]);
212
+ iov[i].iov_len = GRPC_SLICE_LENGTH(tcp->incoming_buffer->slices[i]);
202
213
  }
203
214
 
204
215
  msg.msg_name = NULL;
@@ -209,11 +220,11 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
209
220
  msg.msg_controllen = 0;
210
221
  msg.msg_flags = 0;
211
222
 
212
- GPR_TIMER_BEGIN("recvmsg", 1);
223
+ GPR_TIMER_BEGIN("recvmsg", 0);
213
224
  do {
214
225
  read_bytes = recvmsg(tcp->fd, &msg, 0);
215
226
  } while (read_bytes < 0 && errno == EINTR);
216
- GPR_TIMER_END("recvmsg", 0);
227
+ GPR_TIMER_END("recvmsg", read_bytes >= 0);
217
228
 
218
229
  if (read_bytes < 0) {
219
230
  /* NB: After calling call_read_cb a parallel call of the read handler may
@@ -225,19 +236,22 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
225
236
  /* We've consumed the edge, request a new one */
226
237
  grpc_fd_notify_on_read(exec_ctx, tcp->em_fd, &tcp->read_closure);
227
238
  } else {
228
- gpr_slice_buffer_reset_and_unref(tcp->incoming_buffer);
229
- call_read_cb(exec_ctx, tcp, GRPC_OS_ERROR(errno, "recvmsg"));
239
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
240
+ tcp->incoming_buffer);
241
+ call_read_cb(exec_ctx, tcp,
242
+ tcp_annotate_error(GRPC_OS_ERROR(errno, "recvmsg"), tcp));
230
243
  TCP_UNREF(exec_ctx, tcp, "read");
231
244
  }
232
245
  } else if (read_bytes == 0) {
233
246
  /* 0 read size ==> end of stream */
234
- gpr_slice_buffer_reset_and_unref(tcp->incoming_buffer);
235
- call_read_cb(exec_ctx, tcp, GRPC_ERROR_CREATE("EOF"));
247
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, tcp->incoming_buffer);
248
+ call_read_cb(exec_ctx, tcp,
249
+ tcp_annotate_error(GRPC_ERROR_CREATE("Socket closed"), tcp));
236
250
  TCP_UNREF(exec_ctx, tcp, "read");
237
251
  } else {
238
252
  GPR_ASSERT((size_t)read_bytes <= tcp->incoming_buffer->length);
239
253
  if ((size_t)read_bytes < tcp->incoming_buffer->length) {
240
- gpr_slice_buffer_trim_end(
254
+ grpc_slice_buffer_trim_end(
241
255
  tcp->incoming_buffer,
242
256
  tcp->incoming_buffer->length - (size_t)read_bytes,
243
257
  &tcp->last_read_buffer);
@@ -252,13 +266,40 @@ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
252
266
  GPR_TIMER_END("tcp_continue_read", 0);
253
267
  }
254
268
 
269
+ static void tcp_read_allocation_done(grpc_exec_ctx *exec_ctx, void *tcpp,
270
+ grpc_error *error) {
271
+ grpc_tcp *tcp = tcpp;
272
+ if (error != GRPC_ERROR_NONE) {
273
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, tcp->incoming_buffer);
274
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
275
+ &tcp->last_read_buffer);
276
+ call_read_cb(exec_ctx, tcp, GRPC_ERROR_REF(error));
277
+ TCP_UNREF(exec_ctx, tcp, "read");
278
+ } else {
279
+ tcp_do_read(exec_ctx, tcp);
280
+ }
281
+ }
282
+
283
+ static void tcp_continue_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
284
+ if (tcp->incoming_buffer->count < (size_t)tcp->iov_size) {
285
+ grpc_resource_user_alloc_slices(
286
+ exec_ctx, &tcp->slice_allocator, tcp->slice_size,
287
+ (size_t)tcp->iov_size - tcp->incoming_buffer->count,
288
+ tcp->incoming_buffer);
289
+ } else {
290
+ tcp_do_read(exec_ctx, tcp);
291
+ }
292
+ }
293
+
255
294
  static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
256
295
  grpc_error *error) {
257
296
  grpc_tcp *tcp = (grpc_tcp *)arg;
258
297
  GPR_ASSERT(!tcp->finished_edge);
259
298
 
260
299
  if (error != GRPC_ERROR_NONE) {
261
- gpr_slice_buffer_reset_and_unref(tcp->incoming_buffer);
300
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, tcp->incoming_buffer);
301
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
302
+ &tcp->last_read_buffer);
262
303
  call_read_cb(exec_ctx, tcp, GRPC_ERROR_REF(error));
263
304
  TCP_UNREF(exec_ctx, tcp, "read");
264
305
  } else {
@@ -267,24 +308,24 @@ static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
267
308
  }
268
309
 
269
310
  static void tcp_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
270
- gpr_slice_buffer *incoming_buffer, grpc_closure *cb) {
311
+ grpc_slice_buffer *incoming_buffer, grpc_closure *cb) {
271
312
  grpc_tcp *tcp = (grpc_tcp *)ep;
272
313
  GPR_ASSERT(tcp->read_cb == NULL);
273
314
  tcp->read_cb = cb;
274
315
  tcp->incoming_buffer = incoming_buffer;
275
- gpr_slice_buffer_reset_and_unref(incoming_buffer);
276
- gpr_slice_buffer_swap(incoming_buffer, &tcp->last_read_buffer);
316
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, incoming_buffer);
317
+ grpc_slice_buffer_swap(incoming_buffer, &tcp->last_read_buffer);
277
318
  TCP_REF(tcp, "read");
278
319
  if (tcp->finished_edge) {
279
320
  tcp->finished_edge = false;
280
321
  grpc_fd_notify_on_read(exec_ctx, tcp->em_fd, &tcp->read_closure);
281
322
  } else {
282
- grpc_exec_ctx_sched(exec_ctx, &tcp->read_closure, GRPC_ERROR_NONE, NULL);
323
+ grpc_closure_sched(exec_ctx, &tcp->read_closure, GRPC_ERROR_NONE);
283
324
  }
284
325
  }
285
326
 
286
327
  /* returns true if done, false if pending; if returning true, *error is set */
287
- #define MAX_WRITE_IOVEC 1024
328
+ #define MAX_WRITE_IOVEC 1000
288
329
  static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
289
330
  struct msghdr msg;
290
331
  struct iovec iov[MAX_WRITE_IOVEC];
@@ -303,11 +344,11 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
303
344
  iov_size != MAX_WRITE_IOVEC;
304
345
  iov_size++) {
305
346
  iov[iov_size].iov_base =
306
- GPR_SLICE_START_PTR(
347
+ GRPC_SLICE_START_PTR(
307
348
  tcp->outgoing_buffer->slices[tcp->outgoing_slice_idx]) +
308
349
  tcp->outgoing_byte_idx;
309
350
  iov[iov_size].iov_len =
310
- GPR_SLICE_LENGTH(
351
+ GRPC_SLICE_LENGTH(
311
352
  tcp->outgoing_buffer->slices[tcp->outgoing_slice_idx]) -
312
353
  tcp->outgoing_byte_idx;
313
354
  sending_length += iov[iov_size].iov_len;
@@ -336,8 +377,13 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
336
377
  tcp->outgoing_slice_idx = unwind_slice_idx;
337
378
  tcp->outgoing_byte_idx = unwind_byte_idx;
338
379
  return false;
380
+ } else if (errno == EPIPE) {
381
+ *error = grpc_error_set_int(GRPC_OS_ERROR(errno, "sendmsg"),
382
+ GRPC_ERROR_INT_GRPC_STATUS,
383
+ GRPC_STATUS_UNAVAILABLE);
384
+ return true;
339
385
  } else {
340
- *error = GRPC_OS_ERROR(errno, "sendmsg");
386
+ *error = tcp_annotate_error(GRPC_OS_ERROR(errno, "sendmsg"), tcp);
341
387
  return true;
342
388
  }
343
389
  }
@@ -348,7 +394,7 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
348
394
  size_t slice_length;
349
395
 
350
396
  tcp->outgoing_slice_idx--;
351
- slice_length = GPR_SLICE_LENGTH(
397
+ slice_length = GRPC_SLICE_LENGTH(
352
398
  tcp->outgoing_buffer->slices[tcp->outgoing_slice_idx]);
353
399
  if (slice_length > trailing) {
354
400
  tcp->outgoing_byte_idx = slice_length - trailing;
@@ -379,20 +425,26 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
379
425
  }
380
426
 
381
427
  if (!tcp_flush(tcp, &error)) {
428
+ if (grpc_tcp_trace) {
429
+ gpr_log(GPR_DEBUG, "write: delayed");
430
+ }
382
431
  grpc_fd_notify_on_write(exec_ctx, tcp->em_fd, &tcp->write_closure);
383
432
  } else {
384
433
  cb = tcp->write_cb;
385
434
  tcp->write_cb = NULL;
386
- GPR_TIMER_BEGIN("tcp_handle_write.cb", 0);
387
- cb->cb(exec_ctx, cb->cb_arg, error);
388
- GPR_TIMER_END("tcp_handle_write.cb", 0);
435
+ if (grpc_tcp_trace) {
436
+ const char *str = grpc_error_string(error);
437
+ gpr_log(GPR_DEBUG, "write: %s", str);
438
+ grpc_error_free_string(str);
439
+ }
440
+
441
+ grpc_closure_run(exec_ctx, cb, error);
389
442
  TCP_UNREF(exec_ctx, tcp, "write");
390
- GRPC_ERROR_UNREF(error);
391
443
  }
392
444
  }
393
445
 
394
446
  static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
395
- gpr_slice_buffer *buf, grpc_closure *cb) {
447
+ grpc_slice_buffer *buf, grpc_closure *cb) {
396
448
  grpc_tcp *tcp = (grpc_tcp *)ep;
397
449
  grpc_error *error = GRPC_ERROR_NONE;
398
450
 
@@ -401,7 +453,7 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
401
453
 
402
454
  for (i = 0; i < buf->count; i++) {
403
455
  char *data =
404
- gpr_dump_slice(buf->slices[i], GPR_DUMP_HEX | GPR_DUMP_ASCII);
456
+ grpc_dump_slice(buf->slices[i], GPR_DUMP_HEX | GPR_DUMP_ASCII);
405
457
  gpr_log(GPR_DEBUG, "WRITE %p (peer=%s): %s", tcp, tcp->peer_string, data);
406
458
  gpr_free(data);
407
459
  }
@@ -412,10 +464,10 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
412
464
 
413
465
  if (buf->length == 0) {
414
466
  GPR_TIMER_END("tcp_write", 0);
415
- grpc_exec_ctx_sched(exec_ctx, cb, grpc_fd_is_shutdown(tcp->em_fd)
416
- ? GRPC_ERROR_CREATE("EOF")
417
- : GRPC_ERROR_NONE,
418
- NULL);
467
+ grpc_closure_sched(exec_ctx, cb,
468
+ grpc_fd_is_shutdown(tcp->em_fd)
469
+ ? tcp_annotate_error(GRPC_ERROR_CREATE("EOF"), tcp)
470
+ : GRPC_ERROR_NONE);
419
471
  return;
420
472
  }
421
473
  tcp->outgoing_buffer = buf;
@@ -425,9 +477,17 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
425
477
  if (!tcp_flush(tcp, &error)) {
426
478
  TCP_REF(tcp, "write");
427
479
  tcp->write_cb = cb;
480
+ if (grpc_tcp_trace) {
481
+ gpr_log(GPR_DEBUG, "write: delayed");
482
+ }
428
483
  grpc_fd_notify_on_write(exec_ctx, tcp->em_fd, &tcp->write_closure);
429
484
  } else {
430
- grpc_exec_ctx_sched(exec_ctx, cb, error, NULL);
485
+ if (grpc_tcp_trace) {
486
+ const char *str = grpc_error_string(error);
487
+ gpr_log(GPR_DEBUG, "write: %s", str);
488
+ grpc_error_free_string(str);
489
+ }
490
+ grpc_closure_sched(exec_ctx, cb, error);
431
491
  }
432
492
 
433
493
  GPR_TIMER_END("tcp_write", 0);
@@ -450,11 +510,21 @@ static char *tcp_get_peer(grpc_endpoint *ep) {
450
510
  return gpr_strdup(tcp->peer_string);
451
511
  }
452
512
 
513
+ static int tcp_get_fd(grpc_endpoint *ep) {
514
+ grpc_tcp *tcp = (grpc_tcp *)ep;
515
+ return tcp->fd;
516
+ }
517
+
453
518
  static grpc_workqueue *tcp_get_workqueue(grpc_endpoint *ep) {
454
519
  grpc_tcp *tcp = (grpc_tcp *)ep;
455
520
  return grpc_fd_get_workqueue(tcp->em_fd);
456
521
  }
457
522
 
523
+ static grpc_resource_user *tcp_get_resource_user(grpc_endpoint *ep) {
524
+ grpc_tcp *tcp = (grpc_tcp *)ep;
525
+ return tcp->resource_user;
526
+ }
527
+
458
528
  static const grpc_endpoint_vtable vtable = {tcp_read,
459
529
  tcp_write,
460
530
  tcp_get_workqueue,
@@ -462,10 +532,13 @@ static const grpc_endpoint_vtable vtable = {tcp_read,
462
532
  tcp_add_to_pollset_set,
463
533
  tcp_shutdown,
464
534
  tcp_destroy,
465
- tcp_get_peer};
535
+ tcp_get_resource_user,
536
+ tcp_get_peer,
537
+ tcp_get_fd};
466
538
 
467
- grpc_endpoint *grpc_tcp_create(grpc_fd *em_fd, size_t slice_size,
468
- const char *peer_string) {
539
+ grpc_endpoint *grpc_tcp_create(grpc_fd *em_fd,
540
+ grpc_resource_quota *resource_quota,
541
+ size_t slice_size, const char *peer_string) {
469
542
  grpc_tcp *tcp = (grpc_tcp *)gpr_malloc(sizeof(grpc_tcp));
470
543
  tcp->base.vtable = &vtable;
471
544
  tcp->peer_string = gpr_strdup(peer_string);
@@ -480,12 +553,16 @@ grpc_endpoint *grpc_tcp_create(grpc_fd *em_fd, size_t slice_size,
480
553
  tcp->finished_edge = true;
481
554
  /* paired with unref in grpc_tcp_destroy */
482
555
  gpr_ref_init(&tcp->refcount, 1);
556
+ gpr_atm_no_barrier_store(&tcp->shutdown_count, 0);
483
557
  tcp->em_fd = em_fd;
484
- tcp->read_closure.cb = tcp_handle_read;
485
- tcp->read_closure.cb_arg = tcp;
486
- tcp->write_closure.cb = tcp_handle_write;
487
- tcp->write_closure.cb_arg = tcp;
488
- gpr_slice_buffer_init(&tcp->last_read_buffer);
558
+ grpc_closure_init(&tcp->read_closure, tcp_handle_read, tcp,
559
+ grpc_schedule_on_exec_ctx);
560
+ grpc_closure_init(&tcp->write_closure, tcp_handle_write, tcp,
561
+ grpc_schedule_on_exec_ctx);
562
+ grpc_slice_buffer_init(&tcp->last_read_buffer);
563
+ tcp->resource_user = grpc_resource_user_create(resource_quota, peer_string);
564
+ grpc_resource_user_slice_allocator_init(
565
+ &tcp->slice_allocator, tcp->resource_user, tcp_read_allocation_done, tcp);
489
566
  /* Tell network status tracker about new endpoint */
490
567
  grpc_network_status_register_endpoint(&tcp->base);
491
568
 
@@ -500,10 +577,12 @@ int grpc_tcp_fd(grpc_endpoint *ep) {
500
577
 
501
578
  void grpc_tcp_destroy_and_release_fd(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
502
579
  int *fd, grpc_closure *done) {
580
+ grpc_network_status_unregister_endpoint(ep);
503
581
  grpc_tcp *tcp = (grpc_tcp *)ep;
504
582
  GPR_ASSERT(ep->vtable == &vtable);
505
583
  tcp->release_fd = fd;
506
584
  tcp->release_fd_cb = done;
585
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &tcp->last_read_buffer);
507
586
  TCP_UNREF(exec_ctx, tcp, "destroy");
508
587
  }
509
588