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,388 @@
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
+ #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/exec_ctx.h"
45
+ #include "src/core/lib/iomgr/sockaddr.h"
46
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
47
+ #include "src/core/lib/iomgr/tcp_server.h"
48
+ #include "src/core/lib/iomgr/tcp_uv.h"
49
+
50
+ /* one listening port */
51
+ typedef struct grpc_tcp_listener grpc_tcp_listener;
52
+ struct grpc_tcp_listener {
53
+ uv_tcp_t *handle;
54
+ grpc_tcp_server *server;
55
+ unsigned port_index;
56
+ int port;
57
+ /* linked list */
58
+ struct grpc_tcp_listener *next;
59
+ };
60
+
61
+ struct grpc_tcp_server {
62
+ gpr_refcount refs;
63
+
64
+ /* Called whenever accept() succeeds on a server port. */
65
+ grpc_tcp_server_cb on_accept_cb;
66
+ void *on_accept_cb_arg;
67
+
68
+ int open_ports;
69
+
70
+ /* linked list of server ports */
71
+ grpc_tcp_listener *head;
72
+ grpc_tcp_listener *tail;
73
+
74
+ /* List of closures passed to shutdown_starting_add(). */
75
+ grpc_closure_list shutdown_starting;
76
+
77
+ /* shutdown callback */
78
+ grpc_closure *shutdown_complete;
79
+
80
+ grpc_resource_quota *resource_quota;
81
+ };
82
+
83
+ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx,
84
+ grpc_closure *shutdown_complete,
85
+ const grpc_channel_args *args,
86
+ grpc_tcp_server **server) {
87
+ grpc_tcp_server *s = gpr_malloc(sizeof(grpc_tcp_server));
88
+ s->resource_quota = grpc_resource_quota_create(NULL);
89
+ for (size_t i = 0; i < (args == NULL ? 0 : args->num_args); i++) {
90
+ if (0 == strcmp(GRPC_ARG_RESOURCE_QUOTA, args->args[i].key)) {
91
+ if (args->args[i].type == GRPC_ARG_POINTER) {
92
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
93
+ s->resource_quota =
94
+ grpc_resource_quota_ref_internal(args->args[i].value.pointer.p);
95
+ } else {
96
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
97
+ gpr_free(s);
98
+ return GRPC_ERROR_CREATE(GRPC_ARG_RESOURCE_QUOTA
99
+ " must be a pointer to a buffer pool");
100
+ }
101
+ }
102
+ }
103
+ gpr_ref_init(&s->refs, 1);
104
+ s->on_accept_cb = NULL;
105
+ s->on_accept_cb_arg = NULL;
106
+ s->open_ports = 0;
107
+ s->head = NULL;
108
+ s->tail = NULL;
109
+ s->shutdown_starting.head = NULL;
110
+ s->shutdown_starting.tail = NULL;
111
+ s->shutdown_complete = shutdown_complete;
112
+ *server = s;
113
+ return GRPC_ERROR_NONE;
114
+ }
115
+
116
+ grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) {
117
+ gpr_ref(&s->refs);
118
+ return s;
119
+ }
120
+
121
+ void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s,
122
+ grpc_closure *shutdown_starting) {
123
+ grpc_closure_list_append(&s->shutdown_starting, shutdown_starting,
124
+ GRPC_ERROR_NONE);
125
+ }
126
+
127
+ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
128
+ if (s->shutdown_complete != NULL) {
129
+ grpc_closure_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE);
130
+ }
131
+
132
+ while (s->head) {
133
+ grpc_tcp_listener *sp = s->head;
134
+ s->head = sp->next;
135
+ sp->next = NULL;
136
+ gpr_free(sp->handle);
137
+ gpr_free(sp);
138
+ }
139
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
140
+ gpr_free(s);
141
+ }
142
+
143
+ static void handle_close_callback(uv_handle_t *handle) {
144
+ grpc_tcp_listener *sp = (grpc_tcp_listener *)handle->data;
145
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
146
+ sp->server->open_ports--;
147
+ if (sp->server->open_ports == 0) {
148
+ finish_shutdown(&exec_ctx, sp->server);
149
+ }
150
+ grpc_exec_ctx_finish(&exec_ctx);
151
+ }
152
+
153
+ static void tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
154
+ int immediately_done = 0;
155
+ grpc_tcp_listener *sp;
156
+
157
+ if (s->open_ports == 0) {
158
+ immediately_done = 1;
159
+ }
160
+ for (sp = s->head; sp; sp = sp->next) {
161
+ uv_close((uv_handle_t *)sp->handle, handle_close_callback);
162
+ }
163
+
164
+ if (immediately_done) {
165
+ finish_shutdown(exec_ctx, s);
166
+ }
167
+ }
168
+
169
+ void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
170
+ if (gpr_unref(&s->refs)) {
171
+ /* Complete shutdown_starting work before destroying. */
172
+ grpc_exec_ctx local_exec_ctx = GRPC_EXEC_CTX_INIT;
173
+ grpc_closure_list_sched(&local_exec_ctx, &s->shutdown_starting);
174
+ if (exec_ctx == NULL) {
175
+ grpc_exec_ctx_flush(&local_exec_ctx);
176
+ tcp_server_destroy(&local_exec_ctx, s);
177
+ grpc_exec_ctx_finish(&local_exec_ctx);
178
+ } else {
179
+ grpc_exec_ctx_finish(&local_exec_ctx);
180
+ tcp_server_destroy(exec_ctx, s);
181
+ }
182
+ }
183
+ }
184
+
185
+ static void accepted_connection_close_cb(uv_handle_t *handle) {
186
+ gpr_free(handle);
187
+ }
188
+
189
+ static void on_connect(uv_stream_t *server, int status) {
190
+ grpc_tcp_listener *sp = (grpc_tcp_listener *)server->data;
191
+ uv_tcp_t *client;
192
+ grpc_endpoint *ep = NULL;
193
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
194
+ grpc_resolved_address peer_name;
195
+ char *peer_name_string;
196
+ int err;
197
+
198
+ if (status < 0) {
199
+ gpr_log(GPR_INFO, "Skipping on_accept due to error: %s",
200
+ uv_strerror(status));
201
+ return;
202
+ }
203
+
204
+ client = gpr_malloc(sizeof(uv_tcp_t));
205
+ uv_tcp_init(uv_default_loop(), client);
206
+ // UV documentation says this is guaranteed to succeed
207
+ uv_accept((uv_stream_t *)server, (uv_stream_t *)client);
208
+ // If the server has not been started, we discard incoming connections
209
+ if (sp->server->on_accept_cb == NULL) {
210
+ uv_close((uv_handle_t *)client, accepted_connection_close_cb);
211
+ } else {
212
+ peer_name_string = NULL;
213
+ memset(&peer_name, 0, sizeof(grpc_resolved_address));
214
+ peer_name.len = sizeof(struct sockaddr_storage);
215
+ err = uv_tcp_getpeername(client, (struct sockaddr *)&peer_name.addr,
216
+ (int *)&peer_name.len);
217
+ if (err == 0) {
218
+ peer_name_string = grpc_sockaddr_to_uri(&peer_name);
219
+ } else {
220
+ gpr_log(GPR_INFO, "uv_tcp_getpeername error: %s", uv_strerror(status));
221
+ }
222
+ ep = grpc_tcp_create(client, sp->server->resource_quota, peer_name_string);
223
+ // Create acceptor.
224
+ grpc_tcp_server_acceptor *acceptor = gpr_malloc(sizeof(*acceptor));
225
+ acceptor->from_server = sp->server;
226
+ acceptor->port_index = sp->port_index;
227
+ acceptor->fd_index = 0;
228
+ sp->server->on_accept_cb(&exec_ctx, sp->server->on_accept_cb_arg, ep, NULL,
229
+ acceptor);
230
+ grpc_exec_ctx_finish(&exec_ctx);
231
+ }
232
+ }
233
+
234
+ static grpc_error *add_socket_to_server(grpc_tcp_server *s, uv_tcp_t *handle,
235
+ const grpc_resolved_address *addr,
236
+ unsigned port_index,
237
+ grpc_tcp_listener **listener) {
238
+ grpc_tcp_listener *sp = NULL;
239
+ int port = -1;
240
+ int status;
241
+ grpc_error *error;
242
+ grpc_resolved_address sockname_temp;
243
+
244
+ // The last argument to uv_tcp_bind is flags
245
+ status = uv_tcp_bind(handle, (struct sockaddr *)addr->addr, 0);
246
+ if (status != 0) {
247
+ error = GRPC_ERROR_CREATE("Failed to bind to port");
248
+ error =
249
+ grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status));
250
+ return error;
251
+ }
252
+
253
+ status = uv_listen((uv_stream_t *)handle, SOMAXCONN, on_connect);
254
+ if (status != 0) {
255
+ error = GRPC_ERROR_CREATE("Failed to listen to port");
256
+ error =
257
+ grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status));
258
+ return error;
259
+ }
260
+
261
+ sockname_temp.len = (int)sizeof(struct sockaddr_storage);
262
+ status = uv_tcp_getsockname(handle, (struct sockaddr *)&sockname_temp.addr,
263
+ (int *)&sockname_temp.len);
264
+ if (status != 0) {
265
+ error = GRPC_ERROR_CREATE("getsockname failed");
266
+ error =
267
+ grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status));
268
+ return error;
269
+ }
270
+
271
+ port = grpc_sockaddr_get_port(&sockname_temp);
272
+
273
+ GPR_ASSERT(port >= 0);
274
+ GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server");
275
+ sp = gpr_malloc(sizeof(grpc_tcp_listener));
276
+ sp->next = NULL;
277
+ if (s->head == NULL) {
278
+ s->head = sp;
279
+ } else {
280
+ s->tail->next = sp;
281
+ }
282
+ s->tail = sp;
283
+ sp->server = s;
284
+ sp->handle = handle;
285
+ sp->port = port;
286
+ sp->port_index = port_index;
287
+ handle->data = sp;
288
+ s->open_ports++;
289
+ GPR_ASSERT(sp->handle);
290
+ *listener = sp;
291
+
292
+ return GRPC_ERROR_NONE;
293
+ }
294
+
295
+ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s,
296
+ const grpc_resolved_address *addr,
297
+ int *port) {
298
+ // This function is mostly copied from tcp_server_windows.c
299
+ grpc_tcp_listener *sp = NULL;
300
+ uv_tcp_t *handle;
301
+ grpc_resolved_address addr6_v4mapped;
302
+ grpc_resolved_address wildcard;
303
+ grpc_resolved_address *allocated_addr = NULL;
304
+ grpc_resolved_address sockname_temp;
305
+ unsigned port_index = 0;
306
+ int status;
307
+ grpc_error *error = GRPC_ERROR_NONE;
308
+
309
+ if (s->tail != NULL) {
310
+ port_index = s->tail->port_index + 1;
311
+ }
312
+
313
+ /* Check if this is a wildcard port, and if so, try to keep the port the same
314
+ as some previously created listener. */
315
+ if (grpc_sockaddr_get_port(addr) == 0) {
316
+ for (sp = s->head; sp; sp = sp->next) {
317
+ sockname_temp.len = sizeof(struct sockaddr_storage);
318
+ if (0 == uv_tcp_getsockname(sp->handle,
319
+ (struct sockaddr *)&sockname_temp.addr,
320
+ (int *)&sockname_temp.len)) {
321
+ *port = grpc_sockaddr_get_port(&sockname_temp);
322
+ if (*port > 0) {
323
+ allocated_addr = gpr_malloc(sizeof(grpc_resolved_address));
324
+ memcpy(allocated_addr, addr, sizeof(grpc_resolved_address));
325
+ grpc_sockaddr_set_port(allocated_addr, *port);
326
+ addr = allocated_addr;
327
+ break;
328
+ }
329
+ }
330
+ }
331
+ }
332
+
333
+ if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
334
+ addr = &addr6_v4mapped;
335
+ }
336
+
337
+ /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
338
+ if (grpc_sockaddr_is_wildcard(addr, port)) {
339
+ grpc_sockaddr_make_wildcard6(*port, &wildcard);
340
+
341
+ addr = &wildcard;
342
+ }
343
+
344
+ handle = gpr_malloc(sizeof(uv_tcp_t));
345
+ status = uv_tcp_init(uv_default_loop(), handle);
346
+ if (status == 0) {
347
+ error = add_socket_to_server(s, handle, addr, port_index, &sp);
348
+ } else {
349
+ error = GRPC_ERROR_CREATE("Failed to initialize UV tcp handle");
350
+ error =
351
+ grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status));
352
+ }
353
+
354
+ gpr_free(allocated_addr);
355
+
356
+ if (error != GRPC_ERROR_NONE) {
357
+ grpc_error *error_out = GRPC_ERROR_CREATE_REFERENCING(
358
+ "Failed to add port to server", &error, 1);
359
+ GRPC_ERROR_UNREF(error);
360
+ error = error_out;
361
+ *port = -1;
362
+ } else {
363
+ GPR_ASSERT(sp != NULL);
364
+ *port = sp->port;
365
+ }
366
+ return error;
367
+ }
368
+
369
+ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *server,
370
+ grpc_pollset **pollsets, size_t pollset_count,
371
+ grpc_tcp_server_cb on_accept_cb, void *cb_arg) {
372
+ grpc_tcp_listener *sp;
373
+ (void)pollsets;
374
+ (void)pollset_count;
375
+ GPR_ASSERT(on_accept_cb);
376
+ GPR_ASSERT(!server->on_accept_cb);
377
+ server->on_accept_cb = on_accept_cb;
378
+ server->on_accept_cb_arg = cb_arg;
379
+ for (sp = server->head; sp; sp = sp->next) {
380
+ GPR_ASSERT(uv_listen((uv_stream_t *)sp->handle, SOMAXCONN, on_connect) ==
381
+ 0);
382
+ }
383
+ }
384
+
385
+ void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx,
386
+ grpc_tcp_server *s) {}
387
+
388
+ #endif /* GRPC_UV */
@@ -31,13 +31,13 @@
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
- #include <io.h>
38
+ #include "src/core/lib/iomgr/sockaddr.h"
39
39
 
