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
@@ -21,43 +21,46 @@
21
21
 
22
22
  #include <algorithm>
23
23
  #include <atomic>
24
- #include <chrono>
25
24
  #include <cstdint>
26
25
  #include <cstring>
27
26
  #include <memory>
28
27
  #include <string>
29
28
  #include <type_traits>
30
29
  #include <utility>
30
+ #include <vector>
31
31
 
32
+ #include "absl/base/no_destructor.h"
32
33
  #include "absl/cleanup/cleanup.h"
34
+ #include "absl/container/inlined_vector.h"
33
35
  #include "absl/functional/any_invocable.h"
34
36
  #include "absl/log/check.h"
35
37
  #include "absl/log/log.h"
36
38
  #include "absl/status/status.h"
37
- #include "absl/strings/match.h"
38
39
  #include "absl/strings/str_cat.h"
39
40
  #include "src/core/lib/debug/trace.h"
40
41
  #include "src/core/lib/event_engine/ares_resolver.h"
41
- #include "src/core/lib/event_engine/forkable.h"
42
- #include "src/core/lib/event_engine/grpc_polled_fd.h"
43
42
  #include "src/core/lib/event_engine/poller.h"
44
43
  #include "src/core/lib/event_engine/posix.h"
45
44
  #include "src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h"
46
45
  #include "src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h"
46
+ #include "src/core/lib/event_engine/posix_engine/posix_interface.h"
47
47
  #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
48
48
  #include "src/core/lib/event_engine/posix_engine/timer.h"
49
+ #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
49
50
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
50
51
  #include "src/core/lib/event_engine/utils.h"
51
52
  #include "src/core/lib/experiments/experiments.h"
52
53
  #include "src/core/util/crash.h"
53
- #include "src/core/util/no_destruct.h"
54
+ #include "src/core/util/fork.h"
54
55
  #include "src/core/util/sync.h"
55
56
  #include "src/core/util/useful.h"
56
57
 
57
58
  #ifdef GRPC_POSIX_SOCKET_TCP
58
59
  #include <errno.h> // IWYU pragma: keep
60
+ #include <pthread.h> // IWYU pragma: keep
59
61
  #include <stdint.h> // IWYU pragma: keep
60
62
  #include <sys/socket.h> // IWYU pragma: keep
63
+ #include <unistd.h> // IWYU pragma: keep
61
64
 
62
65
  #include "src/core/lib/event_engine/posix_engine/event_poller.h"
63
66
  #include "src/core/lib/event_engine/posix_engine/event_poller_posix_default.h"
