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
@@ -53,8 +53,8 @@ extern int grpc_tcp_trace;
53
53
 
54
54
  /* Create a tcp endpoint given a file desciptor and a read slice size.
55
55
  Takes ownership of fd. */
56
- grpc_endpoint *grpc_tcp_create(grpc_fd *fd, size_t read_slice_size,
57
- const char *peer_string);
56
+ grpc_endpoint *grpc_tcp_create(grpc_fd *fd, grpc_resource_quota *resource_quota,
57
+ size_t read_slice_size, const char *peer_string);
58
58
 
59
59
  /* Return the tcp endpoint's fd, or -1 if this is not available. Does not
60
60
  release the fd.
@@ -38,6 +38,7 @@
38
38
 
39
39
  #include "src/core/lib/iomgr/closure.h"
40
40
  #include "src/core/lib/iomgr/endpoint.h"
41
+ #include "src/core/lib/iomgr/resolve_address.h"
41
42
 
42
43
  /* Forward decl of grpc_tcp_server */
43
44
  typedef struct grpc_tcp_server grpc_tcp_server;
@@ -51,7 +52,8 @@ typedef struct grpc_tcp_server_acceptor {
51
52
  unsigned fd_index;
52
53
  } grpc_tcp_server_acceptor;
53
54
 
54
- /* Called for newly connected TCP connections. */
55
+ /* Called for newly connected TCP connections.
56
+ Takes ownership of acceptor. */
55
57
  typedef void (*grpc_tcp_server_cb)(grpc_exec_ctx *exec_ctx, void *arg,
56
58
  grpc_endpoint *ep,
57
59
  grpc_pollset *accepting_pollset,
@@ -60,7 +62,8 @@ typedef void (*grpc_tcp_server_cb)(grpc_exec_ctx *exec_ctx, void *arg,
60
62
  /* Create a server, initially not bound to any ports. The caller owns one ref.
61
63
  If shutdown_complete is not NULL, it will be used by
62
64
  grpc_tcp_server_unref() when the ref count reaches zero. */
63
- grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete,
65
+ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx,
66
+ grpc_closure *shutdown_complete,
64
67
  const grpc_channel_args *args,
65
68
  grpc_tcp_server **server);
66
69
 
@@ -78,8 +81,9 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *server,
78
81
  but not dualstack sockets. */
79
82
  /* TODO(ctiller): deprecate this, and make grpc_tcp_server_add_ports to handle
80
83
  all of the multiple socket port matching logic in one place */
81
- grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
82
- size_t addr_len, int *out_port);
84
+ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s,
85
+ const grpc_resolved_address *addr,
86
+ int *out_port);
83
87
 
84
88
  /* Number of fds at the given port_index, or 0 if port_index is out of
85
89
  bounds. */
@@ -101,8 +105,12 @@ grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s);
101
105
  void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s,
102
106
  grpc_closure *shutdown_starting);
103
107
 
104
- /* If the refcount drops to zero, delete s, and call (exec_ctx==NULL) or enqueue
105
- a call (exec_ctx!=NULL) to shutdown_complete. */
108
+ /* If the refcount drops to zero, enqueue calls on exec_ctx to
109
+ shutdown_listeners and delete s. */
106
110
  void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s);
107
111
 
112
+ /* Shutdown the fds of listeners. */
113
+ void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx,
114
+ grpc_tcp_server *s);
115
+
108
116
  #endif /* GRPC_CORE_LIB_IOMGR_TCP_SERVER_H */
@@ -36,9 +36,9 @@
36
36
  #define _GNU_SOURCE
37
37
  #endif
38
38
 
39
- #include <grpc/support/port_platform.h>
39
+ #include "src/core/lib/iomgr/port.h"
40
40
 
41
- #ifdef GPR_POSIX_SOCKET
41
+ #ifdef GRPC_POSIX_SOCKET
42
42
 
43
43
  #include "src/core/lib/iomgr/tcp_server.h"
44
44
 
@@ -62,6 +62,7 @@
62
62
  #include <grpc/support/useful.h>
63
63
 
64
64
  #include "src/core/lib/iomgr/resolve_address.h"