40
- #include "src/core/lib/iomgr/sockaddr_utils.h"
40
+ #include <io.h>
41
41
 
42
42
  #include <grpc/support/alloc.h>
43
43
  #include <grpc/support/log.h>
@@ -48,6 +48,8 @@
48
48
 
49
49
  #include "src/core/lib/iomgr/iocp_windows.h"
50
50
  #include "src/core/lib/iomgr/pollset_windows.h"
51
+ #include "src/core/lib/iomgr/resolve_address.h"
52
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
51
53
  #include "src/core/lib/iomgr/socket_windows.h"
52
54
  #include "src/core/lib/iomgr/tcp_server.h"
53
55
  #include "src/core/lib/iomgr/tcp_windows.h"
@@ -71,6 +73,7 @@ struct grpc_tcp_listener {
71
73
  /* The cached AcceptEx for that port. */
72
74
  LPFN_ACCEPTEX AcceptEx;
73
75
  int shutting_down;
76
+ int outstanding_calls;
74
77
  /* closure for socket notification of accept being ready */
75
78
  grpc_closure on_accept;
76
79
  /* linked list */
@@ -98,14 +101,32 @@ struct grpc_tcp_server {
98
101
 
99
102
  /* shutdown callback */
100
103
  grpc_closure *shutdown_complete;
104
+
105
+ grpc_resource_quota *resource_quota;
101
106
  };
102
107
 
103
108
  /* Public function. Allocates the proper data structures to hold a
104
109
  grpc_tcp_server. */
105
- grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete,
110
+ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx,
111
+ grpc_closure *shutdown_complete,
106
112
  const grpc_channel_args *args,
107
113
  grpc_tcp_server **server) {
108
114
  grpc_tcp_server *s = gpr_malloc(sizeof(grpc_tcp_server));
115
+ s->resource_quota = grpc_resource_quota_create(NULL);
116
+ for (size_t i = 0; i < (args == NULL ? 0 : args->num_args); i++) {
117
+ if (0 == strcmp(GRPC_ARG_RESOURCE_QUOTA, args->args[i].key)) {
118
+ if (args->args[i].type == GRPC_ARG_POINTER) {
119
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
120
+ s->resource_quota =
121
+ grpc_resource_quota_ref_internal(args->args[i].value.pointer.p);
122
+ } else {
123
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
124
+ gpr_free(s);
125
+ return GRPC_ERROR_CREATE(GRPC_ARG_RESOURCE_QUOTA
126
+ " must be a pointer to a buffer pool");
127
+ }
128
+ }
129
+ }
109
130
  gpr_ref_init(&s->refs, 1);
110
131
  gpr_mu_init(&s->mu);
111
132
  s->active_ports = 0;
@@ -120,10 +141,9 @@ grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete,
120
141
  return GRPC_ERROR_NONE;
121
142
  }
