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,490 @@
1
+ // Copyright 2022 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_MPSC_H
16
+ #define GRPC_SRC_CORE_LIB_PROMISE_MPSC_H
17
+
18
+ #include <grpc/support/port_platform.h>
19
+ #include <stddef.h>
20
+
21
+ #include <algorithm>
22
+ #include <atomic>
23
+ #include <cstdint>
24
+ #include <utility>
25
+
26
+ #include "absl/log/check.h"
27
+ #include "src/core/channelz/property_list.h"
28
+ #include "src/core/lib/promise/activity.h"
29
+ #include "src/core/lib/promise/map.h"
30
+ #include "src/core/lib/promise/poll.h"
31
+ #include "src/core/lib/promise/status_flag.h"
32
+ #include "src/core/util/ref_counted.h"
33
+ #include "src/core/util/ref_counted_ptr.h"
34
+
35
+ namespace grpc_core {
36
+
37
+ namespace mpscpipe_detail {
38
+
39
+ // Multi Producer Single Consumer (MPSC) inter-activity communications.
40
+ // MPSC is used to communicate in between two or more Activities or Promise
41
+ // Parties in a thread safe way.
42
+ // The communication consists of one or more MpscSender objects and one
43
+ // MpscReceiver.
44
+
45
+ // Base MPSC class.
46
+ //
47
+ // The templates below wrap this and provide a more user friendly API.
48
+ // This class provides queuing of nodes, blocking those sends if there are too
49
+ // many tokens in the queue, a way of dequeuing nodes in order, and a way of
50
+ // lazily returning tokens to the queue after a node is dequeued.
51
+ //
52
+ // Notes:
53
+ //
54
+ // We split the queue in two.
55
+ //
56
+ // The first is an unbounded MPSC that we queue all prospective nodes into.
57
+ // Since the nodes exist, there's no reason not to keep track of them, but we
58
+ // do signal that nodes above the max_queued_ are blocked and refused to
59
+ // complete the send promise until they become accepted. The unbounded mpsc
60
+ // is derived from the same algorithm in mpscq.h, and consequently from
61
+ // http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue
62
+ //
63
+ // That implementation is modified to allow a Waker object to be CAS-d in
64
+ // whenever we'd otherwise return nullptr to signify no ready node yet. This
65
+ // allows us to then wake up the stalled actor using the Activity wakeup system
66
+ // without needing any backoff/manual retry loop that's traditionally plagued
67
+ // usage of mpscq.h. If there are bugs, it's probably in those modifications.
68
+ //
69
+ // The second queue is an spsc queue that tracks nodes that have been accepted,
70
+ // that is that could be returned by Next() but have not yet been returned.
71
+ // We cheat a little here and allow (max_queued_ - 1) + (one node) to be
72
+ // accepted because it makes the logic much simpler - by decoupling the
73
+ // acceptance check and the dequeue operation.
74
+ //
75
+ // The second queue is entirely maintained by the single consumer.
76
+ class Mpsc {
77
+ public:
78
+ explicit Mpsc(size_t max_queued) : max_queued_(max_queued) {}
79
+ ~Mpsc();
80
+
81
+ // Base class for nodes in the queue.
82
+ // Center<T>::Node extends this for various types.
83
+ class Node {
84
+ public:
85
+ // One ref for blocking, one ref for releasing tokens. If there are no
86
+ // tokens this is an immediate send, and so we don't need the ref for
87
+ // blocking.
88
+ explicit Node(uint32_t tokens) : tokens_(tokens) {}
89
+ virtual ~Node() = default;
90
+
91
+ uint32_t tokens() const { return tokens_; }
92
+
93
+ private:
94
+ friend class Mpsc;
95
+ static constexpr uintptr_t kWakerPtr = 1;
96
+ static constexpr uint8_t kBlockedState = 128;
97
+ static constexpr uint8_t kClosedState = 64;
98
+ static constexpr uint8_t kRefMask = 3;
99
+
100
+ void Unref() {
101
+ if ((state_.fetch_sub(1, std::memory_order_acq_rel) & kRefMask) == 1) {
102
+ delete this;
103
+ }
104
+ }
105
+
106
+ channelz::PropertyList ChannelzProperties() const {
107
+ auto state = state_.load(std::memory_order_relaxed);
108
+ return channelz::PropertyList()
109
+ .Set("blocked", state & Node::kBlockedState)
110
+ .Set("closed", state & Node::kClosedState)
111
+ .Set("refs", state & Node::kRefMask);
112
+ }
113
+
114
+ const uint32_t tokens_;
115
+ // All following fields are maintained by the Mpsc class.
116
+ std::atomic<uint8_t> state_;
117
+ Waker waker_;
118
+ union {
119
+ std::atomic<uintptr_t> next_{0};
120
+ Node* spsc_next_;
121
+ };
122
+ };
123
+
124
+ private:
125
+ class SendPoller {
126
+ public:
127
+ explicit SendPoller(Node* node) : node_(node) {}
128
+ ~SendPoller() {
129
+ if (node_ != nullptr) node_->Unref();
130
+ }
131
+ SendPoller(const SendPoller&) = delete;
132
+ SendPoller& operator=(const SendPoller&) = delete;
133
+ SendPoller(SendPoller&& other) noexcept
134
+ : node_(std::exchange(other.node_, nullptr)) {}
135
+ SendPoller& operator=(SendPoller&& other) noexcept {
136
+ std::swap(node_, other.node_);
137
+ return *this;
138
+ }
139
+ Poll<StatusFlag> operator()() {
140
+ auto state = node_->state_.load(std::memory_order_relaxed);
141
+ if (state & Node::kClosedState) {
142
+ node_->Unref();
143
+ node_ = nullptr;
144
+ return Failure{};
145
+ }
146
+ if (state & Node::kBlockedState) {
147
+ return Pending{};
148
+ }
149
+ node_->Unref();
150
+ node_ = nullptr;
151
+ return Success{};
152
+ }
153
+
154
+ channelz::PropertyList ChannelzProperties() const {
155
+ return node_->ChannelzProperties();
156
+ }
157
+
158
+ private:
159
+ Node* node_;
160
+ };
161
+
162
+ class NextPoller {
163
+ public:
164
+ explicit NextPoller(Mpsc* mpsc) : mpsc_(mpsc) {}
165
+ NextPoller(const NextPoller&) = delete;
166
+ NextPoller& operator=(const NextPoller&) = delete;
167
+ NextPoller(NextPoller&& other) noexcept
168
+ : mpsc_(std::exchange(other.mpsc_, nullptr)) {}
169
+ NextPoller& operator=(NextPoller&& other) noexcept {
170
+ std::swap(mpsc_, other.mpsc_);
171
+ return *this;
172
+ }
173
+ Poll<ValueOrFailure<Node*>> operator()() { return mpsc_->PollNext(); }
174
+ channelz::PropertyList ChannelzProperties() const {
175
+ return mpsc_->PollNextChannelzProperties();
176
+ }
177
+
178
+ private:
179
+ Mpsc* mpsc_;
180
+ };
181
+
182
+ public:
183
+ auto Send(Node* node) {
184
+ DCHECK(node->waker_.is_unwakeable());
185
+ // Enqueue the node immediately; this means that Send() must be called
186
+ // from the same activity that will poll the result.
187
+ Enqueue(node);
188
+ return SendPoller(node);
189
+ }
190
+
191
+ StatusFlag UnbufferedImmediateSend(Node* node);
192
+
193
+ auto Next() { return NextPoller(this); }
194
+ Node* ImmediateNext() {
195
+ Node* accepted_head = accepted_head_;
196
+ if (accepted_head != nullptr) {
197
+ accepted_head_ = reinterpret_cast<Node*>(
198
+ accepted_head->next_.load(std::memory_order_relaxed));
199
+ }
200
+ return accepted_head;
201
+ }
202
+ void ReleaseTokens(Node* node);
203
+
204
+ void Close(bool wake_reader);
205
+
206
+ channelz::PropertyList ChannelzProperties() const;
207
+
208
+ uint64_t QueuedTokens() const { return queued_tokens_.load(); }
209
+
210
+ private:
211
+ void Enqueue(Node* node);
212
+ void ReleaseTokensAndClose(Node* node);
213
+ Poll<Node*> Dequeue();
214
+ Node* DequeueImmediate();
215
+ Node* DequeueForDrain();
216
+ // Returns true if we can accept more nodes.
217
+ bool AcceptNode(Node* node);
218
+ // Returns true if we can accept more nodes.
219
+ // If it returns false, ensures a waker is set for the next enqueue.
220
+ bool CheckActiveTokens();
221
+ void DrainMpsc();
222
+ void PushStub();
223
+ void ReleaseActiveTokens(bool wake_reader, uint64_t tokens);
224
+ Poll<ValueOrFailure<Node*>> PollNext();
225
+ channelz::PropertyList PollNextChannelzProperties() const;
226
+
227
+ // Top two bits of active tokens is used for synchronization of
228
+ // the waker.
229
+ // When we see we need to pause because active tokens exceeds max queued,
230
+ // we first store a waker in active_tokens_waker_, then set active_tokens_ to
231
+ // hold kActiveTokensWakerBit.
232
+ // A token releaser to see active tokens less than max queued whilst the waker
233
+ // bit is set will try to transition it to having just the /waking/ bit set.
234
+ // If it succeeds, it holds the waker lock, and moves the waker out to a local
235
+ // variable.
236
+ // Next, it clears the top bits of active tokens, to indicate a waker can once
237
+ // again be installed.
238
+ // Finally, it executes the wakeup it's stored locally.
239
+ static constexpr uint64_t kActiveTokensWakerBit = 1ull << 63;
240
+ static constexpr uint64_t kActiveTokensWakingBit = 1ull << 62;
241
+ static constexpr uint64_t kActiveTokensMask = kActiveTokensWakingBit - 1;
242
+ const uint64_t max_queued_;
243
+
244
+ // Each active enqueue is one actor, and the reader is an actor.
245
+ // Once we close, we drop the reader actor, allowing each enqueuer to see
246
+ // if it's the last enqueuer.
247
+ // The last actor must drain the queue.
248
+ std::atomic<uint64_t> actors_{1};
249
+ std::atomic<uint64_t> queued_tokens_{0};
250
+ Waker active_tokens_waker_;
251
+ std::atomic<Node*> head_ = &stub_;
252
+ alignas(GPR_CACHELINE_SIZE) Node* tail_ = &stub_;
253
+ Node* accepted_head_ = nullptr;
254
+ std::atomic<uint64_t> active_tokens_{0};
255
+ Node stub_{0};
256
+ #ifndef NDEBUG
257
+ bool drained = false;
258
+ #endif
259
+ };
260
+
261
+ // "Center" of the communication pipe.
262
+ // Contains sent but not received messages, and open/close state.
263
+ template <typename T>
264
+ class Center : public RefCounted<Center<T>, NonPolymorphicRefCount> {
265
+ private:
266
+ struct Node final : public Mpsc::Node {
267
+ explicit Node(uint32_t tokens, T value)
268
+ : Mpsc::Node(tokens), value(std::move(value)) {}
269
+ T value;
270
+ };
271
+
272
+ public:
273
+ // Construct the center with a maximum queue size.
274
+ explicit Center(size_t max_queued) : mpsc_(max_queued) {}
275
+
276
+ ~Center() {}
277
+
278
+ class Queued {
279
+ public:
280
+ Queued() : node_(nullptr) {}
281
+ Queued(Node* node, RefCountedPtr<Center<T>> center)
282
+ : node_(node), center_(std::move(center)) {}
283
+ ~Queued() {
284
+ if (node_ != nullptr) center_->mpsc_.ReleaseTokens(node_);
285
+ }
286
+ Queued(const Queued&) = delete;
287
+ Queued& operator=(const Queued&) = delete;
288
+ Queued(Queued&& q) noexcept
289
+ : node_(std::exchange(q.node_, nullptr)),
290
+ center_(std::move(q.center_)) {}
291
+ Queued& operator=(Queued&& q) noexcept {
292
+ std::swap(node_, q.node_);
293
+ std::swap(center_, q.center_);
294
+ return *this;
295
+ }
296
+
297
+ template <typename Sink>
298
+ friend void AbslStringify(Sink& sink, const Queued& q) {
299
+ absl::Format(&sink, "Queued{%s, tokens=%d}", absl::StrCat(q.node_->value),
300
+ q.node_->tokens());
301
+ }
302
+
303
+ friend std::ostream& operator<<(std::ostream& os, const Queued& q) {
304
+ return os << absl::StrCat(q);
305
+ }
306
+
307
+ T& operator*() { return node_->value; }
308
+ const T& operator*() const { return node_->value; }
309
+ T* operator->() { return &node_->value; }
310
+ const T* operator->() const { return &node_->value; }
311
+
312
+ uint32_t tokens() const { return node_->tokens(); }
313
+
314
+ private:
315
+ Node* node_;
316
+ RefCountedPtr<Center<T>> center_;
317
+ };
318
+
319
+ auto Send(T value, uint32_t tokens) {
320
+ return mpsc_.Send(new Node(tokens, std::move(value)));
321
+ }
322
+
323
+ StatusFlag UnbufferedImmediateSend(T value, uint32_t tokens) {
324
+ return mpsc_.UnbufferedImmediateSend(new Node(tokens, std::move(value)));
325
+ }
326
+
327
+ auto Next() {
328
+ return Map(mpsc_.Next(),
329
+ [this](ValueOrFailure<Mpsc::Node*> x) -> ValueOrFailure<Queued> {
330
+ if (!x.ok()) return Failure{};
331
+ return Queued(DownCast<Node*>(*x), this->Ref());
332
+ });
333
+ }
334
+
335
+ auto NextBatch(size_t max_batch_size) {
336
+ // Does not support delayed returning of tokens.
337
+ return Map(mpsc_.Next(),
338
+ [this, max_batch_size](ValueOrFailure<Mpsc::Node*> x)
339
+ -> ValueOrFailure<std::vector<T>> {
340
+ if (!x.ok()) return Failure{};
341
+ std::vector<T> result;
342
+ result.emplace_back(std::move(DownCast<Node*>(*x)->value));
343
+ mpsc_.ReleaseTokens(*x);
344
+ while (result.size() < max_batch_size) {
345
+ auto next = mpsc_.ImmediateNext();
346
+ if (next == nullptr) break;
347
+ result.emplace_back(std::move(DownCast<Node*>(next)->value));
348
+ mpsc_.ReleaseTokens(next);
349
+ }
350
+ return std::move(result);
351
+ });
352
+ }
353
+
354
+ void ReceiverClosed(bool wake_reader) { mpsc_.Close(wake_reader); }
355
+
356
+ uint64_t QueuedTokens() const { return mpsc_.QueuedTokens(); }
357
+
358
+ channelz::PropertyList ChannelzProperties() const {
359
+ return mpsc_.ChannelzProperties();
360
+ }
361
+
362
+ private:
363
+ Mpsc mpsc_;
364
+ };
365
+
366
+ } // namespace mpscpipe_detail
367
+
368
+ template <typename T>
369
+ using MpscQueued = typename mpscpipe_detail::Center<T>::Queued;
370
+
371
+ template <typename T>
372
+ class MpscReceiver;
373
+
374
+ // Send half of an mpsc pipe.
375
+ template <typename T>
376
+ class MpscSender {
377
+ public:
378
+ MpscSender() = default;
379
+ MpscSender(const MpscSender&) = default;
380
+ MpscSender& operator=(const MpscSender&) = default;
381
+ MpscSender(MpscSender&&) noexcept = default;
382
+ MpscSender& operator=(MpscSender&&) noexcept = default;
383
+
384
+ // Input: Input is the object that you want to send. The promise that is
385
+ // returned by Send will take ownership of the object.
386
+ // Return: Returns a promise that will send one item.
387
+ // This promise can either return
388
+ // 1. Pending{} if the sending is still pending
389
+ // 2. Resolves to true if sending is successful
390
+ // 3. Resolves to false if the receiver was closed and the value
391
+ // will never be successfully sent.
392
+ // The promise returned is thread safe. We can use multiple send calls
393
+ // in parallel to generate multiple such send promises and these promises can
394
+ // be run in parallel in a thread safe way.
395
+ auto Send(T t, uint32_t tokens) {
396
+ return Map(center_->Send(std::move(t), tokens),
397
+ [c = center_](auto x) { return x; });
398
+ }
399
+
400
+ StatusFlag UnbufferedImmediateSend(T t, uint32_t tokens) {
401
+ return center_->UnbufferedImmediateSend(std::move(t), tokens);
402
+ }
403
+
404
+ private:
405
+ friend class MpscReceiver<T>;
406
+ explicit MpscSender(RefCountedPtr<mpscpipe_detail::Center<T>> center)
407
+ : center_(std::move(center)) {}
408
+ RefCountedPtr<mpscpipe_detail::Center<T>> center_;
409
+ };
410
+
411
+ template <typename T>
412
+ class MpscDebug {
413
+ public:
414
+ MpscDebug() = default;
415
+ channelz::PropertyList ChannelzProperties() const {
416
+ return center_->ChannelzProperties();
417
+ }
418
+
419
+ private:
420
+ friend class MpscReceiver<T>;
421
+ explicit MpscDebug(RefCountedPtr<mpscpipe_detail::Center<T>> center)
422
+ : center_(std::move(center)) {}
423
+ RefCountedPtr<mpscpipe_detail::Center<T>> center_;
424
+ };
425
+
426
+ template <typename T>
427
+ class MpscProbe {
428
+ public:
429
+ MpscProbe() = default;
430
+
431
+ uint64_t QueuedTokens() const {
432
+ return center_ == nullptr ? 0 : center_->QueuedTokens();
433
+ }
434
+
435
+ private:
436
+ friend class MpscReceiver<T>;
437
+ explicit MpscProbe(RefCountedPtr<mpscpipe_detail::Center<T>> center)
438
+ : center_(std::move(center)) {}
439
+ RefCountedPtr<mpscpipe_detail::Center<T>> center_;
440
+ };
441
+
442
+ // Receive half of an mpsc pipe.
443
+ template <typename T>
444
+ class MpscReceiver {
445
+ public:
446
+ // max_buffer_hint is the maximum number of tokens we'd like to buffer.
447
+ explicit MpscReceiver(uint64_t max_buffer_hint)
448
+ : center_(MakeRefCounted<mpscpipe_detail::Center<T>>(max_buffer_hint)) {}
449
+ ~MpscReceiver() {
450
+ if (center_ != nullptr) center_->ReceiverClosed(false);
451
+ }
452
+ // Marking the receiver closed will make sure it will not receive any
453
+ // messages. If a sender tries to Send a message to a closed receiver,
454
+ // sending will fail.
455
+ void MarkClosed() {
456
+ if (center_ != nullptr) center_->ReceiverClosed(true);
457
+ }
458
+ MpscReceiver(const MpscReceiver&) = delete;
459
+ MpscReceiver& operator=(const MpscReceiver&) = delete;
460
+ MpscReceiver(MpscReceiver&& other) noexcept
461
+ : center_(std::move(other.center_)) {}
462
+ MpscReceiver& operator=(MpscReceiver&& other) noexcept {
463
+ center_ = std::move(other.center_);
464
+ return *this;
465
+ }
466
+
467
+ // Construct a new sender for this receiver. One receiver can have multiple
468
+ // senders.
469
+ MpscSender<T> MakeSender() { return MpscSender<T>(center_); }
470
+
471
+ MpscDebug<T> MakeDebug() { return MpscDebug<T>(center_); }
472
+ MpscProbe<T> MakeProbe() { return MpscProbe<T>(center_); }
473
+
474
+ // Returns a promise that will resolve to ValueOrFailure<T>.
475
+ // If receiving is closed, the promise will resolve to failure.
476
+ // Otherwise, the promise resolves to the next item and removes
477
+ // said item from the queue.
478
+ auto Next() { return center_->Next(); }
479
+
480
+ auto NextBatch(size_t max_batch_size) {
481
+ return center_->NextBatch(max_batch_size);
482
+ }
483
+
484
+ private:
485
+ RefCountedPtr<mpscpipe_detail::Center<T>> center_;
486
+ };
487
+
488
+ } // namespace grpc_core
489
+
490
+ #endif // GRPC_SRC_CORE_LIB_PROMISE_MPSC_H
@@ -27,6 +27,7 @@
27
27
  #include "src/core/lib/event_engine/event_engine_context.h"
