grpc 1.73.0 → 1.74.0

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 (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -27,11 +27,12 @@
27
27
 
28
28
  #include "absl/base/thread_annotations.h"
29
29
  #include "absl/container/flat_hash_map.h"
30
+ #include "absl/container/inlined_vector.h"
30
31
  #include "absl/functional/any_invocable.h"
31
- #include "absl/hash/hash.h"
32
32
  #include "absl/status/status.h"
33
33
  #include "absl/status/statusor.h"
34
34
  #include "absl/strings/string_view.h"
35
+ #include "src/core/lib/event_engine/ares_resolver.h"
35
36
  #include "src/core/lib/event_engine/handle_containers.h"
36
37
  #include "src/core/lib/event_engine/posix.h"
37
38
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
@@ -39,7 +40,6 @@
39
40
  #include "src/core/lib/event_engine/ref_counted_dns_resolver_interface.h"
40
41
  #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
41
42
  #include "src/core/lib/iomgr/port.h"
42
- #include "src/core/lib/surface/init_internally.h"
43
43
  #include "src/core/util/orphanable.h"
44
44
  #include "src/core/util/sync.h"
45
45
 
@@ -103,7 +103,7 @@ class PosixEnginePollerManager
103
103
  explicit PosixEnginePollerManager(
104
104
  std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
105
105
  poller);
106
- grpc_event_engine::experimental::PosixEventPoller* Poller() {
106
+ grpc_event_engine::experimental::PosixEventPoller* Poller() const {
107
107
  return poller_.get();
108
108
  }
109
109
 
@@ -118,8 +118,6 @@ class PosixEnginePollerManager
118
118
  }
119
119
  void TriggerShutdown();
120
120
 
121
- ~PosixEnginePollerManager() override;
122
-
123
121
  private:
124
122
  enum class PollerState { kExternal, kOk, kShuttingDown };
125
123
  std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller> poller_;
@@ -127,12 +125,12 @@ class PosixEnginePollerManager
127
125
  std::shared_ptr<ThreadPool> executor_;
128
126
  bool trigger_shutdown_called_;
129
127
  };
128
+
130
129
  #endif // GRPC_POSIX_SOCKET_TCP
131
130
 
132
131
  // An iomgr-based Posix EventEngine implementation.
133
132
  // All methods require an ExecCtx to already exist on the thread's stack.