122
143
 
123
- static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
124
- if (s->shutdown_complete != NULL) {
125
- grpc_exec_ctx_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE, NULL);
126
- }
144
+ static void destroy_server(grpc_exec_ctx *exec_ctx, void *arg,
145
+ grpc_error *error) {
146
+ grpc_tcp_server *s = arg;
127
147
 
128
148
  /* Now that the accepts have been aborted, we can destroy the sockets.
129
149
  The IOCP won't get notified on these, so we can flag them as already
@@ -135,11 +155,23 @@ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
135
155
  grpc_winsocket_destroy(sp->socket);
136
156
  gpr_free(sp);
137
157
  }
158
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
138
159
  gpr_free(s);
139
160
  }
140
161
 
162
+ static void finish_shutdown_locked(grpc_exec_ctx *exec_ctx,
163
+ grpc_tcp_server *s) {
164
+ if (s->shutdown_complete != NULL) {
165
+ grpc_closure_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE);
166
+ }
167
+
168
+ grpc_closure_sched(exec_ctx, grpc_closure_create(destroy_server, s,
169
+ grpc_schedule_on_exec_ctx),
170
+ GRPC_ERROR_NONE);
171
+ }
172
+
141
173
  grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) {
142
- gpr_ref(&s->refs);
174
+ gpr_ref_non_zero(&s->refs);
143
175
  return s;
144
176
  }
145
177
 
@@ -152,49 +184,37 @@ void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s,
152
184
  }
153
185
 
154
186
  static void tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
155
- int immediately_done = 0;
156
187
  grpc_tcp_listener *sp;
157
188
  gpr_mu_lock(&s->mu);
158
189
 
159
190
  /* First, shutdown all fd's. This will queue abortion calls for all
160
191
  of the pending accepts due to the normal operation mechanism. */
161
192
  if (s->active_ports == 0) {
162
- immediately_done = 1;
163
- }
164
- for (sp = s->head; sp; sp = sp->next) {
165
- sp->shutting_down = 1;
166
- grpc_winsocket_shutdown(sp->socket);
193
+ finish_shutdown_locked(exec_ctx, s);
194
+ } else {
195
+ for (sp = s->head; sp; sp = sp->next) {
196
+ sp->shutting_down = 1;
197
+ grpc_winsocket_shutdown(sp->socket);
198
+ }
167
199
  }
168
200
  gpr_mu_unlock(&s->mu);
169
-
170
- if (immediately_done) {
171
- finish_shutdown(exec_ctx, s);
172
- }
173
201
  }
