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
@@ -42,23 +42,37 @@ namespace grpc_core {
42
42
  // for exporting debug/trace information.
43
43
  template <typename T>
44
44
  static constexpr inline absl::string_view TypeName() {
45
+ #if ABSL_USES_STD_STRING_VIEW
46
+ // absl::string_view doesn't have the constexpr find methods we need
47
+ // here.
45
48
  #if defined(__clang__)
46
49
  constexpr absl::string_view kPrefix{"[T = "};
47
50
  constexpr absl::string_view kSuffix{"]"};
48
51
  #elif defined(__GNUC__)
52
+ #if __GNUC__ < 9
53
+ #define GRPC_FUNCTION_SIGNATURE_TYPE_NAME_USE_FALLBACK
54
+ #endif
49
55
  constexpr absl::string_view kPrefix{"[with T = "};
50
56
  constexpr absl::string_view kSuffix{";"};
51
57
  #elif defined(_MSC_VER)
52
58
  constexpr absl::string_view kPrefix{"TypeName<"};
53
59
  constexpr absl::string_view kSuffix{">(void)"};
54
60
  #else
55
- return "unknown";
61
+ #define GRPC_FUNCTION_SIGNATURE_TYPE_NAME_USE_FALLBACK
56
62
  #endif
63
+ #else // !ABSL_USE_STD_STRING_VIEW
64
+ #define GRPC_FUNCTION_SIGNATURE_TYPE_NAME_USE_FALLBACK
65
+ #endif
66
+
67
+ #ifdef GRPC_FUNCTION_SIGNATURE_TYPE_NAME_USE_FALLBACK
68
+ return "unknown";
69
+ #else
57
70
  constexpr absl::string_view kFunction{GRPC_FUNCTION_SIGNATURE};
58
71
  constexpr size_t kStart = kFunction.find(kPrefix) + kPrefix.size();
59
72
  constexpr size_t kEnd = kFunction.rfind(kSuffix);
60
73
  static_assert(kStart < kEnd);
61
74
  return kFunction.substr(kStart, (kEnd - kStart));
75
+ #endif
62
76
  }
63
77
 
64
78
  } // namespace grpc_core
@@ -40,6 +40,7 @@
40
40
  #include "src/core/lib/channel/channel_args.h"
41
41
  #include "src/core/lib/channel/channel_args_preconditioning.h"
42
42
  #include "src/core/lib/event_engine/resolved_address_internal.h"
43
+ #include "src/core/lib/event_engine/shim.h"
43
44
  #include "src/core/lib/event_engine/tcp_socket_utils.h"
44
45
  #include "src/core/lib/iomgr/endpoint.h"
45
46
  #include "src/core/lib/iomgr/iomgr_internal.h"
