grpc 1.64.3 → 1.65.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 (632) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -58
  3. data/include/grpc/event_engine/event_engine.h +13 -6
  4. data/include/grpc/impl/channel_arg_names.h +7 -3
  5. data/include/grpc/module.modulemap +1 -0
  6. data/include/grpc/passive_listener.h +62 -0
  7. data/include/grpc/support/log.h +7 -17
  8. data/include/grpc/support/port_platform.h +3 -0
  9. data/src/core/channelz/channel_trace.cc +1 -1
  10. data/src/core/channelz/channel_trace.h +1 -1
  11. data/src/core/channelz/channelz.cc +3 -3
  12. data/src/core/channelz/channelz.h +7 -7
  13. data/src/core/channelz/channelz_registry.cc +4 -3
  14. data/src/core/client_channel/backup_poller.cc +4 -5
  15. data/src/core/client_channel/client_channel.cc +1324 -0
  16. data/src/core/client_channel/client_channel.h +243 -0
  17. data/src/core/client_channel/client_channel_filter.cc +266 -709
  18. data/src/core/client_channel/client_channel_filter.h +11 -64
  19. data/src/core/client_channel/client_channel_internal.h +16 -5
  20. data/src/core/client_channel/client_channel_plugin.cc +1 -14
  21. data/src/core/client_channel/client_channel_service_config.h +3 -3
  22. data/src/core/client_channel/config_selector.cc +1 -1
  23. data/src/core/client_channel/config_selector.h +1 -1
  24. data/src/core/client_channel/dynamic_filters.cc +3 -3
  25. data/src/core/client_channel/dynamic_filters.h +1 -3
  26. data/src/core/client_channel/load_balanced_call_destination.cc +336 -0
  27. data/src/core/client_channel/load_balanced_call_destination.h +49 -0
  28. data/src/core/client_channel/retry_filter.cc +2 -9
  29. data/src/core/client_channel/retry_filter.h +2 -7
  30. data/src/core/client_channel/retry_filter_legacy_call_data.cc +65 -72
  31. data/src/core/client_channel/retry_filter_legacy_call_data.h +0 -2
  32. data/src/core/client_channel/retry_service_config.cc +4 -5
  33. data/src/core/client_channel/retry_service_config.h +3 -3
  34. data/src/core/client_channel/subchannel.cc +220 -112
  35. data/src/core/client_channel/subchannel.h +31 -18
  36. data/src/core/client_channel/subchannel_pool_interface.cc +0 -2
  37. data/src/core/client_channel/subchannel_pool_interface.h +2 -4
  38. data/src/core/client_channel/subchannel_stream_client.cc +36 -49
  39. data/src/core/client_channel/subchannel_stream_client.h +2 -4
  40. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +7 -10
  41. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +1 -0
  42. data/src/core/ext/filters/backend_metrics/backend_metric_provider.h +7 -0
  43. data/src/core/ext/filters/census/grpc_context.cc +2 -4
  44. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +8 -15
  45. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +2 -0
  46. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -7
  47. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -0
  48. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h +3 -3
  49. data/src/core/ext/filters/http/client/http_client_filter.cc +1 -0
  50. data/src/core/ext/filters/http/client/http_client_filter.h +1 -0
  51. data/src/core/ext/filters/http/client_authority_filter.cc +1 -0
  52. data/src/core/ext/filters/http/client_authority_filter.h +1 -0
  53. data/src/core/ext/filters/http/message_compress/compression_filter.cc +10 -15
  54. data/src/core/ext/filters/http/message_compress/compression_filter.h +2 -0
  55. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -2
  56. data/src/core/ext/filters/http/server/http_server_filter.h +1 -0
  57. data/src/core/ext/filters/message_size/message_size_filter.cc +6 -9
  58. data/src/core/ext/filters/message_size/message_size_filter.h +6 -6
  59. data/src/core/ext/filters/rbac/rbac_filter.cc +2 -5
  60. data/src/core/ext/filters/rbac/rbac_filter.h +1 -0
  61. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +2 -2
  62. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +1 -1
  63. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +2 -6
  64. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +1 -0
  65. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +3 -3
  66. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  67. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +8 -25
  68. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -5
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +223 -148
  70. data/src/core/ext/transport/chttp2/server/chttp2_server.h +33 -0
  71. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +131 -107
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +8 -8
  73. data/src/core/ext/transport/chttp2/transport/context_list_entry.h +1 -1
  74. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -4
  75. data/src/core/ext/transport/chttp2/transport/flow_control.h +0 -2
  76. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -6
  77. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -2
  78. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +9 -5
  79. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -4
  80. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +9 -2
  81. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +32 -43
  82. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +1 -3
  83. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +3 -8
  84. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -1
  85. data/src/core/ext/transport/chttp2/transport/http2_settings.h +1 -1
  86. data/src/core/ext/transport/chttp2/transport/internal.h +29 -19
  87. data/src/core/ext/transport/chttp2/transport/parsing.cc +15 -25
  88. data/src/core/ext/transport/chttp2/transport/ping_callbacks.cc +0 -2
  89. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +0 -2
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +29 -13
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +5 -4
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -5
  93. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -25
  94. data/src/core/ext/transport/inproc/inproc_transport.cc +56 -32
  95. data/src/core/ext/transport/inproc/inproc_transport.h +1 -3
  96. data/src/core/ext/transport/inproc/legacy_inproc_transport.cc +13 -15
  97. data/src/core/ext/transport/inproc/legacy_inproc_transport.h +0 -2
  98. data/src/core/handshaker/handshaker.cc +6 -14
  99. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +9 -17
  100. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +3 -2
  101. data/src/core/handshaker/security/secure_endpoint.cc +38 -32
  102. data/src/core/handshaker/security/secure_endpoint.h +0 -2
  103. data/src/core/handshaker/security/security_handshaker.cc +25 -37
  104. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +2 -1
  105. data/src/core/lib/address_utils/parse_address.cc +27 -39
  106. data/src/core/lib/address_utils/sockaddr_utils.cc +5 -6
  107. data/src/core/lib/avl/avl.h +1 -1
  108. data/src/core/lib/channel/channel_args.cc +13 -17
  109. data/src/core/lib/channel/channel_args.h +19 -8
  110. data/src/core/lib/channel/channel_stack.cc +5 -63
  111. data/src/core/lib/channel/channel_stack.h +13 -37
  112. data/src/core/lib/channel/channel_stack_builder.h +0 -5
  113. data/src/core/lib/channel/channel_stack_builder_impl.cc +0 -142
  114. data/src/core/lib/channel/channel_stack_builder_impl.h +0 -2
  115. data/src/core/lib/channel/connected_channel.cc +37 -676
  116. data/src/core/lib/channel/promise_based_filter.cc +41 -47
  117. data/src/core/lib/channel/promise_based_filter.h +124 -477
  118. data/src/core/lib/channel/status_util.cc +1 -1
  119. data/src/core/lib/compression/compression.cc +1 -1
  120. data/src/core/lib/compression/message_compress.cc +6 -6
  121. data/src/core/lib/config/config_vars.cc +3 -8
  122. data/src/core/lib/config/config_vars.h +1 -5
  123. data/src/core/lib/debug/event_log.h +1 -1
  124. data/src/core/lib/debug/trace.cc +43 -59
  125. data/src/core/lib/debug/trace.h +2 -97
  126. data/src/core/lib/debug/trace_flags.cc +255 -0
  127. data/src/core/lib/debug/trace_flags.h +133 -0
  128. data/src/core/lib/debug/trace_impl.h +115 -0
  129. data/src/core/lib/event_engine/ares_resolver.cc +5 -7
  130. data/src/core/lib/event_engine/ares_resolver.h +1 -3
  131. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +1 -1
  132. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +17 -22
  133. data/src/core/lib/event_engine/event_engine.cc +29 -4
  134. data/src/core/lib/event_engine/extensions/supports_fd.h +7 -0
  135. data/src/core/lib/event_engine/extensions/tcp_trace.h +43 -0
  136. data/src/core/lib/event_engine/forkable.cc +4 -5
  137. data/src/core/lib/event_engine/forkable.h +0 -11
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +10 -11
  139. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +4 -3
  140. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +1 -1
  141. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +19 -33
  142. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +3 -2
  143. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +24 -7
  144. data/src/core/lib/event_engine/posix_engine/posix_engine.h +2 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +14 -16
  146. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +18 -22
  147. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +13 -17
  148. data/src/core/lib/event_engine/posix_engine/timer.cc +1 -1
  149. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +4 -6
  150. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +2 -1
  151. data/src/core/lib/event_engine/shim.cc +1 -1
  152. data/src/core/lib/event_engine/tcp_socket_utils.cc +6 -8
  153. data/src/core/lib/event_engine/thread_local.h +1 -1
  154. data/src/core/lib/event_engine/thread_pool/thread_count.h +1 -1
  155. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +19 -21
  156. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -6
  157. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +14 -13
  158. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +4 -3
  159. data/src/core/lib/event_engine/trace.h +6 -17
  160. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  161. data/src/core/lib/event_engine/windows/win_socket.cc +23 -17
  162. data/src/core/lib/event_engine/windows/win_socket.h +4 -5
  163. data/src/core/lib/event_engine/windows/windows_endpoint.cc +6 -9
  164. data/src/core/lib/event_engine/windows/windows_engine.cc +201 -87
  165. data/src/core/lib/event_engine/windows/windows_engine.h +136 -25
  166. data/src/core/lib/event_engine/windows/windows_listener.cc +12 -23
  167. data/src/core/lib/experiments/experiments.cc +35 -151
  168. data/src/core/lib/experiments/experiments.h +12 -45
  169. data/src/core/lib/gprpp/bitset.h +1 -1
  170. data/src/core/lib/gprpp/crash.cc +2 -3
  171. data/src/core/lib/gprpp/dual_ref_counted.h +45 -33
  172. data/src/core/lib/gprpp/dump_args.cc +54 -0
  173. data/src/core/lib/gprpp/dump_args.h +69 -0
  174. data/src/core/lib/gprpp/glob.cc +70 -0
  175. data/src/core/lib/gprpp/glob.h +29 -0
  176. data/src/core/lib/gprpp/per_cpu.cc +1 -1
  177. data/src/core/lib/gprpp/posix/stat.cc +3 -4
  178. data/src/core/lib/gprpp/posix/thd.cc +8 -9
  179. data/src/core/lib/gprpp/ref_counted.h +30 -22
  180. data/src/core/lib/gprpp/single_set_ptr.h +5 -3
  181. data/src/core/lib/gprpp/status_helper.cc +11 -30
  182. data/src/core/lib/gprpp/status_helper.h +3 -31
  183. data/src/core/lib/gprpp/time.cc +3 -4
  184. data/src/core/lib/gprpp/time.h +3 -2
  185. data/src/core/lib/gprpp/unique_type_name.h +1 -1
  186. data/src/core/lib/gprpp/validation_errors.cc +10 -1
  187. data/src/core/lib/gprpp/validation_errors.h +11 -0
  188. data/src/core/lib/gprpp/windows/stat.cc +3 -4
  189. data/src/core/lib/gprpp/windows/thd.cc +3 -2
  190. data/src/core/lib/gprpp/work_serializer.cc +48 -57
  191. data/src/core/lib/iomgr/buffer_list.cc +4 -2
  192. data/src/core/lib/iomgr/call_combiner.cc +18 -27
  193. data/src/core/lib/iomgr/call_combiner.h +1 -3
  194. data/src/core/lib/iomgr/cfstream_handle.cc +4 -6
  195. data/src/core/lib/iomgr/closure.h +2 -4
  196. data/src/core/lib/iomgr/combiner.cc +6 -8
  197. data/src/core/lib/iomgr/combiner.h +0 -2
  198. data/src/core/lib/iomgr/endpoint.cc +0 -6
  199. data/src/core/lib/iomgr/endpoint.h +0 -2
  200. data/src/core/lib/iomgr/endpoint_cfstream.cc +19 -41
  201. data/src/core/lib/iomgr/endpoint_pair_posix.cc +1 -1
  202. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
  203. data/src/core/lib/iomgr/error.cc +13 -21
  204. data/src/core/lib/iomgr/error.h +1 -1
  205. data/src/core/lib/iomgr/ev_apple.cc +3 -5
  206. data/src/core/lib/iomgr/ev_epoll1_linux.cc +43 -42
  207. data/src/core/lib/iomgr/ev_poll_posix.cc +38 -29
  208. data/src/core/lib/iomgr/ev_posix.cc +8 -9
  209. data/src/core/lib/iomgr/ev_posix.h +10 -7
  210. data/src/core/lib/iomgr/event_engine_shims/closure.cc +2 -2
  211. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +14 -28
  212. data/src/core/lib/iomgr/exec_ctx.cc +2 -2
  213. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  214. data/src/core/lib/iomgr/executor.cc +6 -15
  215. data/src/core/lib/iomgr/executor.h +1 -1
  216. data/src/core/lib/iomgr/fork_posix.cc +8 -10
  217. data/src/core/lib/iomgr/fork_windows.cc +3 -1
  218. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -3
  219. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +3 -5
  220. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  221. data/src/core/lib/iomgr/iocp_windows.cc +4 -3
  222. data/src/core/lib/iomgr/iomgr.cc +13 -17
  223. data/src/core/lib/iomgr/lockfree_event.cc +3 -5
  224. data/src/core/lib/iomgr/pollset.h +0 -2
  225. data/src/core/lib/iomgr/pollset_windows.cc +0 -2
  226. data/src/core/lib/iomgr/resolve_address_posix.cc +7 -14
  227. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  228. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  229. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  230. data/src/core/lib/iomgr/socket_utils_common_posix.cc +11 -17
  231. data/src/core/lib/iomgr/socket_windows.cc +4 -6
  232. data/src/core/lib/iomgr/tcp_client_cfstream.cc +3 -5
  233. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -15
  234. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -4
  235. data/src/core/lib/iomgr/tcp_posix.cc +57 -84
  236. data/src/core/lib/iomgr/tcp_posix.h +0 -2
  237. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -3
  238. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +4 -6
  239. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -7
  240. data/src/core/lib/iomgr/tcp_server_windows.cc +10 -16
  241. data/src/core/lib/iomgr/tcp_windows.cc +25 -41
  242. data/src/core/lib/iomgr/timer_generic.cc +17 -20
  243. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  244. data/src/core/lib/iomgr/timer_manager.cc +17 -30
  245. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  246. data/src/core/lib/iomgr/vsock.cc +1 -1
  247. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +3 -3
  248. data/src/core/lib/promise/activity.h +27 -4
  249. data/src/core/lib/promise/cancel_callback.h +24 -0
  250. data/src/core/lib/promise/context.h +11 -0
  251. data/src/core/lib/promise/detail/basic_seq.h +1 -2
  252. data/src/core/lib/promise/detail/join_state.h +354 -398
  253. data/src/core/lib/promise/detail/promise_like.h +6 -5
  254. data/src/core/lib/promise/detail/seq_state.h +1178 -1178
  255. data/src/core/lib/promise/for_each.h +6 -6
  256. data/src/core/lib/promise/interceptor_list.h +6 -7
  257. data/src/core/lib/promise/latch.h +9 -9
  258. data/src/core/lib/promise/map.h +17 -0
  259. data/src/core/lib/promise/observable.h +182 -0
  260. data/src/core/lib/promise/party.cc +7 -8
  261. data/src/core/lib/promise/party.h +10 -8
  262. data/src/core/lib/promise/pipe.h +16 -35
  263. data/src/core/lib/promise/promise.h +1 -0
  264. data/src/core/lib/promise/status_flag.h +2 -0
  265. data/src/core/lib/resource_quota/arena.cc +56 -79
  266. data/src/core/lib/resource_quota/arena.h +118 -209
  267. data/src/core/lib/resource_quota/memory_quota.cc +12 -13
  268. data/src/core/lib/resource_quota/memory_quota.h +2 -3
  269. data/src/core/lib/resource_quota/periodic_update.cc +1 -1
  270. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  271. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  272. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  273. data/src/core/lib/security/authorization/evaluate_args.cc +6 -8
  274. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +5 -6
  275. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -0
  276. data/src/core/lib/security/authorization/matchers.cc +3 -3
  277. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +2 -2
  278. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +2 -3
  279. data/src/core/lib/security/context/security_context.cc +12 -13
  280. data/src/core/lib/security/context/security_context.h +31 -8
  281. data/src/core/lib/security/credentials/alts/alts_credentials.h +1 -1
  282. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +3 -1
  283. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -3
  284. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +5 -5
  285. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +3 -3
  286. data/src/core/lib/security/credentials/call_creds_util.cc +2 -1
  287. data/src/core/lib/security/credentials/channel_creds_registry.h +2 -2
  288. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +5 -3
  289. data/src/core/lib/security/credentials/composite/composite_credentials.h +1 -1
  290. data/src/core/lib/security/credentials/credentials.cc +6 -6
  291. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -4
  292. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +2 -2
  293. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -11
  294. data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -3
  295. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +2 -2
  296. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -4
  297. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +1 -1
  298. data/src/core/lib/security/credentials/fake/fake_credentials.h +1 -1
  299. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
  300. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +11 -11
  301. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -1
  302. data/src/core/lib/security/credentials/iam/iam_credentials.h +1 -1
  303. data/src/core/lib/security/credentials/jwt/json_token.cc +14 -15
  304. data/src/core/lib/security/credentials/jwt/json_token.h +1 -1
  305. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +6 -5
  306. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -1
  307. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +50 -54
  308. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
  309. data/src/core/lib/security/credentials/local/local_credentials.h +1 -1
  310. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +12 -11
  311. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +4 -4
  312. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  313. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +1 -3
  314. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +15 -21
  315. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +1 -1
  316. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +21 -30
  317. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +1 -1
  318. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +1 -1
  319. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -4
  320. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +3 -5
  321. data/src/core/lib/security/credentials/tls/tls_credentials.cc +14 -16
  322. data/src/core/lib/security/credentials/tls/tls_utils.cc +4 -4
  323. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -1
  324. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -16
  325. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +15 -12
  326. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +6 -6
  327. data/src/core/lib/security/security_connector/load_system_roots_windows.cc +1 -1
  328. data/src/core/lib/security/security_connector/local/local_security_connector.cc +8 -12
  329. data/src/core/lib/security/security_connector/security_connector.cc +1 -4
  330. data/src/core/lib/security/security_connector/security_connector.h +1 -3
  331. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +17 -19
  332. data/src/core/lib/security/security_connector/ssl_utils.cc +19 -21
  333. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +29 -40
  334. data/src/core/lib/security/transport/auth_filters.h +1 -0
  335. data/src/core/lib/security/transport/client_auth_filter.cc +7 -13
  336. data/src/core/lib/security/transport/server_auth_filter.cc +3 -8
  337. data/src/core/lib/security/util/json_util.h +1 -1
  338. data/src/core/lib/slice/slice.h +1 -1
  339. data/src/core/lib/slice/slice_refcount.h +2 -4
  340. data/src/core/lib/slice/slice_string_helpers.cc +1 -1
  341. data/src/core/lib/surface/api_trace.h +1 -3
  342. data/src/core/lib/surface/call.cc +64 -3738
  343. data/src/core/lib/surface/call.h +41 -143
  344. data/src/core/lib/surface/call_log_batch.cc +1 -1
  345. data/src/core/lib/surface/call_utils.cc +276 -0
  346. data/src/core/lib/surface/call_utils.h +449 -0
  347. data/src/core/lib/surface/channel.cc +8 -3
  348. data/src/core/lib/surface/channel.h +10 -7
  349. data/src/core/lib/surface/channel_create.cc +14 -6
  350. data/src/core/lib/surface/channel_create.h +3 -2
  351. data/src/core/lib/surface/channel_init.cc +21 -77
  352. data/src/core/lib/surface/channel_init.h +19 -97
  353. data/src/core/lib/surface/client_call.cc +419 -0
  354. data/src/core/lib/surface/client_call.h +180 -0
  355. data/src/core/lib/surface/completion_queue.cc +28 -33
  356. data/src/core/lib/surface/completion_queue.h +0 -8
  357. data/src/core/lib/surface/filter_stack_call.cc +1157 -0
  358. data/src/core/lib/surface/filter_stack_call.h +369 -0
  359. data/src/core/lib/surface/init.cc +7 -6
  360. data/src/core/lib/surface/lame_client.cc +1 -1
  361. data/src/core/lib/surface/legacy_channel.cc +40 -27
  362. data/src/core/lib/surface/legacy_channel.h +9 -18
  363. data/src/core/lib/surface/server_call.cc +222 -0
  364. data/src/core/lib/surface/server_call.h +167 -0
  365. data/src/core/lib/surface/version.cc +2 -2
  366. data/src/core/lib/transport/bdp_estimator.cc +3 -5
  367. data/src/core/lib/transport/bdp_estimator.h +2 -4
  368. data/src/core/lib/transport/call_arena_allocator.h +9 -7
  369. data/src/core/lib/transport/call_destination.h +76 -0
  370. data/src/core/lib/transport/call_filters.cc +28 -10
  371. data/src/core/lib/transport/call_filters.h +128 -22
  372. data/src/core/lib/transport/call_spine.cc +5 -6
  373. data/src/core/lib/transport/call_spine.h +159 -334
  374. data/src/core/lib/transport/connectivity_state.cc +8 -10
  375. data/src/core/lib/transport/connectivity_state.h +0 -2
  376. data/src/core/lib/transport/interception_chain.cc +155 -0
  377. data/src/core/lib/transport/interception_chain.h +236 -0
  378. data/src/core/lib/transport/metadata_batch.h +10 -1
  379. data/src/core/lib/transport/metadata_info.h +1 -1
  380. data/src/core/lib/transport/transport.cc +3 -6
  381. data/src/core/lib/transport/transport.h +43 -40
  382. data/src/core/load_balancing/child_policy_handler.cc +8 -8
  383. data/src/core/load_balancing/endpoint_list.cc +5 -5
  384. data/src/core/load_balancing/endpoint_list.h +1 -1
  385. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +1 -0
  386. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -0
  387. data/src/core/load_balancing/grpclb/grpclb.cc +25 -29
  388. data/src/core/load_balancing/grpclb/grpclb_balancer_addresses.cc +1 -1
  389. data/src/core/load_balancing/grpclb/load_balancer_api.cc +3 -4
  390. data/src/core/load_balancing/health_check_client.cc +10 -13
  391. data/src/core/load_balancing/lb_policy.cc +5 -8
  392. data/src/core/load_balancing/lb_policy.h +19 -3
  393. data/src/core/load_balancing/lb_policy_factory.h +1 -1
  394. data/src/core/load_balancing/lb_policy_registry.cc +2 -3
  395. data/src/core/load_balancing/lb_policy_registry.h +1 -1
  396. data/src/core/load_balancing/oob_backend_metric.cc +2 -4
  397. data/src/core/load_balancing/outlier_detection/outlier_detection.cc +33 -35
  398. data/src/core/load_balancing/outlier_detection/outlier_detection.h +3 -3
  399. data/src/core/load_balancing/pick_first/pick_first.cc +65 -65
  400. data/src/core/load_balancing/priority/priority.cc +26 -28
  401. data/src/core/load_balancing/ring_hash/ring_hash.cc +11 -13
  402. data/src/core/load_balancing/ring_hash/ring_hash.h +3 -3
  403. data/src/core/load_balancing/rls/rls.cc +82 -82
  404. data/src/core/load_balancing/round_robin/round_robin.cc +17 -20
  405. data/src/core/load_balancing/weighted_round_robin/weighted_round_robin.cc +54 -43
  406. data/src/core/load_balancing/weighted_target/weighted_target.cc +21 -24
  407. data/src/core/load_balancing/xds/cds.cc +14 -16
  408. data/src/core/load_balancing/xds/xds_cluster_impl.cc +16 -18
  409. data/src/core/load_balancing/xds/xds_cluster_manager.cc +15 -17
  410. data/src/core/load_balancing/xds/xds_override_host.cc +40 -41
  411. data/src/core/load_balancing/xds/xds_override_host.h +3 -3
  412. data/src/core/load_balancing/xds/xds_wrr_locality.cc +10 -12
  413. data/src/core/plugin_registry/grpc_plugin_registry.cc +5 -1
  414. data/src/core/resolver/binder/binder_resolver.cc +3 -2
  415. data/src/core/resolver/dns/c_ares/dns_resolver_ares.cc +3 -2
  416. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  417. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +7 -14
  418. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -5
  419. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  420. data/src/core/resolver/dns/dns_resolver_plugin.cc +6 -5
  421. data/src/core/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +4 -9
  422. data/src/core/resolver/dns/event_engine/service_config_helper.cc +5 -5
  423. data/src/core/resolver/dns/native/dns_resolver.cc +8 -9
  424. data/src/core/resolver/endpoint_addresses.cc +1 -1
  425. data/src/core/resolver/fake/fake_resolver.cc +1 -1
  426. data/src/core/resolver/fake/fake_resolver.h +1 -1
  427. data/src/core/resolver/google_c2p/google_c2p_resolver.cc +13 -14
  428. data/src/core/resolver/polling_resolver.cc +30 -35
  429. data/src/core/resolver/resolver.cc +2 -6
  430. data/src/core/resolver/resolver.h +0 -2
  431. data/src/core/resolver/resolver_registry.cc +6 -8
  432. data/src/core/resolver/sockaddr/sockaddr_resolver.cc +3 -3
  433. data/src/core/resolver/xds/xds_dependency_manager.cc +22 -23
  434. data/src/core/resolver/xds/xds_resolver.cc +13 -15
  435. data/src/core/server/server.cc +269 -389
  436. data/src/core/server/server.h +37 -19
  437. data/src/core/server/server_call_tracer_filter.cc +7 -14
  438. data/src/core/server/server_config_selector.h +1 -1
  439. data/src/core/server/server_config_selector_filter.cc +3 -3
  440. data/src/core/server/server_interface.h +2 -0
  441. data/src/core/server/xds_channel_stack_modifier.cc +1 -1
  442. data/src/core/server/xds_channel_stack_modifier.h +1 -1
  443. data/src/core/server/xds_server_config_fetcher.cc +1 -4
  444. data/src/core/service_config/service_config.h +1 -1
  445. data/src/core/service_config/service_config_call_data.h +13 -11
  446. data/src/core/service_config/service_config_channel_arg_filter.cc +6 -4
  447. data/src/core/service_config/service_config_impl.cc +5 -5
  448. data/src/core/service_config/service_config_impl.h +1 -1
  449. data/src/core/service_config/service_config_parser.cc +3 -6
  450. data/src/core/service_config/service_config_parser.h +1 -1
  451. data/src/core/{lib/channel → telemetry}/call_tracer.cc +20 -30
  452. data/src/core/{lib/channel → telemetry}/call_tracer.h +32 -9
  453. data/src/core/{lib/debug → telemetry}/histogram_view.cc +1 -1
  454. data/src/core/{lib/debug → telemetry}/histogram_view.h +3 -3
  455. data/src/core/telemetry/metrics.cc +178 -0
  456. data/src/core/telemetry/metrics.h +562 -0
  457. data/src/core/{lib/debug → telemetry}/stats.cc +1 -1
  458. data/src/core/{lib/debug → telemetry}/stats.h +5 -5
  459. data/src/core/{lib/debug → telemetry}/stats_data.cc +1 -1
  460. data/src/core/{lib/debug → telemetry}/stats_data.h +4 -4
  461. data/src/core/{lib/channel → telemetry}/tcp_tracer.h +3 -3
  462. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +12 -13
  463. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +25 -27
  464. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -33
  465. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  466. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -1
  467. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +5 -4
  468. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +5 -3
  469. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  470. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +4 -3
  471. data/src/core/tsi/fake_transport_security.cc +14 -17
  472. data/src/core/tsi/local_transport_security.cc +6 -5
  473. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +4 -4
  474. data/src/core/tsi/ssl_transport_security.cc +76 -81
  475. data/src/core/tsi/ssl_transport_security_utils.cc +74 -18
  476. data/src/core/tsi/ssl_transport_security_utils.h +11 -0
  477. data/src/core/tsi/transport_security.cc +0 -4
  478. data/src/core/tsi/transport_security.h +0 -2
  479. data/src/core/tsi/transport_security_interface.h +0 -4
  480. data/src/core/{lib/gpr → util}/alloc.h +3 -3
  481. data/src/core/{lib/gpr → util}/android/log.cc +0 -19
  482. data/src/core/{lib/gpr → util}/atm.cc +1 -1
  483. data/src/core/{ext/gcp/metadata_query.cc → util/gcp_metadata_query.cc} +25 -26
  484. data/src/core/{ext/gcp/metadata_query.h → util/gcp_metadata_query.h} +11 -11
  485. data/src/core/{lib/http → util/http_client}/format_request.cc +4 -3
  486. data/src/core/{lib/http → util/http_client}/format_request.h +6 -5
  487. data/src/core/{lib/http → util/http_client}/httpcli.cc +9 -10
  488. data/src/core/{lib/http → util/http_client}/httpcli.h +6 -5
  489. data/src/core/{lib/http → util/http_client}/httpcli_security_connector.cc +9 -9
  490. data/src/core/{lib/http → util/http_client}/httpcli_ssl_credentials.h +5 -4
  491. data/src/core/{lib/http → util/http_client}/parser.cc +4 -5
  492. data/src/core/{lib/http → util/http_client}/parser.h +5 -6
  493. data/src/core/{lib → util}/json/json.h +5 -4
  494. data/src/core/{lib → util}/json/json_args.h +5 -5
  495. data/src/core/{lib → util}/json/json_channel_args.h +6 -6
  496. data/src/core/{lib → util}/json/json_object_loader.cc +3 -2
  497. data/src/core/{lib → util}/json/json_object_loader.h +7 -7
  498. data/src/core/{lib → util}/json/json_reader.cc +3 -2
  499. data/src/core/{lib → util}/json/json_reader.h +6 -6
  500. data/src/core/{lib → util}/json/json_util.cc +4 -4
  501. data/src/core/{lib → util}/json/json_util.h +6 -6
  502. data/src/core/{lib → util}/json/json_writer.cc +3 -3
  503. data/src/core/{lib → util}/json/json_writer.h +6 -6
  504. data/src/core/{lib/gpr → util}/linux/log.cc +0 -45
  505. data/src/core/util/log.cc +165 -0
  506. data/src/core/{lib/gpr → util}/msys/tmpfile.cc +2 -2
  507. data/src/core/{lib/gpr → util}/posix/cpu.cc +1 -1
  508. data/src/core/{lib/gpr → util}/posix/log.cc +0 -42
  509. data/src/core/{lib/gpr → util}/posix/time.cc +1 -1
  510. data/src/core/{lib/gpr → util}/posix/tmpfile.cc +2 -2
  511. data/src/core/{lib/gpr → util}/spinlock.h +3 -3
  512. data/src/core/{lib/gpr → util}/string.cc +2 -2
  513. data/src/core/{lib/gpr → util}/string.h +3 -3
  514. data/src/core/{lib/gpr → util}/time_precise.cc +1 -1
  515. data/src/core/{lib/gpr → util}/time_precise.h +3 -3
  516. data/src/core/{lib/gpr → util}/tmpfile.h +3 -3
  517. data/src/core/{lib/gpr → util}/useful.h +3 -3
  518. data/src/core/{lib/gpr → util}/windows/log.cc +1 -44
  519. data/src/core/{lib/gpr → util}/windows/string.cc +1 -1
  520. data/src/core/{lib/gpr → util}/windows/string_util.cc +1 -1
  521. data/src/core/{lib/gpr → util}/windows/time.cc +1 -1
  522. data/src/core/{lib/gpr → util}/windows/tmpfile.cc +1 -1
  523. data/src/core/xds/grpc/certificate_provider_store.cc +3 -3
  524. data/src/core/xds/grpc/certificate_provider_store.h +4 -4
  525. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +3 -3
  526. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +3 -3
  527. data/src/core/xds/grpc/xds_audit_logger_registry.h +1 -1
  528. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +5 -5
  529. data/src/core/xds/grpc/xds_bootstrap_grpc.h +3 -3
  530. data/src/core/xds/grpc/xds_certificate_provider.h +1 -1
  531. data/src/core/xds/grpc/xds_client_grpc.cc +27 -23
  532. data/src/core/xds/grpc/xds_client_grpc.h +2 -2
  533. data/src/core/xds/grpc/xds_cluster.cc +4 -5
  534. data/src/core/xds/grpc/xds_cluster.h +1 -1
  535. data/src/core/xds/grpc/xds_cluster_specifier_plugin.cc +2 -2
  536. data/src/core/xds/grpc/xds_cluster_specifier_plugin.h +1 -1
  537. data/src/core/xds/grpc/xds_common_types.cc +1 -1
  538. data/src/core/xds/grpc/xds_common_types.h +1 -1
  539. data/src/core/xds/grpc/xds_endpoint.cc +4 -5
  540. data/src/core/xds/grpc/xds_http_fault_filter.cc +2 -2
  541. data/src/core/xds/grpc/xds_http_filters.h +2 -2
  542. data/src/core/xds/grpc/xds_http_rbac_filter.cc +3 -3
  543. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +2 -2
  544. data/src/core/xds/grpc/xds_lb_policy_registry.h +1 -1
  545. data/src/core/xds/grpc/xds_listener.cc +4 -6
  546. data/src/core/xds/grpc/xds_route_config.cc +7 -8
  547. data/src/core/xds/grpc/xds_transport_grpc.cc +2 -2
  548. data/src/core/xds/grpc/xds_transport_grpc.h +1 -1
  549. data/src/core/xds/xds_client/xds_api.cc +5 -9
  550. data/src/core/xds/xds_client/xds_bootstrap.cc +1 -1
  551. data/src/core/xds/xds_client/xds_bootstrap.h +1 -1
  552. data/src/core/xds/xds_client/xds_client.cc +39 -45
  553. data/src/core/xds/xds_client/xds_client.h +0 -3
  554. data/src/core/xds/xds_client/xds_client_stats.cc +6 -6
  555. data/src/core/xds/xds_client/xds_client_stats.h +2 -2
  556. data/src/ruby/bin/math_pb.rb +1 -22
  557. data/src/ruby/ext/grpc/rb_call.c +8 -1
  558. data/src/ruby/ext/grpc/rb_completion_queue.c +15 -32
  559. data/src/ruby/ext/grpc/rb_completion_queue.h +7 -1
  560. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -2
  561. data/src/ruby/ext/grpc/rb_server.c +39 -22
  562. data/src/ruby/lib/grpc/version.rb +1 -1
  563. data/src/ruby/pb/grpc/health/v1/health_pb.rb +1 -22
  564. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +5 -5
  565. data/src/ruby/pb/grpc/testing/metrics_pb.rb +10 -19
  566. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +5 -5
  567. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -22
  568. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +1 -22
  569. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -22
  570. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +4 -0
  571. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +12 -12
  572. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +66 -41
  573. data/third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.c +1497 -0
  574. data/third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h +58 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -3
  576. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +0 -2
  577. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +2 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +5 -0
  579. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +45 -1
  580. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +33 -23
  581. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.c +3 -6
  582. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/internal.h +9 -4
  583. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +6 -0
  584. data/third_party/boringssl-with-bazel/src/crypto/internal.h +7 -0
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +0 -4
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c +49 -16
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -10
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +7 -17
  589. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +8 -6
  590. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +3 -0
  591. data/third_party/boringssl-with-bazel/src/include/openssl/experimental/dilithium.h +125 -0
  592. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +0 -23
  593. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +1 -1
  594. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -10
  595. metadata +103 -93
  596. data/src/core/ext/transport/chttp2/transport/http_trace.cc +0 -19
  597. data/src/core/ext/transport/chttp2/transport/http_trace.h +0 -24
  598. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -23
  599. data/src/core/handshaker/security/tsi_error.cc +0 -31
  600. data/src/core/handshaker/security/tsi_error.h +0 -30
  601. data/src/core/lib/channel/channel_stack_trace.cc +0 -19
  602. data/src/core/lib/channel/channel_stack_trace.h +0 -24
  603. data/src/core/lib/channel/context.h +0 -105
  604. data/src/core/lib/channel/metrics.cc +0 -334
  605. data/src/core/lib/channel/metrics.h +0 -365
  606. data/src/core/lib/event_engine/trace.cc +0 -25
  607. data/src/core/lib/gpr/log.cc +0 -166
  608. data/src/core/lib/iomgr/ev_windows.cc +0 -30
  609. data/src/core/lib/promise/trace.cc +0 -20
  610. data/src/core/lib/promise/trace.h +0 -24
  611. data/src/core/lib/resource_quota/trace.cc +0 -19
  612. data/src/core/lib/resource_quota/trace.h +0 -24
  613. data/src/core/lib/slice/slice_refcount.cc +0 -20
  614. data/src/core/lib/surface/api_trace.cc +0 -25
  615. data/src/core/lib/surface/call_trace.h +0 -24
  616. data/src/core/lib/surface/wait_for_cq_end_op.cc +0 -75
  617. data/src/core/lib/surface/wait_for_cq_end_op.h +0 -72
  618. data/src/core/lib/transport/batch_builder.cc +0 -172
  619. data/src/core/lib/transport/batch_builder.h +0 -474
  620. data/src/core/resolver/xds/xds_resolver_trace.cc +0 -25
  621. data/src/core/resolver/xds/xds_resolver_trace.h +0 -30
  622. data/third_party/boringssl-with-bazel/src/crypto/conf/conf_def.h +0 -122
  623. /data/src/core/{lib/gpr → util}/alloc.cc +0 -0
  624. /data/src/core/{lib/gpr → util}/iphone/cpu.cc +0 -0
  625. /data/src/core/{lib/gpr → util}/linux/cpu.cc +0 -0
  626. /data/src/core/{lib/gpr → util}/posix/string.cc +0 -0
  627. /data/src/core/{lib/gpr → util}/posix/sync.cc +0 -0
  628. /data/src/core/{lib/gpr → util}/sync.cc +0 -0
  629. /data/src/core/{lib/gpr → util}/sync_abseil.cc +0 -0
  630. /data/src/core/{lib/gpr → util}/time.cc +0 -0
  631. /data/src/core/{lib/gpr → util}/windows/cpu.cc +0 -0
  632. /data/src/core/{lib/gpr → util}/windows/sync.cc +0 -0
