grpc 1.18.0 → 1.22.0

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 (428) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4731 -7404
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc.h +11 -6
  5. data/include/grpc/grpc_security.h +297 -4
  6. data/include/grpc/grpc_security_constants.h +1 -1
  7. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +30 -7
  10. data/include/grpc/impl/codegen/port_platform.h +88 -7
  11. data/include/grpc/impl/codegen/slice.h +2 -22
  12. data/include/grpc/impl/codegen/status.h +2 -1
  13. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  14. data/include/grpc/slice.h +3 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
  16. data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
  19. data/src/core/ext/filters/client_channel/client_channel.h +2 -10
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
  47. data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
  48. data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
  51. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  53. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  65. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  66. data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
  67. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
  68. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
  69. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  70. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  71. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  72. data/src/core/ext/filters/client_channel/resolver.h +52 -23
  73. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  74. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  75. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
  77. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
  78. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
  79. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
  80. data/src/core/ext/filters/client_channel/server_address.cc +4 -54
  81. data/src/core/ext/filters/client_channel/server_address.h +1 -13
  82. data/src/core/ext/filters/client_channel/service_config.cc +329 -0
  83. data/src/core/ext/filters/client_channel/service_config.h +205 -0
  84. data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
  85. data/src/core/ext/filters/client_channel/subchannel.h +295 -128
  86. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  88. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  90. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  91. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  92. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  93. data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
  94. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  95. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  96. data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
  97. data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
  98. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  99. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
  102. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
  104. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  106. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  107. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
  110. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  111. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
  113. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  114. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  116. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  122. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
  131. data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
  133. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
  136. data/src/core/lib/channel/channel_args.cc +2 -101
  137. data/src/core/lib/channel/channel_args.h +3 -37
  138. data/src/core/lib/channel/channel_stack.h +10 -6
  139. data/src/core/lib/channel/channel_trace.cc +4 -4
  140. data/src/core/lib/channel/channel_trace.h +4 -4
  141. data/src/core/lib/channel/channelz.cc +168 -38
  142. data/src/core/lib/channel/channelz.h +40 -44
  143. data/src/core/lib/channel/channelz_registry.cc +75 -107
  144. data/src/core/lib/channel/channelz_registry.h +10 -28
  145. data/src/core/lib/channel/connected_channel.cc +2 -2
  146. data/src/core/lib/channel/context.h +2 -2
  147. data/src/core/lib/channel/handshaker.cc +151 -218
  148. data/src/core/lib/channel/handshaker.h +110 -101
  149. data/src/core/lib/channel/handshaker_factory.h +11 -19
  150. data/src/core/lib/channel/handshaker_registry.cc +67 -51
  151. data/src/core/lib/channel/handshaker_registry.h +21 -16
  152. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  153. data/src/core/lib/compression/compression.cc +14 -9
  154. data/src/core/lib/compression/compression_args.cc +127 -0
  155. data/src/core/lib/compression/compression_args.h +55 -0
  156. data/src/core/lib/compression/compression_internal.cc +16 -12
  157. data/src/core/lib/compression/compression_internal.h +1 -1
  158. data/src/core/lib/compression/stream_compression.cc +3 -2
  159. data/src/core/lib/compression/stream_compression.h +2 -2
  160. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  161. data/src/core/lib/debug/trace.cc +13 -7
  162. data/src/core/lib/debug/trace.h +14 -1
  163. data/src/core/lib/gpr/arena.h +13 -9
  164. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  165. data/src/core/lib/gpr/env.h +3 -6
  166. data/src/core/lib/gpr/env_linux.cc +6 -1
  167. data/src/core/lib/gpr/env_posix.cc +5 -0
  168. data/src/core/lib/gpr/env_windows.cc +7 -5
  169. data/src/core/lib/gpr/log.cc +9 -13
  170. data/src/core/lib/gpr/log_posix.cc +2 -1
  171. data/src/core/lib/gpr/string.cc +20 -7
  172. data/src/core/lib/gpr/string.h +10 -3
  173. data/src/core/lib/gpr/sync_posix.cc +65 -4
  174. data/src/core/lib/gpr/time.cc +8 -0
  175. data/src/core/lib/gpr/time_posix.cc +21 -2
  176. data/src/core/lib/gprpp/arena.cc +103 -0
  177. data/src/core/lib/gprpp/arena.h +121 -0
  178. data/src/core/lib/gprpp/atomic.h +75 -5
  179. data/src/core/lib/gprpp/fork.cc +13 -32
  180. data/src/core/lib/gprpp/fork.h +5 -1
  181. data/src/core/lib/gprpp/global_config.h +96 -0
  182. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  183. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  184. data/src/core/lib/gprpp/global_config_env.h +131 -0
  185. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  186. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  187. data/src/core/lib/gprpp/map.h +436 -0
  188. data/src/core/lib/gprpp/memory.h +2 -2
  189. data/src/core/lib/gprpp/optional.h +48 -0
  190. data/src/core/lib/gprpp/orphanable.h +6 -5
  191. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  192. data/src/core/lib/gprpp/ref_counted.h +36 -17
  193. data/src/core/lib/gprpp/sync.h +126 -0
  194. data/src/core/lib/gprpp/thd.h +42 -7
  195. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  196. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  197. data/src/core/lib/http/httpcli.cc +6 -5
  198. data/src/core/lib/http/httpcli_security_connector.cc +13 -15
  199. data/src/core/lib/http/parser.cc +3 -2
  200. data/src/core/lib/http/parser.h +2 -1
  201. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  202. data/src/core/lib/iomgr/buffer_list.h +72 -10
  203. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  204. data/src/core/lib/iomgr/call_combiner.h +75 -82
  205. data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
  206. data/src/core/lib/iomgr/cfstream_handle.h +86 -0
  207. data/src/core/lib/iomgr/combiner.cc +11 -3
  208. data/src/core/lib/iomgr/combiner.h +1 -1
  209. data/src/core/lib/iomgr/endpoint.cc +2 -2
  210. data/src/core/lib/iomgr/endpoint.h +3 -2
  211. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  212. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  213. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  214. data/src/core/lib/iomgr/error.cc +21 -17
  215. data/src/core/lib/iomgr/error.h +36 -6
  216. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  217. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  218. data/src/core/lib/iomgr/error_internal.h +1 -1
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
  222. data/src/core/lib/iomgr/ev_posix.cc +29 -19
  223. data/src/core/lib/iomgr/ev_posix.h +19 -3
  224. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  225. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  226. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  227. data/src/core/lib/iomgr/executor.cc +147 -95
  228. data/src/core/lib/iomgr/executor.h +55 -49
  229. data/src/core/lib/iomgr/fork_posix.cc +6 -5
  230. data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
  231. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  232. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  233. data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
  234. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  235. data/src/core/lib/iomgr/iomgr.cc +20 -13
  236. data/src/core/lib/iomgr/iomgr.h +15 -0
  237. data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
  238. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  239. data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
  240. data/src/core/lib/iomgr/iomgr_internal.h +12 -0
  241. data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
  242. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  243. data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
  244. data/src/core/lib/iomgr/lockfree_event.cc +4 -4
  245. data/src/core/lib/iomgr/port.h +35 -0
  246. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  247. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  248. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  250. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  251. data/src/core/lib/iomgr/socket_windows.h +8 -0
  252. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  253. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  254. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +10 -14
  257. data/src/core/lib/iomgr/tcp_posix.cc +256 -140
  258. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  259. data/src/core/lib/iomgr/tcp_server.h +24 -0
  260. data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
  261. data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
  262. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  263. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
  264. data/src/core/lib/iomgr/tcp_uv.cc +5 -7
  265. data/src/core/lib/iomgr/tcp_windows.cc +8 -14
  266. data/src/core/lib/iomgr/timer.h +2 -1
  267. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  268. data/src/core/lib/iomgr/timer_manager.cc +20 -11
  269. data/src/core/lib/iomgr/udp_server.cc +8 -6
  270. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  271. data/src/core/lib/json/json.cc +1 -4
  272. data/src/core/lib/profiling/basic_timers.cc +10 -4
  273. data/src/core/lib/security/context/security_context.cc +6 -7
  274. data/src/core/lib/security/context/security_context.h +3 -4
  275. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  276. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  277. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  278. data/src/core/lib/security/credentials/credentials.h +9 -1
  279. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
  280. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  281. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  282. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  284. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  285. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
  286. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
  287. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  288. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  289. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  290. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
  291. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  292. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  293. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  294. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
  295. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  296. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  297. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  298. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  299. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
  300. data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
  301. data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
  302. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  303. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  304. data/src/core/lib/security/transport/auth_filters.h +5 -2
  305. data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
  306. data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
  307. data/src/core/lib/security/transport/security_handshaker.cc +271 -303
  308. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  309. data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
  310. data/src/core/lib/slice/b64.h +2 -2
  311. data/src/core/lib/slice/percent_encoding.cc +3 -3
  312. data/src/core/lib/slice/percent_encoding.h +3 -3
  313. data/src/core/lib/slice/slice.cc +174 -122
  314. data/src/core/lib/slice/slice_buffer.cc +54 -21
  315. data/src/core/lib/slice/slice_hash_table.h +4 -4
  316. data/src/core/lib/slice/slice_intern.cc +49 -107
  317. data/src/core/lib/slice/slice_internal.h +264 -3
  318. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  319. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  320. data/src/core/lib/slice/slice_utils.h +50 -0
  321. data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
  322. data/src/core/lib/surface/api_trace.h +1 -1
  323. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  324. data/src/core/lib/surface/call.cc +67 -46
  325. data/src/core/lib/surface/call.h +7 -2
  326. data/src/core/lib/surface/call_details.cc +0 -1
  327. data/src/core/lib/surface/channel.cc +89 -97
  328. data/src/core/lib/surface/channel.h +60 -6
  329. data/src/core/lib/surface/channel_init.h +5 -0
  330. data/src/core/lib/surface/completion_queue.cc +221 -216
  331. data/src/core/lib/surface/completion_queue.h +2 -1
  332. data/src/core/lib/surface/init.cc +82 -33
  333. data/src/core/lib/surface/init.h +1 -0
  334. data/src/core/lib/surface/init_secure.cc +1 -1
  335. data/src/core/lib/surface/lame_client.cc +5 -7
  336. data/src/core/lib/surface/server.cc +42 -47
  337. data/src/core/lib/surface/validate_metadata.cc +14 -8
  338. data/src/core/lib/surface/validate_metadata.h +13 -2
  339. data/src/core/lib/surface/version.cc +1 -1
  340. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  341. data/src/core/lib/transport/bdp_estimator.h +2 -2
  342. data/src/core/lib/transport/connectivity_state.cc +10 -40
  343. data/src/core/lib/transport/connectivity_state.h +0 -8
  344. data/src/core/lib/transport/error_utils.cc +12 -0
  345. data/src/core/lib/transport/metadata.cc +258 -267
  346. data/src/core/lib/transport/metadata.h +227 -16
  347. data/src/core/lib/transport/metadata_batch.cc +1 -1
  348. data/src/core/lib/transport/metadata_batch.h +1 -1
  349. data/src/core/lib/transport/static_metadata.cc +477 -399
  350. data/src/core/lib/transport/static_metadata.h +273 -182
  351. data/src/core/lib/transport/status_metadata.cc +3 -3
  352. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  353. data/src/core/lib/transport/timeout_encoding.h +1 -1
  354. data/src/core/lib/transport/transport.cc +39 -72
  355. data/src/core/lib/transport/transport.h +59 -24
  356. data/src/core/lib/transport/transport_impl.h +1 -1
  357. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  358. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  359. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  360. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  361. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  362. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  363. data/src/core/tsi/fake_transport_security.cc +4 -4
  364. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  365. data/src/core/tsi/ssl_transport_security.cc +12 -10
  366. data/src/core/tsi/ssl_transport_security.h +24 -4
  367. data/src/ruby/bin/math_pb.rb +18 -16
  368. data/src/ruby/ext/grpc/extconf.rb +12 -4
  369. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  370. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  371. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  372. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  373. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  374. data/src/ruby/ext/grpc/rb_grpc.c +23 -24
  375. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  376. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
  377. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
  378. data/src/ruby/ext/grpc/rb_server.c +8 -4
  379. data/src/ruby/lib/grpc/errors.rb +22 -3
  380. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  381. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
  382. data/src/ruby/lib/grpc/version.rb +1 -1
  383. data/src/ruby/pb/README.md +1 -1
  384. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  385. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  386. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  388. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  389. data/src/ruby/spec/errors_spec.rb +141 -0
  390. data/third_party/cares/cares/ares.h +12 -0
  391. data/third_party/cares/cares/ares_create_query.c +5 -1
  392. data/third_party/cares/cares/ares_data.c +74 -73
  393. data/third_party/cares/cares/ares_destroy.c +6 -1
  394. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  395. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  396. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  397. data/third_party/cares/cares/ares_init.c +274 -173
  398. data/third_party/cares/cares/ares_library_init.c +21 -3
  399. data/third_party/cares/cares/ares_options.c +6 -2
  400. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  401. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  402. data/third_party/cares/cares/ares_platform.c +7 -0
  403. data/third_party/cares/cares/ares_private.h +19 -11
  404. data/third_party/cares/cares/ares_process.c +27 -2
  405. data/third_party/cares/cares/ares_rules.h +1 -1
  406. data/third_party/cares/cares/ares_search.c +7 -0
  407. data/third_party/cares/cares/ares_send.c +6 -0
  408. data/third_party/cares/cares/ares_strsplit.c +174 -0
  409. data/third_party/cares/cares/ares_strsplit.h +43 -0
  410. data/third_party/cares/cares/ares_version.h +4 -4
  411. data/third_party/cares/cares/config-win32.h +1 -1
  412. data/third_party/cares/cares/inet_ntop.c +2 -3
  413. data/third_party/cares/config_darwin/ares_config.h +3 -0
  414. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  415. data/third_party/cares/config_linux/ares_config.h +3 -0
  416. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  417. metadata +83 -48
  418. data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
  419. data/src/core/ext/filters/client_channel/request_routing.h +0 -177
  420. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  421. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  422. data/src/core/lib/channel/handshaker_factory.cc +0 -42
  423. data/src/core/lib/gpr/arena.cc +0 -192
  424. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  425. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  426. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
  427. data/src/core/lib/transport/service_config.cc +0 -106
  428. data/src/core/lib/transport/service_config.h +0 -249