174
202
 
175
203
  void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
176
204
  if (gpr_unref(&s->refs)) {
177
- /* Complete shutdown_starting work before destroying. */
178
- grpc_exec_ctx local_exec_ctx = GRPC_EXEC_CTX_INIT;
205
+ grpc_tcp_server_shutdown_listeners(exec_ctx, s);
179
206
  gpr_mu_lock(&s->mu);
180
- grpc_exec_ctx_enqueue_list(&local_exec_ctx, &s->shutdown_starting, NULL);
207
+ grpc_closure_list_sched(exec_ctx, &s->shutdown_starting);
181
208
  gpr_mu_unlock(&s->mu);
182
- if (exec_ctx == NULL) {
183
- grpc_exec_ctx_flush(&local_exec_ctx);
184
- tcp_server_destroy(&local_exec_ctx, s);
185
- grpc_exec_ctx_finish(&local_exec_ctx);
186
- } else {
187
- grpc_exec_ctx_finish(&local_exec_ctx);
188
- tcp_server_destroy(exec_ctx, s);
189
- }
209
+ tcp_server_destroy(exec_ctx, s);
190
210
  }
191
211
  }
192
212
 
193
213
  /* Prepare (bind) a recently-created socket for listening. */
194
- static grpc_error *prepare_socket(SOCKET sock, const struct sockaddr *addr,
195
- size_t addr_len, int *port) {
196
- struct sockaddr_storage sockname_temp;
197
- socklen_t sockname_len;
214
+ static grpc_error *prepare_socket(SOCKET sock,
215
+ const grpc_resolved_address *addr,
216
+ int *port) {
217
+ grpc_resolved_address sockname_temp;
198
218
  grpc_error *error = GRPC_ERROR_NONE;
199
219
 
200
220
  error = grpc_tcp_prepare_socket(sock);
@@ -202,7 +222,8 @@ static grpc_error *prepare_socket(SOCKET sock, const struct sockaddr *addr,
202
222
  goto failure;
203
223
  }
204
224
 
205
- if (bind(sock, addr, (int)addr_len) == SOCKET_ERROR) {
225
+ if (bind(sock, (const struct sockaddr *)addr->addr, (int)addr->len) ==
226
+ SOCKET_ERROR) {
206
227
  error = GRPC_WSA_ERROR(WSAGetLastError(), "bind");
207
228
  goto failure;
208
229
  }
@@ -212,20 +233,21 @@ static grpc_error *prepare_socket(SOCKET sock, const struct sockaddr *addr,
212
233
  goto failure;
213
234
  }
214
235
 
215
- sockname_len = sizeof(sockname_temp);
216
- if (getsockname(sock, (struct sockaddr *)&sockname_temp, &sockname_len) ==
217
- SOCKET_ERROR) {
236
+ int sockname_temp_len = sizeof(struct sockaddr_storage);
237
+ if (getsockname(sock, (struct sockaddr *)sockname_temp.addr,
238
+ &sockname_temp_len) == SOCKET_ERROR) {
218
239
  error = GRPC_WSA_ERROR(WSAGetLastError(), "getsockname");
219
240
  goto failure;
220
241
  }
242
+ sockname_temp.len = (size_t)sockname_temp_len;
221
243
 
222
- *port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
244
+ *port = grpc_sockaddr_get_port(&sockname_temp);
223
245
  return GRPC_ERROR_NONE;
224
246
 
225
247
  failure:
226
248
  GPR_ASSERT(error != GRPC_ERROR_NONE);
227
249
  char *tgtaddr = grpc_sockaddr_to_uri(addr);
228
- grpc_error *final_error = grpc_error_set_int(
250
+ grpc_error_set_int(
229
251
  grpc_error_set_str(GRPC_ERROR_CREATE_REFERENCING(
230
252
  "Failed to prepare server socket", &error, 1),
231
253
  GRPC_ERROR_STR_TARGET_ADDRESS, tgtaddr),
@@ -236,31 +258,29 @@ failure:
236
258
  return error;
237
259
  }
238
260
 
239
- static void decrement_active_ports_and_notify(grpc_exec_ctx *exec_ctx,
240
- grpc_tcp_listener *sp) {
241
- int notify = 0;
261
+ static void decrement_active_ports_and_notify_locked(grpc_exec_ctx *exec_ctx,
262
+ grpc_tcp_listener *sp) {
242
263
  sp->shutting_down = 0;
243
- gpr_mu_lock(&sp->server->mu);
244
264
  GPR_ASSERT(sp->server->active_ports > 0);
245
265
  if (0 == --sp->server->active_ports) {
246
- notify = 1;
247
- }
248
- gpr_mu_unlock(&sp->server->mu);
249
- if (notify) {
250
- finish_shutdown(exec_ctx, sp->server);
266
+ finish_shutdown_locked(exec_ctx, sp->server);
251
267
  }
252
268
  }
253
269
 
254
270
  /* In order to do an async accept, we need to create a socket first which
255
271
  will be the one assigned to the new incoming connection. */
256
- static grpc_error *start_accept(grpc_exec_ctx *exec_ctx,
257
- grpc_tcp_listener *port) {
272
+ static grpc_error *start_accept_locked(grpc_exec_ctx *exec_ctx,
273
+ grpc_tcp_listener *port) {
258
274
  SOCKET sock = INVALID_SOCKET;
259
275
  BOOL success;
260
276
  DWORD addrlen = sizeof(struct sockaddr_in6) + 16;
261
277
  DWORD bytes_received = 0;
262
278
  grpc_error *error = GRPC_ERROR_NONE;
263
279
 
280
+ if (port->shutting_down) {
281
+ return GRPC_ERROR_NONE;
282
+ }
283
+
264
284
  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
265
285
  WSA_FLAG_OVERLAPPED);
266
286
  if (sock == INVALID_SOCKET) {
@@ -290,20 +310,11 @@ static grpc_error *start_accept(grpc_exec_ctx *exec_ctx,
290
310
  immediately process an accept that happened in the meantime. */
291
311
  port->new_socket = sock;
292
312
  grpc_socket_notify_on_read(exec_ctx, port->socket, &port->on_accept);
313
+ port->outstanding_calls++;
293
314
  return error;
294
315
 
295
316
  failure:
296
317
  GPR_ASSERT(error != GRPC_ERROR_NONE);
297
- if (port->shutting_down) {
298
- /* We are abandoning the listener port, take that into account to prevent
299
- occasional hangs on shutdown. The hang happens when sp->shutting_down
300
- change is not seen by on_accept and we proceed to trying new accept,
301
- but we fail there because the listening port has been closed in the
302
- meantime. */
303
- decrement_active_ports_and_notify(exec_ctx, port);
304
- GRPC_ERROR_UNREF(error);
305
- return GRPC_ERROR_NONE;
306
- }
307
318
  if (sock != INVALID_SOCKET) closesocket(sock);
308
319
  return error;
309
320
  }
@@ -311,19 +322,21 @@ failure:
311
322
  /* Event manager callback when reads are ready. */
312
323
  static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
313
324
  grpc_tcp_listener *sp = arg;
314
- grpc_tcp_server_acceptor acceptor = {sp->server, sp->port_index, 0};
315
325
  SOCKET sock = sp->new_socket;
316
326
  grpc_winsocket_callback_info *info = &sp->socket->read_info;
317
327
  grpc_endpoint *ep = NULL;
318
- struct sockaddr_storage peer_name;
328
+ grpc_resolved_address peer_name;
319
329
  char *peer_name_string;
320
330
  char *fd_name;
321
- int peer_name_len = sizeof(peer_name);
322
331
  DWORD transfered_bytes;
323
332
  DWORD flags;
324
333
  BOOL wsa_success;
325
334
  int err;
326
335
 
336
+ gpr_mu_lock(&sp->server->mu);
337
+
338
+ peer_name.len = sizeof(struct sockaddr_storage);
339
+
327
340
  /* The general mechanism for shutting down is to queue abortion calls. While
328
341
  this is necessary in the read/write case, it's useless for the accept
329
342
  case. We only need to adjust the pending callback count */
@@ -331,6 +344,7 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
331
344
  const char *msg = grpc_error_string(error);
332
345
  gpr_log(GPR_INFO, "Skipping on_accept due to error: %s", msg);
333
346
  grpc_error_free_string(msg);
347
+ gpr_mu_unlock(&sp->server->mu);
334
348
  return;
335
349
  }
336
350
 
@@ -340,17 +354,12 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
340
354
  wsa_success = WSAGetOverlappedResult(sock, &info->overlapped,
341
355
  &transfered_bytes, FALSE, &flags);
342
356
  if (!wsa_success) {
343
- if (sp->shutting_down) {
344
- /* During the shutdown case, we ARE expecting an error. So that's well,
345
- and we can wake up the shutdown thread. */
346
- decrement_active_ports_and_notify(exec_ctx, sp);
347
- return;
348
- } else {
357
+ if (!sp->shutting_down) {
349
358
  char *utf8_message = gpr_format_message(WSAGetLastError());
350
359
  gpr_log(GPR_ERROR, "on_accept error: %s", utf8_message);
351
360
  gpr_free(utf8_message);
352
- closesocket(sock);
353
361
  }
362
+ closesocket(sock);
354
363
  } else {
355
364
  if (!sp->shutting_down) {
356
365
  peer_name_string = NULL;
@@ -361,9 +370,12 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
361
370
  gpr_log(GPR_ERROR, "setsockopt error: %s", utf8_message);
362
371
  gpr_free(utf8_message);
363
372
  }
364
- err = getpeername(sock, (struct sockaddr *)&peer_name, &peer_name_len);
373
+ int peer_name_len = (int)peer_name.len;
374
+ err =
375
+ getpeername(sock, (struct sockaddr *)peer_name.addr, &peer_name_len);
376
+ peer_name.len = (size_t)peer_name_len;
365
377
  if (!err) {
366
- peer_name_string = grpc_sockaddr_to_uri((struct sockaddr *)&peer_name);
378
+ peer_name_string = grpc_sockaddr_to_uri(&peer_name);
367
379
  } else {
368
380
  char *utf8_message = gpr_format_message(WSAGetLastError());
369
381
  gpr_log(GPR_ERROR, "getpeername error: %s", utf8_message);
@@ -371,7 +383,7 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
371
383
  }
372
384
  gpr_asprintf(&fd_name, "tcp_server:%s", peer_name_string);
373
385
  ep = grpc_tcp_create(grpc_winsocket_create(sock, fd_name),
374
- peer_name_string);
386
+ sp->server->resource_quota, peer_name_string);
375
387
  gpr_free(fd_name);
376
388
  gpr_free(peer_name_string);
377
389
  } else {
@@ -382,19 +394,29 @@ static void on_accept(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
382
394
  /* The only time we should call our callback, is where we successfully
383
395
  managed to accept a connection, and created an endpoint. */
384
396
  if (ep) {
397
+ // Create acceptor.
398
+ grpc_tcp_server_acceptor *acceptor = gpr_malloc(sizeof(*acceptor));
399
+ acceptor->from_server = sp->server;
400
+ acceptor->port_index = sp->port_index;
401
+ acceptor->fd_index = 0;
385
402
  sp->server->on_accept_cb(exec_ctx, sp->server->on_accept_cb_arg, ep, NULL,
386
- &acceptor);
403
+ acceptor);
387
404
  }
388
405
  /* As we were notified from the IOCP of one and exactly one accept,
389
406
  the former socked we created has now either been destroy or assigned
390
407
  to the new connection. We need to create a new one for the next
391
408
  connection. */
392
- GPR_ASSERT(GRPC_LOG_IF_ERROR("start_accept", start_accept(exec_ctx, sp)));
409
+ GPR_ASSERT(
410
+ GRPC_LOG_IF_ERROR("start_accept", start_accept_locked(exec_ctx, sp)));
411
+ if (0 == --sp->outstanding_calls) {
412
+ decrement_active_ports_and_notify_locked(exec_ctx, sp);
413
+ }
414
+ gpr_mu_unlock(&sp->server->mu);
393
415
  }
394
416
 
395
417
  static grpc_error *add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
396
- const struct sockaddr *addr,
397
- size_t addr_len, unsigned port_index,
418
+ const grpc_resolved_address *addr,
419
+ unsigned port_index,
398
420
  grpc_tcp_listener **listener) {
399
421
  grpc_tcp_listener *sp = NULL;
400
422
  int port = -1;
@@ -418,7 +440,7 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
418
440
  return NULL;
419
441
  }
420
442
 
421
- error = prepare_socket(sock, addr, addr_len, &port);
443
+ error = prepare_socket(sock, addr, &port);
422
444
  if (error != GRPC_ERROR_NONE) {
423
445
  return error;
424
446
  }
@@ -437,11 +459,12 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
437
459
  sp->server = s;
438
460
  sp->socket = grpc_winsocket_create(sock, "listener");
439
461
  sp->shutting_down = 0;
462
+ sp->outstanding_calls = 0;
440
463
  sp->AcceptEx = AcceptEx;
441
464
  sp->new_socket = INVALID_SOCKET;
442
465
  sp->port = port;
443
466
  sp->port_index = port_index;
444
- grpc_closure_init(&sp->on_accept, on_accept, sp);
467
+ grpc_closure_init(&sp->on_accept, on_accept, sp, grpc_schedule_on_exec_ctx);
445
468
  GPR_ASSERT(sp->socket);
446
469
  gpr_mu_unlock(&s->mu);
447
470
  *listener = sp;
@@ -449,15 +472,15 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
449
472
  return GRPC_ERROR_NONE;
450
473
  }
451
474
 
452
- grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
453
- size_t addr_len, int *port) {
475
+ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s,
476
+ const grpc_resolved_address *addr,
477
+ int *port) {
454
478
  grpc_tcp_listener *sp = NULL;
455
479
  SOCKET sock;
456
- struct sockaddr_in6 addr6_v4mapped;
457
- struct sockaddr_in6 wildcard;
458
- struct sockaddr *allocated_addr = NULL;
459
- struct sockaddr_storage sockname_temp;
460
- socklen_t sockname_len;
480
+ grpc_resolved_address addr6_v4mapped;
481
+ grpc_resolved_address wildcard;
482
+ grpc_resolved_address *allocated_addr = NULL;
483
+ grpc_resolved_address sockname_temp;
461
484
  unsigned port_index = 0;
462
485
  grpc_error *error = GRPC_ERROR_NONE;
463
486
 
@@ -469,13 +492,15 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
469
492
  as some previously created listener. */
470
493
  if (grpc_sockaddr_get_port(addr) == 0) {
471
494
  for (sp = s->head; sp; sp = sp->next) {
472
- sockname_len = sizeof(sockname_temp);
495
+ int sockname_temp_len = sizeof(struct sockaddr_storage);
473
496
  if (0 == getsockname(sp->socket->socket,
474
- (struct sockaddr *)&sockname_temp, &sockname_len)) {
475
- *port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
497
+ (struct sockaddr *)sockname_temp.addr,
498
+ &sockname_temp_len)) {
499
+ sockname_temp.len = (size_t)sockname_temp_len;
500
+ *port = grpc_sockaddr_get_port(&sockname_temp);
476
501
  if (*port > 0) {
477
- allocated_addr = gpr_malloc(addr_len);
478
- memcpy(allocated_addr, addr, addr_len);
502
+ allocated_addr = gpr_malloc(sizeof(grpc_resolved_address));
503
+ memcpy(allocated_addr, addr, sizeof(grpc_resolved_address));
479
504
  grpc_sockaddr_set_port(allocated_addr, *port);
480
505
  addr = allocated_addr;
481
506
  break;
@@ -485,16 +510,14 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
485
510
  }
486
511
 
487
512
  if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
488
- addr = (const struct sockaddr *)&addr6_v4mapped;
489
- addr_len = sizeof(addr6_v4mapped);
513
+ addr = &addr6_v4mapped;
490
514
  }
491
515
 
492
516
  /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
493
517
  if (grpc_sockaddr_is_wildcard(addr, port)) {
494
518
  grpc_sockaddr_make_wildcard6(*port, &wildcard);
495
519
 
496
- addr = (struct sockaddr *)&wildcard;
497
- addr_len = sizeof(wildcard);
520
+ addr = &wildcard;
498
521
  }
499
522
 
500
523
  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
@@ -504,7 +527,7 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
504
527
  goto done;
505
528
  }
506
529
 
507
- error = add_socket_to_server(s, sock, addr, addr_len, port_index, &sp);
530
+ error = add_socket_to_server(s, sock, addr, port_index, &sp);
508
531
 
509
532
  done:
510
533
  gpr_free(allocated_addr);
@@ -534,10 +557,14 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s,
534
557
  s->on_accept_cb = on_accept_cb;
535
558
  s->on_accept_cb_arg = on_accept_cb_arg;
536
559
  for (sp = s->head; sp; sp = sp->next) {
537
- GPR_ASSERT(GRPC_LOG_IF_ERROR("start_accept", start_accept(exec_ctx, sp)));
560
+ GPR_ASSERT(
561
+ GRPC_LOG_IF_ERROR("start_accept", start_accept_locked(exec_ctx, sp)));
538
562
  s->active_ports++;
539
563
  }
540
564
  gpr_mu_unlock(&s->mu);
541
565
  }
542
566
 
543
- #endif /* GPR_WINSOCK_SOCKET */
567
+ void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx,
568
+ grpc_tcp_server *s) {}
569
+
570
+ #endif /* GRPC_WINSOCK_SOCKET */