65
+ #include "src/core/lib/iomgr/sockaddr.h"
65
66
  #include "src/core/lib/iomgr/sockaddr_utils.h"
66
67
  #include "src/core/lib/iomgr/socket_utils_posix.h"
67
68
  #include "src/core/lib/iomgr/tcp_posix.h"
@@ -79,21 +80,19 @@ struct grpc_tcp_listener {
79
80
  int fd;
80
81
  grpc_fd *emfd;
81
82
  grpc_tcp_server *server;
82
- union {
83
- uint8_t untyped[GRPC_MAX_SOCKADDR_SIZE];
84
- struct sockaddr sockaddr;
85
- } addr;
86
- size_t addr_len;
83
+ grpc_resolved_address addr;
87
84
  int port;
88
85
  unsigned port_index;
89
86
  unsigned fd_index;
90
87
  grpc_closure read_closure;
91
88
  grpc_closure destroyed_closure;
92
89
  struct grpc_tcp_listener *next;
93
- /* When we add a listener, more than one can be created, mainly because of
94
- IPv6. A sibling will still be in the normal list, but will be flagged
95
- as such. Any action, such as ref or unref, will affect all of the
96
- siblings in the list. */
90
+ /* sibling is a linked list of all listeners for a given port. add_port and
91
+ clone_port place all new listeners in the same sibling list. A member of
92
+ the 'sibling' list is also a member of the 'next' list. The head of each
93
+ sibling list has is_sibling==0, and subsequent members of sibling lists
94
+ have is_sibling==1. is_sibling allows separate sibling lists to be
95
+ identified while iterating through 'next'. */
97
96
  struct grpc_tcp_listener *sibling;
98
97
  int is_sibling;
99
98
  };
@@ -135,6 +134,8 @@ struct grpc_tcp_server {
135
134
 
136
135
  /* next pollset to assign a channel to */
137
136
  gpr_atm next_pollset_to_assign;
137
+
138
+ grpc_resource_quota *resource_quota;
138
139
  };
139
140
 
140
141
  static gpr_once check_init = GPR_ONCE_INIT;
@@ -151,23 +152,37 @@ static void init(void) {
151
152
  #endif
152
153
  }
153
154
 
154
- grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete,
155
+ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx,
156
+ grpc_closure *shutdown_complete,
155
157
  const grpc_channel_args *args,
156
158
  grpc_tcp_server **server) {
157
159
  gpr_once_init(&check_init, init);
158
160
 
159
161
  grpc_tcp_server *s = gpr_malloc(sizeof(grpc_tcp_server));
160
162
  s->so_reuseport = has_so_reuseport;
163
+ s->resource_quota = grpc_resource_quota_create(NULL);
161
164
  for (size_t i = 0; i < (args == NULL ? 0 : args->num_args); i++) {
162
165
  if (0 == strcmp(GRPC_ARG_ALLOW_REUSEPORT, args->args[i].key)) {
163
166
  if (args->args[i].type == GRPC_ARG_INTEGER) {
164
167
  s->so_reuseport =
165
168
  has_so_reuseport && (args->args[i].value.integer != 0);
166
169
  } else {
170
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
167
171
  gpr_free(s);
168
172
  return GRPC_ERROR_CREATE(GRPC_ARG_ALLOW_REUSEPORT
169
173
  " must be an integer");
170
174
  }
175
+ } else if (0 == strcmp(GRPC_ARG_RESOURCE_QUOTA, args->args[i].key)) {
176
+ if (args->args[i].type == GRPC_ARG_POINTER) {
177
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
178
+ s->resource_quota =
179
+ grpc_resource_quota_ref_internal(args->args[i].value.pointer.p);
180
+ } else {
181
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
182
+ gpr_free(s);
183
+ return GRPC_ERROR_CREATE(GRPC_ARG_RESOURCE_QUOTA
184
+ " must be a pointer to a buffer pool");
185
+ }
171
186
  }
172
187
  }
173
188
  gpr_ref_init(&s->refs, 1);
@@ -189,8 +204,11 @@ grpc_error *grpc_tcp_server_create(grpc_closure *shutdown_complete,
189
204
  }
190
205
 
191
206
  static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
207
+ gpr_mu_lock(&s->mu);
208
+ GPR_ASSERT(s->shutdown);
209
+ gpr_mu_unlock(&s->mu);
192
210
  if (s->shutdown_complete != NULL) {
193
- grpc_exec_ctx_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE, NULL);
211
+ grpc_closure_sched(exec_ctx, s->shutdown_complete, GRPC_ERROR_NONE);
194
212
  }
