grpc 1.47.0 → 1.48.0.pre1

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 (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -30,25 +30,36 @@
30
30
  #include "src/core/lib/resource_quota/memory_quota.h"
31
31
 
32
32
  typedef struct grpc_tcp_client_vtable {
33
- void (*connect)(grpc_closure* on_connect, grpc_endpoint** endpoint,
34
- grpc_pollset_set* interested_parties,
35
- const grpc_channel_args* channel_args,
36
- const grpc_resolved_address* addr,
37
- grpc_core::Timestamp deadline);
33
+ int64_t (*connect)(grpc_closure* on_connect, grpc_endpoint** endpoint,
34
+ grpc_pollset_set* interested_parties,
35
+ const grpc_channel_args* channel_args,
36
+ const grpc_resolved_address* addr,
37
+ grpc_core::Timestamp deadline);
38
+ bool (*cancel_connect)(int64_t connection_handle);
38
39
  } grpc_tcp_client_vtable;
39
40
 
40
41
  /* Asynchronously connect to an address (specified as (addr, len)), and call
41
42
  cb with arg and the completed connection when done (or call cb with arg and
42
43
  NULL on failure).
43
44
  interested_parties points to a set of pollsets that would be interested
44
- in this connection being established (in order to continue their work) */
45
- void grpc_tcp_client_connect(grpc_closure* on_connect, grpc_endpoint** endpoint,
46
- grpc_pollset_set* interested_parties,
47
- const grpc_channel_args* channel_args,
48
- const grpc_resolved_address* addr,
49
- grpc_core::Timestamp deadline);
50
-
51
- void grpc_tcp_client_global_init();
45
+ in this connection being established (in order to continue their work). It
46
+ returns a handle to the connect operation which can be used to cancel the
47
+ connection attempt. */
48
+ int64_t grpc_tcp_client_connect(grpc_closure* on_connect,
49
+ grpc_endpoint** endpoint,
50
+ grpc_pollset_set* interested_parties,
51
+ const grpc_channel_args* channel_args,
52
+ const grpc_resolved_address* addr,
53
+ grpc_core::Timestamp deadline);
54
+
55
+ // Returns true if a connect attempt corresponding to the provided handle
56
+ // is successfully cancelled. Otherwise it returns false. If the connect
57
+ // attempt is successfully cancelled, then the on_connect closure passed to
58
+ // grpc_tcp_client_connect will not be executed. Its upto the caller to free
59
+ // up any resources that may have been allocated to create the closure.
60
+ bool grpc_tcp_client_cancel_connect(int64_t connection_handle);
61
+
62
+ extern void grpc_tcp_client_global_init();
52
63
 
53
64
  void grpc_set_tcp_client_impl(grpc_tcp_client_vtable* impl);
54
65
 
@@ -116,7 +116,7 @@ static void OnOpen(void* arg, grpc_error_handle error) {
116
116
  gpr_mu_unlock(&connect->mu);
117
117
  CFStreamConnectCleanup(connect);
118
118
  } else {
119
- if (error == GRPC_ERROR_NONE) {
119
+ if (GRPC_ERROR_IS_NONE(error)) {
120
120
  CFErrorRef stream_error = CFReadStreamCopyError(connect->read_stream);
121
121
  if (stream_error == NULL) {
122
122
  stream_error = CFWriteStreamCopyError(connect->write_stream);
@@ -125,7 +125,7 @@ static void OnOpen(void* arg, grpc_error_handle error) {
125
125
  error = GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "connect() error");
126
126
  CFRelease(stream_error);
127
127
  }
128
- if (error == GRPC_ERROR_NONE) {
128
+ if (GRPC_ERROR_IS_NONE(error)) {
129
129
  *endpoint = grpc_cfstream_endpoint_create(
130
130
  connect->read_stream, connect->write_stream,
131
131
  connect->addr_name.c_str(), connect->stream_handle);
@@ -149,17 +149,17 @@ static void ParseResolvedAddress(const grpc_resolved_address* addr,
149
149
  *port = grpc_sockaddr_get_port(addr);
150
150
  }
151
151
 
152
- static void CFStreamClientConnect(grpc_closure* closure, grpc_endpoint** ep,
153
- grpc_pollset_set* interested_parties,
154
- const grpc_channel_args* channel_args,
155
- const grpc_resolved_address* resolved_addr,
156
- grpc_core::Timestamp deadline) {
152
+ static int64_t CFStreamClientConnect(grpc_closure* closure, grpc_endpoint** ep,
153
+ grpc_pollset_set* interested_parties,
154
+ const grpc_channel_args* channel_args,
155
+ const grpc_resolved_address* resolved_addr,
156
+ grpc_core::Timestamp deadline) {
157
157
  auto addr_uri = grpc_sockaddr_to_uri(resolved_addr);
158
158
  if (!addr_uri.ok()) {
159
159
  grpc_error_handle error =
160
160
  GRPC_ERROR_CREATE_FROM_CPP_STRING(addr_uri.status().ToString());
161
161
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, error);
162
- return;
162
+ return 0;
163
163
  }
164
164
 
165
165
  CFStreamConnect* connect = new CFStreamConnect();
@@ -198,8 +198,14 @@ static void CFStreamClientConnect(grpc_closure* closure, grpc_endpoint** ep,
198
198
  CFWriteStreamOpen(write_stream);
199
199
  grpc_timer_init(&connect->alarm, deadline, &connect->on_alarm);
200
200
  gpr_mu_unlock(&connect->mu);
201
+ return 0;
201
202
  }
202
203
 
203
- grpc_tcp_client_vtable grpc_cfstream_client_vtable = {CFStreamClientConnect};
204
+ static bool CFStreamClientCancelConnect(int64_t /*connection_handle*/) {
205
+ return false;
206
+ }
207
+
208
+ grpc_tcp_client_vtable grpc_cfstream_client_vtable = {
209
+ CFStreamClientConnect, CFStreamClientCancelConnect};
204
210
 
205
211
  #endif /* GRPC_CFSTREAM_CLIENT */
@@ -27,6 +27,7 @@
27
27
  #include <string.h>
28
28
  #include <unistd.h>
29
29
 
30
+ #include "absl/container/flat_hash_map.h"
30
31
  #include "absl/strings/str_cat.h"
31
32
 
32
33
  #include <grpc/support/alloc.h>
@@ -62,8 +63,33 @@ struct async_connect {
62
63
  grpc_endpoint** ep;
63
64
  grpc_closure* closure;
64
65
  grpc_channel_args* channel_args;
66
+ int64_t connection_handle;
67
+ bool connect_cancelled;
65
68
  };
66
69
 
70
+ struct ConnectionShard {
71
+ grpc_core::Mutex mu;
72
+ absl::flat_hash_map<int64_t, async_connect*> pending_connections
73
+ ABSL_GUARDED_BY(&mu);
74
+ };
75
+
76
+ namespace {
77
+
78
+ gpr_once g_tcp_client_posix_init = GPR_ONCE_INIT;
79
+ std::vector<ConnectionShard>* g_connection_shards = nullptr;
80
+ std::atomic<int64_t> g_connection_id{1};
81
+
82
+ void do_tcp_client_global_init(void) {
83
+ size_t num_shards = std::max(2 * gpr_cpu_num_cores(), 1u);
84
+ g_connection_shards = new std::vector<struct ConnectionShard>(num_shards);
85
+ }
86
+
87
+ } // namespace
88
+
89
+ void grpc_tcp_client_global_init() {
90
+ gpr_once_init(&g_tcp_client_posix_init, do_tcp_client_global_init);
91
+ }
92
+
67
93
  static grpc_error_handle prepare_socket(const grpc_resolved_address* addr,
68
94
  int fd,
69
95
  const grpc_channel_args* channel_args) {
@@ -72,24 +98,24 @@ static grpc_error_handle prepare_socket(const grpc_resolved_address* addr,
72
98
  GPR_ASSERT(fd >= 0);
73
99
 
74
100
  err = grpc_set_socket_nonblocking(fd, 1);
75
- if (err != GRPC_ERROR_NONE) goto error;
101
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
76
102
  err = grpc_set_socket_cloexec(fd, 1);
77
- if (err != GRPC_ERROR_NONE) goto error;
103
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
78
104
  if (!grpc_is_unix_socket(addr)) {
79
105
  err = grpc_set_socket_low_latency(fd, 1);
80
- if (err != GRPC_ERROR_NONE) goto error;
106
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
81
107
  err = grpc_set_socket_reuse_addr(fd, 1);
82
- if (err != GRPC_ERROR_NONE) goto error;
108
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
83
109
  err = grpc_set_socket_tcp_user_timeout(fd, channel_args,
84
110
  true /* is_client */);
85
- if (err != GRPC_ERROR_NONE) goto error;
111
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
86
112
  }
87
113
  err = grpc_set_socket_no_sigpipe_if_possible(fd);
88
- if (err != GRPC_ERROR_NONE) goto error;
114
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
89
115
 
90
116
  err = grpc_apply_socket_mutator_in_args(fd, GRPC_FD_CLIENT_CONNECTION_USAGE,
91
117
  channel_args);
92
- if (err != GRPC_ERROR_NONE) goto error;
118
+ if (!GRPC_ERROR_IS_NONE(err)) goto error;
93
119
 
94
120
  goto done;
95
121
 
@@ -150,17 +176,24 @@ static void on_writable(void* acp, grpc_error_handle error) {
150
176
  GPR_ASSERT(ac->fd);
151
177
  fd = ac->fd;
152
178
  ac->fd = nullptr;
179
+ bool connect_cancelled = ac->connect_cancelled;
153
180
  gpr_mu_unlock(&ac->mu);
154
181
 
155
182
  grpc_timer_cancel(&ac->alarm);
156
183
 
157
184
  gpr_mu_lock(&ac->mu);
158
- if (error != GRPC_ERROR_NONE) {
185
+ if (!GRPC_ERROR_IS_NONE(error)) {
159
186
  error =
160
187
  grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, "Timeout occurred");
161
188
  goto finish;
162
189
  }
163
190
 
191
+ if (connect_cancelled) {
192
+ // The callback should not get scheduled in this case.
193
+ error = GRPC_ERROR_NONE;
194
+ goto finish;
195
+ }
196
+
164
197
  do {
165
198
  so_error_size = sizeof(so_error);
166
199
  err = getsockopt(grpc_fd_wrapped_fd(fd), SOL_SOCKET, SO_ERROR, &so_error,
@@ -208,6 +241,14 @@ static void on_writable(void* acp, grpc_error_handle error) {
208
241
  }
209
242
 
210
243
  finish:
244
+ if (!connect_cancelled) {
245
+ int shard_number = ac->connection_handle % (*g_connection_shards).size();
246
+ struct ConnectionShard* shard = &(*g_connection_shards)[shard_number];
247
+ {
248
+ grpc_core::MutexLock lock(&shard->mu);
249
+ shard->pending_connections.erase(ac->connection_handle);
250
+ }
251
+ }
211
252
  if (fd != nullptr) {
212
253
  grpc_pollset_set_del_fd(ac->interested_parties, fd);
213
254
  grpc_fd_orphan(fd, nullptr, nullptr, "tcp_client_orphan");
@@ -215,7 +256,7 @@ finish:
215
256
  }
216
257
  done = (--ac->refs == 0);
217
258
  gpr_mu_unlock(&ac->mu);
218
- if (error != GRPC_ERROR_NONE) {
259
+ if (!GRPC_ERROR_IS_NONE(error)) {
219
260
  std::string str;
220
261
  bool ret = grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &str);
221
262
  GPR_ASSERT(ret);
@@ -234,7 +275,12 @@ finish:
234
275
  // Push async connect closure to the executor since this may actually be
235
276
  // called during the shutdown process, in which case a deadlock could form
236
277
  // between the core shutdown mu and the connector mu (b/188239051)
237
- grpc_core::Executor::Run(closure, error);
278
+ if (!connect_cancelled) {
279
+ grpc_core::Executor::Run(closure, error);
280
+ } else if (!GRPC_ERROR_IS_NONE(error)) {
281
+ // Unref the error here because it is not used.
282
+ (void)GRPC_ERROR_UNREF(error);
283
+ }
238
284
  }
239
285
 
240
286
  grpc_error_handle grpc_tcp_client_prepare_fd(
@@ -251,7 +297,7 @@ grpc_error_handle grpc_tcp_client_prepare_fd(
251
297
  }
252
298
  error =
253
299
  grpc_create_dualstack_socket(mapped_addr, SOCK_STREAM, 0, &dsmode, fd);
254
- if (error != GRPC_ERROR_NONE) {
300
+ if (!GRPC_ERROR_IS_NONE(error)) {
255
301
  return error;
256
302
  }
257
303
  if (dsmode == GRPC_DSMODE_IPV4) {
@@ -267,7 +313,7 @@ grpc_error_handle grpc_tcp_client_prepare_fd(
267
313
  return GRPC_ERROR_NONE;
268
314
  }
269
315
 
270
- void grpc_tcp_client_create_from_prepared_fd(
316
+ int64_t grpc_tcp_client_create_from_prepared_fd(
271
317
  grpc_pollset_set* interested_parties, grpc_closure* closure, const int fd,
272
318
  const grpc_channel_args* channel_args, const grpc_resolved_address* addr,
273
319
  grpc_core::Timestamp deadline, grpc_endpoint** ep) {
@@ -282,24 +328,33 @@ void grpc_tcp_client_create_from_prepared_fd(
282
328
  grpc_error_handle error =
283
329
  GRPC_ERROR_CREATE_FROM_CPP_STRING(addr_uri.status().ToString());
284
330
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, error);
285
- return;
331
+ return 0;
286
332
  }
287
333
 
288
334
  std::string name = absl::StrCat("tcp-client:", addr_uri.value());
289
335
  grpc_fd* fdobj = grpc_fd_create(fd, name.c_str(), true);
336
+ int64_t connection_id = 0;
337
+ if (errno == EWOULDBLOCK || errno == EINPROGRESS) {
338
+ // Connection is still in progress.
339
+ connection_id = g_connection_id.fetch_add(1, std::memory_order_acq_rel);
340
+ }
290
341
 
291
342
  if (err >= 0) {
343
+ // Connection already succeded. Return 0 to discourage any cancellation
344
+ // attempts.
292
345
  *ep = grpc_tcp_client_create_from_fd(fdobj, channel_args, addr_uri.value());
293
346
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, GRPC_ERROR_NONE);
294
- return;
347
+ return 0;
295
348
  }
296
349
  if (errno != EWOULDBLOCK && errno != EINPROGRESS) {
350
+ // Connection already failed. Return 0 to discourage any cancellation
351
+ // attempts.
297
352
  grpc_error_handle error = GRPC_OS_ERROR(errno, "connect");
298
353
  error = grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS,
299
354
  addr_uri.value());
300
355
  grpc_fd_orphan(fdobj, nullptr, nullptr, "tcp_client_connect_error");
301
356
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, error);
302
- return;
357
+ return 0;
303
358
  }
304
359
 
305
360
  grpc_pollset_set_add_fd(interested_parties, fdobj);
@@ -310,6 +365,8 @@ void grpc_tcp_client_create_from_prepared_fd(
310
365
  ac->fd = fdobj;
311
366
  ac->interested_parties = interested_parties;
312
367
  ac->addr_str = addr_uri.value();
368
+ ac->connection_handle = connection_id;
369
+ ac->connect_cancelled = false;
313
370
  gpr_mu_init(&ac->mu);
314
371
  ac->refs = 2;
315
372
  GRPC_CLOSURE_INIT(&ac->write_closure, on_writable, ac,
@@ -321,18 +378,26 @@ void grpc_tcp_client_create_from_prepared_fd(
321
378
  ac->addr_str.c_str(), fdobj);
322
379
  }
323
380
 
381
+ int shard_number = connection_id % (*g_connection_shards).size();
382
+ struct ConnectionShard* shard = &(*g_connection_shards)[shard_number];
383
+ {
384
+ grpc_core::MutexLock lock(&shard->mu);
385
+ shard->pending_connections.insert_or_assign(connection_id, ac);
386
+ }
387
+
324
388
  gpr_mu_lock(&ac->mu);
325
389
  GRPC_CLOSURE_INIT(&ac->on_alarm, tc_on_alarm, ac, grpc_schedule_on_exec_ctx);
326
390
  grpc_timer_init(&ac->alarm, deadline, &ac->on_alarm);
327
391
  grpc_fd_notify_on_write(ac->fd, &ac->write_closure);
328
392
  gpr_mu_unlock(&ac->mu);
393
+ return connection_id;
329
394
  }
330
395
 
331
- static void tcp_connect(grpc_closure* closure, grpc_endpoint** ep,
332
- grpc_pollset_set* interested_parties,
333
- const grpc_channel_args* channel_args,
334
- const grpc_resolved_address* addr,
335
- grpc_core::Timestamp deadline) {
396
+ static int64_t tcp_connect(grpc_closure* closure, grpc_endpoint** ep,
397
+ grpc_pollset_set* interested_parties,
398
+ const grpc_channel_args* channel_args,
399
+ const grpc_resolved_address* addr,
400
+ grpc_core::Timestamp deadline) {
336
401
  grpc_resolved_address mapped_addr;
337
402
  int fd = -1;
338
403
  grpc_error_handle error;
@@ -340,12 +405,65 @@ static void tcp_connect(grpc_closure* closure, grpc_endpoint** ep,
340
405
  if ((error = grpc_tcp_client_prepare_fd(channel_args, addr, &mapped_addr,
341
406
  &fd)) != GRPC_ERROR_NONE) {
342
407
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, closure, error);
343
- return;
408
+ return 0;
409
+ }
410
+ return grpc_tcp_client_create_from_prepared_fd(interested_parties, closure,
411
+ fd, channel_args, &mapped_addr,
412
+ deadline, ep);
413
+ }
414
+
415
+ static bool tcp_cancel_connect(int64_t connection_handle) {
416
+ if (connection_handle <= 0) {
417
+ return false;
418
+ }
419
+ int shard_number = connection_handle % (*g_connection_shards).size();
420
+ struct ConnectionShard* shard = &(*g_connection_shards)[shard_number];
421
+ async_connect* ac = nullptr;
422
+ {
423
+ grpc_core::MutexLock lock(&shard->mu);
424
+ auto it = shard->pending_connections.find(connection_handle);
425
+ if (it != shard->pending_connections.end()) {
426
+ ac = it->second;
427
+ GPR_ASSERT(ac != nullptr);
428
+ // Trying to acquire ac->mu here would could cause a deadlock because
429
+ // the on_writable method tries to acquire the two mutexes used
430
+ // here in the reverse order. But we dont need to acquire ac->mu before
431
+ // incrementing ac->refs here. This is because the on_writable
432
+ // method decrements ac->refs only after deleting the connection handle
433
+ // from the corresponding hashmap. If the code enters here, it means that
434
+ // deletion hasn't happened yet. The deletion can only happen after the
435
+ // corresponding g_shard_mu is unlocked.
436
+ ++ac->refs;
437
+ // Remove connection from list of active connections.
438
+ shard->pending_connections.erase(it);
439
+ }
440
+ }
441
+ if (ac == nullptr) {
442
+ return false;
443
+ }
444
+ gpr_mu_lock(&ac->mu);
445
+ bool connection_cancel_success = (ac->fd != nullptr);
446
+ if (connection_cancel_success) {
447
+ // Connection is still pending. The on_writable callback hasn't executed
448
+ // yet because ac->fd != nullptr.
449
+ ac->connect_cancelled = true;
450
+ // Shutdown the fd. This would cause on_writable to run as soon as possible.
451
+ // We dont need to pass a custom error here because it wont be used since
452
+ // the on_connect_closure is not run if connect cancellation is successfull.
453
+ grpc_fd_shutdown(ac->fd, GRPC_ERROR_NONE);
454
+ }
455
+ bool done = (--ac->refs == 0);
456
+ gpr_mu_unlock(&ac->mu);
457
+ if (done) {
458
+ // This is safe even outside the lock, because "done", the sentinel, is
459
+ // populated *inside* the lock.
460
+ gpr_mu_destroy(&ac->mu);
461
+ grpc_channel_args_destroy(ac->channel_args);
462
+ delete ac;
344
463
  }
345
- grpc_tcp_client_create_from_prepared_fd(interested_parties, closure, fd,
346
- channel_args, &mapped_addr, deadline,
347
- ep);
464
+ return connection_cancel_success;
348
465
  }
349
466
 
350
- grpc_tcp_client_vtable grpc_posix_tcp_client_vtable = {tcp_connect};
467
+ grpc_tcp_client_vtable grpc_posix_tcp_client_vtable = {tcp_connect,
468
+ tcp_cancel_connect};
351
469
  #endif
@@ -61,7 +61,7 @@ grpc_error_handle grpc_tcp_client_prepare_fd(
61
61
  deadline: connection deadline
62
62
  ep: out parameter. Set before closure is called if successful
63
63
  */
64
- void grpc_tcp_client_create_from_prepared_fd(
64
+ int64_t grpc_tcp_client_create_from_prepared_fd(
65
65
  grpc_pollset_set* interested_parties, grpc_closure* closure, const int fd,
66
66
  const grpc_channel_args* channel_args, const grpc_resolved_address* addr,
67
67
  grpc_core::Timestamp deadline, grpc_endpoint** ep);
@@ -93,7 +93,7 @@ static void on_connect(void* acp, grpc_error_handle error) {
93
93
 
94
94
  gpr_mu_lock(&ac->mu);
95
95
 
96
- if (error == GRPC_ERROR_NONE) {
96
+ if (GRPC_ERROR_IS_NONE(error)) {
97
97
  if (socket != NULL) {
98
98
  DWORD transfered_bytes = 0;
99
99
  DWORD flags;
@@ -121,11 +121,11 @@ static void on_connect(void* acp, grpc_error_handle error) {
121
121
 
122
122
  /* Tries to issue one async connection, then schedules both an IOCP
123
123
  notification request for the connection, and one timeout alert. */
124
- static void tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
125
- grpc_pollset_set* interested_parties,
126
- const grpc_channel_args* channel_args,
127
- const grpc_resolved_address* addr,
128
- grpc_core::Timestamp deadline) {
124
+ static int64_t tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
125
+ grpc_pollset_set* interested_parties,
126
+ const grpc_channel_args* channel_args,
127
+ const grpc_resolved_address* addr,
128
+ grpc_core::Timestamp deadline) {
129
129
  SOCKET sock = INVALID_SOCKET;
130
130
  BOOL success;
131
131
  int status;
@@ -161,7 +161,7 @@ static void tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
161
161
  }
162
162
 
163
163
  error = grpc_tcp_prepare_socket(sock);
164
- if (error != GRPC_ERROR_NONE) {
164
+ if (!GRPC_ERROR_IS_NONE(error)) {
165
165
  goto failure;
166
166
  }
167
167
 
@@ -216,10 +216,10 @@ static void tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
216
216
  grpc_timer_init(&ac->alarm, deadline, &ac->on_alarm);
217
217
  grpc_socket_notify_on_write(socket, &ac->on_connect);
218
218
  gpr_mu_unlock(&ac->mu);
219
- return;
219
+ return 0;
220
220
 
221
221
  failure:
222
- GPR_ASSERT(error != GRPC_ERROR_NONE);
222
+ GPR_ASSERT(!GRPC_ERROR_IS_NONE(error));
223
223
  grpc_error_handle final_error = grpc_error_set_str(
224
224
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Failed to connect",
225
225
  &error, 1),
@@ -232,8 +232,12 @@ failure:
232
232
  closesocket(sock);
233
233
  }
234
234
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, on_done, final_error);
235
+ return 0;
235
236
  }
236
237
 
237
- grpc_tcp_client_vtable grpc_windows_tcp_client_vtable = {tcp_connect};
238
+ static bool tcp_cancel_connect(int64_t /*connection_handle*/) { return false; }
239
+
240
+ grpc_tcp_client_vtable grpc_windows_tcp_client_vtable = {tcp_connect,
241
+ tcp_cancel_connect};
238
242
 
239
243
  #endif /* GRPC_WINSOCK_SOCKET */