@@ -24,16 +24,20 @@
24
24
  #include <poll.h>
25
25
 
26
26
  #include "src/core/lib/debug/trace.h"
27
+ #include "src/core/lib/gprpp/global_config.h"
27
28
  #include "src/core/lib/iomgr/exec_ctx.h"
28
29
  #include "src/core/lib/iomgr/pollset.h"
29
30
  #include "src/core/lib/iomgr/pollset_set.h"
30
31
  #include "src/core/lib/iomgr/wakeup_fd_posix.h"
31
32
 
32
- extern grpc_core::TraceFlag grpc_fd_trace; /* Disabled by default */
33
- extern grpc_core::TraceFlag grpc_polling_trace; /* Disabled by default */
33
+ GPR_GLOBAL_CONFIG_DECLARE_STRING(grpc_poll_strategy);
34
+
35
+ extern grpc_core::DebugOnlyTraceFlag grpc_fd_trace; /* Disabled by default */
36
+ extern grpc_core::DebugOnlyTraceFlag
37
+ grpc_polling_trace; /* Disabled by default */
34
38
 
35
39
  #define GRPC_FD_TRACE(format, ...) \
36
- if (grpc_fd_trace.enabled()) { \
40
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_fd_trace)) { \
37
41
  gpr_log(GPR_INFO, "(fd-trace) " format, __VA_ARGS__); \
38
42
  }