@@ -175,7 +176,10 @@ HttpRequest::HttpRequest(
175
176
  pollent_(pollent),
176
177
  pollset_set_(grpc_pollset_set_create()),
177
178
  test_only_generate_response_(std::move(test_only_generate_response)),
178
- use_event_engine_dns_resolver_(IsEventEngineDnsNonClientChannelEnabled()),
179
+ use_event_engine_dns_resolver_(
180
+ IsEventEngineDnsNonClientChannelEnabled() &&
181
+ !grpc_event_engine::experimental::
182
+ EventEngineExperimentDisabledForPython()),
179
183
  resolver_(!use_event_engine_dns_resolver_ ? GetDNSResolver() : nullptr),
180
184
  ee_resolver_(
181
185
  use_event_engine_dns_resolver_
@@ -196,8 +200,10 @@ HttpRequest::HttpRequest(
196
200
  GRPC_CLOSURE_INIT(&continue_done_write_after_schedule_on_exec_ctx_,
197
201
  ContinueDoneWriteAfterScheduleOnExecCtx, this,
198
202
  grpc_schedule_on_exec_ctx);
199
- CHECK(pollent);
200
- grpc_polling_entity_add_to_pollset_set(pollent, pollset_set_);
203
+ if (!grpc_event_engine::experimental::UsePollsetAlternative()) {
204
+ CHECK(pollent);
205
+ grpc_polling_entity_add_to_pollset_set(pollent, pollset_set_);
206
+ }
201
207
  }
202
208
 
203
209
  HttpRequest::~HttpRequest() {
@@ -329,8 +335,9 @@ void HttpRequest::StartWrite() {
329
335
  CSliceRef(request_text_);
330
336
  grpc_slice_buffer_add(&outgoing_, request_text_);
331
337
  Ref().release(); // ref held by pending write
332
- grpc_endpoint_write(ep_.get(), &outgoing_, &done_write_, nullptr,
333
- /*max_frame_size=*/INT_MAX);
338
+ grpc_event_engine::experimental::EventEngine::Endpoint::WriteArgs args;
339
+ args.set_max_frame_size(INT_MAX);
340
+ grpc_endpoint_write(ep_.get(), &outgoing_, &done_write_, std::move(args));
334
341
  }
335
342
 
336
343
  void HttpRequest::OnHandshakeDone(absl::StatusOr<HandshakerArgs*> result) {
@@ -35,6 +35,7 @@
35
35
  #include "absl/status/statusor.h"
36
36
  #include "absl/strings/string_view.h"
37
37
  #include "src/core/handshaker/handshaker.h"
38
+ #include "src/core/lib/event_engine/shim.h"
38
39
  #include "src/core/lib/iomgr/closure.h"
39
40
  #include "src/core/lib/iomgr/endpoint.h"
40
41
  #include "src/core/lib/iomgr/error.h"
@@ -180,7 +181,9 @@ class HttpRequest : public InternallyRefCounted<HttpRequest> {
180
181
 
181
182
  private:
182
183
  void Finish(grpc_error_handle error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_) {
183
- grpc_polling_entity_del_from_pollset_set(pollent_, pollset_set_);
184
+ if (!grpc_event_engine::experimental::UsePollsetAlternative()) {
185
+ grpc_polling_entity_del_from_pollset_set(pollent_, pollset_set_);
186
+ }
184
187
  ExecCtx::Run(DEBUG_LOCATION, on_done_, error);
185
188
  }
186
189
 
@@ -47,7 +47,7 @@ namespace latent_see {
47
47
  struct Metadata {
48
48
  const char* file;
49
49
  int line;
50
- const char* name;
50
+ absl::string_view name;
51
51
  };
52
52
 
53
53
  enum class EventType : uint8_t { kBegin, kEnd, kFlowStart, kFlowEnd, kMark };
@@ -259,6 +259,9 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION auto Promise(const Metadata* md_poll,
259
259
 
260
260
  } // namespace latent_see
261
261
  } // namespace grpc_core
262
+ #define GRPC_LATENT_SEE_SYMBOL2(name, line) name##_##line
263
+ #define GRPC_LATENT_SEE_SYMBOL1(name, line) GRPC_LATENT_SEE_SYMBOL2(name, line)
264
+ #define GRPC_LATENT_SEE_SYMBOL(name) GRPC_LATENT_SEE_SYMBOL1(name, __LINE__)
262
265
  #define GRPC_LATENT_SEE_METADATA(name) \
263
266
  []() { \
264
267
  static grpc_core::latent_see::Metadata metadata = {__FILE__, __LINE__, \
@@ -268,14 +271,14 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION auto Promise(const Metadata* md_poll,
268
271
  // Parent scope: logs a begin and end event, and flushes the thread log on scope
269
272
  // exit. Because the flush takes some time it's better to place one parent scope
270
273
  // at the top of the stack, and use lighter weight scopes within it.
271
- #define GRPC_LATENT_SEE_PARENT_SCOPE(name) \
272
- grpc_core::latent_see::ParentScope latent_see_scope##__LINE__( \
274
+ #define GRPC_LATENT_SEE_PARENT_SCOPE(name) \
275
+ grpc_core::latent_see::ParentScope GRPC_LATENT_SEE_SYMBOL(latent_see_scope)( \
273
276
  GRPC_LATENT_SEE_METADATA(name))
274
277
  // Inner scope: logs a begin and end event. Lighter weight than parent scope,
275
278
  // but does not flush the thread state - so should only be enclosed by a parent
276
279
  // scope.
277
- #define GRPC_LATENT_SEE_INNER_SCOPE(name) \
278
- grpc_core::latent_see::InnerScope latent_see_scope##__LINE__( \
280
+ #define GRPC_LATENT_SEE_INNER_SCOPE(name) \
281
+ grpc_core::latent_see::InnerScope GRPC_LATENT_SEE_SYMBOL(latent_see_scope)( \
279
282
  GRPC_LATENT_SEE_METADATA(name))
280
283
  // Mark: logs a single event.
281
284
  // This is not flushed automatically, and so should only be used within a parent
data/src/core/util/log.cc CHANGED
@@ -104,6 +104,7 @@ void gpr_log_verbosity_init(void) {
104
104
  "ERROR. However if you see this message in a debug environment or "
105
105
  "test environment it is safe to ignore this message.";
106
106
  absl::SetVLogLevel("*grpc*/*", -1);
107
+ absl::SetVLogLevel("src/core/util/log", -1);
107
108
  absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo);
108
109
  } else if (absl::EqualsIgnoreCase(verbosity, "DEBUG")) {
109
110
  LOG_FIRST_N(WARNING, 1)
@@ -111,12 +112,15 @@ void gpr_log_verbosity_init(void) {
111
112
  "ERROR. However if you see this message in a debug environment or "
112
113
  "test environment it is safe to ignore this message.";
113
114
  absl::SetVLogLevel("*grpc*/*", 2);
115
+ absl::SetVLogLevel("src/core/util/log", 2);
114
116
  absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfo);
115
117
  } else if (absl::EqualsIgnoreCase(verbosity, "ERROR")) {
116
118
  absl::SetVLogLevel("*grpc*/*", -1);
119
+ absl::SetVLogLevel("src/core/util/log", -1);
117
120
  absl::SetMinLogLevel(absl::LogSeverityAtLeast::kError);
118
121
  } else if (absl::EqualsIgnoreCase(verbosity, "NONE")) {
119
122
  absl::SetVLogLevel("*grpc*/*", -1);
123
+ absl::SetVLogLevel("src/core/util/log", -1);
120
124
  absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfinity);
121
125
  } else if (verbosity.empty()) {
122
126
  // Do not alter absl settings if GRPC_VERBOSITY flag is not set.
@@ -0,0 +1,268 @@
1
+ // Copyright 2025 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_UTIL_MEMORY_USAGE_H
16
+ #define GRPC_SRC_CORE_UTIL_MEMORY_USAGE_H
17
+
18
+ #include <cstddef>
19
+ #include <memory>
20
+ #include <optional>
21
+ #include <tuple>
22
+ #include <type_traits>
23
+ #include <utility>
24
+ #include <vector>
25
+
26
+ #include "absl/log/log.h"
27
+ #include "absl/status/status.h"
28
+ #include "absl/status/statusor.h"
29
+ #include "absl/strings/string_view.h"
30
+ #include "absl/time/time.h"
31
+ #include "src/core/util/time.h"
32
+
33
+ namespace grpc_core {
34
+
35
+ namespace memory_usage_detail {
36
+
37
+ template <typename SfinaeVoid, typename T, typename... Args>
38
+ struct IsBraceConstructible : public std::false_type {};
39
+
40
+ template <typename T, typename... Args>
41
+ struct IsBraceConstructible<std::void_t<decltype(T{std::declval<Args>()...})>,
42
+ T, Args...> : public std::true_type {};
43
+
44
+ template <typename T, typename... Args>
45
+ constexpr bool kIsBraceConstructible =
46
+ IsBraceConstructible<void, T, Args...>::value;
47
+
48
+ template <typename T>
49
+ constexpr bool kAnyTypeConvertibleTo = true;
50
+ template <typename T>
51
+ constexpr bool kAnyTypeConvertibleTo<std::optional<T>> = false;
52
+
53
+ struct AnyType {
54
+ template <typename T, std::enable_if_t<kAnyTypeConvertibleTo<T>, int> = 0>
55
+ // NOLINTNEXTLINE
56
+ constexpr operator T() {
57
+ LOG(FATAL) << "unreachable";
58
+ }
59
+ };
60
+
61
+ enum class Category {
62
+ kUncategorized,
63
+ kOptional,
64
+ kAbslStatusOr,
65
+ kSimple, // memory usage == sizeof(T)
66
+ kOwnedPointer, // memory usage is pointer + usage of pointed to value
67
+ kVector, // memory usage is container + elements
68
+ };
69
+
70
+ template <typename T, typename = void>
71
+ constexpr Category kMemoryUsageCategory = Category::kUncategorized;
72
+
73
+ template <typename T>
74
+ constexpr Category
75
+ kMemoryUsageCategory<T, std::enable_if_t<std::is_fundamental_v<T>>> =
76
+ Category::kSimple;
77
+
78
+ template <typename T>
79
+ constexpr Category
80
+ kMemoryUsageCategory<T, std::enable_if_t<std::is_enum_v<T>>> =
81
+ Category::kSimple;
82
+
83
+ template <typename T, typename D>
84
+ constexpr Category kMemoryUsageCategory<std::unique_ptr<T, D>> =
85
+ Category::kOwnedPointer;
86
+
87
+ template <typename T>
88
+ constexpr Category kMemoryUsageCategory<std::shared_ptr<T>> =
89
+ Category::kOwnedPointer;
90
+
91
+ template <typename T>
92
+ constexpr Category kMemoryUsageCategory<std::vector<T>> = Category::kVector;
93
+
94
+ template <typename C, typename Traits, typename Allocator>
95
+ constexpr Category
96
+ kMemoryUsageCategory<std::basic_string<C, Traits, Allocator>> =
97
+ Category::kVector;
98
+
99
+ template <typename T>
100
+ constexpr Category kMemoryUsageCategory<std::optional<T>> = Category::kOptional;
101
+
102
+ template <typename T, typename = void>
103
+ constexpr bool kHasMemoryUsageMethod = false;
104
+
105
+ template <typename T>
106
+ constexpr bool kHasMemoryUsageMethod<
107
+ T, std::void_t<decltype(std::declval<T>().MemoryUsage())>> = true;
108
+
109
+ } // namespace memory_usage_detail
110
+
111
+ // Given an object x, `MemoryUsage(x)` returns a size_t that approximates the
112
+ // memory used by x. It's not totally accurate, but "good enough" for systems
113
+ // that need to roughly bound memory usage of a collection of elements.
114
+
115
+ template <typename T>
116
+ size_t MemoryUsageOf(const T& x) {
117
+ using memory_usage_detail::AnyType;
118
+ using memory_usage_detail::Category;
119
+ using memory_usage_detail::kHasMemoryUsageMethod;
120
+ using memory_usage_detail::kIsBraceConstructible;
121
+ constexpr Category category = memory_usage_detail::kMemoryUsageCategory<T>;
122
+ if constexpr (kHasMemoryUsageMethod<T>) {
123
+ return x.MemoryUsage();
124
+ } else if constexpr (std::is_empty_v<T>) {
125
+ return sizeof(T);
126
+ } else if constexpr (std::is_same_v<T, absl::Status>) {
127
+ if (x.ok()) return sizeof(T);
128
+ return 2 * sizeof(T) + x.message().length(); // wrong, but not super wrong
129
+ } else if constexpr (std::is_same_v<T, absl::Time>) {
130
+ return sizeof(T);
131
+ } else if constexpr (std::is_same_v<T, absl::string_view>) {
132
+ // Assume that the string_view is not owning the string.
133
+ return sizeof(T);
134
+ } else if constexpr (std::is_same_v<T, Timestamp>) {
135
+ return sizeof(T);
136
+ } else if constexpr (std::is_same_v<T, Duration>) {
137
+ return sizeof(T);
138
+ } else if constexpr (category == Category::kSimple) {
139
+ return sizeof(T);
140
+ } else if constexpr (category == Category::kOwnedPointer) {
141
+ if (x == nullptr) return sizeof(T);
142
+ return sizeof(T) + MemoryUsageOf(*x);
143
+ } else if constexpr (category == Category::kVector) {
144
+ size_t total = sizeof(T) + sizeof(*x.begin()) * (x.capacity() - x.size());
145
+ for (const auto& e : x) {
146
+ total += MemoryUsageOf(e);
147
+ }
148
+ return total;
149
+ } else if constexpr (category == Category::kOptional) {
150
+ if (x.has_value()) return MemoryUsageOf(*x) + sizeof(T) - sizeof(*x);
151
+ return sizeof(T);
152
+ } else if constexpr (category == Category::kAbslStatusOr) {
153
+ if (x.ok()) return MemoryUsageOf(*x) + sizeof(absl::Status);
154
+ return MemoryUsageOf(x.status()) + sizeof(T);
155
+ } else if constexpr (category == Category::kUncategorized) {
156
+ // Structs!
157
+ // If you have more than 8 fields, you can add more cases here.
158
+ // Keep sorted longest to shortest.
159
+ if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType, AnyType,
160
+ AnyType, AnyType, AnyType, AnyType,
161
+ AnyType, AnyType>) {
162
+ const auto& [v1, v2, v3, v4, v5, v6, v7, v8, v9, v10] = x;
163
+ constexpr auto padding = sizeof(T) - sizeof(v1) - sizeof(v2) -
164
+ sizeof(v3) - sizeof(v4) - sizeof(v5) -
165
+ sizeof(v6) - sizeof(v7) - sizeof(v8) -
166
+ sizeof(v9) - sizeof(v10);
167
+ static_assert(padding >= 0);
168
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
169
+ MemoryUsageOf(v4) + MemoryUsageOf(v5) + MemoryUsageOf(v6) +
170
+ MemoryUsageOf(v7) + MemoryUsageOf(v8) + MemoryUsageOf(v9) +
171
+ MemoryUsageOf(v10) + padding;
172
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType,
173
+ AnyType, AnyType, AnyType,
174
+ AnyType, AnyType, AnyType>) {
175
+ const auto& [v1, v2, v3, v4, v5, v6, v7, v8, v9] = x;
176
+ constexpr auto padding =
177
+ sizeof(T) - sizeof(v1) - sizeof(v2) - sizeof(v3) - sizeof(v4) -
178
+ sizeof(v5) - sizeof(v6) - sizeof(v7) - sizeof(v8) - sizeof(v9);
179
+ static_assert(padding >= 0);
180
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
181
+ MemoryUsageOf(v4) + MemoryUsageOf(v5) + MemoryUsageOf(v6) +
182
+ MemoryUsageOf(v7) + MemoryUsageOf(v8) + MemoryUsageOf(v9) +
183
+ padding;
184
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType,
185
+ AnyType, AnyType, AnyType,
186
+ AnyType, AnyType>) {
187
+ const auto& [v1, v2, v3, v4, v5, v6, v7, v8] = x;
188
+ constexpr auto padding = sizeof(T) - sizeof(v1) - sizeof(v2) -
189
+ sizeof(v3) - sizeof(v4) - sizeof(v5) -
190
+ sizeof(v6) - sizeof(v7) - sizeof(v8);
191
+ static_assert(padding >= 0);
192
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
193
+ MemoryUsageOf(v4) + MemoryUsageOf(v5) + MemoryUsageOf(v6) +
194
+ MemoryUsageOf(v7) + MemoryUsageOf(v8) + padding;
195
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType,
196
+ AnyType, AnyType, AnyType,
197
+ AnyType>) {
198
+ const auto& [v1, v2, v3, v4, v5, v6, v7] = x;
199
+ constexpr auto padding = sizeof(T) - sizeof(v1) - sizeof(v2) -
200
+ sizeof(v3) - sizeof(v4) - sizeof(v5) -
201
+ sizeof(v6) - sizeof(v7);
202
+ static_assert(padding >= 0);
203
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
204
+ MemoryUsageOf(v4) + MemoryUsageOf(v5) + MemoryUsageOf(v6) +
205
+ MemoryUsageOf(v7) + padding;
206
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType,
207
+ AnyType, AnyType, AnyType>) {
208
+ const auto& [v1, v2, v3, v4, v5, v6] = x;
209
+ constexpr auto padding = sizeof(T) - sizeof(v1) - sizeof(v2) -
210
+ sizeof(v3) - sizeof(v4) - sizeof(v5) -
211
+ sizeof(v6);
212
+ static_assert(padding >= 0);
213
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
214
+ MemoryUsageOf(v4) + MemoryUsageOf(v5) + MemoryUsageOf(v6) +
215
+ padding;
216
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType,
217
+ AnyType, AnyType>) {
218
+ const auto& [v1, v2, v3, v4, v5] = x;
219
+ constexpr auto padding = sizeof(T) - sizeof(v1) - sizeof(v2) -
220
+ sizeof(v3) - sizeof(v4) - sizeof(v5);
221
+ static_assert(padding >= 0);
222
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
223
+ MemoryUsageOf(v4) + MemoryUsageOf(v5) + padding;
224
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType,
225
+ AnyType>) {
226
+ const auto& [v1, v2, v3, v4] = x;
227
+ constexpr auto padding =
228
+ sizeof(T) - sizeof(v1) - sizeof(v2) - sizeof(v3) - sizeof(v4);
229
+ static_assert(padding >= 0);
230
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
231
+ MemoryUsageOf(v4) + padding;
232
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType, AnyType>) {
233
+ const auto& [v1, v2, v3] = x;
234
+ constexpr auto padding = sizeof(T) - sizeof(v1) - sizeof(v2) - sizeof(v3);
235
+ static_assert(padding >= 0);
236
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + MemoryUsageOf(v3) +
237
+ padding;
238
+ } else if constexpr (kIsBraceConstructible<T, AnyType, AnyType>) {
239
+ const auto& [v1, v2] = x;
240
+ constexpr auto padding = sizeof(T) - sizeof(v1) - sizeof(v2);
241
+ static_assert(padding >= 0);
242
+ return MemoryUsageOf(v1) + MemoryUsageOf(v2) + padding;
243
+ } else if constexpr (kIsBraceConstructible<T, AnyType>) {
244
+ const auto& [v1] = x;
245
+ constexpr auto padding = sizeof(T) - sizeof(v1);
246
+ static_assert(padding >= 0);
247
+ return MemoryUsageOf(v1) + padding;
248
+ } else {
249
+ // Probably wrong, but we've not figured any better...
250
+ LOG(DFATAL) << "Unsupported type";
251
+ return sizeof(T);
252
+ }
253
+ } else {
254
+ // Probably wrong, but we've not figured any better...
255
+ LOG(DFATAL) << "Unsupported type";
256
+ return sizeof(T);
257
+ }
258
+ }
259
+
260
+ template <typename... Args>
261
+ size_t MemoryUsageOf(const std::tuple<Args...>& t) {
262
+ return std::apply(
263
+ [](const auto&... args) { return (MemoryUsageOf(args) + ... + 0); }, t);
264
+ }
265
+
266
+ } // namespace grpc_core
267
+
268
+ #endif // GRPC_SRC_CORE_UTIL_MEMORY_USAGE_H
@@ -21,7 +21,9 @@
21
21
 
22
22
  namespace grpc_core {
23
23
 
24
+ #ifndef GPR_CPU_CUSTOM
24
25
  thread_local PerCpuShardingHelper::State PerCpuShardingHelper::state_;
26
+ #endif // GPR_CPU_CUSTOM
25
27
 
26
28
  size_t PerCpuOptions::Shards() {
27
29
  return ShardsForCpuCount(gpr_cpu_num_cores());
@@ -55,6 +55,12 @@ class PerCpuOptions {
55
55
  size_t max_shards_ = std::numeric_limits<size_t>::max();
56
56
  };
57
57
 
58
+ #ifdef GPR_CPU_CUSTOM
59
+ class PerCpuShardingHelper {
60
+ public:
61
+ size_t GetShardingBits() { return gpr_cpu_current_cpu(); }
62
+ };
63
+ #else
58
64
  class PerCpuShardingHelper {
59
65
  public:
60
66
  size_t GetShardingBits() {
@@ -76,6 +82,7 @@ class PerCpuShardingHelper {
76
82
  };
77
83
  static thread_local State state_;
78
84
  };
85
+ #endif // GPR_CPU_CUSTOM
79
86
 
80
87
  template <typename T>
81
88
  class PerCpu {
@@ -19,6 +19,25 @@
19
19
 
20
20
  namespace grpc_core {
21
21
 
22
+ #if defined(GRPC_CPU_INTENSIVE_BITGEN)
23
+ class SharedBitGen {
24
+ public:
25
+ SharedBitGen() = default;
26
+ SharedBitGen(const SharedBitGen&) = delete;
27
+ SharedBitGen& operator=(const SharedBitGen&) = delete;
28
+ SharedBitGen(SharedBitGen&&) = default;
29
+ SharedBitGen& operator=(SharedBitGen&&) = default;
30
+
31
+ using result_type = absl::BitGen::result_type;
32
+ result_type operator()() { return bit_gen_(); }
33
+
34
+ static constexpr auto min() { return absl::BitGen::min(); }
35
+ static constexpr auto max() { return absl::BitGen::max(); }
36
+
37
+ private:
38
+ absl::BitGen bit_gen_;
39
+ };
40
+ #else
22
41
  class SharedBitGen {
23
42
  public:
24
43
  SharedBitGen() = default;
@@ -38,6 +57,7 @@ class SharedBitGen {
38
57
  // for the mutex acquisition.
39
58
  static thread_local absl::BitGen bit_gen_;
40
59
  };
60
+ #endif // defined(GRPC_CPU_INTENSIVE_BITGEN)
41
61
 
42
62
  } // namespace grpc_core
43
63
 
@@ -105,13 +105,13 @@ class SingleSetRefCountedPtr {
105
105
 
106
106
  T& operator*() const { return *Get(); }
107
107
 
108
+ T* Set(RefCountedPtr<T> p) { return p_.Set(p.release()); }
109
+
108
110
  private:
109
111
  struct UnrefDeleter {
110
112
  void operator()(T* p) { p->Unref(); }
111
113
  };
112
114
 
113
- T* Set(RefCountedPtr<T> p) { return p_.Set(p.release()); }
114
-
115
115
  SingleSetPtr<T, UnrefDeleter> p_;
116
116
  };
117
117
 
@@ -17,10 +17,15 @@
17
17
  #ifndef GRPC_SRC_CORE_UTIL_UPB_UTILS_H
18
18
  #define GRPC_SRC_CORE_UTIL_UPB_UTILS_H
19
19
 
20
+ #include <grpc/support/time.h>
21
+
20
22
  #include <string>
21
23
 
22
24
  #include "absl/strings/string_view.h"
25
+ #include "google/protobuf/duration.upb.h"
26
+ #include "google/protobuf/timestamp.upb.h"
23
27
  #include "upb/base/string_view.h"
28
+ #include "upb/mem/arena.h"
24
29
 
25
30
  namespace grpc_core {
26
31
 
@@ -30,6 +35,17 @@ inline upb_StringView StdStringToUpbString(const T& str) {
30
35
  return upb_StringView_FromDataAndSize(str.data(), str.size());
31
36
  }
32
37
 
38
+ inline upb_StringView StdStringToUpbString(const char* str) {
39
+ return upb_StringView_FromDataAndSize(str, strlen(str));
40
+ }
41
+
42
+ template <typename T>
43
+ inline upb_StringView CopyStdStringToUpbString(const T& str, upb_Arena* arena) {
44
+ char* copy = static_cast<char*>(upb_Arena_Malloc(arena, str.size()));
45
+ memcpy(copy, str.data(), str.size());
46
+ return upb_StringView_FromDataAndSize(copy, str.size());
47
+ }
48
+
33
49
  inline absl::string_view UpbStringToAbsl(const upb_StringView& str) {
34
50
  return absl::string_view(str.data, str.size);
35
51
  }
@@ -38,6 +54,32 @@ inline std::string UpbStringToStdString(const upb_StringView& str) {
38
54
  return std::string(str.data, str.size);
39
55
  }
40
56
 
57
+ inline void TimestampToUpb(gpr_timespec ts, google_protobuf_Timestamp* proto) {
58
+ auto t = gpr_convert_clock_type(ts, GPR_CLOCK_REALTIME);
59
+ google_protobuf_Timestamp_set_seconds(proto, t.tv_sec);
60
+ google_protobuf_Timestamp_set_nanos(proto, t.tv_nsec);
61
+ }
62
+
63
+ inline void UpbToTimestamp(const google_protobuf_Timestamp* proto,
64
+ gpr_timespec* ts) {
65
+ ts->clock_type = GPR_CLOCK_REALTIME;
66
+ ts->tv_sec = google_protobuf_Timestamp_seconds(proto);
67
+ ts->tv_nsec = google_protobuf_Timestamp_nanos(proto);
68
+ }
69
+
70
+ inline void DurationToUpb(gpr_timespec ts, google_protobuf_Duration* proto) {
71
+ auto t = gpr_convert_clock_type(ts, GPR_TIMESPAN);
72
+ google_protobuf_Duration_set_seconds(proto, t.tv_sec);
73
+ google_protobuf_Duration_set_nanos(proto, t.tv_nsec);
74
+ }
75
+
76
+ inline void UpbToTimestamp(const google_protobuf_Duration* proto,
77
+ gpr_timespec* ts) {
78
+ ts->clock_type = GPR_TIMESPAN;
79
+ ts->tv_sec = google_protobuf_Duration_seconds(proto);
80
+ ts->tv_nsec = google_protobuf_Duration_nanos(proto);
81
+ }
82
+
41
83
  } // namespace grpc_core
42
84
 
43
85
  #endif // GRPC_SRC_CORE_UTIL_UPB_UTILS_H
data/src/core/util/uri.cc CHANGED
@@ -259,7 +259,7 @@ absl::StatusOr<URI> URI::Parse(absl::string_view uri_text) {
259
259
  std::string host_port;
260
260
  if (absl::ConsumePrefix(&remaining, "//")) {
261
261
  offset = remaining.find_first_of("/?#");
262
- absl::string_view encoded_authority = (remaining.substr(0, offset));
262
+ absl::string_view encoded_authority = remaining.substr(0, offset);
263
263
  // parse user_info and host_port
264
264
  absl::string_view encoded_user_info;
265
265
  absl::string_view encoded_host_port;
@@ -404,7 +404,8 @@ std::string URI::ToString() const {
404
404
  std::vector<std::string> parts = {PercentEncode(scheme_, IsSchemeChar), ":"};
405
405
  // If path starts with '//' we need to encode the authority to ensure that
406
406
  // we can round-trip the URI through a parse/encode/parse loop.
407
- if (!host_port_.empty() || absl::StartsWith(path_, "//")) {
407
+ if (!user_info_.empty() || !host_port_.empty() ||
408
+ absl::StartsWith(path_, "//")) {
408
409
  parts.emplace_back("//");
409
410
  if (!user_info_.empty()) {
410
411
  parts.emplace_back(PercentEncode(user_info_, IsUserInfoChar));
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include <cstddef>
21
21
  #include <limits>
22
+ #include <type_traits>
22
23
  #include <variant>
23
24
 
24
25
  #include "absl/log/check.h"
@@ -114,8 +115,58 @@ inline T SaturatingAdd(T a, T b) {
114
115
  return a + b;
115
116
  }
116
117
 
117
- inline uint32_t MixHash32(uint32_t a, uint32_t b) {
118
- return absl::rotl(a, 2u) ^ b;
118
+ template <
119
+ typename T,
120
+ std::enable_if_t<std::is_integral_v<T> && std::is_unsigned_v<T>, int> = 0>
121
+ inline T SaturatingMul(T a, T b) {
122
+ if (a == 0 || b == 0) return 0;
123
+ if (b > std::numeric_limits<T>::max() / a) {
124
+ return std::numeric_limits<T>::max();
125
+ }
126
+ return a * b;
127
+ }
128
+
129
+ template <
130
+ typename T,
131
+ std::enable_if_t<std::is_integral_v<T> && std::is_signed_v<T>, int> = 0>
132
+ inline T SaturatingMul(T a, T b) {
133
+ if (a == 0 || b == 0) return 0;
134
+ if (a == std::numeric_limits<T>::min()) {
135
+ // negation is ub
136
+ if (b == -1) return std::numeric_limits<T>::max();
137
+ if (b == 1) return std::numeric_limits<T>::min();
138
+ if (b > 1) return std::numeric_limits<T>::min();
139
+ return std::numeric_limits<T>::max();
140
+ }
141
+ if (b == std::numeric_limits<T>::min()) {
142
+ if (a == -1) return std::numeric_limits<T>::max();
143
+ if (a == 1) return std::numeric_limits<T>::min();
144
+ if (a > 1) return std::numeric_limits<T>::min();
145
+ return std::numeric_limits<T>::max();
146
+ }
147
+ if (a > 0 && b > 0) {
148
+ // both positive
149
+ if (a > std::numeric_limits<T>::max() / b) {
150
+ return std::numeric_limits<T>::max();
151
+ }
152
+ } else if (a < 0 && b < 0) {
153
+ // both negative
154
+ if (a < std::numeric_limits<T>::max() / b) {
155
+ return std::numeric_limits<T>::max();
156
+ }
157
+ } else {
158
+ // one positive, one negative
159
+ if (a > 0) {
160
+ if (b < std::numeric_limits<T>::min() / a) {
161
+ return std::numeric_limits<T>::min();
162
+ }
163
+ } else {
164
+ if (a < std::numeric_limits<T>::min() / b) {
165
+ return std::numeric_limits<T>::min();
166
+ }
167
+ }
168
+ }
169
+ return a * b;
119
170
  }
120
171
 
121
172
  inline uint32_t RoundUpToPowerOf2(uint32_t v) {