134
- class PosixEventEngine final : public PosixEventEngineWithFdSupport,
135
- public grpc_core::KeepsGrpcInitialized {
133
+ class PosixEventEngine final : public PosixEventEngineWithFdSupport {
136
134
  public:
137
135
  class PosixDNSResolver : public EventEngine::DNSResolver {
138
136
  public:
@@ -198,6 +196,13 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
198
196
  bool Cancel(TaskHandle handle) override;
199
197
 
200
198
  #ifdef GRPC_POSIX_SOCKET_TCP
199
+
200
+ #ifdef GRPC_ENABLE_FORK_SUPPORT
201
+ enum class OnForkRole { kChild, kParent };
202
+ void AfterFork(OnForkRole on_fork_role);
203
+ void BeforeFork();
204
+ #endif // GRPC_ENABLE_FORK_SUPPORT
205
+
201
206
  // The posix EventEngine returned by this method would have a shared ownership
202
207
  // of the poller and would not be in-charge of driving the poller by calling
203
208
  // its Work(..) method. Instead its upto the test to drive the poller. The
@@ -209,15 +214,15 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
209
214
  #endif // GRPC_POSIX_SOCKET_TCP
210
215
 
211
216
  private:
217
+ friend class AresResolverTest;
212
218
  struct ClosureData;
213
219
 
214
220
  PosixEventEngine();
215
221
 
216
222
  #ifdef GRPC_POSIX_SOCKET_TCP
217
- // Constructs an EventEngine which has a shared ownership of the poller. Do
218
- // not call this constructor directly. Instead use the
219
- // MakeTestOnlyPosixEventEngine static method. Its expected to be used only in
220
- // tests.
223
+ // Constructs an EventEngine which has a shared ownership of the poller. Use
224
+ // the MakeTestOnlyPosixEventEngine static method to call this. Its expected
225
+ // to be used only in tests.
221
226
  explicit PosixEventEngine(
222
227
  std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
223
228
  poller);
@@ -234,11 +239,8 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
234
239
  ABSL_GUARDED_BY(&mu);
235
240
  };
236
241
 
237
- static void PollerWorkInternal(
238
- std::shared_ptr<PosixEnginePollerManager> poller_manager);
239
-
240
242
  ConnectionHandle CreateEndpointFromUnconnectedFdInternal(
241
- int fd, EventEngine::OnConnectCallback on_connect,
243
+ const FileDescriptor& fd, EventEngine::OnConnectCallback on_connect,
242
244
  const EventEngine::ResolvedAddress& addr, const PosixTcpOptions& options,
243
245
  MemoryAllocator memory_allocator, EventEngine::Duration timeout);
244
246
 
@@ -249,14 +251,55 @@ class PosixEventEngine final : public PosixEventEngineWithFdSupport,
249
251
 
250
252
  #endif // GRPC_POSIX_SOCKET_TCP
251
253
 
254
+ #if GRPC_ENABLE_FORK_SUPPORT
255
+ void AfterForkInChild();
256
+ #endif
257
+
252
258
  grpc_core::Mutex mu_;
253
259
  TaskHandleSet known_handles_ ABSL_GUARDED_BY(mu_);
254
260
  std::atomic<intptr_t> aba_token_{0};
261
+ #if GRPC_ENABLE_FORK_SUPPORT && GRPC_ARES == 1 && \
262
+ defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
263
+ // A separate mutex to avoid deadlocks.
264
+ grpc_core::Mutex resolver_handles_mu_;
265
+ absl::InlinedVector<std::weak_ptr<AresResolver::ReinitHandle>, 16>
266
+ resolver_handles_ ABSL_GUARDED_BY(resolver_handles_mu_);
267
+ #endif // defined(GRPC_ENABLE_FORK_SUPPORT) && GRPC_ARES == 1 &&
268
+ // defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
255
269
  std::shared_ptr<ThreadPool> executor_;
270
+
271
+ #if defined(GRPC_POSIX_SOCKET_TCP) && \
272
+ !defined(GRPC_DO_NOT_INSTANTIATE_POSIX_POLLER)
273
+
274
+ // RAII wrapper for a polling cycle. Starts a new one in ctor and stops
275
+ // in dtor.
276
+ class PollingCycle {
277
+ public:
278
+ explicit PollingCycle(PosixEnginePollerManager* poller_manager);
279
+ ~PollingCycle();
280
+
281
+ private:
282
+ void PollerWorkInternal();
283
+
284
+ PosixEnginePollerManager* poller_manager_;
285
+ grpc_core::Mutex mu_;
286
+ std::atomic_bool done_{false};
287
+ int is_scheduled_ ABSL_GUARDED_BY(&mu_) = 0;
288
+ grpc_core::CondVar cond_;
289
+ };
290
+
291
+ void SchedulePoller();
292
+ void ResetPollCycle();
293
+
294
+ PosixEnginePollerManager poller_manager_;
295
+
296
+ // Ensures there's ever only one of these.
297
+ std::optional<PollingCycle> polling_cycle_ ABSL_GUARDED_BY(&mu_);
298
+
299
+ #endif // defined(GRPC_POSIX_SOCKET_TCP) &&
300
+ // !defined(GRPC_DO_NOT_INSTANTIATE_POSIX_POLLER)
301
+
256
302
  std::shared_ptr<TimerManager> timer_manager_;
257
- #ifdef GRPC_POSIX_SOCKET_TCP
258
- std::shared_ptr<PosixEnginePollerManager> poller_manager_;
259
- #endif // GRPC_POSIX_SOCKET_TCP
260
303
  };
261
304
 
262
305
  } // namespace grpc_event_engine::experimental
@@ -30,7 +30,6 @@
30
30
  #include <optional>
31
31
  #include <string>
32
32
  #include <tuple>
33
- #include <type_traits>
34
33
  #include <utility>
35
34
 
36
35
  #include "absl/functional/any_invocable.h"
@@ -42,6 +41,7 @@
42
41
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
43
42
  #include "src/core/lib/event_engine/posix_engine/posix_endpoint.h"
44
43
  #include "src/core/lib/event_engine/posix_engine/posix_engine_listener.h"
44
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
45
45
  #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
46
46
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
47
47
  #include "src/core/lib/iomgr/socket_mutator.h"