195
213
 
196
214
  gpr_mu_destroy(&s->mu);
@@ -201,6 +219,8 @@ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
201
219
  gpr_free(sp);
202
220
  }
203
221
 
222
+ grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota);
223
+
204
224
  gpr_free(s);
205
225
  }
206
226
 
@@ -233,9 +253,9 @@ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
233
253
  if (s->head) {
234
254
  grpc_tcp_listener *sp;
235
255
  for (sp = s->head; sp; sp = sp->next) {
236
- grpc_unlink_if_unix_domain_socket(&sp->addr.sockaddr);
237
- sp->destroyed_closure.cb = destroyed_port;
238
- sp->destroyed_closure.cb_arg = s;
256
+ grpc_unlink_if_unix_domain_socket(&sp->addr);
257
+ grpc_closure_init(&sp->destroyed_closure, destroyed_port, s,
258
+ grpc_schedule_on_exec_ctx);
239
259
  grpc_fd_orphan(exec_ctx, sp->emfd, &sp->destroyed_closure, NULL,
240
260
  "tcp_listener_shutdown");
241
261
  }
@@ -299,16 +319,14 @@ static int get_max_accept_queue_size(void) {
299
319
  }
300
320
 
301
321
  /* Prepare a recently-created socket for listening. */
302
- static grpc_error *prepare_socket(int fd, const struct sockaddr *addr,
303
- size_t addr_len, bool so_reuseport,
304
- int *port) {
305
- struct sockaddr_storage sockname_temp;
306
- socklen_t sockname_len;
322
+ static grpc_error *prepare_socket(int fd, const grpc_resolved_address *addr,
323
+ bool so_reuseport, int *port) {
324
+ grpc_resolved_address sockname_temp;
307
325
  grpc_error *err = GRPC_ERROR_NONE;
308
326
 
309
327
  GPR_ASSERT(fd >= 0);
310
328
 
311
- if (so_reuseport) {
329
+ if (so_reuseport && !grpc_is_unix_socket(addr)) {
312
330
  err = grpc_set_socket_reuse_port(fd, 1);
313
331
  if (err != GRPC_ERROR_NONE) goto error;
314
332
  }
@@ -326,8 +344,8 @@ static grpc_error *prepare_socket(int fd, const struct sockaddr *addr,
326
344
  err = grpc_set_socket_no_sigpipe_if_possible(fd);
327
345
  if (err != GRPC_ERROR_NONE) goto error;
328
346
 
329
- GPR_ASSERT(addr_len < ~(socklen_t)0);
330
- if (bind(fd, addr, (socklen_t)addr_len) < 0) {
347
+ GPR_ASSERT(addr->len < ~(socklen_t)0);
348
+ if (bind(fd, (struct sockaddr *)addr->addr, (socklen_t)addr->len) < 0) {
331
349
  err = GRPC_OS_ERROR(errno, "bind");
332
350
  goto error;
333
351
  }
@@ -337,13 +355,15 @@ static grpc_error *prepare_socket(int fd, const struct sockaddr *addr,
337
355
  goto error;
338
356
  }
339
357
 
340
- sockname_len = sizeof(sockname_temp);
341
- if (getsockname(fd, (struct sockaddr *)&sockname_temp, &sockname_len) < 0) {
358
+ sockname_temp.len = sizeof(struct sockaddr_storage);
359
+
360
+ if (getsockname(fd, (struct sockaddr *)sockname_temp.addr,
361
+ (socklen_t *)&sockname_temp.len) < 0) {
342
362
  err = GRPC_OS_ERROR(errno, "getsockname");
343
363
  goto error;
344
364
  }
345
365
 
346
- *port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
366
+ *port = grpc_sockaddr_get_port(&sockname_temp);
347
367
  return GRPC_ERROR_NONE;
348
368
 
349
369
  error:
@@ -361,29 +381,25 @@ error:
361
381
  /* event manager callback when reads are ready */
362
382
  static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) {
363
383
  grpc_tcp_listener *sp = arg;
364
- grpc_tcp_server_acceptor acceptor = {sp->server, sp->port_index,
365
- sp->fd_index};
366
- grpc_pollset *read_notifier_pollset = NULL;
367
- grpc_fd *fdobj;
368
384
 
369
385
  if (err != GRPC_ERROR_NONE) {
370
386
  goto error;
371
387
  }
372
388
 
373
- read_notifier_pollset =
389
+ grpc_pollset *read_notifier_pollset =
374
390
  sp->server->pollsets[(size_t)gpr_atm_no_barrier_fetch_add(
375
391
  &sp->server->next_pollset_to_assign, 1) %
376
392
  sp->server->pollset_count];
377
393
 
378
394
  /* loop until accept4 returns EAGAIN, and then re-arm notification */
379
395
  for (;;) {
380
- struct sockaddr_storage addr;
381
- socklen_t addrlen = sizeof(addr);
396
+ grpc_resolved_address addr;
382
397
  char *addr_str;
383
398
  char *name;
399
+ addr.len = sizeof(struct sockaddr_storage);
384
400
  /* Note: If we ever decide to return this address to the user, remember to
385
401
  strip off the ::ffff:0.0.0.0/96 prefix first. */
386
- int fd = grpc_accept4(sp->fd, (struct sockaddr *)&addr, &addrlen, 1, 1);
402
+ int fd = grpc_accept4(sp->fd, &addr, 1, 1);
387
403
  if (fd < 0) {
388
404
  switch (errno) {
389
405
  case EINTR:
@@ -399,14 +415,14 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) {
399
415
 
400
416
  grpc_set_socket_no_sigpipe_if_possible(fd);
401
417
 
402
- addr_str = grpc_sockaddr_to_uri((struct sockaddr *)&addr);
418
+ addr_str = grpc_sockaddr_to_uri(&addr);
403
419
  gpr_asprintf(&name, "tcp-server-connection:%s", addr_str);
404
420
 
405
421
  if (grpc_tcp_trace) {
406
422
  gpr_log(GPR_DEBUG, "SERVER_CONNECT: incoming connection: %s", addr_str);
407
423
  }
408
424
 
409
- fdobj = grpc_fd_create(fd, name);
425
+ grpc_fd *fdobj = grpc_fd_create(fd, name);
410
426
 
411
427
  if (read_notifier_pollset == NULL) {
412
428
  gpr_log(GPR_ERROR, "Read notifier pollset is not set on the fd");
@@ -415,10 +431,17 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) {
415
431
 
416
432
  grpc_pollset_add_fd(exec_ctx, read_notifier_pollset, fdobj);
417
433
 
434
+ // Create acceptor.
435
+ grpc_tcp_server_acceptor *acceptor = gpr_malloc(sizeof(*acceptor));
436
+ acceptor->from_server = sp->server;
437
+ acceptor->port_index = sp->port_index;
438
+ acceptor->fd_index = sp->fd_index;
439
+
418
440
  sp->server->on_accept_cb(
419
441
  exec_ctx, sp->server->on_accept_cb_arg,
420
- grpc_tcp_create(fdobj, GRPC_TCP_DEFAULT_READ_SLICE_SIZE, addr_str),
421
- read_notifier_pollset, &acceptor);
442
+ grpc_tcp_create(fdobj, sp->server->resource_quota,
443
+ GRPC_TCP_DEFAULT_READ_SLICE_SIZE, addr_str),
444
+ read_notifier_pollset, acceptor);
422
445
 
423
446
  gpr_free(name);
424
447
  gpr_free(addr_str);
@@ -437,19 +460,18 @@ error:
437
460
  }
438
461
 
439
462
  static grpc_error *add_socket_to_server(grpc_tcp_server *s, int fd,
440
- const struct sockaddr *addr,
441
- size_t addr_len, unsigned port_index,
442
- unsigned fd_index,
463
+ const grpc_resolved_address *addr,
464
+ unsigned port_index, unsigned fd_index,
443
465
  grpc_tcp_listener **listener) {
444
466
  grpc_tcp_listener *sp = NULL;
445
467
  int port = -1;
446
468
  char *addr_str;
447
469
  char *name;
448
470
 
449
- grpc_error *err = prepare_socket(fd, addr, addr_len, s->so_reuseport, &port);
471
+ grpc_error *err = prepare_socket(fd, addr, s->so_reuseport, &port);
450
472
  if (err == GRPC_ERROR_NONE) {
451
473
  GPR_ASSERT(port > 0);
452
- grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1);
474
+ grpc_sockaddr_to_string(&addr_str, addr, 1);
453
475
  gpr_asprintf(&name, "tcp-server-listener:%s", addr_str);
454
476
  gpr_mu_lock(&s->mu);
455
477
  s->nports++;
@@ -465,8 +487,7 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, int fd,
465
487
  sp->server = s;
466
488
  sp->fd = fd;
467
489
  sp->emfd = grpc_fd_create(fd, name);
468
- memcpy(sp->addr.untyped, addr, addr_len);
469
- sp->addr_len = addr_len;
490
+ memcpy(&sp->addr, addr, sizeof(grpc_resolved_address));
470
491
  sp->port = port;
471
492
  sp->port_index = port_index;
472
493
  sp->fd_index = fd_index;
@@ -482,6 +503,9 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, int fd,
482
503
  return err;
483
504
  }
484
505
 
506
+ /* Insert count new listeners after listener. Every new listener will have the
507
+ same listen address as listener (SO_REUSEPORT must be enabled). Every new
508
+ listener is a sibling of listener. */
485
509
  static grpc_error *clone_port(grpc_tcp_listener *listener, unsigned count) {
486
510
  grpc_tcp_listener *sp = NULL;
487
511
  char *addr_str;
@@ -496,28 +520,29 @@ static grpc_error *clone_port(grpc_tcp_listener *listener, unsigned count) {
496
520
  int fd = -1;
497
521
  int port = -1;
498
522
  grpc_dualstack_mode dsmode;
499
- err = grpc_create_dualstack_socket(&listener->addr.sockaddr, SOCK_STREAM, 0,
500
- &dsmode, &fd);
523
+ err = grpc_create_dualstack_socket(&listener->addr, SOCK_STREAM, 0, &dsmode,
524
+ &fd);
501
525
  if (err != GRPC_ERROR_NONE) return err;
502
- err = prepare_socket(fd, &listener->addr.sockaddr, listener->addr_len, true,
503
- &port);
526
+ err = prepare_socket(fd, &listener->addr, true, &port);
504
527
  if (err != GRPC_ERROR_NONE) return err;
505
528
  listener->server->nports++;
506
- grpc_sockaddr_to_string(&addr_str, &listener->addr.sockaddr, 1);
529
+ grpc_sockaddr_to_string(&addr_str, &listener->addr, 1);
507
530
  gpr_asprintf(&name, "tcp-server-listener:%s/clone-%d", addr_str, i);
508
531
  sp = gpr_malloc(sizeof(grpc_tcp_listener));
509
532
  sp->next = listener->next;
510
533
  listener->next = sp;
534
+ /* sp (the new listener) is a sibling of 'listener' (the original
535
+ listener). */
536
+ sp->is_sibling = 1;
537
+ sp->sibling = listener->sibling;
538
+ listener->sibling = sp;
511
539
  sp->server = listener->server;
512
540
  sp->fd = fd;
513
541
  sp->emfd = grpc_fd_create(fd, name);
514
- memcpy(sp->addr.untyped, listener->addr.untyped, listener->addr_len);
515
- sp->addr_len = listener->addr_len;
542
+ memcpy(&sp->addr, &listener->addr, sizeof(grpc_resolved_address));
516
543
  sp->port = port;
517
544
  sp->port_index = listener->port_index;
518
545
  sp->fd_index = listener->fd_index + count - i;
519
- sp->is_sibling = 1;
520
- sp->sibling = listener->is_sibling ? listener->sibling : listener;
521
546
  GPR_ASSERT(sp->emfd);
522
547
  while (listener->server->tail->next != NULL) {
523
548
  listener->server->tail = listener->server->tail->next;
@@ -529,19 +554,19 @@ static grpc_error *clone_port(grpc_tcp_listener *listener, unsigned count) {
529
554
  return GRPC_ERROR_NONE;
530
555
  }
531
556
 
532
- grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
533
- size_t addr_len, int *out_port) {
557
+ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s,
558
+ const grpc_resolved_address *addr,
559
+ int *out_port) {
534
560
  grpc_tcp_listener *sp;
535
561
  grpc_tcp_listener *sp2 = NULL;
536
562
  int fd;
537
563
  grpc_dualstack_mode dsmode;
538
- struct sockaddr_in6 addr6_v4mapped;
539
- struct sockaddr_in wild4;
540
- struct sockaddr_in6 wild6;
541
- struct sockaddr_in addr4_copy;
542
- struct sockaddr *allocated_addr = NULL;
543
- struct sockaddr_storage sockname_temp;
544
- socklen_t sockname_len;
564
+ grpc_resolved_address addr6_v4mapped;
565
+ grpc_resolved_address wild4;
566
+ grpc_resolved_address wild6;
567
+ grpc_resolved_address addr4_copy;
568
+ grpc_resolved_address *allocated_addr = NULL;
569
+ grpc_resolved_address sockname_temp;
545
570
  int port;
546
571
  unsigned port_index = 0;
547
572
  unsigned fd_index = 0;
@@ -549,19 +574,19 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
549
574
  if (s->tail != NULL) {
550
575
  port_index = s->tail->port_index + 1;
551
576
  }
552
- grpc_unlink_if_unix_domain_socket((struct sockaddr *)addr);
577
+ grpc_unlink_if_unix_domain_socket(addr);
553
578
 
554
579
  /* Check if this is a wildcard port, and if so, try to keep the port the same
555
580
  as some previously created listener. */
556
581
  if (grpc_sockaddr_get_port(addr) == 0) {
557
582
  for (sp = s->head; sp; sp = sp->next) {
558
- sockname_len = sizeof(sockname_temp);
559
- if (0 == getsockname(sp->fd, (struct sockaddr *)&sockname_temp,
560
- &sockname_len)) {
561
- port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
583
+ sockname_temp.len = sizeof(struct sockaddr_storage);
584
+ if (0 == getsockname(sp->fd, (struct sockaddr *)sockname_temp.addr,
585
+ (socklen_t *)&sockname_temp.len)) {
586
+ port = grpc_sockaddr_get_port(&sockname_temp);
562
587
  if (port > 0) {
563
- allocated_addr = gpr_malloc(addr_len);
564
- memcpy(allocated_addr, addr, addr_len);
588
+ allocated_addr = gpr_malloc(sizeof(grpc_resolved_address));
589
+ memcpy(allocated_addr, addr, addr->len);
565
590
  grpc_sockaddr_set_port(allocated_addr, port);
566
591
  addr = allocated_addr;
567
592
  break;
@@ -573,8 +598,7 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
573
598
  sp = NULL;
574
599
 
575
600
  if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
576
- addr = (const struct sockaddr *)&addr6_v4mapped;
577
- addr_len = sizeof(addr6_v4mapped);
601
+ addr = &addr6_v4mapped;
578
602
  }
579
603
 
580
604
  /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
@@ -582,12 +606,10 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
582
606
  grpc_sockaddr_make_wildcards(port, &wild4, &wild6);
583
607
 
584
608
  /* Try listening on IPv6 first. */
585
- addr = (struct sockaddr *)&wild6;
586
- addr_len = sizeof(wild6);
609
+ addr = &wild6;
587
610
  errs[0] = grpc_create_dualstack_socket(addr, SOCK_STREAM, 0, &dsmode, &fd);
588
611
  if (errs[0] == GRPC_ERROR_NONE) {
589
- errs[0] = add_socket_to_server(s, fd, addr, addr_len, port_index,
590
- fd_index, &sp);
612
+ errs[0] = add_socket_to_server(s, fd, addr, port_index, fd_index, &sp);
591
613
  if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) {
592
614
  goto done;
593
615
  }
@@ -596,23 +618,20 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
596
618
  }
597
619
  /* If we didn't get a dualstack socket, also listen on 0.0.0.0. */
598
620
  if (port == 0 && sp != NULL) {
599
- grpc_sockaddr_set_port((struct sockaddr *)&wild4, sp->port);
621
+ grpc_sockaddr_set_port(&wild4, sp->port);
600
622
  }
601
623
  }
602
- addr = (struct sockaddr *)&wild4;
603
- addr_len = sizeof(wild4);
624
+ addr = &wild4;
604
625
  }
605
626
 
606
627
  errs[1] = grpc_create_dualstack_socket(addr, SOCK_STREAM, 0, &dsmode, &fd);
607
628
  if (errs[1] == GRPC_ERROR_NONE) {
608
629
  if (dsmode == GRPC_DSMODE_IPV4 &&
609
630
  grpc_sockaddr_is_v4mapped(addr, &addr4_copy)) {
610
- addr = (struct sockaddr *)&addr4_copy;
611
- addr_len = sizeof(addr4_copy);
631
+ addr = &addr4_copy;
612
632
  }
613
633
  sp2 = sp;
614
- errs[1] =
615
- add_socket_to_server(s, fd, addr, addr_len, port_index, fd_index, &sp);
634
+ errs[1] = add_socket_to_server(s, fd, addr, port_index, fd_index, &sp);
616
635
  if (sp2 != NULL && sp != NULL) {
617
636
  sp2->sibling = sp;
618
637
  sp->is_sibling = 1;
@@ -640,35 +659,46 @@ done:
640
659
  }
641
660
  }
642
661
 
643
- unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server *s,
644
- unsigned port_index) {
645
- unsigned num_fds = 0;
662
+ /* Return listener at port_index or NULL. Should only be called with s->mu
663
+ locked. */
664
+ static grpc_tcp_listener *get_port_index(grpc_tcp_server *s,
665
+ unsigned port_index) {
666
+ unsigned num_ports = 0;
646
667
  grpc_tcp_listener *sp;
647
- for (sp = s->head; sp && port_index != 0; sp = sp->next) {
668
+ for (sp = s->head; sp; sp = sp->next) {
648
669
  if (!sp->is_sibling) {
649
- --port_index;
670
+ if (++num_ports > port_index) {
671
+ return sp;
672
+ }
650
673
  }
651
674
  }
652
- for (; sp; sp = sp->sibling, ++num_fds)
653
- ;
675
+ return NULL;
676
+ }
677
+
678
+ unsigned grpc_tcp_server_port_fd_count(grpc_tcp_server *s,
679
+ unsigned port_index) {
680
+ unsigned num_fds = 0;
681
+ gpr_mu_lock(&s->mu);
682
+ grpc_tcp_listener *sp = get_port_index(s, port_index);
683
+ for (; sp; sp = sp->sibling) {
684
+ ++num_fds;
685
+ }
686
+ gpr_mu_unlock(&s->mu);
654
687
  return num_fds;
655
688
  }
656
689
 
657
690
  int grpc_tcp_server_port_fd(grpc_tcp_server *s, unsigned port_index,
658
691
  unsigned fd_index) {
659
- grpc_tcp_listener *sp;
660
- for (sp = s->head; sp && port_index != 0; sp = sp->next) {
661
- if (!sp->is_sibling) {
662
- --port_index;
692
+ gpr_mu_lock(&s->mu);
693
+ grpc_tcp_listener *sp = get_port_index(s, port_index);
694
+ for (; sp; sp = sp->sibling, --fd_index) {
695
+ if (fd_index == 0) {
696
+ gpr_mu_unlock(&s->mu);
697
+ return sp->fd;
663
698
  }
664
699
  }
665
- for (; sp && fd_index != 0; sp = sp->sibling, --fd_index)
666
- ;
667
- if (sp) {
668
- return sp->fd;
669
- } else {
670
- return -1;
671
- }
700
+ gpr_mu_unlock(&s->mu);
701
+ return -1;
672
702
  }
673
703
 
674
704
  void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s,
@@ -687,13 +717,14 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s,
687
717
  s->pollset_count = pollset_count;
688
718
  sp = s->head;
689
719
  while (sp != NULL) {
690
- if (s->so_reuseport && pollset_count > 1) {
720
+ if (s->so_reuseport && !grpc_is_unix_socket(&sp->addr) &&
721
+ pollset_count > 1) {
691
722
  GPR_ASSERT(GRPC_LOG_IF_ERROR(
692
723
  "clone_port", clone_port(sp, (unsigned)(pollset_count - 1))));
693
724
  for (i = 0; i < pollset_count; i++) {
694
725
  grpc_pollset_add_fd(exec_ctx, pollsets[i], sp->emfd);
695
- sp->read_closure.cb = on_read;
696
- sp->read_closure.cb_arg = sp;
726
+ grpc_closure_init(&sp->read_closure, on_read, sp,
727
+ grpc_schedule_on_exec_ctx);
697
728
  grpc_fd_notify_on_read(exec_ctx, sp->emfd, &sp->read_closure);
698
729
  s->active_ports++;
699
730
  sp = sp->next;
@@ -702,8 +733,8 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s,
702
733
  for (i = 0; i < pollset_count; i++) {
703
734
  grpc_pollset_add_fd(exec_ctx, pollsets[i], sp->emfd);
704
735
  }
705
- sp->read_closure.cb = on_read;
706
- sp->read_closure.cb_arg = sp;
736
+ grpc_closure_init(&sp->read_closure, on_read, sp,
737
+ grpc_schedule_on_exec_ctx);
707
738
  grpc_fd_notify_on_read(exec_ctx, sp->emfd, &sp->read_closure);
708
739
  s->active_ports++;
709
740
  sp = sp->next;
@@ -713,7 +744,7 @@ void grpc_tcp_server_start(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s,
713
744
  }
714
745
 
715
746
  grpc_tcp_server *grpc_tcp_server_ref(grpc_tcp_server *s) {
716
- gpr_ref(&s->refs);
747
+ gpr_ref_non_zero(&s->refs);
717
748
  return s;
718
749
  }
719
750
 
@@ -727,20 +758,25 @@ void grpc_tcp_server_shutdown_starting_add(grpc_tcp_server *s,
727
758
 
728
759
  void grpc_tcp_server_unref(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) {
729
760
  if (gpr_unref(&s->refs)) {
730
- /* Complete shutdown_starting work before destroying. */
731
- grpc_exec_ctx local_exec_ctx = GRPC_EXEC_CTX_INIT;
761
+ grpc_tcp_server_shutdown_listeners(exec_ctx, s);
732
762
  gpr_mu_lock(&s->mu);
733
- grpc_exec_ctx_enqueue_list(&local_exec_ctx, &s->shutdown_starting, NULL);
763
+ grpc_closure_list_sched(exec_ctx, &s->shutdown_starting);
734
764
  gpr_mu_unlock(&s->mu);
735
- if (exec_ctx == NULL) {
736
- grpc_exec_ctx_flush(&local_exec_ctx);
737
- tcp_server_destroy(&local_exec_ctx, s);
738
- grpc_exec_ctx_finish(&local_exec_ctx);
739
- } else {
740
- grpc_exec_ctx_finish(&local_exec_ctx);
741
- tcp_server_destroy(exec_ctx, s);
765
+ tcp_server_destroy(exec_ctx, s);
766
+ }
767
+ }
768
+
769
+ void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx,
770
+ grpc_tcp_server *s) {
771
+ gpr_mu_lock(&s->mu);
772
+ /* shutdown all fd's */
773
+ if (s->active_ports) {
774
+ grpc_tcp_listener *sp;
775
+ for (sp = s->head; sp; sp = sp->next) {
776
+ grpc_fd_shutdown(exec_ctx, sp->emfd);
742
777
  }
743
778
  }
779
+ gpr_mu_unlock(&s->mu);
744
780
  }
745
781
 
746
782
  #endif