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
@@ -0,0 +1,103 @@
1
+ // Copyright 2024 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_LIB_PROMISE_MATCH_PROMISE_H
16
+ #define GRPC_SRC_CORE_LIB_PROMISE_MATCH_PROMISE_H
17
+
18
+ #include <variant>
19
+
20
+ #include "src/core/lib/promise/detail/promise_factory.h"
21
+ #include "src/core/lib/promise/detail/promise_like.h"
22
+ #include "src/core/lib/promise/detail/promise_variant.h"
23
+ #include "src/core/util/overload.h"
24
+
25
+ namespace grpc_core {
26
+
27
+ namespace promise_detail {
28
+
29
+ // Match Promise Combinator
30
+ //
31
+ // Input:
32
+ // The first input is an std::variant<...> object.
33
+ // The remaining inputs are either
34
+ // 1. Promises which take one of the variant types as input parameter and return
35
+ // Poll<T>
36
+ // 2. Functors that take one of the variant types as input parameter and return
37
+ // a Promise with return type Poll<T>
38
+ // 3. There MUST be one input promise/functor corresponding to each type in the
39
+ // std::variant<...> input
40
+ // 4. The return type of all promises must be the same.
41
+ //
42
+ // Returns:
43
+ // Match promise combinator returns Poll<T>
44
+ //
45
+ // Polling the Match combinator works in the following way :
46
+ // The Match combinator selects which of the input promises to execute based on
47
+ // the value of the std::variant. Only 1 of the input promises will be executed
48
+ // on polling the Match combinator. Like all other promises, the Match
49
+ // combinator can be polled till it resolves.
50
+ //
51
+ // Example : Refer to match_promise_test.cc
52
+
53
+ // This types job is to visit a supplied variant, and apply a mapping
54
+ // Constructor from input types to promises, returning a variant full of
55
+ // promises.
56
+ template <typename Constructor, typename... Ts>
57
+ struct ConstructPromiseVariantVisitor {
58
+ // Factory functions supplied to the top level `Match` object, wrapped by
59
+ // OverloadType to become overloaded members.
60
+ Constructor constructor;
61
+
62
+ // Helper function... only callable once.
63
+ // Given a value, construct a Promise Factory that accepts that value type,
64
+ // and uses the constructor type above to map from that type to a promise
65
+ // returned by the factory.
66
+ // We use the Promise Factory infrastructure to deal with all the common
67
+ // variants of factory signatures that we've found to be convenient.
68
+ template <typename T>
69
+ auto CallConstructorThenFactory(T x) {
70
+ OncePromiseFactory<T, Constructor> factory(std::move(constructor));
71
+ return factory.Make(std::move(x));
72
+ }
73
+
74
+ // Polling operator.
75
+ // Given a visited type T, construct a Promise Factory, use it, and then cast
76
+ // the result into a variant type that covers ALL of the possible return types
77
+ // given the input types listed in Ts...
78
+ template <typename T>
79
+ auto operator()(T x) -> std::variant<promise_detail::PromiseLike<
80
+ decltype(CallConstructorThenFactory(std::declval<Ts>()))>...> {
81
+ return CallConstructorThenFactory(std::move(x));
82
+ }
83
+ };
84
+
85
+ } // namespace promise_detail
86
+
87
+ template <typename... Fs, typename... Ts>
88
+ auto MatchPromise(std::variant<Ts...> value, Fs... fs) {
89
+ // Construct a variant of promises using the factory functions fs, selected by
90
+ // the type held by value.
91
+ auto body = std::visit(
92
+ promise_detail::ConstructPromiseVariantVisitor<OverloadType<Fs...>,
93
+ Ts...>{
94
+ OverloadType<Fs...>(std::move(fs)...)},
95
+ std::move(value));
96
+ // Wrap that in a PromiseVariant that provides the promise API on the wrapped
97
+ // variant.
98
+ return promise_detail::PromiseVariant<decltype(body)>(std::move(body));
99
+ }
100
+
101
+ } // namespace grpc_core
102
+
103
+ #endif // GRPC_SRC_CORE_LIB_PROMISE_MATCH_PROMISE_H
@@ -0,0 +1,425 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "src/core/lib/promise/mpsc.h"
16
+
17
+ #include <atomic>
18
+ #include <cstdint>
19
+
20
+ #include "absl/log/check.h"
21
+ #include "src/core/channelz/property_list.h"
22
+ #include "src/core/lib/promise/activity.h"
23
+ #include "src/core/util/sync.h"
24
+
25
+ namespace grpc_core::mpscpipe_detail {
26
+
27
+ Mpsc::~Mpsc() { Close(false); }
28
+
29
+ void Mpsc::Enqueue(Node* node) {
30
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::Enqueue");
31
+ auto actors = actors_.load(std::memory_order_relaxed);
32
+ while (true) {
33
+ if (actors == 0) {
34
+ // Queue closed - node not yet added to queue.
35
+ node->state_.store(1 /*ref*/ | Node::kClosedState,
36
+ std::memory_order_relaxed);
37
+ return;
38
+ }
39
+ if (actors_.compare_exchange_weak(actors, actors + 1,
40
+ std::memory_order_relaxed)) {
41
+ break;
42
+ }
43
+ }
44
+ const auto tokens = node->tokens_;
45
+ if (tokens > 0 &&
46
+ queued_tokens_.fetch_add(tokens, std::memory_order_relaxed) + tokens >
47
+ max_queued_) {
48
+ node->waker_ = GetContext<Activity>()->MakeOwningWaker();
49
+ node->state_.store(2 /*refs*/ | Node::kBlockedState,
50
+ std::memory_order_release);
51
+ } else {
52
+ node->state_.store(2 /*refs*/, std::memory_order_release);
53
+ }
54
+ DCHECK_EQ(node->next_.load(std::memory_order_relaxed), 0u);
55
+ Node* prev = head_.exchange(node, std::memory_order_acq_rel);
56
+ uintptr_t prev_next = prev->next_.exchange(reinterpret_cast<uintptr_t>(node),
57
+ std::memory_order_acq_rel);
58
+ if (1 == actors_.fetch_sub(1, std::memory_order_acq_rel)) {
59
+ DrainMpsc();
60
+ }
61
+ if (prev_next == 0) return;
62
+ DCHECK_NE(prev_next & Node::kWakerPtr, 0u);
63
+ Waker* waker = reinterpret_cast<Waker*>(prev_next & ~Node::kWakerPtr);
64
+ DCHECK_NE(waker, nullptr);
65
+ waker->Wakeup();
66
+ delete waker;
67
+ }
68
+
69
+ StatusFlag Mpsc::UnbufferedImmediateSend(Node* node) {
70
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::UnbufferedImmediateSend");
71
+ auto actors = actors_.load(std::memory_order_relaxed);
72
+ while (true) {
73
+ if (actors == 0) {
74
+ // Queue closed - node not yet added to queue.
75
+ delete node;
76
+ return Failure{};
77
+ }
78
+ if (actors_.compare_exchange_weak(actors, actors + 1,
79
+ std::memory_order_relaxed)) {
80
+ break;
81
+ }
82
+ }
83
+ queued_tokens_.fetch_add(node->tokens_, std::memory_order_relaxed);
84
+ node->state_.store(1, std::memory_order_relaxed);
85
+ Node* prev = head_.exchange(node, std::memory_order_acq_rel);
86
+ uintptr_t prev_next = prev->next_.exchange(reinterpret_cast<uintptr_t>(node),
87
+ std::memory_order_acq_rel);
88
+ if (1 == actors_.fetch_sub(1, std::memory_order_acq_rel)) {
89
+ DrainMpsc();
90
+ }
91
+ if (prev_next == 0) return Success{};
92
+ DCHECK_NE(prev_next & Node::kWakerPtr, 0u);
93
+ Waker* waker = reinterpret_cast<Waker*>(prev_next & ~Node::kWakerPtr);
94
+ DCHECK_NE(waker, nullptr);
95
+ waker->Wakeup();
96
+ delete waker;
97
+ return Success{};
98
+ }
99
+
100
+ channelz::PropertyList Mpsc::PollNextChannelzProperties() const {
101
+ return channelz::PropertyList()
102
+ .Set("accepted",
103
+ [this]() {
104
+ channelz::PropertyTable properties;
105
+ for (Node* n = accepted_head_; n != nullptr; n = n->spsc_next_) {
106
+ properties.AppendRow(n->ChannelzProperties());
107
+ }
108
+ return properties;
109
+ }())
110
+ .Set("closed", tail_ == nullptr)
111
+ .Set("queued_tokens", queued_tokens_.load(std::memory_order_relaxed))
112
+ .Set("active_tokens",
113
+ active_tokens_.load(std::memory_order_relaxed) & kActiveTokensMask)
114
+ .Set("active_tokens_waker_bit",
115
+ active_tokens_.load(std::memory_order_relaxed) &
116
+ kActiveTokensWakerBit)
117
+ .Set("active_tokens_waking_bit",
118
+ active_tokens_.load(std::memory_order_relaxed) &
119
+ kActiveTokensWakingBit);
120
+ }
121
+
122
+ Poll<ValueOrFailure<Mpsc::Node*>> Mpsc::PollNext() {
123
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::Next");
124
+ Node* accepted_head = accepted_head_;
125
+ if (accepted_head != nullptr) {
126
+ accepted_head_ = accepted_head->spsc_next_;
127
+ return accepted_head;
128
+ }
129
+ if (tail_ == nullptr) return Failure{};
130
+ if (!CheckActiveTokens()) return Pending{};
131
+ auto r = Dequeue();
132
+ if (r.pending()) return Pending{};
133
+ accepted_head = r.value();
134
+ DCHECK_NE(accepted_head, &stub_);
135
+ accepted_head->spsc_next_ = nullptr;
136
+ if (AcceptNode(accepted_head)) {
137
+ Node* accepted_tail = accepted_head;
138
+ while (true) {
139
+ Node* node = DequeueImmediate();
140
+ DCHECK_NE(node, &stub_);
141
+ if (node == nullptr) break;
142
+ node->spsc_next_ = nullptr;
143
+ accepted_tail->spsc_next_ = node;
144
+ accepted_tail = node;
145
+ if (!AcceptNode(node)) break;
146
+ }
147
+ }
148
+ accepted_head_ = accepted_head->spsc_next_;
149
+ return accepted_head;
150
+ }
151
+
152
+ bool Mpsc::AcceptNode(Node* node) {
153
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::AcceptNode");
154
+ DCHECK_NE(node, nullptr);
155
+ if (node->state_.fetch_and(255 - Node::kBlockedState,
156
+ std::memory_order_relaxed) &
157
+ Node::kBlockedState) {
158
+ node->waker_.Wakeup();
159
+ }
160
+ const auto prev_active =
161
+ active_tokens_.fetch_add(node->tokens_, std::memory_order_relaxed);
162
+ return (prev_active & kActiveTokensMask) + node->tokens_ <= max_queued_;
163
+ }
164
+
165
+ bool Mpsc::CheckActiveTokens() {
166
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::CheckActiveTokens");
167
+ // First step: see if the active token count is lower than max_queued_.
168
+ // If it's not, we do not supply any nodes.
169
+ auto active_tokens = active_tokens_.load(std::memory_order_relaxed);
170
+ while (true) {
171
+ if ((active_tokens & kActiveTokensMask) > max_queued_) {
172
+ if (active_tokens & (kActiveTokensWakerBit | kActiveTokensWakingBit)) {
173
+ return false;
174
+ }
175
+ active_tokens_waker_ = GetContext<Activity>()->MakeNonOwningWaker();
176
+ if (!active_tokens_.compare_exchange_weak(
177
+ active_tokens, active_tokens | kActiveTokensWakerBit,
178
+ std::memory_order_release, std::memory_order_relaxed)) {
179
+ continue;
180
+ }
181
+ return false;
182
+ } else {
183
+ // Observed active tokens less than max_queued_.
184
+ // This must continue for the duration of this code path since it is the
185
+ // only incrementer.
186
+ return true;
187
+ }
188
+ }
189
+ }
190
+
191
+ void Mpsc::DrainMpsc() {
192
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::DrainMpsc");
193
+ #ifndef NDEBUG
194
+ DCHECK(!drained);
195
+ drained = true;
196
+ #endif
197
+ while (true) {
198
+ Node* node = tail_;
199
+ if (node == nullptr) return;
200
+ auto next = node->next_.load(std::memory_order_acquire);
201
+ if (next == 0) {
202
+ tail_ = nullptr;
203
+ } else if (next & Node::kWakerPtr) {
204
+ Waker* waker = reinterpret_cast<Waker*>(next & ~Node::kWakerPtr);
205
+ waker->Wakeup();
206
+ delete waker;
207
+ tail_ = nullptr;
208
+ } else {
209
+ tail_ = reinterpret_cast<Node*>(next);
210
+ }
211
+ if (node != &stub_) ReleaseTokensAndClose(node);
212
+ }
213
+ }
214
+
215
+ Poll<Mpsc::Node*> Mpsc::Dequeue() {
216
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::Dequeue");
217
+ Node* tail = tail_;
218
+ uintptr_t next = tail->next_.load(std::memory_order_acquire);
219
+ retry_all:
220
+ if (tail == &stub_) {
221
+ if (next == 0) {
222
+ // List is (ephemerally) empty - create a waker so we get woken up
223
+ // when the queue is not empty.
224
+ Waker* waker = new Waker(GetContext<Activity>()->MakeNonOwningWaker());
225
+ if (!tail->next_.compare_exchange_weak(
226
+ next, reinterpret_cast<uintptr_t>(waker) | Node::kWakerPtr,
227
+ std::memory_order_acq_rel)) {
228
+ delete waker;
229
+ goto retry_all;
230
+ }
231
+ return Pending{}; // pending
232
+ }
233
+ if (next & Node::kWakerPtr) {
234
+ // null next waker => list closed
235
+ DCHECK_NE(next, Node::kWakerPtr);
236
+ // List is (ephemerally) empty - but we've already asked to be notified
237
+ // when non-empty.
238
+ return Pending{}; // pending
239
+ }
240
+ tail = reinterpret_cast<Node*>(next);
241
+ tail_ = tail;
242
+ next = tail->next_.load(std::memory_order_acquire);
243
+ }
244
+ if (next != 0 && (next & Node::kWakerPtr) == 0) {
245
+ tail_ = reinterpret_cast<Node*>(next);
246
+ return tail;
247
+ }
248
+ Node* head = head_.load(std::memory_order_acquire);
249
+ DCHECK_NE(head, nullptr);
250
+ if (tail != head) {
251
+ auto tail_next = tail->next_.load(std::memory_order_acquire);
252
+ while (true) {
253
+ if (tail_next != 0 && (tail_next & Node::kWakerPtr) == 0) {
254
+ // Finished adding, retry.
255
+ next = tail->next_.load(std::memory_order_acquire);
256
+ goto retry_all;
257
+ }
258
+ if (tail_next & Node::kWakerPtr) {
259
+ // null next waker => list closed
260
+ DCHECK_NE(tail_next, Node::kWakerPtr);
261
+ // Node still being added, and we've already asked to be notified.
262
+ return Pending{}; // pending
263
+ }
264
+ DCHECK_EQ(tail_next, 0u);
265
+ Waker* waker = new Waker(GetContext<Activity>()->MakeNonOwningWaker());
266
+ // Inform the adder we'd like to be woken up.
267
+ if (!tail->next_.compare_exchange_weak(
268
+ tail_next, reinterpret_cast<uintptr_t>(waker) | Node::kWakerPtr,
269
+ std::memory_order_acq_rel)) {
270
+ delete waker;
271
+ continue;
272
+ }
273
+ return Pending{}; // pending
274
+ }
275
+ }
276
+ // add stub to queue
277
+ PushStub();
278
+ next = tail->next_.load(std::memory_order_acquire);
279
+ if (next != 0 && (next & Node::kWakerPtr) == 0) {
280
+ tail_ = reinterpret_cast<Node*>(next);
281
+ return tail;
282
+ }
283
+ if (next & Node::kWakerPtr) {
284
+ // Node still being added, and we've already asked to be notified.
285
+ return Pending{}; // pending
286
+ }
287
+ DCHECK_EQ(next, 0u);
288
+ Waker* waker = new Waker(GetContext<Activity>()->MakeNonOwningWaker());
289
+ if (!tail->next_.compare_exchange_weak(
290
+ next, reinterpret_cast<uintptr_t>(waker) | Node::kWakerPtr,
291
+ std::memory_order_acq_rel)) {
292
+ delete waker;
293
+ goto retry_all;
294
+ }
295
+ return Pending{}; // pending
296
+ }
297
+
298
+ void Mpsc::PushStub() {
299
+ stub_.next_.store(0, std::memory_order_relaxed);
300
+ Node* prev = head_.exchange(&stub_, std::memory_order_acq_rel);
301
+ DCHECK_NE(prev, nullptr);
302
+ prev->next_.store(reinterpret_cast<uintptr_t>(&stub_),
303
+ std::memory_order_release);
304
+ }
305
+
306
+ Mpsc::Node* Mpsc::DequeueImmediate() {
307
+ GRPC_LATENT_SEE_INNER_SCOPE("Mpsc::DequeueImmediate");
308
+ Node* tail = tail_;
309
+ uintptr_t next = tail->next_.load(std::memory_order_acquire);
310
+ if (tail == &stub_) {
311
+ if (next == 0) {
312
+ // List is (ephemerally) empty.
313
+ return nullptr; // pending
314
+ }
315
+ if (next & Node::kWakerPtr) {
316
+ // null next waker => list closed
317
+ DCHECK_NE(next, Node::kWakerPtr);
318
+ // List is (ephemerally) empty - but we've already asked to be notified
319
+ // when non-empty.
320
+ return nullptr; // pending
321
+ }
322
+ tail = reinterpret_cast<Node*>(next);
323
+ tail_ = tail;
324
+ next = tail->next_.load(std::memory_order_acquire);
325
+ }
326
+ if (next != 0 && (next & Node::kWakerPtr) == 0) {
327
+ tail_ = reinterpret_cast<Node*>(next);
328
+ return tail;
329
+ }
330
+ Node* head = head_.load(std::memory_order_acquire);
331
+ if (tail != head) {
332
+ return nullptr; // pending
333
+ }
334
+ // add stub to queue
335
+ PushStub();
336
+ next = tail->next_.load(std::memory_order_acquire);
337
+ if (next & Node::kWakerPtr) {
338
+ // Node still being added, and we've already asked to be notified.
339
+ return nullptr; // pending
340
+ }
341
+ if (next == 0) {
342
+ return nullptr; // pending
343
+ }
344
+ tail_ = reinterpret_cast<Node*>(next);
345
+ return tail;
346
+ }
347
+
348
+ void Mpsc::Close(bool wake_reader) {
349
+ Node* accepted_head = accepted_head_;
350
+ while (accepted_head != nullptr) {
351
+ auto* next = accepted_head->spsc_next_;
352
+ ReleaseActiveTokens(wake_reader, accepted_head->tokens_);
353
+ ReleaseTokensAndClose(accepted_head);
354
+ accepted_head = next;
355
+ }
356
+ accepted_head_ = nullptr;
357
+ if (1 == actors_.fetch_sub(1, std::memory_order_acq_rel)) {
358
+ DrainMpsc();
359
+ }
360
+ }
361
+
362
+ void Mpsc::ReleaseTokens(Node* node) {
363
+ auto prev_queued =
364
+ queued_tokens_.fetch_sub(node->tokens_, std::memory_order_relaxed);
365
+ DCHECK_GE(prev_queued, node->tokens_);
366
+ ReleaseActiveTokens(true, node->tokens_);
367
+ node->Unref();
368
+ }
369
+
370
+ void Mpsc::ReleaseTokensAndClose(Node* node) {
371
+ DCHECK_NE(node, &stub_);
372
+ auto prev_queued =
373
+ queued_tokens_.fetch_sub(node->tokens_, std::memory_order_relaxed);
374
+ DCHECK_GE(prev_queued, node->tokens_);
375
+ // Called when the node has not yet been dequeued -- so we don't need to
376
+ // decrement active tokens_.
377
+ uint8_t state = node->state_.load(std::memory_order_relaxed);
378
+ while (true) {
379
+ DCHECK_EQ(state & Node::kClosedState, 0) << int(state);
380
+ uint8_t new_state = state;
381
+ new_state &= ~Node::kBlockedState;
382
+ new_state |= Node::kClosedState;
383
+ if (!node->state_.compare_exchange_weak(state, new_state,
384
+ std::memory_order_acq_rel)) {
385
+ continue;
386
+ }
387
+ break;
388
+ }
389
+ node->waker_.Wakeup();
390
+ node->Unref();
391
+ }
392
+
393
+ void Mpsc::ReleaseActiveTokens(bool wake_reader, uint64_t tokens) {
394
+ DCHECK_EQ(tokens & kActiveTokensMask, tokens);
395
+ auto prev_active =
396
+ active_tokens_.fetch_sub(tokens, std::memory_order_relaxed);
397
+ DCHECK_GE(prev_active & kActiveTokensMask, tokens);
398
+ while ((prev_active & kActiveTokensWakerBit) != 0 &&
399
+ (prev_active & kActiveTokensMask) - tokens <= max_queued_) {
400
+ if (active_tokens_.compare_exchange_weak(
401
+ prev_active,
402
+ (prev_active & kActiveTokensMask) | kActiveTokensWakingBit,
403
+ std::memory_order_acquire, std::memory_order_relaxed)) {
404
+ auto waker = std::move(active_tokens_waker_);
405
+ DCHECK(!waker.is_unwakeable());
406
+ auto prev = active_tokens_.fetch_and(kActiveTokensMask,
407
+ std::memory_order_release);
408
+ DCHECK_EQ(prev & (kActiveTokensWakerBit | kActiveTokensWakingBit),
409
+ kActiveTokensWakingBit)
410
+ << prev;
411
+ if (wake_reader) waker.Wakeup();
412
+ return;
413
+ }
414
+ }
415
+ }
416
+
417
+ channelz::PropertyList Mpsc::ChannelzProperties() const {
418
+ return channelz::PropertyList()
419
+ .Set("max_queued", max_queued_)
420
+ .Set("active_tokens",
421
+ active_tokens_.load(std::memory_order_relaxed) & kActiveTokensMask)
422
+ .Set("queued_tokens", queued_tokens_.load(std::memory_order_relaxed));
423
+ }
424
+
425
+ } // namespace grpc_core::mpscpipe_detail