@@ -80,19 +83,194 @@ namespace grpc_event_engine::experimental {
80
83
 
81
84
  namespace {
82
85
 
83
- grpc_core::NoDestruct<ObjectGroupForkHandler> g_timer_fork_manager;
84
-
85
- class TimerForkCallbackMethods {
86
- public:
87
- static void Prefork() { g_timer_fork_manager->Prefork(); }
88
- static void PostforkParent() { g_timer_fork_manager->PostforkParent(); }
89
- static void PostforkChild() { g_timer_fork_manager->PostforkChild(); }
86
+ #if GRPC_ENABLE_FORK_SUPPORT && GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
87
+
88
+ // Thread pool can outlive EE but we need to ensure the ordering if both
89
+ // entities are alive.
90
+ template <template <typename> typename PtrType>
91
+ struct ForkHandlerPointers {
92
+ PtrType<PosixEventEngine> event_engine;
93
+ PtrType<ThreadPool> executor;
94
+ PtrType<TimerManager> timer_manager;
95
+
96
+ ForkHandlerPointers(PtrType<PosixEventEngine> event_engine,
97
+ PtrType<ThreadPool> executor,
98
+ PtrType<TimerManager> timer_manager)
99
+ : event_engine(std::move(event_engine)),
100
+ executor(std::move(executor)),
101
+ timer_manager(std::move(timer_manager)) {}
90
102
  };
91
103
 
104
+ // Fork support - mutex and global list of event engines
105
+ // Should never be destroyed to avoid race conditions on process shutdown
106
+ absl::NoDestructor<grpc_core::Mutex> fork_mu;
107
+ absl::NoDestructor<absl::InlinedVector<ForkHandlerPointers<std::weak_ptr>, 16>>
108
+ fork_handlers ABSL_GUARDED_BY(fork_mu.get());
109
+
110
+ // "Locks" event engines and returns a collection so callbacks can be invoked
111
+ // without holding a lock.
112
+ std::vector<ForkHandlerPointers<std::shared_ptr>> LockForkHandlers() {
113
+ grpc_core::MutexLock lock(fork_mu.get());
114
+ std::vector<ForkHandlerPointers<std::shared_ptr>> locked;
115
+ // Not all weak_ptrs might be locked. If an engine enters dtor, it will stop
116
+ // on a mutex in DeregisterEventEngineForFork but the weak pointer will not
117
+ // be lockable here.
118
+ locked.reserve(fork_handlers->size());
119
+ for (const auto& [event_engine, executor, timer_manager] : *fork_handlers) {
120
+ locked.emplace_back(event_engine.lock(), executor.lock(),
121
+ timer_manager.lock());
122
+ }
123
+ return locked;
124
+ }
125
+
126
+ void PrepareFork() {
127
+ for (const auto& [event_engine, executor, timer_manager] :
128
+ LockForkHandlers()) {
129
+ if (event_engine != nullptr) {
130
+ event_engine->BeforeFork();
131
+ }
132
+ if (timer_manager != nullptr) {
133
+ timer_manager->PrepareFork();
134
+ }
135
+ if (executor != nullptr) {
136
+ executor->PrepareFork();
137
+ }
138
+ }
139
+ }
140
+
141
+ void PostForkInParent() {
142
+ for (const auto& [event_engine, executor, timer_manager] :
143
+ LockForkHandlers()) {
144
+ if (executor != nullptr) {
145
+ executor->PostFork();
146
+ }
147
+ if (timer_manager) {
148
+ timer_manager->PostFork();
149
+ }
150
+ if (event_engine != nullptr) {
151
+ event_engine->AfterFork(PosixEventEngine::OnForkRole::kParent);
152
+ }
153
+ }
154
+ }
155
+
156
+ void PostForkInChild() {
157
+ for (const auto& [event_engine, executor, timer_manager] :
158
+ LockForkHandlers()) {
159
+ if (executor != nullptr) {
160
+ executor->PostFork();
161
+ }
162
+ if (timer_manager) {
163
+ timer_manager->PostFork();
164
+ }
165
+ if (event_engine != nullptr) {
166
+ event_engine->AfterFork(PosixEventEngine::OnForkRole::kChild);
167
+ }
168
+ }
169
+ }
170
+
171
+ void RegisterEventEngineForFork(
172
+ const std::shared_ptr<PosixEventEngine>& posix_engine,
173
+ const std::shared_ptr<ThreadPool>& executor,
174
+ const std::shared_ptr<TimerManager>& timer_manager) {
175
+ if (!grpc_core::Fork::Enabled()) {
176
+ return;
177
+ }
178
+ grpc_core::MutexLock lock(fork_mu.get());
179
+ // We have mutex, cleanup if there's any expired event engines
180
+ fork_handlers->erase(
181
+ std::remove_if(fork_handlers->begin(), fork_handlers->end(),
182
+ [](const auto& ptr) {
183
+ return ptr.event_engine.expired() &&
184
+ ptr.executor.expired();
185
+ }),
186
+ fork_handlers->end());
187
+ fork_handlers->emplace_back(std::move(posix_engine), std::move(executor),
188
+ std::move(timer_manager));
189
+ static bool handlers_installed = false;
190
+ if (!handlers_installed) {
191
+ pthread_atfork(PrepareFork, PostForkInParent, PostForkInChild);
192
+ handlers_installed = true;
193
+ }
194
+ }
195
+
196
+ #if GRPC_ARES && GRPC_POSIX_SOCKET_ARES_EV_DRIVER && \
197
+ GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
198
+
199
+ void RegisterResolver(
200
+ absl::InlinedVector<std::weak_ptr<AresResolver::ReinitHandle>, 16>*
201
+ resolver_handles,
202
+ std::weak_ptr<AresResolver::ReinitHandle> resolver_handle) {
203
+ resolver_handles->emplace_back(std::move(resolver_handle));
204
+ // Cleanup in case we have expired callbacks, prevents the list from
205
+ // growing indefinitely
206
+ auto new_end = std::remove_if(
207
+ resolver_handles->begin(), resolver_handles->end(),
208
+ +[](const std::weak_ptr<AresResolver::ReinitHandle>& callback) {
209
+ return callback.expired();
210
+ });
211
+ resolver_handles->erase(new_end, resolver_handles->end());
212
+ }
213
+
214
+ #endif // GRPC_ARES && GRPC_POSIX_SOCKET_ARES_EV_DRIVER
215
+ // && GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
216
+
217
+ #else // GRPC_ENABLE_FORK_SUPPORT && GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
218
+
219
+ void RegisterEventEngineForFork(
220
+ const std::shared_ptr<PosixEventEngine>& /* posix_engine */,
221
+ const std::shared_ptr<ThreadPool>& /* executor */,
222
+ const std::shared_ptr<TimerManager>& /* timer_manager */) {}
223
+
224
+ #endif // GRPC_ENABLE_FORK_SUPPORT && GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
225
+
92
226
  } // namespace
93
227
 
94
228
  #ifdef GRPC_POSIX_SOCKET_TCP
95
229
 
230
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
231
+
232
+ PosixEventEngine::PollingCycle::PollingCycle(
233
+ PosixEnginePollerManager* poller_manager)
234
+ : poller_manager_(poller_manager), is_scheduled_(1) {
235
+ poller_manager_->Executor()->Run([this]() { PollerWorkInternal(); });
236
+ }
237
+
238
+ PosixEventEngine::PollingCycle::~PollingCycle() {
239
+ done_ = true;
240
+ auto poller = poller_manager_->Poller();
241
+ if (poller != nullptr) {
242
+ poller->Kick();
243
+ }
244
+ grpc_core::MutexLock lock(&mu_);
245
+ while (is_scheduled_ > 0) {
246
+ cond_.Wait(&mu_);
247
+ }
248
+ }
249
+
250
+ void PosixEventEngine::PollingCycle::PollerWorkInternal() {
251
+ grpc_core::MutexLock lock(&mu_);
252
+ --is_scheduled_;
253
+ CHECK_EQ(is_scheduled_, 0);
254
+ bool again = false;
255
+ // TODO(vigneshbabu): The timeout specified here is arbitrary. For
256
+ // instance, this can be improved by setting the timeout to the next
257
+ // expiring timer.
258
+ PosixEventPoller* poller = poller_manager_->Poller();
259
+ auto result = poller->Work(24h, [&]() { again = true; });
260
+ if (result == Poller::WorkResult::kDeadlineExceeded) {
261
+ // The EventEngine is not shutting down but the next asynchronous
262
+ // PollerWorkInternal did not get scheduled. Schedule it now.
263
+ again = true;
264
+ }
265
+ if (!done_ && again) {
266
+ poller_manager_->Executor()->Run([this]() { PollerWorkInternal(); });
267
+ ++is_scheduled_;
268
+ }
269
+ cond_.SignalAll();
270
+ }
271
+
272
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
273
+
96
274
  void AsyncConnect::Start(EventEngine::Duration timeout) {
97
275
  on_writable_ = PosixEngineClosure::ToPermanentClosure(
98
276
  [this](absl::Status status) { OnWritable(std::move(status)); });
@@ -120,9 +298,7 @@ void AsyncConnect::OnTimeoutExpired(absl::Status status) {
120
298
 
121
299
  void AsyncConnect::OnWritable(absl::Status status)
122
300
  ABSL_NO_THREAD_SAFETY_ANALYSIS {
123
- int so_error = 0;
124
301
  socklen_t so_error_size;
125
- int err;
126
302
  int done;
127
303
  int consumed_refs = 1;
128
304
  EventHandle* fd;
@@ -185,14 +361,21 @@ void AsyncConnect::OnWritable(absl::Status status)
185
361
  return;
186
362
  }
187
363
 
364
+ int so_error = 0;
365
+ PosixError err;
188
366
  do {
189
367
  so_error_size = sizeof(so_error);
190
- err = getsockopt(fd->WrappedFd(), SOL_SOCKET, SO_ERROR, &so_error,
191
- &so_error_size);
192
- } while (err < 0 && errno == EINTR);
193
- if (err < 0) {
194
- status = absl::FailedPreconditionError(
195
- absl::StrCat("getsockopt: ", std::strerror(errno)));
368
+ err = fd->Poller()->posix_interface().GetSockOpt(
369
+ fd->WrappedFd(), SOL_SOCKET, SO_ERROR, &so_error, &so_error_size);
370
+ } while (err.IsPosixError(EINTR));
371
+ if (!err.ok()) {
372
+ if (err.IsWrongGenerationError()) {
373
+ status = absl::FailedPreconditionError(
374
+ "getsockopt: file descriptor was created pre fork");
375
+ } else {
376
+ status = absl::FailedPreconditionError(
377
+ absl::StrCat("getsockopt: ", err.StrError()));
378
+ }
196
379
  return;
197
380
  }
198
381
 
@@ -238,16 +421,26 @@ void AsyncConnect::OnWritable(absl::Status status)
238
421
 
239
422
  EventEngine::ConnectionHandle
240
423
  PosixEventEngine::CreateEndpointFromUnconnectedFdInternal(
241
- int fd, EventEngine::OnConnectCallback on_connect,
424
+ const FileDescriptor& fd, EventEngine::OnConnectCallback on_connect,
242
425
  const EventEngine::ResolvedAddress& addr,
243
426
  const PosixTcpOptions& tcp_options, MemoryAllocator memory_allocator,
244
427
  EventEngine::Duration timeout) {
245
- int err;
428
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
429
+ PosixError err;
246
430
  int connect_errno;
247
431
  do {
248
- err = connect(fd, addr.address(), addr.size());
249
- } while (err < 0 && errno == EINTR);
250
- connect_errno = (err < 0) ? errno : 0;
432
+ err = poller_manager_.Poller()->posix_interface().Connect(
433
+ fd, addr.address(), addr.size());
434
+ } while (err.IsPosixError(EINTR));
435
+ if (err.IsWrongGenerationError()) {
436
+ Run([on_connect = std::move(on_connect),
437
+ ep = absl::FailedPreconditionError(
438
+ "connect failed: file descriptor was created before "
439
+ "fork")]() mutable { on_connect(std::move(ep)); });
440
+ return EventEngine::ConnectionHandle::kInvalid;
441
+ }
442
+
443
+ connect_errno = err.errno_value().value_or(0);
251
444
 
252
445
  auto addr_uri = ResolvedAddressToURI(addr);
253
446
  if (!addr_uri.ok()) {
@@ -259,7 +452,7 @@ PosixEventEngine::CreateEndpointFromUnconnectedFdInternal(
259
452
  }
260
453
 
261
454
  std::string name = absl::StrCat("tcp-client:", addr_uri.value());
262
- PosixEventPoller* poller = poller_manager_->Poller();
455
+ PosixEventPoller* poller = poller_manager_.Poller();
263
456
  EventHandle* handle =
264
457
  poller->CreateHandle(fd, name, poller->CanTrackErrors());
265
458
 
@@ -300,6 +493,9 @@ PosixEventEngine::CreateEndpointFromUnconnectedFdInternal(
300
493
  // Start asynchronous connect and return the connection id.
301
494
  ac->Start(timeout);
302
495
  return {static_cast<intptr_t>(connection_id), 0};
496
+ #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
497
+ grpc_core::Crash("Polling is not available on this platform");
498
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
303
499
  }
304
500
 
305
501
  void PosixEventEngine::OnConnectFinishInternal(int connection_handle) {
@@ -353,103 +549,43 @@ void PosixEnginePollerManager::TriggerShutdown() {
353
549
  }
354
550
 
355
551
  std::shared_ptr<PosixEventEngine> PosixEventEngine::MakePosixEventEngine() {
356
- // Constructor is private, can't use std::make_shared
357
- return std::shared_ptr<PosixEventEngine>(new PosixEventEngine());
552
+ // Can't use make_shared as ctor is private
553
+ std::shared_ptr<PosixEventEngine> engine(new PosixEventEngine());
554
+ RegisterEventEngineForFork(engine, engine->executor_, engine->timer_manager_);
555
+ return engine;
358
556
  }
359
557
 
360
- #ifdef GRPC_POSIX_SOCKET_TCP
361
-
362
- // The posix EventEngine returned by this method would have a shared ownership
363
- // of the poller and would not be in-charge of driving the poller by calling
364
- // its Work(..) method. Instead its up to the test to drive the poller. The
365
- // returned posix EventEngine will also not attempt to shutdown the poller
366
- // since it does not own it.
367
558
  std::shared_ptr<PosixEventEngine>
368
559
  PosixEventEngine::MakeTestOnlyPosixEventEngine(
369
560
  std::shared_ptr<grpc_event_engine::experimental::PosixEventPoller>
370
561
  test_only_poller) {
371
- // Constructor is private, can't use std::make_shared
372
- return std::shared_ptr<PosixEventEngine>(
562
+ std::shared_ptr<PosixEventEngine> engine(
373
563
  new PosixEventEngine(std::move(test_only_poller)));
374
- }
375
- #endif // GRPC_POSIX_SOCKET_TCP
376
-
377
- PosixEnginePollerManager::~PosixEnginePollerManager() {
378
- if (poller_ != nullptr) {
379
- poller_->Shutdown();
380
- }
564
+ RegisterEventEngineForFork(engine, engine->executor_, engine->timer_manager_);
565
+ return engine;
381
566
  }
382
567
 
383
568
  PosixEventEngine::PosixEventEngine(std::shared_ptr<PosixEventPoller> poller)
384
- : grpc_core::KeepsGrpcInitialized(
385
- /*enabled=*/!grpc_core::IsPosixEeSkipGrpcInitEnabled()),
386
- connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
569
+ : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
387
570
  executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
388
- timer_manager_(std::make_shared<TimerManager>(executor_)) {
389
- g_timer_fork_manager->RegisterForkable(
390
- timer_manager_, TimerForkCallbackMethods::Prefork,
391
- TimerForkCallbackMethods::PostforkParent,
392
- TimerForkCallbackMethods::PostforkChild);
393
571
  #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
394
- poller_manager_ = std::make_shared<PosixEnginePollerManager>(poller);
572
+ poller_manager_(poller),
395
573
  #endif
574
+ timer_manager_(std::make_shared<TimerManager>(executor_)) {
396
575
  }
397
576
 
398
577
  PosixEventEngine::PosixEventEngine()
399
- : grpc_core::KeepsGrpcInitialized(
400
- /*enabled=*/!grpc_core::IsPosixEeSkipGrpcInitEnabled()),
401
- connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
578
+ : connection_shards_(std::max(2 * gpr_cpu_num_cores(), 1u)),
402
579
  executor_(MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 4u, 16u))),
403
- timer_manager_(std::make_shared<TimerManager>(executor_)) {
404
- g_timer_fork_manager->RegisterForkable(
405
- timer_manager_, TimerForkCallbackMethods::Prefork,
406
- TimerForkCallbackMethods::PostforkParent,
407
- TimerForkCallbackMethods::PostforkChild);
408
580
  #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
409
- poller_manager_ = std::make_shared<PosixEnginePollerManager>(executor_);
410
- // The threadpool must be instantiated after the poller otherwise, the
411
- // process will deadlock when forking.
412
- if (poller_manager_->Poller() != nullptr) {
413
- executor_->Run([poller_manager = poller_manager_]() {
414
- PollerWorkInternal(poller_manager);
415
- });
416
- }
581
+ poller_manager_(executor_),
582
+ timer_manager_(std::make_shared<TimerManager>(executor_)) {
583
+ SchedulePoller();
584
+ #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
585
+ timer_manager_(std::make_shared<TimerManager>(executor_)) {
417
586
  #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
418
587
  }
419
588
 
420
- void PosixEventEngine::PollerWorkInternal(
421
- std::shared_ptr<PosixEnginePollerManager> poller_manager) {
422
- // TODO(vigneshbabu): The timeout specified here is arbitrary. For instance,
423
- // this can be improved by setting the timeout to the next expiring timer.
424
- PosixEventPoller* poller = poller_manager->Poller();
425
- ThreadPool* executor = poller_manager->Executor();
426
- auto result = poller->Work(24h, [executor, &poller_manager]() {
427
- executor->Run([poller_manager]() mutable {
428
- PollerWorkInternal(std::move(poller_manager));
429
- });
430
- });
431
- if (result == Poller::WorkResult::kDeadlineExceeded) {
432
- // The EventEngine is not shutting down but the next asynchronous
433
- // PollerWorkInternal did not get scheduled. Schedule it now.
434
- executor->Run([poller_manager = std::move(poller_manager)]() {
435
- PollerWorkInternal(poller_manager);
436
- });
437
- } else if (result == Poller::WorkResult::kKicked &&
438
- poller_manager->IsShuttingDown()) {
439
- // The Poller Got Kicked and poller_state_ is set to
440
- // PollerState::kShuttingDown. This can currently happen only from the
441
- // EventEngine destructor. Sample the use_count of poller_manager. If the
442
- // sampled use_count is > 1, there is one more instance of Work(...)
443
- // which hasn't returned yet. Send another Kick to be safe to ensure the
444
- // pending instance of Work(..) also breaks out. Its possible that the other
445
- // instance of Work(..) had already broken out before this Kick is sent. In
446
- // that case, the Kick is spurious but it shouldn't cause any side effects.
447
- if (poller_manager.use_count() > 1) {
448
- poller->Kick();
449
- }
450
- }
451
- }
452
-
453
589
  #endif // GRPC_POSIX_SOCKET_TCP
454
590
 
455
591
  struct PosixEventEngine::ClosureData final : public EventEngine::Closure {
@@ -482,12 +618,11 @@ PosixEventEngine::~PosixEventEngine() {
482
618
  }
483
619
  CHECK(GPR_LIKELY(known_handles_.empty()));
484
620
  }
485
- timer_manager_->Shutdown();
486
621
  #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
487
- if (poller_manager_ != nullptr) {
488
- poller_manager_->TriggerShutdown();
489
- }
622
+ polling_cycle_.reset();
623
+ poller_manager_.TriggerShutdown();
490
624
  #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
625
+ timer_manager_->Shutdown();
491
626
  executor_->Quiesce();
492
627
  }
493
628
 
@@ -570,17 +705,28 @@ PosixEventEngine::GetDNSResolver(
570
705
  // configuration.
571
706
  if (ShouldUseAresDnsResolver()) {
572
707
  #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
708
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
573
709
  GRPC_TRACE_LOG(event_engine_dns, INFO)
574
710
  << "PosixEventEngine::" << this << " creating AresResolver";
575
711
  auto ares_resolver = AresResolver::CreateAresResolver(
576
712
  options.dns_server,
577
- std::make_unique<GrpcPolledFdFactoryPosix>(poller_manager_->Poller()),
713
+ std::make_unique<GrpcPolledFdFactoryPosix>(poller_manager_.Poller()),
578
714
  shared_from_this());
579
715
  if (!ares_resolver.ok()) {
580
716
  return ares_resolver.status();
581
717
  }
718
+ #if GRPC_ENABLE_FORK_SUPPORT && GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
719
+ {
720
+ grpc_core::MutexLock lock(&resolver_handles_mu_);
721
+ RegisterResolver(&resolver_handles_,
722
+ ares_resolver->get()->GetReinitHandle());
723
+ }
724
+ #endif // GRPC_ENABLE_FORK_SUPPORT && GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
582
725
  return std::make_unique<PosixEventEngine::PosixDNSResolver>(
583
726
  std::move(*ares_resolver));
727
+ #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
728
+ grpc_core::Crash("Can not create CAres resolver with disabled poller");
729
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
584
730
  #endif // GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
585
731
  }
586
732
  GRPC_TRACE_LOG(event_engine_dns, INFO)
@@ -652,17 +798,18 @@ EventEngine::ConnectionHandle PosixEventEngine::Connect(
652
798
  const EndpointConfig& args, MemoryAllocator memory_allocator,
653
799
  Duration timeout) {
654
800
  #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
655
- CHECK_NE(poller_manager_, nullptr);
656
801
  PosixTcpOptions options = TcpOptionsFromEndpointConfig(args);
657
- absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult> socket =
658
- PosixSocketWrapper::CreateAndPrepareTcpClientSocket(options, addr);
802
+ absl::StatusOr<EventEnginePosixInterface::PosixSocketCreateResult> socket =
803
+ poller_manager_.Poller()
804
+ ->posix_interface()
805
+ .CreateAndPrepareTcpClientSocket(options, addr);
659
806
  if (!socket.ok()) {
660
807
  Run([on_connect = std::move(on_connect),
661
808
  status = socket.status()]() mutable { on_connect(status); });
662
809
  return EventEngine::ConnectionHandle::kInvalid;
663
810
  }
664
811
  return CreateEndpointFromUnconnectedFdInternal(
665
- (*socket).sock.Fd(), std::move(on_connect), (*socket).mapped_target_addr,
812
+ (*socket).sock, std::move(on_connect), (*socket).mapped_target_addr,
666
813
  options, std::move(memory_allocator), timeout);
667
814
  #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
668
815
  grpc_core::Crash("EventEngine::Connect is not supported on this platform");
@@ -675,7 +822,8 @@ EventEngine::ConnectionHandle PosixEventEngine::CreateEndpointFromUnconnectedFd(
675
822
  MemoryAllocator memory_allocator, EventEngine::Duration timeout) {
676
823
  #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
677
824
  return CreateEndpointFromUnconnectedFdInternal(
678
- fd, std::move(on_connect), addr, TcpOptionsFromEndpointConfig(config),
825
+ poller_manager_.Poller()->posix_interface().Adopt(fd),
826
+ std::move(on_connect), addr, TcpOptionsFromEndpointConfig(config),
679
827
  std::move(memory_allocator), timeout);
680
828
  #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
681
829
  grpc_core::Crash(
@@ -690,10 +838,11 @@ PosixEventEngine::CreatePosixEndpointFromFd(int fd,
690
838
  MemoryAllocator memory_allocator) {
691
839
  #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
692
840
  DCHECK_GT(fd, 0);
693
- PosixEventPoller* poller = poller_manager_->Poller();
841
+ PosixEventPoller* poller = poller_manager_.Poller();
694
842
  DCHECK_NE(poller, nullptr);
695
843
  EventHandle* handle =
696
- poller->CreateHandle(fd, "tcp-client", poller->CanTrackErrors());
844
+ poller->CreateHandle(poller->posix_interface().Adopt(fd), "tcp-client",
845
+ poller->CanTrackErrors());
697
846
  return CreatePosixEndpoint(handle, nullptr, shared_from_this(),
698
847
  std::move(memory_allocator),
699
848
  TcpOptionsFromEndpointConfig(config));
@@ -736,7 +885,7 @@ PosixEventEngine::CreateListener(
736
885
  };
737
886
  return std::make_unique<PosixEngineListener>(
738
887
  std::move(posix_on_accept), std::move(on_shutdown), config,
739
- std::move(memory_allocator_factory), poller_manager_->Poller(),
888
+ std::move(memory_allocator_factory), poller_manager_.Poller(),
740
889
  shared_from_this());
741
890
  #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
742
891
  grpc_core::Crash(
@@ -753,7 +902,7 @@ PosixEventEngine::CreatePosixListener(
753
902
  #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
754
903
  return std::make_unique<PosixEngineListener>(
755
904
  std::move(on_accept), std::move(on_shutdown), config,
756
- std::move(memory_allocator_factory), poller_manager_->Poller(),
905
+ std::move(memory_allocator_factory), poller_manager_.Poller(),
757
906
  shared_from_this());
758
907
  #else // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
759
908
  grpc_core::Crash(
@@ -761,4 +910,72 @@ PosixEventEngine::CreatePosixListener(
761
910
  #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
762
911
  }
763
912
 
913
+ #if GRPC_POSIX_SOCKET_TCP && GRPC_ENABLE_FORK_SUPPORT && \
914
+ GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
915
+
916
+ void PosixEventEngine::AfterFork(OnForkRole on_fork_role) {
917
+ if (on_fork_role == OnForkRole::kChild) {
918
+ if (grpc_core::IsEventEngineForkEnabled()) {
919
+ AfterForkInChild();
920
+ } else {
921
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
922
+ poller_manager_.Poller()->HandleForkInChild();
923
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
924
+ }
925
+ }
926
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
927
+ poller_manager_.Poller()->ResetKickState();
928
+ SchedulePoller();
929
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
930
+ }
931
+
932
+ void PosixEventEngine::BeforeFork() {
933
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
934
+ ResetPollCycle();
935
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
936
+ }
937
+
938
+ void PosixEventEngine::AfterForkInChild() {
939
+ #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
940
+ grpc_core::MutexLock lock(&resolver_handles_mu_);
941
+ for (const auto& cb : resolver_handles_) {
942
+ auto locked = cb.lock();
943
+ if (locked != nullptr) {
944
+ locked->Reset(absl::CancelledError("Reset resolver on fork"));
945
+ }
946
+ }
947
+ #endif
948
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
949
+ poller_manager_.Poller()->HandleForkInChild();
950
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
951
+ #if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
952
+ for (const auto& cb : resolver_handles_) {
953
+ auto locked = cb.lock();
954
+ if (locked != nullptr) {
955
+ locked->Restart();
956
+ }
957
+ }
958
+ #endif
959
+ }
960
+
961
+ #endif // GRPC_POSIX_SOCKET_TCP && GRPC_ENABLE_FORK_SUPPORT &&
962
+ // GRPC_POSIX_FORK_ALLOW_PTHREAD_ATFORK
963
+
964
+ #if GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
965
+
966
+ void PosixEventEngine::SchedulePoller() {
967
+ if (poller_manager_.Poller() != nullptr) {
968
+ grpc_core::MutexLock lock(&mu_);
969
+ CHECK(!polling_cycle_.has_value());
970
+ polling_cycle_.emplace(&poller_manager_);
971
+ }
972
+ }
973
+
974
+ void PosixEventEngine::ResetPollCycle() {
975
+ grpc_core::MutexLock lock(&mu_);
976
+ polling_cycle_.reset();
977
+ }
978
+
979
+ #endif // GRPC_PLATFORM_SUPPORTS_POSIX_POLLING
980
+
764
981
  } // namespace grpc_event_engine::experimental