28
28
  #include "src/core/lib/iomgr/exec_ctx.h"
29
29
  #include "src/core/lib/promise/activity.h"
30
+ #include "src/core/util/json/json_writer.h"
30
31
  #include "src/core/util/latent_see.h"
31
32
  #include "src/core/util/sync.h"
32
33
 
@@ -154,6 +155,7 @@ Party::Participant::~Participant() {
154
155
  // Party::SpawnSerializer
155
156
 
156
157
  bool Party::SpawnSerializer::PollParticipantPromise() {
158
+ GRPC_LATENT_SEE_INNER_SCOPE("SpawnSerializer::PollParticipantPromise");
157
159
  if (active_ == nullptr) {
158
160
  active_ = next_.Pop().value_or(nullptr);
159
161
  }
@@ -187,6 +189,50 @@ void Party::SpawnSerializer::Destroy() {
187
189
 
188
190
  Party::~Party() {}
189
191
 
192
+ void Party::ToJson(absl::AnyInvocable<void(Json::Object)> f) {
193
+ Spawn(
194
+ "get-json",
195
+ [f = std::move(f), self = Ref()]() mutable {
196
+ return [f = std::move(f), self]() mutable {
197
+ f(self->ChannelzPropertiesLocked().TakeJsonObject());
198
+ return absl::OkStatus();
199
+ };
200
+ },
201
+ [](absl::Status) {});
202
+ }
203
+
204
+ void Party::ExportToChannelz(std::string name, channelz::DataSink sink) {
205
+ Spawn(
206
+ "export-to-channelz",
207
+ [name = std::move(name), sink = std::move(sink), self = Ref()]() mutable {
208
+ sink.AddData(std::move(name), self->ChannelzPropertiesLocked());
209
+ return absl::OkStatus();
210
+ },
211
+ [](absl::Status) {});
212
+ }
213
+
214
+ channelz::PropertyList Party::ChannelzPropertiesLocked() {
215
+ return channelz::PropertyList()
216
+ .Set("ref_count", state_.load(std::memory_order_relaxed) >> kRefShift)
217
+ .Set("allocated_participants",
218
+ (state_.load(std::memory_order_relaxed) & kAllocatedMask) >>
219
+ kAllocatedShift)
220
+ .Set("wakeup_mask", wakeup_mask_ & kWakeupMask)
221
+ .Set("locked", (state_.load(std::memory_order_relaxed) & kLocked) != 0)
222
+ .Set("local_wakeup_mask", wakeup_mask_)
223
+ .Set("currently_polling", currently_polling_)
224
+ .Set("participants", [this]() {
225
+ channelz::PropertyTable table;
226
+ for (size_t i = 0; i < party_detail::kMaxParticipants; i++) {
227
+ if (auto* p = participants_[i].load(std::memory_order_acquire);
228
+ p != nullptr) {
229
+ table.AppendRow(p->ChannelzProperties());
230
+ }
231
+ }
232
+ return table;
233
+ }());
234
+ }
235
+
190
236
  void Party::CancelRemainingParticipants() {
191
237
  uint64_t prev_state = state_.load(std::memory_order_relaxed);
192
238
  if ((prev_state & kAllocatedMask) == 0) return;
@@ -260,6 +306,7 @@ void Party::RunLockedAndUnref(Party* party, uint64_t prev_state) {
260
306
  g_run_state = this;
261
307
  do {
262
308
  GRPC_LATENT_SEE_INNER_SCOPE("run_one_party");
309
+ CHECK(first.party != nullptr);
263
310
  first.party->RunPartyAndUnref(first.prev_state);
264
311
  first = std::exchange(next, PartyWakeup{});
265
312
  } while (first.party != nullptr);
@@ -290,10 +337,12 @@ void Party::RunLockedAndUnref(Party* party, uint64_t prev_state) {
290
337
  // gets held for a really long time.
291
338
  auto wakeup =
292
339
  std::exchange(g_run_state->next, PartyWakeup{party, prev_state});
293
- auto arena = party->arena_.get();
340
+ auto arena = wakeup.party->arena_.get();
341
+ CHECK(arena != nullptr);
294
342
  auto* event_engine =
295
343
  arena->GetContext<grpc_event_engine::experimental::EventEngine>();
296
344
  CHECK(event_engine != nullptr) << "; " << GRPC_DUMP_ARGS(party, arena);
345
+ GRPC_LATENT_SEE_INNER_SCOPE("offload_one_party");
297
346
  event_engine->Run([wakeup]() {
298
347
  GRPC_LATENT_SEE_PARENT_SCOPE("Party::RunLocked offload");
299
348
  ExecCtx exec_ctx;