39
43
 
@@ -80,8 +84,11 @@ typedef struct grpc_event_engine_vtable {
80
84
  void (*pollset_set_add_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd);
81
85
  void (*pollset_set_del_fd)(grpc_pollset_set* pollset_set, grpc_fd* fd);
82
86
 
87
+ bool (*is_any_background_poller_thread)(void);
83
88
  void (*shutdown_background_closure)(void);
84
89
  void (*shutdown_engine)(void);
90
+ bool (*add_closure_to_background_poller)(grpc_closure* closure,
91
+ grpc_error* error);
85
92
  } grpc_event_engine_vtable;
86
93
 
87
94
  /* register a new event engine factory */
@@ -181,6 +188,15 @@ void grpc_pollset_add_fd(grpc_pollset* pollset, struct grpc_fd* fd);
181
188
  void grpc_pollset_set_add_fd(grpc_pollset_set* pollset_set, grpc_fd* fd);
182
189
  void grpc_pollset_set_del_fd(grpc_pollset_set* pollset_set, grpc_fd* fd);
183
190
 
191
+ /* Returns true if the caller is a worker thread for any background poller. */
192
+ bool grpc_is_any_background_poller_thread();
193
+
194
+ /* Returns true if the closure is registered into the background poller. Note
195
+ * that the closure may or may not run yet when this function returns, and the
196
+ * closure should not be blocking or long-running. */
197
+ bool grpc_add_closure_to_background_poller(grpc_closure* closure,
198
+ grpc_error* error);
199
+
184
200
  /* Shut down all the closures registered in the background poller. */
185
201
  void grpc_shutdown_background_closure();
186
202
 
@@ -24,7 +24,7 @@
24
24
 
25
25
  #include "src/core/lib/debug/trace.h"
26
26
 
27
- grpc_core::TraceFlag grpc_polling_trace(false,
28
- "polling"); /* Disabled by default */
27
+ grpc_core::DebugOnlyTraceFlag grpc_polling_trace(
28
+ false, "polling"); /* Disabled by default */
29
29
 
30
30
  #endif // GRPC_WINSOCK_SOCKET