@@ -80,16 +80,15 @@ absl::StatusOr<int> PosixEngineListenerImpl::Bind(
80
80
  CHECK(addr.size() <= EventEngine::ResolvedAddress::MAX_SIZE_BYTES);
81
81
  UnlinkIfUnixDomainSocket(addr);
82
82
 
83
+ EventEnginePosixInterface& posix_interface = poller_->posix_interface();
84
+
83
85
  /// Check if this is a wildcard port, and if so, try to keep the port the same
84
86
  /// as some previously created listener socket.
85
87
  for (auto it = acceptors_.begin();
86
88
  requested_port == 0 && it != acceptors_.end(); it++) {
87
- EventEngine::ResolvedAddress sockname_temp;
88
- socklen_t len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
89
- if (0 == getsockname((*it)->Socket().sock.Fd(),
90
- const_cast<sockaddr*>(sockname_temp.address()),
91
- &len)) {
92
- int used_port = ResolvedAddressGetPort(sockname_temp);
89
+ auto sockname_temp = posix_interface.LocalAddress((*it)->Fd());
90
+ if (sockname_temp.ok()) {
91
+ int used_port = ResolvedAddressGetPort(*sockname_temp);
93
92
  if (used_port > 0) {
94
93
  requested_port = used_port;
95
94
  ResolvedAddressSetPort(res_addr, requested_port);
@@ -97,21 +96,21 @@ absl::StatusOr<int> PosixEngineListenerImpl::Bind(
97
96
  }
98
97
  }
99
98
  }
100
-
101
99
  auto used_port = MaybeGetWildcardPortFromAddress(res_addr);
102
100
  // Update the callback. Any subsequent new sockets created and added to
103
101
  // acceptors_ in this function will invoke the new callback.
104
102
  acceptors_.UpdateOnAppendCallback(std::move(on_bind_new_fd));
105
103
  if (used_port.has_value()) {
106
104
  requested_port = *used_port;
107
- return ListenerContainerAddWildcardAddresses(acceptors_, options_,
108
- requested_port);
105
+ return ListenerContainerAddWildcardAddresses(&posix_interface, acceptors_,
106
+ options_, requested_port);
109
107
  }
110
108
  if (ResolvedAddressToV4Mapped(res_addr, &addr6_v4mapped)) {
111
109
  res_addr = addr6_v4mapped;
112
110
  }
113
111
 
114
- auto result = CreateAndPrepareListenerSocket(options_, res_addr);
112
+ auto result =
113
+ CreateAndPrepareListenerSocket(&posix_interface, options_, res_addr);
115
114
  GRPC_RETURN_IF_ERROR(result.status());
116
115
  acceptors_.Append(*result);
117
116
  return result->port;
@@ -136,22 +135,31 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
136
135
  for (;;) {
137
136
  EventEngine::ResolvedAddress addr;
138
137
  memset(const_cast<sockaddr*>(addr.address()), 0, addr.size());
138
+ auto& posix_interface = handle_->Poller()->posix_interface();
139
139
  // Note: If we ever decide to return this address to the user, remember to
140
140
  // strip off the ::ffff:0.0.0.0/96 prefix first.
141
- int fd = Accept4(handle_->WrappedFd(), addr, 1, 1);
142
- if (fd < 0) {
143
- switch (errno) {
141
+ auto fd = posix_interface.Accept4(handle_->WrappedFd(), addr, 1, 1);
142
+ if (fd.IsWrongGenerationError()) {
143
+ LOG(ERROR) << "Closing acceptor. accept4 was called with fd from a wrong "
144
+ "generation";
145
+ // Shutting down the acceptor. Unref the ref grabbed in
146
+ // AsyncConnectionAcceptor::Start().
147
+ Unref();
148
+ return;
149
+ }
150
+ if (fd.IsPosixError()) {
151
+ switch (*fd.errno_value()) {
144
152
  case EINTR:
145
153
  continue;
146
154
  case EMFILE:
147
- // When the process runs out of fds, accept4() returns EMFILE. When
148
- // this happens, the connection is left in the accept queue until
149
- // either a read event triggers the on_read callback, or time has
150
- // passed and the accept should be re-tried regardless. This callback
151
- // is not cancelled, so a spurious wakeup may occur even when there's
152
- // nothing to accept. This is not a performant code path, but if an fd
153
- // limit has been reached, the system is likely in an unhappy state
154
- // regardless.
155
+ // When the process runs out of posix_interface, accept4() returns
156
+ // EMFILE. When this happens, the connection is left in the accept
157
+ // queue until either a read event triggers the on_read callback, or
158
+ // time has passed and the accept should be re-tried regardless. This
159
+ // callback is not cancelled, so a spurious wakeup may occur even when
160
+ // there's nothing to accept. This is not a performant code path, but
161
+ // if an fd limit has been reached, the system is likely in an unhappy
162
+ // state regardless.
155
163
  LOG_EVERY_N_SEC(ERROR, 1)
156
164
  << "File descriptor limit reached. Retrying.";
157
165
  handle_->NotifyOnRead(notify_on_accept_);
@@ -186,8 +194,8 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
186
194
  // For UNIX sockets, the accept call might not fill up the member
187
195
  // sun_path of sockaddr_un, so explicitly call getpeername to get it.
188
196
  if (addr.address()->sa_family == AF_UNIX) {
189
- socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
190
- if (getpeername(fd, const_cast<sockaddr*>(addr.address()), &len) < 0) {
197
+ auto peer_address = posix_interface.PeerAddress(fd.value());
198
+ if (!peer_address.ok()) {
191
199
  auto listener_addr_uri = ResolvedAddressToURI(socket_.addr);
192
200
  LOG(ERROR) << "Failed getpeername: " << grpc_core::StrError(errno)
193
201
  << ". Dropping the connection, and continuing "
@@ -195,17 +203,16 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
195
203
  << (listener_addr_uri.ok() ? *listener_addr_uri
196
204
  : "<unknown>")
197
205
  << ":" << socket_.port;
198
- close(fd);
206
+ posix_interface.Close(fd.value());
199
207
  handle_->NotifyOnRead(notify_on_accept_);
200
208
  return;
201
209
  }
202
- addr = EventEngine::ResolvedAddress(addr.address(), len);
210
+ addr = std::move(peer_address).value();
203
211
  }
204
212
 
205
- PosixSocketWrapper sock(fd);
206
- (void)sock.SetSocketNoSigpipeIfPossible();
207
- auto result = sock.ApplySocketMutatorInOptions(
208
- GRPC_FD_SERVER_CONNECTION_USAGE, listener_->options_);
213
+ (void)posix_interface.SetSocketNoSigpipeIfPossible(fd.value());
214
+ auto result = posix_interface.ApplySocketMutatorInOptions(
215
+ fd.value(), GRPC_FD_SERVER_CONNECTION_USAGE, listener_->options_);
209
216
  if (!result.ok()) {
210
217
  LOG(ERROR) << "Closing acceptor. Failed to apply socket mutator: "
211
218
  << result;
@@ -226,7 +233,7 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
226
233
  }
227
234
  auto endpoint = CreatePosixEndpoint(
228
235
  /*handle=*/listener_->poller_->CreateHandle(
229
- fd, *peer_name, listener_->poller_->CanTrackErrors()),
236
+ fd.value(), *peer_name, listener_->poller_->CanTrackErrors()),
230
237
  /*on_shutdown=*/nullptr, /*engine=*/listener_->engine_,
231
238
  // allocator=
232
239
  listener_->memory_allocator_factory_->CreateMemoryAllocator(
@@ -238,7 +245,7 @@ void PosixEngineListenerImpl::AsyncConnectionAcceptor::NotifyOnAccept(
238
245
  // Call on_accept_ and then resume accepting new connections
239
246
  // by continuing the parent for-loop.
240
247
  listener_->on_accept_(
241
- /*listener_fd=*/handle_->WrappedFd(),
248
+ /*listener_fd=*/handle_->WrappedFd().fd(),
242
249
  /*endpoint=*/std::move(endpoint),
243
250
  /*is_external=*/false,
244
251
  /*memory_allocator=*/
@@ -260,18 +267,19 @@ absl::Status PosixEngineListenerImpl::HandleExternalConnection(
260
267
  return absl::UnknownError(
261
268
  absl::StrCat("HandleExternalConnection: Invalid peer socket: ", fd));
262
269
  }
263
- PosixSocketWrapper sock(fd);
264
- (void)sock.SetSocketNoSigpipeIfPossible();
265
- auto peer_name = sock.PeerAddressString();
270
+ auto& posix_interface = poller_->posix_interface();
271
+ FileDescriptor wrapped = posix_interface.Adopt(fd);
272
+ (void)posix_interface.SetSocketNoSigpipeIfPossible(wrapped);
273
+ auto peer_name = posix_interface.PeerAddressString(wrapped);
266
274
  if (!peer_name.ok()) {
267
275
  return absl::UnknownError(
268
276
  absl::StrCat("HandleExternalConnection: peer not connected: ",
269
277
  peer_name.status().ToString()));
270
278
  }
271
279
  grpc_core::EnsureRunInExecCtx([this, peer_name = std::move(*peer_name),
272
- pending_data, listener_fd, fd]() mutable {
280
+ pending_data, listener_fd, wrapped]() mutable {
273
281
  auto endpoint = CreatePosixEndpoint(
274
- /*handle=*/poller_->CreateHandle(fd, peer_name,
282
+ /*handle=*/poller_->CreateHandle(wrapped, peer_name,
275
283
  poller_->CanTrackErrors()),
276
284
  /*on_shutdown=*/nullptr, /*engine=*/engine_,
277
285
  /*allocator=*/
@@ -24,7 +24,6 @@
24
24
  #include <atomic>
25
25
  #include <list>
26
26
  #include <memory>
27
- #include <string>
28
27
  #include <utility>
29
28
 
30
29
  #include "absl/base/thread_annotations.h"
@@ -32,6 +31,7 @@
32
31
  #include "absl/status/status.h"
33
32
  #include "absl/status/statusor.h"
34
33
  #include "src/core/lib/event_engine/posix.h"
34
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
35
35
  #include "src/core/lib/iomgr/port.h"
36
36
  #include "src/core/util/sync.h"
37
37
 
@@ -85,7 +85,7 @@ class PosixEngineListenerImpl
85
85
  listener_(std::move(listener)),
86
86
  socket_(socket),
87
87
  handle_(listener_->poller_->CreateHandle(
88
- socket_.sock.Fd(),
88
+ socket_.sock,
89
89
  *grpc_event_engine::experimental::
90
90
  ResolvedAddressToNormalizedString(socket_.addr),
91
91
  listener_->poller_->CanTrackErrors())),
@@ -105,8 +105,10 @@ class PosixEngineListenerImpl
105
105
  }
106
106
  }
107
107
  ListenerSocketsContainer::ListenerSocket& Socket() { return socket_; }
108
+ FileDescriptor Fd() { return handle_->WrappedFd(); }
108
109
  ~AsyncConnectionAcceptor() {
109
- auto address = socket_.sock.LocalAddress();
110
+ auto address = handle_->Poller()->posix_interface().LocalAddress(
111
+ handle_->WrappedFd());
110
112
  if (address.ok()) {
111
113
  // If uds socket, unlink it so that the corresponding file is deleted.
112
114
  UnlinkIfUnixDomainSocket(*address);
@@ -140,7 +142,7 @@ class PosixEngineListenerImpl
140
142
  acceptors_.push_back(new AsyncConnectionAcceptor(
141
143
  listener_->engine_, listener_->shared_from_this(), socket));
142
144
  if (on_append_) {
143
- on_append_(socket.sock.Fd());
145
+ on_append_(socket.sock.fd());
144
146
  }
145
147
  }
146
148
 
@@ -17,7 +17,6 @@
17
17
  #include <grpc/event_engine/event_engine.h>
18
18
  #include <grpc/support/port_platform.h>
19
19
  #include <limits.h>
20
- #include <stdio.h>
21
20
  #include <stdlib.h>
22
21
 
23
22
  #include <cstdint>
@@ -29,16 +28,13 @@
29
28
  #include "absl/log/log.h"
30
29
  #include "absl/status/status.h"
31
30
  #include "absl/strings/str_cat.h"
32
- #include "absl/strings/str_replace.h"
31
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
33
32
  #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
34
33
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
35
34
  #include "src/core/lib/iomgr/port.h"
36
- #include "src/core/lib/iomgr/socket_mutator.h"
37
35
  #include "src/core/util/crash.h" // IWYU pragma: keep
38
36
  #include "src/core/util/status_helper.h"
39
37
 
40
- #define MIN_SAFE_ACCEPT_QUEUE_SIZE 100
41
-
42
38
  #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
43
39
  #include <errno.h> // IWYU pragma: keep
44
40
  #include <ifaddrs.h> // IWYU pragma: keep
@@ -59,36 +55,6 @@ using ListenerSocket = ListenerSocketsContainer::ListenerSocket;
59
55
 
60
56
  #ifdef GRPC_HAVE_IFADDRS
61
57
 
62
- // Bind to "::" to get a port number not used by any address.
63
- absl::StatusOr<int> GetUnusedPort() {
64
- ResolvedAddress wild = ResolvedAddressMakeWild6(0);
65
- PosixSocketWrapper::DSMode dsmode;
66
- auto sock = PosixSocketWrapper::CreateDualStackSocket(nullptr, wild,
67
- SOCK_STREAM, 0, dsmode);
68
- GRPC_RETURN_IF_ERROR(sock.status());
69
- if (dsmode == PosixSocketWrapper::DSMode::DSMODE_IPV4) {
70
- wild = ResolvedAddressMakeWild4(0);
71
- }
72
- if (bind(sock->Fd(), wild.address(), wild.size()) != 0) {
73
- close(sock->Fd());
74
- return absl::FailedPreconditionError(
75
- absl::StrCat("bind(GetUnusedPort): ", std::strerror(errno)));
76
- }
77
- socklen_t len = wild.size();
78
- if (getsockname(sock->Fd(), const_cast<sockaddr*>(wild.address()), &len) !=
79
- 0) {
80
- close(sock->Fd());
81
- return absl::FailedPreconditionError(
82
- absl::StrCat("getsockname(GetUnusedPort): ", std::strerror(errno)));
83
- }
84
- close(sock->Fd());
85
- int port = ResolvedAddressGetPort(wild);
86
- if (port <= 0) {
87
- return absl::FailedPreconditionError("Bad port");
88
- }
89
- return port;
90
- }
91
-
92
58
  bool SystemHasIfAddrs() { return true; }
93
59
 
94
60
  #else // GRPC_HAVE_IFADDRS
@@ -97,108 +63,28 @@ bool SystemHasIfAddrs() { return false; }
97
63
 
98
64
  #endif // GRPC_HAVE_IFADDRS
99
65
 
100
- // get max listen queue size on linux
101
- int InitMaxAcceptQueueSize() {
102
- int n = SOMAXCONN;
103
- char buf[64];
104
- FILE* fp = fopen("/proc/sys/net/core/somaxconn", "r");
105
- int max_accept_queue_size;
106
- if (fp == nullptr) {
107
- // 2.4 kernel.
108
- return SOMAXCONN;
109
- }
110
- if (fgets(buf, sizeof buf, fp)) {
111
- char* end;
112
- long i = strtol(buf, &end, 10);
113
- if (i > 0 && i <= INT_MAX && end && *end == '\n') {
114
- n = static_cast<int>(i);
115
- }
116
- }
117
- fclose(fp);
118
- max_accept_queue_size = n;
119
-
120
- if (max_accept_queue_size < MIN_SAFE_ACCEPT_QUEUE_SIZE) {
121
- LOG(INFO) << "Suspiciously small accept queue (" << max_accept_queue_size
122
- << ") will probably lead to connection drops";
123
- }
124
- return max_accept_queue_size;
125
- }
126
-
127
- int GetMaxAcceptQueueSize() {
128
- static const int kMaxAcceptQueueSize = InitMaxAcceptQueueSize();
129
- return kMaxAcceptQueueSize;
130
- }
131
-
132
66
  // Prepare a recently-created socket for listening.
133
- absl::Status PrepareSocket(const PosixTcpOptions& options,
67
+ absl::Status PrepareSocket(EventEnginePosixInterface* posix_interface,
68
+ const PosixTcpOptions& options,
134
69
  ListenerSocket& socket) {
135
- ResolvedAddress sockname_temp;
136
- int fd = socket.sock.Fd();
137
- CHECK_GE(fd, 0);
70
+ FileDescriptor fd = socket.sock;
71
+ CHECK(fd.ready());
138
72
  bool close_fd = true;
139
- socket.zero_copy_enabled = false;
140
73
  socket.port = 0;
141
- auto sock_cleanup = absl::MakeCleanup([&close_fd, fd]() -> void {
142
- if (close_fd && fd >= 0) {
143
- close(fd);
144
- }
145
- });
146
- if (PosixSocketWrapper::IsSocketReusePortSupported() &&
147
- options.allow_reuse_port && socket.addr.address()->sa_family != AF_UNIX &&
148
- !ResolvedAddressIsVSock(socket.addr)) {
149
- GRPC_RETURN_IF_ERROR(socket.sock.SetSocketReusePort(1));
150
- }
151
-
152
- #ifdef GRPC_LINUX_ERRQUEUE
153
- if (!socket.sock.SetSocketZeroCopy().ok()) {
154
- // it's not fatal, so just log it.
155
- VLOG(2) << "Node does not support SO_ZEROCOPY, continuing.";
156
- } else {
157
- socket.zero_copy_enabled = true;
158
- }
159
- #endif
160
-
161
- GRPC_RETURN_IF_ERROR(socket.sock.SetSocketNonBlocking(1));
162
- GRPC_RETURN_IF_ERROR(socket.sock.SetSocketCloexec(1));
163
-
164
- if (socket.addr.address()->sa_family != AF_UNIX &&
165
- !ResolvedAddressIsVSock(socket.addr)) {
166
- GRPC_RETURN_IF_ERROR(socket.sock.SetSocketLowLatency(1));
167
- GRPC_RETURN_IF_ERROR(socket.sock.SetSocketReuseAddr(1));
168
- GRPC_RETURN_IF_ERROR(socket.sock.SetSocketDscp(options.dscp));
169
- socket.sock.TrySetSocketTcpUserTimeout(options, false);
170
- }
171
- GRPC_RETURN_IF_ERROR(socket.sock.SetSocketNoSigpipeIfPossible());
172
- GRPC_RETURN_IF_ERROR(socket.sock.ApplySocketMutatorInOptions(
173
- GRPC_FD_SERVER_LISTENER_USAGE, options));
174
-
175
- if (bind(fd, socket.addr.address(), socket.addr.size()) < 0) {
176
- auto sockaddr_str = ResolvedAddressToString(socket.addr);
177
- if (!sockaddr_str.ok()) {
178
- LOG(ERROR) << "Could not convert sockaddr to string: "
179
- << sockaddr_str.status();
180
- sockaddr_str = "<unparsable>";
181
- }
182
- sockaddr_str = absl::StrReplaceAll(*sockaddr_str, {{"\0", "@"}});
183
- return absl::FailedPreconditionError(
184
- absl::StrCat("Error in bind for address '", *sockaddr_str,
185
- "': ", std::strerror(errno)));
186
- }
187
-
188
- if (listen(fd, GetMaxAcceptQueueSize()) < 0) {
189
- return absl::FailedPreconditionError(
190
- absl::StrCat("Error in listen: ", std::strerror(errno)));
74
+ auto sock_cleanup =
75
+ absl::MakeCleanup([&close_fd, fd, posix_interface]() -> void {
76
+ if (close_fd && fd.ready()) {
77
+ posix_interface->Close(fd);
78
+ }
79
+ });
80
+ auto listen_address =
81
+ posix_interface->PrepareListenerSocket(socket.sock, options, socket.addr);
82
+ if (!listen_address.ok()) {
83
+ return std::move(listen_address).status();
191
84
  }
192
85
  socklen_t len = static_cast<socklen_t>(sizeof(struct sockaddr_storage));
193
-
194
- if (getsockname(fd, const_cast<sockaddr*>(sockname_temp.address()), &len) <
195
- 0) {
196
- return absl::FailedPreconditionError(
197
- absl::StrCat("Error in getsockname: ", std::strerror(errno)));
198
- }
199
-
200
86
  socket.port =
201
- ResolvedAddressGetPort(ResolvedAddress(sockname_temp.address(), len));
87
+ ResolvedAddressGetPort(ResolvedAddress(listen_address->address(), len));
202
88
  // No errors. Set close_fd to false to ensure the socket is not closed.
203
89
  close_fd = false;
204
90
  return absl::OkStatus();
@@ -207,22 +93,23 @@ absl::Status PrepareSocket(const PosixTcpOptions& options,
207
93
  } // namespace
208
94
 
209
95
  absl::StatusOr<ListenerSocket> CreateAndPrepareListenerSocket(
210
- const PosixTcpOptions& options, const ResolvedAddress& addr) {
96
+ EventEnginePosixInterface* posix_interface, const PosixTcpOptions& options,
97
+ const ResolvedAddress& addr) {
211
98
  ResolvedAddress addr4_copy;
212
99
  ListenerSocket socket;
213
- auto result = PosixSocketWrapper::CreateDualStackSocket(
100
+ auto result = posix_interface->CreateDualStackSocket(
214
101
  nullptr, addr, SOCK_STREAM, 0, socket.dsmode);
215
102
  if (!result.ok()) {
216
103
  return result.status();
217
104
  }
218
105
  socket.sock = *result;
219
- if (socket.dsmode == PosixSocketWrapper::DSMODE_IPV4 &&
106
+ if (socket.dsmode == EventEnginePosixInterface::DSMODE_IPV4 &&
220
107
  ResolvedAddressIsV4Mapped(addr, &addr4_copy)) {
221
108
  socket.addr = addr4_copy;
222
109
  } else {
223
110
  socket.addr = addr;
224
111
  }
225
- GRPC_RETURN_IF_ERROR(PrepareSocket(options, socket));
112
+ GRPC_RETURN_IF_ERROR(PrepareSocket(posix_interface, options, socket));
226
113
  CHECK_GT(socket.port, 0);
227
114
  return socket;
228
115
  }
@@ -249,6 +136,7 @@ bool IsSockAddrLinkLocal(const EventEngine::ResolvedAddress* resolved_addr) {
249
136
  }
250
137
 
251
138
  absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
139
+ EventEnginePosixInterface* posix_interface,
252
140
  ListenerSocketsContainer& listener_sockets, const PosixTcpOptions& options,
253
141
  int requested_port) {
254
142
  #ifdef GRPC_HAVE_IFADDRS
@@ -258,7 +146,7 @@ absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
258
146
  bool no_local_addresses = true;
259
147
  int assigned_port = 0;
260
148
  if (requested_port == 0) {
261
- auto result = GetUnusedPort();
149
+ auto result = posix_interface->GetUnusedPort();
262
150
  GRPC_RETURN_IF_ERROR(result.status());
263
151
  requested_port = *result;
264
152
  VLOG(2) << "Picked unused port " << requested_port;
@@ -307,7 +195,8 @@ absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
307
195
  << ifa_name;
308
196
  continue;
309
197
  }
310
- auto result = CreateAndPrepareListenerSocket(options, addr);
198
+ auto result =
199
+ CreateAndPrepareListenerSocket(posix_interface, options, addr);
311
200
  if (!result.ok()) {
312
201
  op_status = absl::FailedPreconditionError(
313
202
  absl::StrCat("Failed to add listener: ", addr_str,
@@ -335,6 +224,7 @@ absl::StatusOr<int> ListenerContainerAddAllLocalAddresses(
335
224
  }
336
225
 
337
226
  absl::StatusOr<int> ListenerContainerAddWildcardAddresses(
227
+ EventEnginePosixInterface* posix_interface,
338
228
  ListenerSocketsContainer& listener_sockets, const PosixTcpOptions& options,
339
229
  int requested_port) {
340
230
  ResolvedAddress wild4 = ResolvedAddressMakeWild4(requested_port);
@@ -344,24 +234,24 @@ absl::StatusOr<int> ListenerContainerAddWildcardAddresses(
344
234
  int assigned_port = 0;
345
235
 
346
236
  if (SystemHasIfAddrs() && options.expand_wildcard_addrs) {
347
- return ListenerContainerAddAllLocalAddresses(listener_sockets, options,
348
- requested_port);
237
+ return ListenerContainerAddAllLocalAddresses(
238
+ posix_interface, listener_sockets, options, requested_port);
349
239
  }
350
240
 
351
241
  // Try listening on IPv6 first.
352
- v6_sock = CreateAndPrepareListenerSocket(options, wild6);
242
+ v6_sock = CreateAndPrepareListenerSocket(posix_interface, options, wild6);
353
243
  if (v6_sock.ok()) {
354
244
  listener_sockets.Append(*v6_sock);
355
245
  requested_port = v6_sock->port;
356
246
  assigned_port = v6_sock->port;
357
- if (v6_sock->dsmode == PosixSocketWrapper::DSMODE_DUALSTACK ||
358
- v6_sock->dsmode == PosixSocketWrapper::DSMODE_IPV4) {
247
+ if (v6_sock->dsmode == EventEnginePosixInterface::DSMODE_DUALSTACK ||
248
+ v6_sock->dsmode == EventEnginePosixInterface::DSMODE_IPV4) {
359
249
  return v6_sock->port;
360
250
  }
361
251
  }
362
252
  // If we got a v6-only socket or nothing, try adding 0.0.0.0.
363
253
  ResolvedAddressSetPort(wild4, requested_port);
364
- v4_sock = CreateAndPrepareListenerSocket(options, wild4);
254
+ v4_sock = CreateAndPrepareListenerSocket(posix_interface, options, wild4);
365
255
  if (v4_sock.ok()) {
366
256
  assigned_port = v4_sock->port;
367
257
  listener_sockets.Append(*v4_sock);