grpc 1.74.1 → 1.75.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  187. data/src/ruby/lib/grpc/version.rb +1 -1
  188. data/third_party/cares/cares/include/ares.h +925 -460
  189. data/third_party/cares/cares/include/ares_dns.h +86 -71
  190. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  191. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  192. data/third_party/cares/cares/include/ares_version.h +37 -14
  193. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  194. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  195. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  196. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  197. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  198. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  199. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  201. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  202. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  203. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  204. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  205. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  206. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  207. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  208. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  209. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  210. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  211. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  212. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  213. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  214. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  215. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  216. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  217. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  218. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  219. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  220. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  221. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  222. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  223. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  224. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  225. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  226. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  227. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  228. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  229. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  230. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  231. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  232. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  233. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  234. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  235. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  238. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  239. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  240. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  241. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  242. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  243. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  244. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  255. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  265. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  266. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  267. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  273. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  274. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  275. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  276. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  277. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  278. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  279. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  294. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  302. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  303. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  304. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  306. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  307. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  309. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  311. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  313. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  315. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  316. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  317. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  319. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  320. metadata +121 -49
  321. data/src/core/util/ring_buffer.h +0 -122
  322. data/third_party/cares/cares/include/ares_rules.h +0 -125
  323. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  324. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  325. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  326. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  327. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  328. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  329. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  330. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  331. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  332. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  333. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  334. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  335. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  336. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  337. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  338. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  339. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  340. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  341. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  342. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  343. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  344. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  345. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  346. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  347. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  348. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  349. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  350. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  351. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  352. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  353. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  354. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  355. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  356. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  357. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  359. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  360. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  361. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  362. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  363. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  364. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  365. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  366. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  367. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  368. data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -0,0 +1,107 @@
1
+ // Copyright 2025 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_CF_ENGINE_CFSOCKET_LISTENER_H
15
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_CF_ENGINE_CFSOCKET_LISTENER_H
16
+ #include <grpc/support/port_platform.h>
17
+
18
+ #ifdef GPR_APPLE
19
+ #include <AvailabilityMacros.h>
20
+ #ifdef AVAILABLE_MAC_OS_X_VERSION_10_12_AND_LATER
21
+
22
+ #include <CoreFoundation/CoreFoundation.h>
23
+ #include <grpc/event_engine/event_engine.h>
24
+
25
+ #include "src/core/lib/event_engine/cf_engine/cf_engine.h"
26
+ #include "src/core/lib/event_engine/cf_engine/cftype_unique_ref.h"
27
+ #include "src/core/util/ref_counted.h"
28
+ #include "src/core/util/ref_counted_ptr.h"
29
+ #include "src/core/util/sync.h"
30
+
31
+ namespace grpc_event_engine::experimental {
32
+
33
+ class CFSocketListenerImpl
34
+ : public grpc_core::RefCounted<CFSocketListenerImpl> {
35
+ public:
36
+ CFSocketListenerImpl(
37
+ std::shared_ptr<CFEventEngine> engine,
38
+ EventEngine::Listener::AcceptCallback on_accept,
39
+ absl::AnyInvocable<void(absl::Status)> on_shutdown,
40
+ const EndpointConfig& config,
41
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory);
42
+ ~CFSocketListenerImpl();
43
+
44
+ absl::StatusOr<int> Bind(const EventEngine::ResolvedAddress& addr);
45
+ absl::Status Start();
46
+
47
+ void Shutdown();
48
+
49
+ private:
50
+ static const void* Retain(const void* info) {
51
+ auto that = static_cast<const CFSocketListenerImpl*>(info);
52
+ return that->Ref().release();
53
+ }
54
+
55
+ static void Release(const void* info) {
56
+ auto that = static_cast<const CFSocketListenerImpl*>(info);
57
+ that->Unref();
58
+ }
59
+
60
+ static void handleConnect(CFSocketRef s, CFSocketCallBackType type,
61
+ CFDataRef address, const void* data, void* info);
62
+
63
+ private:
64
+ std::shared_ptr<CFEventEngine> engine_;
65
+ dispatch_queue_t queue_ = dispatch_queue_create("cfsocket_listener", nullptr);
66
+
67
+ grpc_core::Mutex mu_;
68
+ bool started_ ABSL_GUARDED_BY(mu_) = false;
69
+ bool shutdown_ ABSL_GUARDED_BY(mu_) = false;
70
+ std::vector<std::tuple<CFTypeUniqueRef<CFSocketRef>>> ipv6cfsocks_
71
+ ABSL_GUARDED_BY(mu_);
72
+ CFRunLoopRef runloop_ ABSL_GUARDED_BY(mu_);
73
+
74
+ EventEngine::Listener::AcceptCallback on_accept_;
75
+ absl::AnyInvocable<void(absl::Status)> on_shutdown_;
76
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory_;
77
+ };
78
+
79
+ class CFSocketListener : public EventEngine::Listener {
80
+ public:
81
+ CFSocketListener(
82
+ std::shared_ptr<CFEventEngine> engine, Listener::AcceptCallback on_accept,
83
+ absl::AnyInvocable<void(absl::Status)> on_shutdown,
84
+ const EndpointConfig& config,
85
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory)
86
+ : impl_(grpc_core::MakeRefCounted<CFSocketListenerImpl>(
87
+ std::move(engine), std::move(on_accept), std::move(on_shutdown),
88
+ config, std::move(memory_allocator_factory))) {}
89
+
90
+ ~CFSocketListener() override { impl_->Shutdown(); }
91
+
92
+ absl::StatusOr<int> Bind(const EventEngine::ResolvedAddress& addr) override {
93
+ return impl_->Bind(addr);
94
+ };
95
+
96
+ absl::Status Start() override { return impl_->Start(); };
97
+
98
+ private:
99
+ grpc_core::RefCountedPtr<CFSocketListenerImpl> impl_;
100
+ };
101
+
102
+ } // namespace grpc_event_engine::experimental
103
+
104
+ #endif // AVAILABLE_MAC_OS_X_VERSION_10_12_AND_LATER
105
+ #endif // GPR_APPLE
106
+
107
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_CF_ENGINE_CFSOCKET_LISTENER_H
@@ -72,6 +72,26 @@ bool CFStreamEndpointImpl::CancelConnect(absl::Status status) {
72
72
  return open_event_.SetShutdown(std::move(status));
73
73
  }