@@ -21,17 +21,24 @@
21
21
  #include <atomic>
22
22
  #include <new>
23
23
 
24
+ #include "absl/log/log.h"
25
+
24
26
  #include <grpc/support/alloc.h>
25
27
  #include <grpc/support/port_platform.h>
26
28
 
27
- #include "src/core/lib/gpr/alloc.h"
29
+ #include "src/core/lib/resource_quota/resource_quota.h"
30
+ #include "src/core/util/alloc.h"
31
+ namespace grpc_core {
28
32
 
29
33
  namespace {
30
34
 
31
- void* ArenaStorage(size_t initial_size) {
35
+ void* ArenaStorage(size_t& initial_size) {
32
36
  static constexpr size_t base_size =
33
- GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(grpc_core::Arena));
37
+ GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(Arena));
34
38
  initial_size = GPR_ROUND_UP_TO_ALIGNMENT_SIZE(initial_size);
39
+ initial_size = std::max(
40
+ initial_size, GPR_ROUND_UP_TO_ALIGNMENT_SIZE(
41
+ arena_detail::BaseArenaContextTraits::ContextSize()));
35
42
  size_t alloc_size = base_size + initial_size;
36
43
  static constexpr size_t alignment =
37
44
  (GPR_CACHELINE_SIZE > GPR_MAX_ALIGNMENT &&
@@ -43,9 +50,15 @@ void* ArenaStorage(size_t initial_size) {
43
50
 
44
51
  } // namespace
45
52
 
46
- namespace grpc_core {
47
-
48
53
  Arena::~Arena() {
54
+ for (size_t i = 0; i < arena_detail::BaseArenaContextTraits::NumContexts();
55
+ ++i) {
56
+ arena_detail::BaseArenaContextTraits::Destroy(i, contexts()[i]);
57
+ }
58
+ DestroyManagedNewObjects();
59
+ arena_factory_->FinalizeArena(this);
60
+ arena_factory_->allocator().Release(
61
+ total_allocated_.load(std::memory_order_relaxed));
49
62
  Zone* z = last_zone_;
50
63
  while (z) {
51
64
  Zone* prev_z = z->prev;
@@ -53,24 +66,26 @@ Arena::~Arena() {
53
66
  gpr_free_aligned(z);
54
67
  z = prev_z;
55
68
  }
56
- #ifdef GRPC_ARENA_TRACE_POOLED_ALLOCATIONS
57
- gpr_log(GPR_ERROR, "DESTRUCT_ARENA %p", this);
58
- #endif
59
69
  }
60
70
 
61
- Arena* Arena::Create(size_t initial_size, MemoryAllocator* memory_allocator) {
62
- return new (ArenaStorage(initial_size))
63
- Arena(initial_size, 0, memory_allocator);
71
+ RefCountedPtr<Arena> Arena::Create(size_t initial_size,
72
+ RefCountedPtr<ArenaFactory> arena_factory) {
73
+ void* p = ArenaStorage(initial_size);
74
+ return RefCountedPtr<Arena>(
75
+ new (p) Arena(initial_size, std::move(arena_factory)));
64
76
  }
65
77
 
66
- std::pair<Arena*, void*> Arena::CreateWithAlloc(
67
- size_t initial_size, size_t alloc_size, MemoryAllocator* memory_allocator) {
68
- static constexpr size_t base_size =
69
- GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(Arena));
70
- auto* new_arena = new (ArenaStorage(initial_size))
71
- Arena(initial_size, alloc_size, memory_allocator);
72
- void* first_alloc = reinterpret_cast<char*>(new_arena) + base_size;
73
- return std::make_pair(new_arena, first_alloc);
78
+ Arena::Arena(size_t initial_size, RefCountedPtr<ArenaFactory> arena_factory)
79
+ : initial_zone_size_(initial_size),
80
+ total_used_(GPR_ROUND_UP_TO_ALIGNMENT_SIZE(
81
+ arena_detail::BaseArenaContextTraits::ContextSize())),
82
+ arena_factory_(std::move(arena_factory)) {
83
+ for (size_t i = 0; i < arena_detail::BaseArenaContextTraits::NumContexts();
84
+ ++i) {
85
+ contexts()[i] = nullptr;
86
+ }
87
+ CHECK_GE(initial_size, arena_detail::BaseArenaContextTraits::ContextSize());
88
+ arena_factory_->allocator().Reserve(initial_size);
74
89
  }
75
90
 
76
91
  void Arena::DestroyManagedNewObjects() {
@@ -86,11 +101,9 @@ void Arena::DestroyManagedNewObjects() {
86
101
  }
87
102
  }
88
103
 
89
- void Arena::Destroy() {
90
- DestroyManagedNewObjects();
91
- memory_allocator_->Release(total_allocated_.load(std::memory_order_relaxed));
104
+ void Arena::Destroy() const {
92
105
  this->~Arena();
93
- gpr_free_aligned(this);
106
+ gpr_free_aligned(const_cast<Arena*>(this));
94
107
  }
95
108
 
96
109
  void* Arena::AllocZone(size_t size) {
@@ -102,7 +115,7 @@ void* Arena::AllocZone(size_t size) {
102
115
  static constexpr size_t zone_base_size =
103
116
  GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(Zone));
104
117
  size_t alloc_size = zone_base_size + size;
105
- memory_allocator_->Reserve(alloc_size);
118
+ arena_factory_->allocator().Reserve(alloc_size);
106
119
  total_allocated_.fetch_add(alloc_size, std::memory_order_relaxed);
107
120
  Zone* z = new (gpr_malloc_aligned(alloc_size, GPR_MAX_ALIGNMENT)) Zone();
108
121
  auto* prev = last_zone_.load(std::memory_order_relaxed);
@@ -120,63 +133,27 @@ void Arena::ManagedNewObject::Link(std::atomic<ManagedNewObject*>* head) {
120
133
  }
121
134
  }
122
135
 
123
- #ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
124
- void* Arena::AllocPooled(size_t obj_size, size_t alloc_size,
125
- std::atomic<FreePoolNode*>* head) {
126
- // ABA mitigation:
127
- // AllocPooled may be called by multiple threads, and to remove a node from
128
- // the free list we need to manipulate the next pointer, which may be done
129
- // differently by each thread in a naive implementation.
130
- // The literature contains various ways of dealing with this. Here we expect
131
- // to be mostly single threaded - Arena's are owned by calls and calls don't
132
- // do a lot of concurrent work with the pooled allocator. The place that they
133
- // do is allocating metadata batches for decoding HPACK headers in chttp2.
134
- // So we adopt an approach that is simple and fast for the single threaded
135
- // case, and that is also correct in the multi threaded case.
136
-
137
- // First, take ownership of the entire free list. At this point we know that
138
- // no other thread can see free nodes and will be forced to allocate.
139
- // We think we're mostly single threaded and so that's ok.
140
- FreePoolNode* p = head->exchange(nullptr, std::memory_order_acquire);
141
- // If there are no nodes in the free list, then go ahead and allocate from the
142
- // arena.
143
- if (p == nullptr) {
144
- void* r = Alloc(alloc_size);
145
- TracePoolAlloc(obj_size, r);
146
- return r;
147
- }
148
- // We had a non-empty free list... but we own the *entire* free list.
149
- // We only want one node, so if there are extras we'd better give them back.
150
- if (p->next != nullptr) {
151
- // We perform an exchange to do so, but if there were concurrent frees with
152
- // this allocation then there'll be a free list that needs to be merged with
153
- // ours.
154
- FreePoolNode* extra = head->exchange(p->next, std::memory_order_acq_rel);
155
- // If there was a free list concurrently created, we merge it into the
156
- // overall free list here by simply freeing each node in turn. This is O(n),
157
- // but only O(n) in the number of nodes that were freed concurrently, and
158
- // again: we think real world use cases are going to see this as mostly
159
- // single threaded.
160
- while (extra != nullptr) {
161
- FreePoolNode* next = extra->next;
162
- FreePooled(extra, head);
163
- extra = next;
136
+ RefCountedPtr<ArenaFactory> SimpleArenaAllocator(size_t initial_size) {
137
+ class Allocator : public ArenaFactory {
138
+ public:
139
+ explicit Allocator(size_t initial_size)
140
+ : ArenaFactory(
141
+ ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator(
142
+ "simple-arena-allocator")),
143
+ initial_size_(initial_size) {}
144
+
145
+ RefCountedPtr<Arena> MakeArena() override {
146
+ return Arena::Create(initial_size_, Ref());
164
147
  }
165
- }
166
- TracePoolAlloc(obj_size, p);
167
- return p;
168
- }
169
148
 
170
- void Arena::FreePooled(void* p, std::atomic<FreePoolNode*>* head) {
171
- // May spuriously trace a free of an already freed object - see AllocPooled
172
- // ABA mitigation.
173
- TracePoolFree(p);
174
- FreePoolNode* node = static_cast<FreePoolNode*>(p);
175
- node->next = head->load(std::memory_order_acquire);
176
- while (!head->compare_exchange_weak(
177
- node->next, node, std::memory_order_acq_rel, std::memory_order_relaxed)) {
178
- }
149
+ void FinalizeArena(Arena*) override {
150
+ // No-op.
151
+ }
152
+
153
+ private:
154
+ size_t initial_size_;
155
+ };
156
+ return MakeRefCounted<Allocator>(initial_size);
179
157
  }
180
- #endif
181
158
 
182
159
  } // namespace grpc_core
@@ -35,81 +35,73 @@
35
35
  #include <grpc/event_engine/memory_allocator.h>
36
36
  #include <grpc/support/port_platform.h>
37
37
 
38
- #include "src/core/lib/gpr/alloc.h"
39
38
  #include "src/core/lib/gprpp/construct_destruct.h"
40
39
  #include "src/core/lib/promise/context.h"
41
40
  #include "src/core/lib/resource_quota/memory_quota.h"
42
-
43
- #define GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
44
- // #define GRPC_ARENA_TRACE_POOLED_ALLOCATIONS
41
+ #include "src/core/util/alloc.h"
45
42
 
46
43
  namespace grpc_core {
47
44
 
48
- namespace arena_detail {
45
+ class Arena;
49
46
 
50
- #ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
51
- struct PoolAndSize {
52
- size_t alloc_size;
53
- size_t pool_index;
54
- };
47
+ template <typename T>
48
+ struct ArenaContextType;
55
49
 
56
- template <typename Void, size_t kIndex, size_t kObjectSize,
57
- size_t... kBucketSize>
58
- struct PoolIndexForSize;
59
-
60
- template <size_t kObjectSize, size_t kIndex, size_t kSmallestRemainingBucket,
61
- size_t... kBucketSizes>
62
- struct PoolIndexForSize<
63
- absl::enable_if_t<kObjectSize <= kSmallestRemainingBucket>, kIndex,
64
- kObjectSize, kSmallestRemainingBucket, kBucketSizes...> {
65
- static constexpr size_t kPool = kIndex;
66
- static constexpr size_t kSize = kSmallestRemainingBucket;
67
- };
50
+ namespace arena_detail {
68
51
 
69
- template <size_t kObjectSize, size_t kIndex, size_t kSmallestRemainingBucket,
70
- size_t... kBucketSizes>
71
- struct PoolIndexForSize<
72
- absl::enable_if_t<(kObjectSize > kSmallestRemainingBucket)>, kIndex,
73
- kObjectSize, kSmallestRemainingBucket, kBucketSizes...>
74
- : public PoolIndexForSize<void, kIndex + 1, kObjectSize, kBucketSizes...> {
75
- };
52
+ // Tracks all registered arena context types (these should only be registered
53
+ // via ArenaContextTraits at static initialization time).
54
+ class BaseArenaContextTraits {
55
+ public:
56
+ // Count of number of contexts that have been allocated.
57
+ static uint16_t NumContexts() {
58
+ return static_cast<uint16_t>(RegisteredTraits().size());
59
+ }
76
60
 
77
- template <size_t kObjectSize, size_t... kBucketSizes>
78
- constexpr size_t PoolFromObjectSize(
79
- absl::integer_sequence<size_t, kBucketSizes...>) {
80
- return PoolIndexForSize<void, 0, kObjectSize, kBucketSizes...>::kPool;
81
- }
61
+ // Number of bytes required to store the context pointers on an arena.
62
+ static size_t ContextSize() { return NumContexts() * sizeof(void*); }
82
63
 
83
- template <size_t kObjectSize, size_t... kBucketSizes>
84
- constexpr size_t AllocationSizeFromObjectSize(
85
- absl::integer_sequence<size_t, kBucketSizes...>) {
86
- return PoolIndexForSize<void, 0, kObjectSize, kBucketSizes...>::kSize;
87
- }
64
+ // Call the registered destruction function for a context.
65
+ static void Destroy(uint16_t id, void* ptr) {
66
+ if (ptr == nullptr) return;
67
+ RegisteredTraits()[id](ptr);
68
+ }
88
69
 
89
- template <size_t kIndex, size_t... kBucketSizes>
90
- struct ChoosePoolForAllocationSizeImpl;
70
+ protected:
71
+ // Allocate a new context id and register the destruction function.
72
+ static uint16_t MakeId(void (*destroy)(void* ptr)) {
73
+ auto& traits = RegisteredTraits();
74
+ const uint16_t id = static_cast<uint16_t>(traits.size());
75
+ traits.push_back(destroy);
76
+ return id;
77
+ }
91
78
 
92
- template <size_t kIndex, size_t kBucketSize, size_t... kBucketSizes>
93
- struct ChoosePoolForAllocationSizeImpl<kIndex, kBucketSize, kBucketSizes...> {
94
- static PoolAndSize Fn(size_t n) {
95
- if (n <= kBucketSize) return {kBucketSize, kIndex};
96
- return ChoosePoolForAllocationSizeImpl<kIndex + 1, kBucketSizes...>::Fn(n);
79
+ private:
80
+ static std::vector<void (*)(void*)>& RegisteredTraits() {
81
+ static NoDestruct<std::vector<void (*)(void*)>> registered_traits;
82
+ return *registered_traits;
97
83
  }
98
84
  };
99
85
 
100
- template <size_t kIndex>
101
- struct ChoosePoolForAllocationSizeImpl<kIndex> {
102
- static PoolAndSize Fn(size_t n) {
103
- return PoolAndSize{n, std::numeric_limits<size_t>::max()};
104
- }
86
+ // Traits for a specific context type.
87
+ template <typename T>
88
+ class ArenaContextTraits : public BaseArenaContextTraits {
89
+ public:
90
+ static uint16_t id() { return id_; }
91
+
92
+ private:
93
+ static const uint16_t id_;
105
94
  };
106
95
 
107
- template <size_t... kBucketSizes>
108
- PoolAndSize ChoosePoolForAllocationSize(
109
- size_t n, absl::integer_sequence<size_t, kBucketSizes...>) {
110
- return ChoosePoolForAllocationSizeImpl<0, kBucketSizes...>::Fn(n);
96
+ template <typename T>
97
+ void DestroyArenaContext(void* p) {
98
+ ArenaContextType<T>::Destroy(static_cast<T*>(p));
111
99
  }
112
- #else
100
+
101
+ template <typename T>
102
+ const uint16_t ArenaContextTraits<T>::id_ =
103
+ BaseArenaContextTraits::MakeId(DestroyArenaContext<T>);
104
+
113
105
  template <typename T, typename A, typename B>
114
106
  struct IfArray {
115
107
  using Result = A;
@@ -119,30 +111,36 @@ template <typename T, typename A, typename B>
119
111
  struct IfArray<T[], A, B> {
120
112
  using Result = B;
121
113
  };
122
- #endif
114
+
115
+ struct UnrefDestroy {
116
+ void operator()(const Arena* arena) const;
117
+ };
123
118
 
124
119
  } // namespace arena_detail
125
120
 
126
- class Arena {
127
- #ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
128
- // Selected pool sizes.
129
- // How to tune: see tools/codegen/core/optimize_arena_pool_sizes.py
130
- using PoolSizes = absl::integer_sequence<size_t, 80, 304, 528, 1024>;
131
- struct FreePoolNode {
132
- FreePoolNode* next;
133
- };
134
- #endif
121
+ class ArenaFactory : public RefCounted<ArenaFactory> {
122
+ public:
123
+ virtual RefCountedPtr<Arena> MakeArena() = 0;
124
+ virtual void FinalizeArena(Arena* arena) = 0;
125
+
126
+ MemoryAllocator& allocator() { return allocator_; }
135
127
 
128
+ protected:
129
+ explicit ArenaFactory(MemoryAllocator allocator)
130
+ : allocator_(std::move(allocator)) {}
131
+
132
+ private:
133
+ MemoryAllocator allocator_;
134
+ };
135
+
136
+ RefCountedPtr<ArenaFactory> SimpleArenaAllocator(size_t initial_size = 1024);
137
+
138
+ class Arena final : public RefCounted<Arena, NonPolymorphicRefCount,
139
+ arena_detail::UnrefDestroy> {
136
140
  public:
137
141
  // Create an arena, with \a initial_size bytes in the first allocated buffer.
138
- static Arena* Create(size_t initial_size, MemoryAllocator* memory_allocator);
139
-
140
- // Create an arena, with \a initial_size bytes in the first allocated buffer,
141
- // and return both a void pointer to the returned arena and a void* with the
142
- // first allocation.
143
- static std::pair<Arena*, void*> CreateWithAlloc(
144
- size_t initial_size, size_t alloc_size,
145
- MemoryAllocator* memory_allocator);
142
+ static RefCountedPtr<Arena> Create(size_t initial_size,
143
+ RefCountedPtr<ArenaFactory> arena_factory);
146
144
 
147
145
  // Destroy all `ManagedNew` allocated objects.
148
146
  // Allows safe destruction of these objects even if they need context held by
@@ -151,9 +149,6 @@ class Arena {
151
149
  // TODO(ctiller): eliminate ManagedNew.
152
150
  void DestroyManagedNewObjects();
153
151
 
154
- // Destroy an arena.
155
- void Destroy();
156
-
157
152
  // Return the total amount of memory allocated by this arena.
158
153
  size_t TotalUsedBytes() const {
159
154
  return total_used_.load(std::memory_order_relaxed);
@@ -194,95 +189,6 @@ class Arena {
194
189
  return &p->t;
195
190
  }
196
191
 
197
- #ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
198
- class PooledDeleter {
199
- public:
200
- explicit PooledDeleter(std::atomic<FreePoolNode*>* free_list)
201
- : free_list_(free_list) {}
202
- PooledDeleter() = default;
203
- template <typename T>
204
- void operator()(T* p) {
205
- // TODO(ctiller): promise based filter hijacks ownership of some pointers
206
- // to make them appear as PoolPtr without really transferring ownership,
207
- // by setting the arena to nullptr.
208
- // This is a transitional hack and should be removed once promise based
209
- // filter is removed.
210
- if (free_list_ != nullptr) {
211
- p->~T();
212
- FreePooled(p, free_list_);
213
- }
214
- }
215
-
216
- bool has_freelist() const { return free_list_ != nullptr; }
217
-
218
- private:
219
- std::atomic<FreePoolNode*>* free_list_;
220
- };
221
-
222
- template <typename T>
223
- using PoolPtr = std::unique_ptr<T, PooledDeleter>;
224
-
225
- // Make a unique_ptr to T that is allocated from the arena.
226
- // When the pointer is released, the memory may be reused for other
227
- // MakePooled(.*) calls.
228
- // CAUTION: The amount of memory allocated is rounded up to the nearest
229
- // value in Arena::PoolSizes, and so this may pessimize total
230
- // arena size.
231
- template <typename T, typename... Args>
232
- PoolPtr<T> MakePooled(Args&&... args) {
233
- auto* free_list =
234
- &pools_[arena_detail::PoolFromObjectSize<sizeof(T)>(PoolSizes())];
235
- return PoolPtr<T>(
236
- new (AllocPooled(
237
- sizeof(T),
238
- arena_detail::AllocationSizeFromObjectSize<sizeof(T)>(PoolSizes()),
239
- free_list)) T(std::forward<Args>(args)...),
240
- PooledDeleter(free_list));
241
- }
242
-
243
- // Make a unique_ptr to an array of T that is allocated from the arena.
244
- // When the pointer is released, the memory may be reused for other
245
- // MakePooled(.*) calls.
246
- // One can use MakePooledArray<char> to allocate a buffer of bytes.
247
- // CAUTION: The amount of memory allocated is rounded up to the nearest
248
- // value in Arena::PoolSizes, and so this may pessimize total
249
- // arena size.
250
- template <typename T>
251
- PoolPtr<T[]> MakePooledArray(size_t n) {
252
- auto where =
253
- arena_detail::ChoosePoolForAllocationSize(n * sizeof(T), PoolSizes());
254
- if (where.pool_index == std::numeric_limits<size_t>::max()) {
255
- return PoolPtr<T[]>(new (Alloc(where.alloc_size)) T[n],
256
- PooledDeleter(nullptr));
257
- } else {
258
- return PoolPtr<T[]>(new (AllocPooled(where.alloc_size, where.alloc_size,
259
- &pools_[where.pool_index])) T[n],
260
- PooledDeleter(&pools_[where.pool_index]));
261
- }
262
- }
263
-
264
- // Like MakePooled, but with manual memory management.
265
- // The caller is responsible for calling DeletePooled() on the returned
266
- // pointer, and expected to call it with the same type T as was passed to this
267
- // function (else the free list returned to the arena will be corrupted).
268
- template <typename T, typename... Args>
269
- T* NewPooled(Args&&... args) {
270
- auto* free_list =
271
- &pools_[arena_detail::PoolFromObjectSize<sizeof(T)>(PoolSizes())];
272
- return new (AllocPooled(
273
- sizeof(T),
274
- arena_detail::AllocationSizeFromObjectSize<sizeof(T)>(PoolSizes()),
275
- free_list)) T(std::forward<Args>(args)...);
276
- }
277
-
278
- template <typename T>
279
- void DeletePooled(T* p) {
280
- auto* free_list =
281
- &pools_[arena_detail::PoolFromObjectSize<sizeof(T)>(PoolSizes())];
282
- p->~T();
283
- FreePooled(p, free_list);
284
- }
285
- #else
286
192
  class PooledDeleter {
287
193
  public:
288
194
  PooledDeleter() = default;
@@ -364,9 +270,30 @@ class Arena {
364
270
  void DeletePooled(T* p) {
365
271
  delete p;
366
272
  }
367
- #endif
273
+
274
+ // Context accessors
275
+ // Prefer to use the free-standing `GetContext<>` and `SetContext<>` functions
276
+ // for modern promise-based code -- however legacy filter stack based code
277
+ // often needs to access these directly.
278
+ template <typename T>
279
+ T* GetContext() {
280
+ return static_cast<T*>(
281
+ contexts()[arena_detail::ArenaContextTraits<T>::id()]);
282
+ }
283
+
284
+ template <typename T>
285
+ void SetContext(T* context) {
286
+ void*& slot = contexts()[arena_detail::ArenaContextTraits<T>::id()];
287
+ if (slot != nullptr) {
288
+ ArenaContextType<T>::Destroy(static_cast<T*>(slot));
289
+ }
290
+ slot = context;
291
+ DCHECK_EQ(GetContext<T>(), context);
292
+ }
368
293
 
369
294
  private:
295
+ friend struct arena_detail::UnrefDestroy;
296
+
370
297
  struct Zone {
371
298
  Zone* prev;
372
299
  };
@@ -396,41 +323,20 @@ class Arena {
396
323
  // quick optimization (avoiding an atomic fetch-add) for the common case
397
324
  // where we wish to create an arena and then perform an immediate
398
325
  // allocation.
399
- explicit Arena(size_t initial_size, size_t initial_alloc,
400
- MemoryAllocator* memory_allocator)
401
- : total_used_(GPR_ROUND_UP_TO_ALIGNMENT_SIZE(initial_alloc)),
402
- initial_zone_size_(initial_size),
403
- memory_allocator_(memory_allocator) {}
326
+ explicit Arena(size_t initial_size,
327
+ RefCountedPtr<ArenaFactory> arena_factory);
404
328
 
405
329
  ~Arena();
406
330
 
407
331
  void* AllocZone(size_t size);
408
-
409
- #ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
410
- void* AllocPooled(size_t obj_size, size_t alloc_size,
411
- std::atomic<FreePoolNode*>* head);
412
- static void FreePooled(void* p, std::atomic<FreePoolNode*>* head);
413
- #endif
414
-
415
- void TracePoolAlloc(size_t size, void* ptr) {
416
- (void)size;
417
- (void)ptr;
418
- #ifdef GRPC_ARENA_TRACE_POOLED_ALLOCATIONS
419
- gpr_log(GPR_ERROR, "ARENA %p ALLOC %" PRIdPTR " @ %p", this, size, ptr);
420
- #endif
421
- }
422
- static void TracePoolFree(void* ptr) {
423
- (void)ptr;
424
- #ifdef GRPC_ARENA_TRACE_POOLED_ALLOCATIONS
425
- gpr_log(GPR_ERROR, "FREE %p", ptr);
426
- #endif
427
- }
332
+ void Destroy() const;
333
+ void** contexts() { return reinterpret_cast<void**>(this + 1); }
428
334
 
429
335
  // Keep track of the total used size. We use this in our call sizing
430
336
  // hysteresis.
431
- std::atomic<size_t> total_used_{0};
432
- std::atomic<size_t> total_allocated_{0};
433
337
  const size_t initial_zone_size_;
338
+ std::atomic<size_t> total_used_;
339
+ std::atomic<size_t> total_allocated_{initial_zone_size_};
434
340
  // If the initial arena allocation wasn't enough, we allocate additional zones
435
341
  // in a reverse linked list. Each additional zone consists of (1) a pointer to
436
342
  // the zone added before this zone (null if this is the first additional zone)
@@ -438,27 +344,30 @@ class Arena {
438
344
  // last zone; the zone list is reverse-walked during arena destruction only.
439
345
  std::atomic<Zone*> last_zone_{nullptr};
440
346
  std::atomic<ManagedNewObject*> managed_new_head_{nullptr};
441
- #ifndef GRPC_ARENA_POOLED_ALLOCATIONS_USE_MALLOC
442
- std::atomic<FreePoolNode*> pools_[PoolSizes::size()]{};
443
- #endif
444
- // The backing memory quota
445
- MemoryAllocator* const memory_allocator_;
446
- };
447
-
448
- // Smart pointer for arenas when the final size is not required.
449
- struct ScopedArenaDeleter {
450
- void operator()(Arena* arena) { arena->Destroy(); }
347
+ RefCountedPtr<ArenaFactory> arena_factory_;
451
348
  };
452
- using ScopedArenaPtr = std::unique_ptr<Arena, ScopedArenaDeleter>;
453
- inline ScopedArenaPtr MakeScopedArena(size_t initial_size,
454
- MemoryAllocator* memory_allocator) {
455
- return ScopedArenaPtr(Arena::Create(initial_size, memory_allocator));
456
- }
457
349
 
458
350
  // Arenas form a context for activities
459
351
  template <>
460
352
  struct ContextType<Arena> {};
461
353
 
354
+ namespace arena_detail {
355
+ inline void UnrefDestroy::operator()(const Arena* arena) const {
356
+ arena->Destroy();
357
+ }
358
+ } // namespace arena_detail
359
+
360
+ namespace promise_detail {
361
+
362
+ template <typename T>
363
+ class Context<T, absl::void_t<decltype(ArenaContextType<T>::Destroy)>> {
364
+ public:
365
+ static T* get() { return GetContext<Arena>()->GetContext<T>(); }
366
+ static void set(T* value) { GetContext<Arena>()->SetContext(value); }
367
+ };
368
+
369
+ } // namespace promise_detail
370
+
462
371
  } // namespace grpc_core
463
372
 
464
373
  #endif // GRPC_SRC_CORE_LIB_RESOURCE_QUOTA_ARENA_H