@@ -115,6 +115,7 @@ grpc_closure_scheduler* grpc_schedule_on_exec_ctx = &exec_ctx_scheduler;
115
115
 
116
116
  namespace grpc_core {
117
117
  GPR_TLS_CLASS_DEF(ExecCtx::exec_ctx_);
118
+ GPR_TLS_CLASS_DEF(ApplicationCallbackExecCtx::callback_exec_ctx_);
118
119
 
119
120
  // WARNING: for testing purposes only!
120
121
  void ExecCtx::TestOnlyGlobalInit(gpr_timespec new_val) {
@@ -21,6 +21,7 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <grpc/impl/codegen/grpc_types.h>
24
25
  #include <grpc/support/atm.h>
25
26
  #include <grpc/support/cpu.h>
26
27
  #include <grpc/support/log.h>
@@ -34,9 +35,8 @@ typedef int64_t grpc_millis;
34
35
  #define GRPC_MILLIS_INF_FUTURE INT64_MAX
35
36
  #define GRPC_MILLIS_INF_PAST INT64_MIN
36
37
 
37
- /** A workqueue represents a list of work to be executed asynchronously.
38
- Forward declared here to avoid a circular dependency with workqueue.h. */
39
- typedef struct grpc_workqueue grpc_workqueue;
38
+ /** A combiner represents a list of work to be executed later.
39
+ Forward declared here to avoid a circular dependency with combiner.h. */
40
40
  typedef struct grpc_combiner grpc_combiner;
41
41
 
42
42
  /* This exec_ctx is ready to return: either pre-populated, or cached as soon as
@@ -49,6 +49,10 @@ typedef struct grpc_combiner grpc_combiner;
49
49
  be counted by fork handlers */
50
50
  #define GRPC_EXEC_CTX_FLAG_IS_INTERNAL_THREAD 4
51
51
 
52
+ /* This application callback exec ctx was initialized by an internal thread, and
53
+ should not be counted by fork handlers */
54
+ #define GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD 1
55
+
52
56
  extern grpc_closure_scheduler* grpc_schedule_on_exec_ctx;
53
57
 
54
58
  gpr_timespec grpc_millis_to_timespec(grpc_millis millis, gpr_clock_type clock);
@@ -58,8 +62,8 @@ grpc_millis grpc_timespec_to_millis_round_up(gpr_timespec timespec);
58
62
  namespace grpc_core {
59
63
  /** Execution context.
60
64
  * A bag of data that collects information along a callstack.
61
- * It is created on the stack at public API entry points, and stored internally
62
- * as a thread-local variable.
65
+ * It is created on the stack at core entry points (public API or iomgr), and
66
+ * stored internally as a thread-local variable.
63
67
  *
64
68
  * Generally, to create an exec_ctx instance, add the following line at the top
65
69
  * of the public API entry point or at the start of a thread's work function :
@@ -70,7 +74,7 @@ namespace grpc_core {
70
74
  * grpc_core::ExecCtx::Get()
71
75
  *
72
76
  * Specific responsibilities (this may grow in the future):
73
- * - track a list of work that needs to be delayed until the top of the
77
+ * - track a list of core work that needs to be delayed until the base of the
74
78
  * call stack (this provides a convenient mechanism to run callbacks
75
79
  * without worrying about locking issues)
76
80
  * - provide a decision maker (via IsReadyToFinish) that provides a
@@ -80,10 +84,19 @@ namespace grpc_core {
80
84
  * CONVENTIONS:
81
85
  * - Instance of this must ALWAYS be constructed on the stack, never
82
86
  * heap allocated.
83
- * - Exactly one instance of ExecCtx must be created per thread. Instances must
84
- * always be called exec_ctx.
85
87
  * - Do not pass exec_ctx as a parameter to a function. Always access it using
86
88
  * grpc_core::ExecCtx::Get().
89
+ * - NOTE: In the future, the convention is likely to change to allow only one
90
+ * ExecCtx on a thread's stack at the same time. The TODO below
91
+ * discusses this plan in more detail.
92
+ *
93
+ * TODO(yashykt): Only allow one "active" ExecCtx on a thread at the same time.
94
+ * Stage 1: If a new one is created on the stack, it should just
95
+ * pass-through to the underlying ExecCtx deeper in the thread's
96
+ * stack.
97
+ * Stage 2: Assert if a 2nd one is ever created on the stack
98
+ * since that implies a core re-entry outside of application
99
+ * callbacks.
87
100
  */
88
101
  class ExecCtx {
89
102
  public:
@@ -226,6 +239,122 @@ class ExecCtx {
226
239
  GPR_TLS_CLASS_DECL(exec_ctx_);
227
240
  ExecCtx* last_exec_ctx_ = Get();
228
241
  };
242
+
243
+ /** Application-callback execution context.
244
+ * A bag of data that collects information along a callstack.
245
+ * It is created on the stack at core entry points, and stored internally
246
+ * as a thread-local variable.
247
+ *
248
+ * There are three key differences between this structure and ExecCtx:
249
+ * 1. ApplicationCallbackExecCtx builds a list of application-level
250
+ * callbacks, but ExecCtx builds a list of internal callbacks to invoke.
251
+ * 2. ApplicationCallbackExecCtx invokes its callbacks only at destruction;
252
+ * there is no explicit Flush method.
253
+ * 3. If more than one ApplicationCallbackExecCtx is created on the thread's
254
+ * stack, only the one closest to the base of the stack is actually
255
+ * active and this is the only one that enqueues application callbacks.
256
+ * (Unlike ExecCtx, it is not feasible to prevent multiple of these on the
257
+ * stack since the executing application callback may itself enter core.
258
+ * However, the new one created will just pass callbacks through to the
259
+ * base one and those will not be executed until the return to the
260
+ * destructor of the base one, preventing unlimited stack growth.)
261
+ *
262
+ * This structure exists because application callbacks may themselves cause a
263
+ * core re-entry (e.g., through a public API call) and if that call in turn
264
+ * causes another application-callback, there could be arbitrarily growing
265
+ * stacks of core re-entries. Instead, any application callbacks instead should
266
+ * not be invoked until other core work is done and other application callbacks
267
+ * have completed. To accomplish this, any application callback should be
268
+ * enqueued using grpc_core::ApplicationCallbackExecCtx::Enqueue .
269
+ *
270
+ * CONVENTIONS:
271
+ * - Instances of this must ALWAYS be constructed on the stack, never
272
+ * heap allocated.
273
+ * - Instances of this are generally constructed before ExecCtx when needed.
274
+ * The only exception is for ExecCtx's that are explicitly flushed and
275
+ * that survive beyond the scope of the function that can cause application
276
+ * callbacks to be invoked (e.g., in the timer thread).
277
+ *
278
+ * Generally, core entry points that may trigger application-level callbacks
279
+ * will have the following declarations:
280
+ *
281
+ * grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
282
+ * grpc_core::ExecCtx exec_ctx;
283
+ *
284
+ * This ordering is important to make sure that the ApplicationCallbackExecCtx
285
+ * is destroyed after the ExecCtx (to prevent the re-entry problem described
286
+ * above, as well as making sure that ExecCtx core callbacks are invoked first)
287
+ *
288
+ */
289
+
290
+ class ApplicationCallbackExecCtx {
291
+ public:
292
+ /** Default Constructor */
293
+ ApplicationCallbackExecCtx() { Set(this, flags_); }
294
+
295
+ /** Parameterised Constructor */
296
+ ApplicationCallbackExecCtx(uintptr_t fl) : flags_(fl) { Set(this, flags_); }
297
+
298
+ ~ApplicationCallbackExecCtx() {
299
+ if (reinterpret_cast<ApplicationCallbackExecCtx*>(
300
+ gpr_tls_get(&callback_exec_ctx_)) == this) {
301
+ while (head_ != nullptr) {
302
+ auto* f = head_;
303
+ head_ = f->internal_next;
304
+ if (f->internal_next == nullptr) {
305
+ tail_ = nullptr;
306
+ }
307
+ (*f->functor_run)(f, f->internal_success);
308
+ }
309
+ gpr_tls_set(&callback_exec_ctx_, reinterpret_cast<intptr_t>(nullptr));
310
+ if (!(GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD & flags_)) {
311
+ grpc_core::Fork::DecExecCtxCount();
312
+ }
313
+ } else {
314
+ GPR_DEBUG_ASSERT(head_ == nullptr);
315
+ GPR_DEBUG_ASSERT(tail_ == nullptr);
316
+ }
317
+ }
318
+
319
+ static void Set(ApplicationCallbackExecCtx* exec_ctx, uintptr_t flags) {
320
+ if (reinterpret_cast<ApplicationCallbackExecCtx*>(
321
+ gpr_tls_get(&callback_exec_ctx_)) == nullptr) {
322
+ if (!(GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD & flags)) {
323
+ grpc_core::Fork::IncExecCtxCount();
324
+ }
325
+ gpr_tls_set(&callback_exec_ctx_, reinterpret_cast<intptr_t>(exec_ctx));
326
+ }
327
+ }
328
+
329
+ static void Enqueue(grpc_experimental_completion_queue_functor* functor,
330
+ int is_success) {
331
+ functor->internal_success = is_success;
332
+ functor->internal_next = nullptr;
333
+
334
+ auto* ctx = reinterpret_cast<ApplicationCallbackExecCtx*>(
335
+ gpr_tls_get(&callback_exec_ctx_));
336
+
337
+ if (ctx->head_ == nullptr) {
338
+ ctx->head_ = functor;
339
+ }
340
+ if (ctx->tail_ != nullptr) {
341
+ ctx->tail_->internal_next = functor;
342
+ }
343
+ ctx->tail_ = functor;
344
+ }
345
+
346
+ /** Global initialization for ApplicationCallbackExecCtx. Called by init. */
347
+ static void GlobalInit(void) { gpr_tls_init(&callback_exec_ctx_); }
348
+
349
+ /** Global shutdown for ApplicationCallbackExecCtx. Called by init. */
350
+ static void GlobalShutdown(void) { gpr_tls_destroy(&callback_exec_ctx_); }
351
+
352
+ private:
353
+ uintptr_t flags_{0u};
354
+ grpc_experimental_completion_queue_functor* head_{nullptr};
355
+ grpc_experimental_completion_queue_functor* tail_{nullptr};
356
+ GPR_TLS_CLASS_DECL(callback_exec_ctx_);
357
+ };
229
358
  } // namespace grpc_core
230
359
 
231
360
  #endif /* GRPC_CORE_LIB_IOMGR_EXEC_CTX_H */
@@ -32,35 +32,98 @@
32
32
  #include "src/core/lib/gpr/useful.h"
33
33
  #include "src/core/lib/gprpp/memory.h"
34
34
  #include "src/core/lib/iomgr/exec_ctx.h"
35
+ #include "src/core/lib/iomgr/iomgr.h"
35
36
 
36
37
  #define MAX_DEPTH 2
37
38
 
38
- #define EXECUTOR_TRACE(format, ...) \
39
- if (executor_trace.enabled()) { \
40
- gpr_log(GPR_INFO, "EXECUTOR " format, __VA_ARGS__); \
41
- }
39
+ #define EXECUTOR_TRACE(format, ...) \
40
+ do { \
41
+ if (GRPC_TRACE_FLAG_ENABLED(executor_trace)) { \
42
+ gpr_log(GPR_INFO, "EXECUTOR " format, __VA_ARGS__); \
43
+ } \
44
+ } while (0)
42
45
 
43
- #define EXECUTOR_TRACE0(str) \
44
- if (executor_trace.enabled()) { \
45
- gpr_log(GPR_INFO, "EXECUTOR " str); \
46
- }
46
+ #define EXECUTOR_TRACE0(str) \
47
+ do { \
48
+ if (GRPC_TRACE_FLAG_ENABLED(executor_trace)) { \
49
+ gpr_log(GPR_INFO, "EXECUTOR " str); \
50
+ } \
51
+ } while (0)
47
52
 
48
- grpc_core::TraceFlag executor_trace(false, "executor");
53
+ namespace grpc_core {
54
+ namespace {
49
55
 
50
56
  GPR_TLS_DECL(g_this_thread_state);
51
57
 
52
- GrpcExecutor::GrpcExecutor(const char* name) : name_(name) {
58
+ Executor* executors[static_cast<size_t>(ExecutorType::NUM_EXECUTORS)];
59
+
60
+ void default_enqueue_short(grpc_closure* closure, grpc_error* error) {
61
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Enqueue(
62
+ closure, error, true /* is_short */);
63
+ }
64
+
65
+ void default_enqueue_long(grpc_closure* closure, grpc_error* error) {
66
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Enqueue(
67
+ closure, error, false /* is_short */);
68
+ }
69
+
70
+ void resolver_enqueue_short(grpc_closure* closure, grpc_error* error) {
71
+ executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Enqueue(
72
+ closure, error, true /* is_short */);
73
+ }
74
+
75
+ void resolver_enqueue_long(grpc_closure* closure, grpc_error* error) {
76
+ executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Enqueue(
77
+ closure, error, false /* is_short */);
78
+ }
79
+
80
+ const grpc_closure_scheduler_vtable
81
+ vtables_[static_cast<size_t>(ExecutorType::NUM_EXECUTORS)]
82
+ [static_cast<size_t>(ExecutorJobType::NUM_JOB_TYPES)] = {
83
+ {{&default_enqueue_short, &default_enqueue_short,
84
+ "def-ex-short"},
85
+ {&default_enqueue_long, &default_enqueue_long, "def-ex-long"}},
86
+ {{&resolver_enqueue_short, &resolver_enqueue_short,
87
+ "res-ex-short"},
88
+ {&resolver_enqueue_long, &resolver_enqueue_long,
89
+ "res-ex-long"}}};
90
+
91
+ grpc_closure_scheduler
92
+ schedulers_[static_cast<size_t>(ExecutorType::NUM_EXECUTORS)]
93
+ [static_cast<size_t>(ExecutorJobType::NUM_JOB_TYPES)] = {
94
+ {{&vtables_[static_cast<size_t>(ExecutorType::DEFAULT)]
95
+ [static_cast<size_t>(ExecutorJobType::SHORT)]},
96
+ {&vtables_[static_cast<size_t>(ExecutorType::DEFAULT)]
97
+ [static_cast<size_t>(ExecutorJobType::LONG)]}},
98
+ {{&vtables_[static_cast<size_t>(ExecutorType::RESOLVER)]
99
+ [static_cast<size_t>(ExecutorJobType::SHORT)]},
100
+ {&vtables_[static_cast<size_t>(ExecutorType::RESOLVER)]
101
+ [static_cast<size_t>(ExecutorJobType::LONG)]}}};
102
+
103
+ } // namespace
104
+
105
+ TraceFlag executor_trace(false, "executor");
106
+
107
+ Executor::Executor(const char* name) : name_(name) {
53
108
  adding_thread_lock_ = GPR_SPINLOCK_STATIC_INITIALIZER;
54
109
  gpr_atm_rel_store(&num_threads_, 0);
55
110
  max_threads_ = GPR_MAX(1, 2 * gpr_cpu_num_cores());
56
111
  }
57
112
 
58
- void GrpcExecutor::Init() { SetThreading(true); }
113
+ void Executor::Init() { SetThreading(true); }
59
114
 
60
- size_t GrpcExecutor::RunClosures(const char* executor_name,
61
- grpc_closure_list list) {
115
+ size_t Executor::RunClosures(const char* executor_name,
116
+ grpc_closure_list list) {
62
117
  size_t n = 0;
63
118
 
119
+ // In the executor, the ExecCtx for the thread is declared in the executor
120
+ // thread itself, but this is the point where we could start seeing
121
+ // application-level callbacks. No need to create a new ExecCtx, though,
122
+ // since there already is one and it is flushed (but not destructed) in this
123
+ // function itself.
124
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx(
125
+ GRPC_APP_CALLBACK_EXEC_CTX_FLAG_IS_INTERNAL_THREAD);
126
+
64
127
  grpc_closure* c = list.head;
65
128
  while (c != nullptr) {
66
129
  grpc_closure* next = c->next_data.next;
@@ -82,11 +145,11 @@ size_t GrpcExecutor::RunClosures(const char* executor_name,
82
145
  return n;
83
146
  }
84
147
 
85
- bool GrpcExecutor::IsThreaded() const {
148
+ bool Executor::IsThreaded() const {
86
149
  return gpr_atm_acq_load(&num_threads_) > 0;
87
150
  }
88
151
 
89
- void GrpcExecutor::SetThreading(bool threading) {
152
+ void Executor::SetThreading(bool threading) {
90
153
  gpr_atm curr_num_threads = gpr_atm_acq_load(&num_threads_);
91
154
  EXECUTOR_TRACE("(%s) SetThreading(%d) begin", name_, threading);
92
155
 
@@ -112,7 +175,7 @@ void GrpcExecutor::SetThreading(bool threading) {
112
175
  }
113
176
 
114
177
  thd_state_[0].thd =
115
- grpc_core::Thread(name_, &GrpcExecutor::ThreadMain, &thd_state_[0]);
178
+ grpc_core::Thread(name_, &Executor::ThreadMain, &thd_state_[0]);
116
179
  thd_state_[0].thd.Start();
117
180
  } else { // !threading
118
181
  if (curr_num_threads == 0) {
@@ -148,14 +211,22 @@ void GrpcExecutor::SetThreading(bool threading) {
148
211
 
149
212
  gpr_free(thd_state_);
150
213
  gpr_tls_destroy(&g_this_thread_state);
214
+
215
+ // grpc_iomgr_shutdown_background_closure() will close all the registered
216
+ // fds in the background poller, and wait for all pending closures to
217
+ // finish. Thus, never call Executor::SetThreading(false) in the middle of
218
+ // an application.
219
+ // TODO(guantaol): create another method to finish all the pending closures
220
+ // registered in the background poller by grpc_core::Executor.
221
+ grpc_iomgr_shutdown_background_closure();
151
222
  }
152
223
 
153
224
  EXECUTOR_TRACE("(%s) SetThreading(%d) done", name_, threading);
154
225
  }
155
226
 
156
- void GrpcExecutor::Shutdown() { SetThreading(false); }
227
+ void Executor::Shutdown() { SetThreading(false); }
157
228
 
158
- void GrpcExecutor::ThreadMain(void* arg) {
229
+ void Executor::ThreadMain(void* arg) {
159
230
  ThreadState* ts = static_cast<ThreadState*>(arg);
160
231
  gpr_tls_set(&g_this_thread_state, reinterpret_cast<intptr_t>(ts));
161
232
 
@@ -192,8 +263,8 @@ void GrpcExecutor::ThreadMain(void* arg) {
192
263
  }
193
264
  }
194
265
 
195
- void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error,
196
- bool is_short) {
266
+ void Executor::Enqueue(grpc_closure* closure, grpc_error* error,
267
+ bool is_short) {
197
268
  bool retry_push;
198
269
  if (is_short) {
199
270
  GRPC_STATS_INC_EXECUTOR_SCHEDULED_SHORT_ITEMS();
@@ -220,6 +291,10 @@ void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error,
220
291
  return;
221
292
  }
222
293
 
294
+ if (grpc_iomgr_add_closure_to_background_poller(closure, error)) {
295
+ return;
296
+ }
297
+
223
298
  ThreadState* ts = (ThreadState*)gpr_tls_get(&g_this_thread_state);
224
299
  if (ts == nullptr) {
225
300
  ts = &thd_state_[GPR_HASH_POINTER(grpc_core::ExecCtx::Get(),
@@ -304,7 +379,7 @@ void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error,
304
379
  gpr_atm_rel_store(&num_threads_, cur_thread_count + 1);
305
380
 
306
381
  thd_state_[cur_thread_count].thd = grpc_core::Thread(
307
- name_, &GrpcExecutor::ThreadMain, &thd_state_[cur_thread_count]);
382
+ name_, &Executor::ThreadMain, &thd_state_[cur_thread_count]);
308
383
  thd_state_[cur_thread_count].thd.Start();
309
384
  }
310
385
  gpr_spinlock_unlock(&adding_thread_lock_);
@@ -316,85 +391,52 @@ void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error,
316
391
  } while (retry_push);
317
392
  }
318
393
 
319
- static GrpcExecutor* executors[GRPC_NUM_EXECUTORS];
320
-
321
- void default_enqueue_short(grpc_closure* closure, grpc_error* error) {
322
- executors[GRPC_DEFAULT_EXECUTOR]->Enqueue(closure, error,
323
- true /* is_short */);
324
- }
325
-
326
- void default_enqueue_long(grpc_closure* closure, grpc_error* error) {
327
- executors[GRPC_DEFAULT_EXECUTOR]->Enqueue(closure, error,
328
- false /* is_short */);
329
- }
330
-
331
- void resolver_enqueue_short(grpc_closure* closure, grpc_error* error) {
332
- executors[GRPC_RESOLVER_EXECUTOR]->Enqueue(closure, error,
333
- true /* is_short */);
334
- }
335
-
336
- void resolver_enqueue_long(grpc_closure* closure, grpc_error* error) {
337
- executors[GRPC_RESOLVER_EXECUTOR]->Enqueue(closure, error,
338
- false /* is_short */);
339
- }
340
-
341
- static const grpc_closure_scheduler_vtable
342
- vtables_[GRPC_NUM_EXECUTORS][GRPC_NUM_EXECUTOR_JOB_TYPES] = {
343
- {{&default_enqueue_short, &default_enqueue_short, "def-ex-short"},
344
- {&default_enqueue_long, &default_enqueue_long, "def-ex-long"}},
345
- {{&resolver_enqueue_short, &resolver_enqueue_short, "res-ex-short"},
346
- {&resolver_enqueue_long, &resolver_enqueue_long, "res-ex-long"}}};
347
-
348
- static grpc_closure_scheduler
349
- schedulers_[GRPC_NUM_EXECUTORS][GRPC_NUM_EXECUTOR_JOB_TYPES] = {
350
- {{&vtables_[GRPC_DEFAULT_EXECUTOR][GRPC_EXECUTOR_SHORT]},
351
- {&vtables_[GRPC_DEFAULT_EXECUTOR][GRPC_EXECUTOR_LONG]}},
352
- {{&vtables_[GRPC_RESOLVER_EXECUTOR][GRPC_EXECUTOR_SHORT]},
353
- {&vtables_[GRPC_RESOLVER_EXECUTOR][GRPC_EXECUTOR_LONG]}}};
354
-
355
- // grpc_executor_init() and grpc_executor_shutdown() functions are called in the
394
+ // Executor::InitAll() and Executor::ShutdownAll() functions are called in the
356
395
  // the grpc_init() and grpc_shutdown() code paths which are protected by a
357
396
  // global mutex. So it is okay to assume that these functions are thread-safe
358
- void grpc_executor_init() {
359
- EXECUTOR_TRACE0("grpc_executor_init() enter");
397
+ void Executor::InitAll() {
398
+ EXECUTOR_TRACE0("Executor::InitAll() enter");
360
399
 
361
- // Return if grpc_executor_init() is already called earlier
362
- if (executors[GRPC_DEFAULT_EXECUTOR] != nullptr) {
363
- GPR_ASSERT(executors[GRPC_RESOLVER_EXECUTOR] != nullptr);
400
+ // Return if Executor::InitAll() is already called earlier
401
+ if (executors[static_cast<size_t>(ExecutorType::DEFAULT)] != nullptr) {
402
+ GPR_ASSERT(executors[static_cast<size_t>(ExecutorType::RESOLVER)] !=
403
+ nullptr);
364
404
  return;
365
405
  }
366
406
 
367
- executors[GRPC_DEFAULT_EXECUTOR] =
368
- grpc_core::New<GrpcExecutor>("default-executor");
369
- executors[GRPC_RESOLVER_EXECUTOR] =
370
- grpc_core::New<GrpcExecutor>("resolver-executor");
407
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)] =
408
+ grpc_core::New<Executor>("default-executor");
409
+ executors[static_cast<size_t>(ExecutorType::RESOLVER)] =
410
+ grpc_core::New<Executor>("resolver-executor");
371
411
 
372
- executors[GRPC_DEFAULT_EXECUTOR]->Init();
373
- executors[GRPC_RESOLVER_EXECUTOR]->Init();
412
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Init();
413
+ executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Init();
374
414
 
375
- EXECUTOR_TRACE0("grpc_executor_init() done");
415
+ EXECUTOR_TRACE0("Executor::InitAll() done");
376
416
  }
377
417
 
378
- grpc_closure_scheduler* grpc_executor_scheduler(GrpcExecutorType executor_type,
379
- GrpcExecutorJobType job_type) {
380
- return &schedulers_[executor_type][job_type];
418
+ grpc_closure_scheduler* Executor::Scheduler(ExecutorType executor_type,
419
+ ExecutorJobType job_type) {
420
+ return &schedulers_[static_cast<size_t>(executor_type)]
421
+ [static_cast<size_t>(job_type)];
381
422
  }
382
423
 
383
- grpc_closure_scheduler* grpc_executor_scheduler(GrpcExecutorJobType job_type) {
384
- return grpc_executor_scheduler(GRPC_DEFAULT_EXECUTOR, job_type);
424
+ grpc_closure_scheduler* Executor::Scheduler(ExecutorJobType job_type) {
425
+ return Executor::Scheduler(ExecutorType::DEFAULT, job_type);
385
426
  }
386
427
 
387
- void grpc_executor_shutdown() {
388
- EXECUTOR_TRACE0("grpc_executor_shutdown() enter");
428
+ void Executor::ShutdownAll() {
429
+ EXECUTOR_TRACE0("Executor::ShutdownAll() enter");
389
430
 
390
- // Return if grpc_executor_shutdown() is already called earlier
391
- if (executors[GRPC_DEFAULT_EXECUTOR] == nullptr) {
392
- GPR_ASSERT(executors[GRPC_RESOLVER_EXECUTOR] == nullptr);
431
+ // Return if Executor:SshutdownAll() is already called earlier
432
+ if (executors[static_cast<size_t>(ExecutorType::DEFAULT)] == nullptr) {
433
+ GPR_ASSERT(executors[static_cast<size_t>(ExecutorType::RESOLVER)] ==
434
+ nullptr);
393
435
  return;
394
436
  }
395
437
 
396
- executors[GRPC_DEFAULT_EXECUTOR]->Shutdown();
397
- executors[GRPC_RESOLVER_EXECUTOR]->Shutdown();
438
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)]->Shutdown();
439
+ executors[static_cast<size_t>(ExecutorType::RESOLVER)]->Shutdown();
398
440
 
399
441
  // Delete the executor objects.
400
442
  //
@@ -408,26 +450,36 @@ void grpc_executor_shutdown() {
408
450
  // By ensuring that all executors are shutdown first, we are also ensuring
409
451
  // that no thread is active across all executors.
410
452
 
411
- grpc_core::Delete<GrpcExecutor>(executors[GRPC_DEFAULT_EXECUTOR]);
412
- grpc_core::Delete<GrpcExecutor>(executors[GRPC_RESOLVER_EXECUTOR]);
413
- executors[GRPC_DEFAULT_EXECUTOR] = nullptr;
414
- executors[GRPC_RESOLVER_EXECUTOR] = nullptr;
453
+ grpc_core::Delete<Executor>(
454
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)]);
455
+ grpc_core::Delete<Executor>(
456
+ executors[static_cast<size_t>(ExecutorType::RESOLVER)]);
457
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)] = nullptr;
458
+ executors[static_cast<size_t>(ExecutorType::RESOLVER)] = nullptr;
415
459
 
416
- EXECUTOR_TRACE0("grpc_executor_shutdown() done");
460
+ EXECUTOR_TRACE0("Executor::ShutdownAll() done");
417
461
  }
418
462
 
419
- bool grpc_executor_is_threaded(GrpcExecutorType executor_type) {
420
- GPR_ASSERT(executor_type < GRPC_NUM_EXECUTORS);
421
- return executors[executor_type]->IsThreaded();
463
+ bool Executor::IsThreaded(ExecutorType executor_type) {
464
+ GPR_ASSERT(executor_type < ExecutorType::NUM_EXECUTORS);
465
+ return executors[static_cast<size_t>(executor_type)]->IsThreaded();
422
466
  }
423
467
 
424
- bool grpc_executor_is_threaded() {
425
- return grpc_executor_is_threaded(GRPC_DEFAULT_EXECUTOR);
468
+ bool Executor::IsThreadedDefault() {
469
+ return Executor::IsThreaded(ExecutorType::DEFAULT);
426
470
  }
427
471
 
428
- void grpc_executor_set_threading(bool enable) {
429
- EXECUTOR_TRACE("grpc_executor_set_threading(%d) called", enable);
430
- for (int i = 0; i < GRPC_NUM_EXECUTORS; i++) {
472
+ void Executor::SetThreadingAll(bool enable) {
473
+ EXECUTOR_TRACE("Executor::SetThreadingAll(%d) called", enable);
474
+ for (size_t i = 0; i < static_cast<size_t>(ExecutorType::NUM_EXECUTORS);
475
+ i++) {
431
476
  executors[i]->SetThreading(enable);
432
477
  }
433
478
  }
479
+
480
+ void Executor::SetThreadingDefault(bool enable) {
481
+ EXECUTOR_TRACE("Executor::SetThreadingDefault(%d) called", enable);
482
+ executors[static_cast<size_t>(ExecutorType::DEFAULT)]->SetThreading(enable);
483
+ }
484
+
485
+ } // namespace grpc_core