74
74
 
75
+ void CFStreamEndpointImpl::AcceptSocket(
76
+ absl::AnyInvocable<void(absl::Status)> on_connect,
77
+ CFSocketNativeHandle sock, const EventEngine::ResolvedAddress& addr) {
78
+ peer_address_ = addr;
79
+ auto host_port = ResolvedAddressToNormalizedString(peer_address_);
80
+ if (!host_port.ok()) {
81
+ on_connect(std::move(host_port).status());
82
+ return;
83
+ }
84
+
85
+ peer_address_string_ = host_port.value();
86
+ GRPC_TRACE_LOG(event_engine_endpoint, INFO)
87
+ << "CFStreamEndpointImpl::AcceptSocket, host_port: "
88
+ << peer_address_string_;
89
+
90
+ CFStreamCreatePairWithSocket(nullptr, sock, &cf_read_stream_,
91
+ &cf_write_stream_);
92
+ SetupStreams(std::move(on_connect));
93
+ }
94
+
75
95
  void CFStreamEndpointImpl::Connect(
76
96
  absl::AnyInvocable<void(absl::Status)> on_connect,
77
97
  EventEngine::ResolvedAddress addr) {
@@ -105,6 +125,11 @@ void CFStreamEndpointImpl::Connect(
105
125
  CFStreamCreatePairWithSocketToHost(NULL, host, port, &cf_read_stream_,
106
126
  &cf_write_stream_);
107
127
 
128
+ SetupStreams(std::move(on_connect));
129
+ }
130
+
131
+ void CFStreamEndpointImpl::SetupStreams(
132
+ absl::AnyInvocable<void(absl::Status)> on_connect) {
108
133
  CFStreamClientContext cf_context = {0, this, Retain, Release, nullptr};
109
134
  CFReadStreamSetClient(
110
135
  cf_read_stream_,
@@ -223,9 +248,9 @@ CFStreamEndpointImpl::CFStreamEndpointImpl(
223
248
  std::shared_ptr<CFEventEngine> engine, MemoryAllocator memory_allocator)
224
249
  : engine_(std::move(engine)),
225
250
  memory_allocator_(std::move(memory_allocator)),
226
- open_event_(engine_.get()),
227
- read_event_(engine_.get()),
228
- write_event_(engine_.get()) {
251
+ open_event_(engine_->thread_pool()),
252
+ read_event_(engine_->thread_pool()),
253
+ write_event_(engine_->thread_pool()) {
229
254
  open_event_.InitEvent();
230
255
  read_event_.InitEvent();
231
256
  write_event_.InitEvent();
@@ -235,6 +260,9 @@ CFStreamEndpointImpl::~CFStreamEndpointImpl() {
235
260
  open_event_.DestroyEvent();
236
261
  read_event_.DestroyEvent();
237
262
  write_event_.DestroyEvent();
263
+
264
+ GRPC_TRACE_LOG(event_engine_endpoint, INFO)
265
+ << "CFStreamEndpointImpl::~CFStreamEndpointImpl: this: " << this;
238
266
  }
239
267
 
240
268
  void CFStreamEndpointImpl::Shutdown() {
@@ -60,7 +60,13 @@ class CFStreamEndpointImpl
60
60
  EventEngine::ResolvedAddress addr);
61
61
  bool CancelConnect(absl::Status status);
62
62
 
63
+ void AcceptSocket(absl::AnyInvocable<void(absl::Status)> on_connect,
64
+ CFSocketNativeHandle sock,
65
+ const EventEngine::ResolvedAddress& addr);
66
+
63
67
  private:
68
+ void SetupStreams(absl::AnyInvocable<void(absl::Status)> on_connect);
69
+
64
70
  void DoWrite(absl::AnyInvocable<void(absl::Status)> on_writable,
65
71
  SliceBuffer* data);
66
72
  void DoRead(absl::AnyInvocable<void(absl::Status)> on_read,
@@ -137,6 +143,12 @@ class CFStreamEndpoint : public EventEngine::Endpoint {
137
143
  return impl_->CancelConnect(std::move(status));
138
144
  }
139
145
 
146
+ void AcceptSocket(absl::AnyInvocable<void(absl::Status)> on_connect,
147
+ CFSocketNativeHandle sock,
148
+ const EventEngine::ResolvedAddress& addr) {
149
+ return impl_->AcceptSocket(std::move(on_connect), sock, addr);
150
+ }
151
+
140
152
  private:
141
153
  grpc_core::RefCountedPtr<CFStreamEndpointImpl> impl_;
142
154
  };
@@ -60,9 +60,9 @@ class Epoll1EventHandle : public EventHandle {
60
60
  Epoll1EventHandle(const FileDescriptor& fd, Epoll1Poller* poller)
61
61
  : fd_(fd),
62
62
  poller_(poller),
63
- read_closure_(poller->GetScheduler()),
64
- write_closure_(poller->GetScheduler()),
65
- error_closure_(poller->GetScheduler()) {
63
+ read_closure_(poller->GetThreadPool()),
64
+ write_closure_(poller->GetThreadPool()),
65
+ error_closure_(poller->GetThreadPool()) {
66
66
  read_closure_.InitEvent();
67
67
  write_closure_.InitEvent();
68
68
  error_closure_.InitEvent();
@@ -217,7 +217,7 @@ void Epoll1EventHandle::OrphanHandle(PosixEngineClosure* on_done,
217
217
  }
218
218
  if (on_done != nullptr) {
219
219
  on_done->SetStatus(absl::OkStatus());
220
- poller_->GetScheduler()->Run(on_done);
220
+ poller_->GetThreadPool()->Run(on_done);
221
221
  }
222
222
  }
223
223
 
@@ -243,8 +243,8 @@ void Epoll1EventHandle::HandleShutdownInternal(absl::Status why,
243
243
  }
244
244
  }
245
245
 
246
- Epoll1Poller::Epoll1Poller(Scheduler* scheduler)
247
- : scheduler_(scheduler), was_kicked_(false), closed_(false) {
246
+ Epoll1Poller::Epoll1Poller(std::shared_ptr<ThreadPool> thread_pool)
247
+ : thread_pool_(thread_pool), was_kicked_(false), closed_(false) {
248
248
  g_epoll_set_.epfd = posix_interface().EpollCreateAndCloexec().value();
249
249
  wakeup_fd_ = CreateWakeupFd(&posix_interface()).value();
250
250
  CHECK(wakeup_fd_ != nullptr);
@@ -493,10 +493,11 @@ void Epoll1Poller::ResetKickState() {
493
493
  was_kicked_ = false;
494
494
  }
495
495
 
496
- std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* scheduler) {
496
+ std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(
497
+ std::shared_ptr<ThreadPool> thread_pool) {
497
498
  static bool kEpoll1PollerSupported = InitEpoll1PollerLinux();
498
499
  if (kEpoll1PollerSupported) {
499
- return std::make_shared<Epoll1Poller>(scheduler);
500
+ return std::make_shared<Epoll1Poller>(std::move(thread_pool));
500
501
  }
501
502
  return nullptr;
502
503
  }
@@ -511,7 +512,7 @@ namespace grpc_event_engine::experimental {
511
512
  using ::grpc_event_engine::experimental::EventEngine;
512
513
  using ::grpc_event_engine::experimental::Poller;
513
514
 
514
- Epoll1Poller::Epoll1Poller(Scheduler* /* engine */) {
515
+ Epoll1Poller::Epoll1Poller(std::shared_ptr<ThreadPool> /* thread_pool */) {
515
516
  grpc_core::Crash("unimplemented");
516
517
  }
517
518
 
@@ -548,7 +549,8 @@ void Epoll1Poller::ResetKickState() { grpc_core::Crash("unimplemented"); }
548
549
 
549
550
  // If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
550
551
  // nullptr.
551
- std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* /*scheduler*/) {
552
+ std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(
553
+ std::shared_ptr<ThreadPool> /*thread_pool*/) {
552
554
  return nullptr;
553
555
  }
554
556
 
@@ -30,6 +30,7 @@
30
30
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
31
31
  #include "src/core/lib/event_engine/posix_engine/internal_errqueue.h"
32
32
  #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
33
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
33
34
  #include "src/core/lib/iomgr/port.h"
34
35
  #include "src/core/util/sync.h"
35
36
 
@@ -46,7 +47,7 @@ class Epoll1EventHandle;
46
47
  // Definition of epoll1 based poller.
47
48
  class Epoll1Poller : public PosixEventPoller {
48
49
  public:
49
- explicit Epoll1Poller(Scheduler* scheduler);
50
+ explicit Epoll1Poller(std::shared_ptr<ThreadPool> thread_pool);
50
51
  EventHandle* CreateHandle(FileDescriptor fd, absl::string_view name,
51
52
  bool track_err) override;
52
53
  Poller::WorkResult Work(
@@ -54,7 +55,7 @@ class Epoll1Poller : public PosixEventPoller {
54
55
  absl::FunctionRef<void()> schedule_poll_again) override;
55
56
  std::string Name() override { return "epoll1"; }
56
57
  void Kick() override;
57
- Scheduler* GetScheduler() { return scheduler_; }
58
+ ThreadPool* GetThreadPool() { return thread_pool_.get(); }
58
59
  bool CanTrackErrors() const override {
59
60
  #ifdef GRPC_POSIX_SOCKET_TCP
60
61
  return KernelSupportsErrqueue();
@@ -109,7 +110,7 @@ class Epoll1Poller : public PosixEventPoller {
109
110
  struct EpollSet {};
110
111
  #endif
111
112
  grpc_core::Mutex mu_;
112
- Scheduler* scheduler_;
113
+ std::shared_ptr<ThreadPool> thread_pool_;
113
114
  // A singleton epoll set
114
115
  EpollSet g_epoll_set_;
115
116
  bool was_kicked_ ABSL_GUARDED_BY(mu_);
@@ -123,7 +124,8 @@ class Epoll1Poller : public PosixEventPoller {
123
124
 
124
125
  // Return an instance of a epoll1 based poller tied to the specified event
125
126
  // engine.
126
- std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(Scheduler* scheduler);
127
+ std::shared_ptr<Epoll1Poller> MakeEpoll1Poller(
128
+ std::shared_ptr<ThreadPool> thread_pool);
127
129
 
128
130
  } // namespace grpc_event_engine::experimental
129
131
 
@@ -72,7 +72,7 @@ class PollEventHandle : public EventHandle {
72
72
  : fd_(fd),
73
73
  pending_actions_(0),
74
74
  poller_handles_list_(this),
75
- scheduler_(poller->GetScheduler()),
75
+ thread_pool_(poller->GetThreadPool()),
76
76
  poller_(std::move(poller)),
77
77
  is_orphaned_(false),
78
78
  is_shutdown_(false),
@@ -175,7 +175,7 @@ class PollEventHandle : public EventHandle {
175
175
  void Unref() {
176
176
  if (ref_count_.fetch_sub(1, std::memory_order_acq_rel) == 1) {
177
177
  if (on_done_ != nullptr) {
178
- scheduler_->Run(on_done_);
178
+ thread_pool_->Run(on_done_);
179
179
  }
180
180
  delete this;
181
181
  }
@@ -200,7 +200,7 @@ class PollEventHandle : public EventHandle {
200
200
  FileDescriptor fd_;
201
201
  int pending_actions_;
202
202
  PollPoller::HandlesList poller_handles_list_;
203
- Scheduler* scheduler_;
203
+ ThreadPool* thread_pool_;
204
204
  std::shared_ptr<PollPoller> poller_;
205
205
  bool is_orphaned_;
206
206
  bool is_shutdown_;
@@ -293,7 +293,7 @@ int PollEventHandle::NotifyOnLocked(PosixEngineClosure** st,
293
293
  PosixEngineClosure* closure) {
294
294
  if (is_shutdown_ || pollhup_) {
295
295
  closure->SetStatus(shutdown_error_);
296
- scheduler_->Run(closure);
296
+ thread_pool_->Run(closure);
297
297
  } else if (*st == reinterpret_cast<PosixEngineClosure*>(kClosureNotReady)) {
298
298
  // not ready ==> switch to a waiting state by setting the closure
299
299
  *st = closure;
@@ -302,7 +302,7 @@ int PollEventHandle::NotifyOnLocked(PosixEngineClosure** st,
302
302
  // already ready ==> queue the closure to run immediately
303
303
  *st = reinterpret_cast<PosixEngineClosure*>(kClosureNotReady);
304
304
  closure->SetStatus(shutdown_error_);
305
- scheduler_->Run(closure);
305
+ thread_pool_->Run(closure);
306
306
  return 1;
307
307
  } else {
308
308
  // upcallptr was set to a different closure. This is an error!
@@ -327,7 +327,7 @@ int PollEventHandle::SetReadyLocked(PosixEngineClosure** st) {
327
327
  PosixEngineClosure* closure = *st;
328
328
  *st = reinterpret_cast<PosixEngineClosure*>(kClosureNotReady);
329
329
  closure->SetStatus(shutdown_error_);
330
- scheduler_->Run(closure);
330
+ thread_pool_->Run(closure);
331
331
  return 1;
332
332
  }
333
333
  }
@@ -402,7 +402,7 @@ void PollEventHandle::NotifyOnError(PosixEngineClosure* on_error) {
402
402
  on_error->SetStatus(
403
403
  absl::Status(absl::StatusCode::kCancelled,
404
404
  "Polling engine does not support tracking errors"));
405
- scheduler_->Run(on_error);
405
+ thread_pool_->Run(on_error);
406
406
  }
407
407
 
408
408
  void PollEventHandle::SetReadable() {
@@ -503,8 +503,9 @@ void PollPoller::PollerHandlesListRemoveHandle(PollEventHandle* handle) {
503
503
  --num_poll_handles_;
504
504
  }
505
505
 
506
- PollPoller::PollPoller(Scheduler* scheduler, bool use_phony_poll)
507
- : scheduler_(scheduler),
506
+ PollPoller::PollPoller(std::shared_ptr<ThreadPool> thread_pool,
507
+ bool use_phony_poll)
508
+ : thread_pool_(std::move(thread_pool)),
508
509
  use_phony_poll_(use_phony_poll),
509
510
  was_kicked_(false),
510
511
  was_kicked_ext_(false),
@@ -752,12 +753,12 @@ void PollPoller::ResetKickState() {
752
753
  was_kicked_ext_ = false;
753
754
  }
754
755
 
755
- std::shared_ptr<PollPoller> MakePollPoller(Scheduler* scheduler,
756
- bool use_phony_poll) {
756
+ std::shared_ptr<PollPoller> MakePollPoller(
757
+ std::shared_ptr<ThreadPool> thread_pool, bool use_phony_poll) {
757
758
  static bool kPollPollerSupported =
758
759
  grpc_event_engine::experimental::SupportsWakeupFd();
759
760
  if (kPollPollerSupported) {
760
- return std::make_shared<PollPoller>(scheduler, use_phony_poll);
761
+ return std::make_shared<PollPoller>(std::move(thread_pool), use_phony_poll);
761
762
  }
762
763
  return nullptr;
763
764
  }
@@ -788,8 +789,8 @@ void PollPoller::Kick() { grpc_core::Crash("unimplemented"); }
788
789
 
789
790
  // If GRPC_LINUX_EPOLL is not defined, it means epoll is not available. Return
790
791
  // nullptr.
791
- std::shared_ptr<PollPoller> MakePollPoller(Scheduler* /*scheduler*/,
792
- bool /* use_phony_poll */) {
792
+ std::shared_ptr<PollPoller> MakePollPoller(
793
+ std::shared_ptr<ThreadPool> /*thread_pool*/, bool /* use_phony_poll */) {
793
794
  return nullptr;
794
795
  }
795
796
 
@@ -27,6 +27,7 @@
27
27
  #include "src/core/lib/event_engine/poller.h"
28
28
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
29
29
  #include "src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h"
30
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
30
31
  #include "src/core/util/sync.h"
31
32
 
32
33
  namespace grpc_event_engine::experimental {
@@ -37,7 +38,8 @@ class PollEventHandle;
37
38
  class PollPoller : public PosixEventPoller,
38
39
  public std::enable_shared_from_this<PollPoller> {
39
40
  public:
40
- explicit PollPoller(Scheduler* scheduler, bool use_phony_poll = false);
41
+ explicit PollPoller(std::shared_ptr<ThreadPool> thread_pool,
42
+ bool use_phony_poll = false);
41
43
  EventHandle* CreateHandle(FileDescriptor fd, absl::string_view name,
42
44
  bool track_err) override;
43
45
  Poller::WorkResult Work(
@@ -45,7 +47,7 @@ class PollPoller : public PosixEventPoller,
45
47
  absl::FunctionRef<void()> schedule_poll_again) override;
46
48
  std::string Name() override { return "poll"; }
47
49
  void Kick() override;
48
- Scheduler* GetScheduler() { return scheduler_; }
50
+ ThreadPool* GetThreadPool() { return thread_pool_.get(); }
49
51
  bool CanTrackErrors() const override { return false; }
50
52
  ~PollPoller() override;
51
53
 
@@ -71,7 +73,7 @@ class PollPoller : public PosixEventPoller,
71
73
  PollEventHandle* prev = nullptr;
72
74
  };
73
75
  grpc_core::Mutex mu_;
74
- Scheduler* scheduler_;
76
+ std::shared_ptr<ThreadPool> thread_pool_;
75
77
  bool use_phony_poll_;
76
78
  bool was_kicked_ ABSL_GUARDED_BY(mu_);
77
79
  bool was_kicked_ext_ ABSL_GUARDED_BY(mu_);
@@ -85,8 +87,8 @@ class PollPoller : public PosixEventPoller,
85
87
  // It use_phony_poll is true, it implies that the poller is declared
86
88
  // non-polling and any attempt to schedule a blocking poll will result in a
87
89
  // crash failure.
88
- std::shared_ptr<PollPoller> MakePollPoller(Scheduler* scheduler,
89
- bool use_phony_poll);
90
+ std::shared_ptr<PollPoller> MakePollPoller(
91
+ std::shared_ptr<ThreadPool> thread_pool, bool use_phony_poll);
90
92
 
91
93
  } // namespace grpc_event_engine::experimental
92
94
 
@@ -19,7 +19,6 @@
19
19
 
20
20
  #include <string>
21
21
 
22
- #include "absl/functional/any_invocable.h"
23
22
  #include "absl/status/status.h"
24
23
  #include "absl/strings/string_view.h"
25
24
  #include "src/core/lib/event_engine/poller.h"
@@ -28,13 +27,6 @@
28
27
 
29
28
  namespace grpc_event_engine::experimental {
30
29
 
31
- class Scheduler {
32
- public:
33
- virtual void Run(experimental::EventEngine::Closure* closure) = 0;
34
- virtual void Run(absl::AnyInvocable<void()>) = 0;
35
- virtual ~Scheduler() = default;
36
- };
37
-
38
30
  class PosixEventPoller;
39
31
 
40
32
  class EventHandle {
@@ -15,6 +15,7 @@
15
15
  #include <grpc/support/port_platform.h>
16
16
 
17
17
  #include <memory>
18
+ #include <utility>
18
19
 
19
20
  #include "absl/strings/str_split.h"
20
21
  #include "absl/strings/string_view.h"
@@ -34,22 +35,26 @@ bool PollStrategyMatches(absl::string_view strategy, absl::string_view want) {
34
35
  }
35
36
  } // namespace
36
37
 
37
- std::shared_ptr<PosixEventPoller> MakeDefaultPoller(Scheduler* scheduler) {
38
+ std::shared_ptr<PosixEventPoller> MakeDefaultPoller(
39
+ std::shared_ptr<ThreadPool> thread_pool) {
40
+ // Note that Make*Poller are allowed to return nullptr - e.g. MakeEpoll1Poller
41
+ // would return nullptr if an epoll poller is requested on unsupported
42
+ // platform.
38
43
  std::shared_ptr<PosixEventPoller> poller;
39
44
  auto strings =
40
45
  absl::StrSplit(grpc_core::ConfigVars::Get().PollStrategy(), ',');
41
46
  for (auto it = strings.begin(); it != strings.end() && poller == nullptr;
42
47
  it++) {
43
48
  if (PollStrategyMatches(*it, "epoll1")) {
44
- poller = MakeEpoll1Poller(scheduler);
49
+ poller = MakeEpoll1Poller(thread_pool);
45
50
  }
46
51
  if (poller == nullptr && PollStrategyMatches(*it, "poll")) {
47
52
  // If epoll1 fails and if poll strategy matches "poll", use Poll poller
48
- poller = MakePollPoller(scheduler, /*use_phony_poll=*/false);
53
+ poller = MakePollPoller(thread_pool, /*use_phony_poll=*/false);
49
54
  } else if (poller == nullptr && PollStrategyMatches(*it, "none")) {
50
55
  // If epoll1 fails and if poll strategy matches "none", use phony poll
51
56
  // poller.
52
- poller = MakePollPoller(scheduler, /*use_phony_poll=*/true);
57
+ poller = MakePollPoller(thread_pool, /*use_phony_poll=*/true);
53
58
  }
54
59
  }
55
60
  return poller;
@@ -57,7 +62,8 @@ std::shared_ptr<PosixEventPoller> MakeDefaultPoller(Scheduler* scheduler) {
57
62
 
58
63
  #else // GRPC_POSIX_SOCKET_TCP
59
64
 
60
- std::shared_ptr<PosixEventPoller> MakeDefaultPoller(Scheduler* /*scheduler*/) {
65
+ std::shared_ptr<PosixEventPoller> MakeDefaultPoller(
66
+ std::shared_ptr<ThreadPool> /*thread_pool*/) {
61
67
  return nullptr;
62
68
  }
63
69
 
@@ -22,11 +22,12 @@
22
22
  namespace grpc_event_engine::experimental {
23
23
 
24
24
  class PosixEventPoller;
25
- class Scheduler;
25
+ class ThreadPool;
26
26
 
27
27
  // Return an instance of an event poller which is tied to the specified
28
28
  // scheduler.
29
- std::shared_ptr<PosixEventPoller> MakeDefaultPoller(Scheduler* scheduler);
29
+ std::shared_ptr<PosixEventPoller> MakeDefaultPoller(
30
+ std::shared_ptr<ThreadPool> thread_pool);
30
31
 
31
32
  } // namespace grpc_event_engine::experimental
32
33
 
@@ -118,6 +118,7 @@ class GrpcPolledFdFactoryPosix : public GrpcPolledFdFactory {
118
118
  ares_socket_t as) override {
119
119
  grpc_core::MutexLock lock(&mu_);
120
120
  owned_fds_.insert(as);
121
+ CHECK_NE(poller_, nullptr);
121
122
  FileDescriptor fd(as, poller_->posix_interface().generation());
122
123
  return std::make_unique<GrpcPolledFdPosix>(
123
124
  as,
@@ -117,7 +117,7 @@ void LockfreeEvent::NotifyOn(PosixEngineClosure* closure) {
117
117
  if (state_.compare_exchange_strong(curr, kClosureNotReady,
118
118
  std::memory_order_acq_rel,
119
119
  std::memory_order_acquire)) {
120
- scheduler_->Run(closure);
120
+ thread_pool_->Run(closure);
121
121
  return; // Successful. Return.
122
122
  }
123
123
  break; // retry
@@ -131,7 +131,7 @@ void LockfreeEvent::NotifyOn(PosixEngineClosure* closure) {
131
131
  absl::Status shutdown_err =
132
132
  grpc_core::internal::StatusGetFromHeapPtr(curr & ~kShutdownBit);
133
133
  closure->SetStatus(shutdown_err);
134
- scheduler_->Run(closure);
134
+ thread_pool_->Run(closure);
135
135
  return;
136
136
  }
137
137
 
@@ -187,7 +187,7 @@ bool LockfreeEvent::SetShutdown(absl::Status shutdown_error) {
187
187
  std::memory_order_acquire)) {
188
188
  auto closure = reinterpret_cast<PosixEngineClosure*>(curr);
189
189
  closure->SetStatus(shutdown_error);
190
- scheduler_->Run(closure);
190
+ thread_pool_->Run(closure);
191
191
  return true;
192
192
  }
193
193
  // 'curr' was a closure but now changed to a different state. We will
@@ -234,7 +234,7 @@ void LockfreeEvent::SetReady() {
234
234
  // notify_on (or set_shutdown)
235
235
  auto closure = reinterpret_cast<PosixEngineClosure*>(curr);
236
236
  closure->SetStatus(absl::OkStatus());
237
- scheduler_->Run(closure);
237
+ thread_pool_->Run(closure);
238
238
  return;
239
239
  }
240
240
  // else the state changed again (only possible by either a racing
@@ -21,14 +21,13 @@
21
21
 
22
22
  #include "absl/status/status.h"
23
23
  #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
24
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
24
25
 
25
26
  namespace grpc_event_engine::experimental {
26
27
 
27
- class Scheduler;
28
-
29
28
  class LockfreeEvent {
30
29
  public:
31
- explicit LockfreeEvent(Scheduler* scheduler) : scheduler_(scheduler) {}
30
+ explicit LockfreeEvent(ThreadPool* thread_pool) : thread_pool_(thread_pool) {}
32
31
 
33
32
  LockfreeEvent(const LockfreeEvent&) = delete;
34
33
  LockfreeEvent& operator=(const LockfreeEvent&) = delete;
@@ -62,7 +61,7 @@ class LockfreeEvent {
62
61
  enum State { kClosureNotReady = 0, kClosureReady = 2, kShutdownBit = 1 };
63
62
 
64
63
  std::atomic<intptr_t> state_;
65
- Scheduler* scheduler_;
64
+ ThreadPool* thread_pool_;
66
65
  };
67
66
 
68
67
  } // namespace grpc_event_engine::experimental
@@ -99,7 +99,7 @@ PosixErrorOr<int64_t> TcpSend(EventEnginePosixInterface* posix_interface,
99
99
  const FileDescriptor& fd,
100
100
  const struct msghdr* msg, int* saved_errno,
101
101
  int additional_flags = 0) {
102
- GRPC_LATENT_SEE_PARENT_SCOPE("TcpSend");
102
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("TcpSend");
103
103
  PosixErrorOr<int64_t> send_result;
104
104
  do {
105
105
  grpc_core::global_stats().IncrementSyscallWrite();
@@ -290,7 +290,7 @@ absl::Status PosixEndpointImpl::TcpAnnotateError(absl::Status src_error) const {
290
290
 
291
291
  // Returns true if data available to read or error other than EAGAIN.
292
292
  bool PosixEndpointImpl::TcpDoRead(absl::Status& status) {
293
- GRPC_LATENT_SEE_INNER_SCOPE("TcpDoRead");
293
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("TcpDoRead");
294
294
 
295
295
  struct msghdr msg;
296
296
  struct iovec iov[MAX_READ_IOVEC];