grpc 1.74.1 → 1.75.0.pre1

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 (368) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  187. data/src/ruby/lib/grpc/version.rb +1 -1
  188. data/third_party/cares/cares/include/ares.h +925 -460
  189. data/third_party/cares/cares/include/ares_dns.h +86 -71
  190. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  191. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  192. data/third_party/cares/cares/include/ares_version.h +37 -14
  193. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  194. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  195. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  196. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  197. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  198. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  199. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  201. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  202. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  203. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  204. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  205. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  206. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  207. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  208. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  209. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  210. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  211. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  212. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  213. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  214. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  215. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  216. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  217. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  218. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  219. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  220. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  221. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  222. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  223. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  224. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  225. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  226. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  227. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  228. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  229. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  230. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  231. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  232. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  233. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  234. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  235. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  238. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  239. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  240. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  241. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  242. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  243. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  244. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  255. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  265. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  266. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  267. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  273. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  274. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  275. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  276. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  277. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  278. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  279. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  294. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  302. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  303. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  304. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  306. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  307. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  309. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  311. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  313. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  315. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  316. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  317. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  319. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  320. metadata +121 -49
  321. data/src/core/util/ring_buffer.h +0 -122
  322. data/third_party/cares/cares/include/ares_rules.h +0 -125
  323. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  324. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  325. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  326. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  327. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  328. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  329. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  330. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  331. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  332. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  333. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  334. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  335. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  336. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  337. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  338. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  339. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  340. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  341. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  342. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  343. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  344. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  345. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  346. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  347. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  348. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  349. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  350. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  351. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  352. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  353. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  354. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  355. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  356. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  357. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  359. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  360. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  361. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  362. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  363. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  364. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  365. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  366. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  367. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  368. data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -16,30 +16,73 @@
16
16
  #define GRPC_SRC_CORE_UTIL_LATENT_SEE_H
17
17
 
18
18
  #include <grpc/support/port_platform.h>
19
-
20
- #ifdef GRPC_ENABLE_LATENT_SEE
21
- #include <sys/syscall.h>
22
- #include <unistd.h>
19
+ #include <grpc/support/thd_id.h>
23
20
 
24
21
  #include <atomic>
25
- #include <chrono>
26
22
  #include <cstdint>
27
23
  #include <cstdio>
28
24
  #include <cstdlib>
29
- #include <optional>
30
- #include <string>
25
+ #include <memory>
31
26
  #include <utility>
32
- #include <vector>
33
27
 
34
- #include "absl/base/thread_annotations.h"
35
- #include "absl/functional/any_invocable.h"
36
- #include "absl/functional/function_ref.h"
37
- #include "absl/log/log.h"
28
+ #include "absl/container/flat_hash_map.h"
38
29
  #include "absl/strings/string_view.h"
39
- #include "src/core/util/per_cpu.h"
40
- #include "src/core/util/sync.h"
30
+ #include "absl/time/clock.h"
31
+ #include "src/core/util/mpscq.h"
32
+ #include "src/core/util/notification.h"
33
+ #include "src/core/util/thd.h"
34
+
35
+ namespace grpc_core {
36
+ namespace latent_see {
37
+
38
+ class Output {
39
+ public:
40
+ virtual void Mark(absl::string_view name, int64_t tid, int64_t timestamp) = 0;
41
+ virtual void FlowBegin(absl::string_view name, int64_t tid, int64_t timestamp,
42
+ int64_t flow_id) = 0;
43
+ virtual void FlowEnd(absl::string_view name, int64_t tid, int64_t timestamp,
44
+ int64_t flow_id) = 0;
45
+ virtual void Span(absl::string_view name, int64_t tid,
46
+ int64_t timestamp_begin, int64_t duration) = 0;
47
+ virtual void Finish() = 0;
48
+
49
+ protected:
50
+ ~Output() = default;
51
+ };
52
+
53
+ class DiscardOutput final : public Output {
54
+ public:
55
+ void Mark(absl::string_view, int64_t, int64_t) override {}
56
+ void FlowBegin(absl::string_view, int64_t, int64_t, int64_t) override {}
57
+ void FlowEnd(absl::string_view, int64_t, int64_t, int64_t) override {}
58
+ void Span(absl::string_view, int64_t, int64_t, int64_t) override {}
59
+ void Finish() override {}
60
+ };
61
+
62
+ class JsonOutput final : public Output {
63
+ public:
64
+ explicit JsonOutput(std::ostream& out) : out_(out) { out_ << "[\n"; }
65
+
66
+ void Mark(absl::string_view name, int64_t tid, int64_t timestamp) override;
67
+ void FlowBegin(absl::string_view name, int64_t tid, int64_t timestamp,
68
+ int64_t flow_id) override;
69
+ void FlowEnd(absl::string_view name, int64_t tid, int64_t timestamp,
70
+ int64_t flow_id) override;
71
+ void Span(absl::string_view name, int64_t tid, int64_t timestamp_begin,
72
+ int64_t duration) override;
73
+ void Finish() override;
74
+
75
+ private:
76
+ static std::string MicrosString(int64_t nanos);
77
+
78
+ std::ostream& out_;
79
+ const char* sep_ = "";
80
+ };
81
+
82
+ } // namespace latent_see
83
+ } // namespace grpc_core
41
84
 
42
- #define TAGGED_POINTER_SIZE_BITS 48
85
+ #ifndef GRPC_DISABLE_LATENT_SEE
43
86
 
44
87
  namespace grpc_core {
45
88
  namespace latent_see {
@@ -50,211 +93,215 @@ struct Metadata {
50
93
  absl::string_view name;
51
94
  };
52
95
 
53
- enum class EventType : uint8_t { kBegin, kEnd, kFlowStart, kFlowEnd, kMark };
54
-
55
96
  // A bin collects all events that occur within a parent scope.
56
- struct Bin {
97
+ struct Bin : public MultiProducerSingleConsumerQueue::Node {
57
98
  struct Event {
58
99
  const Metadata* metadata;
59
- std::chrono::steady_clock::time_point timestamp;
60
- uint64_t id;
61
- EventType type;
100
+ int64_t timestamp_begin;
101
+ int64_t timestamp_end;
102
+
103
+ static constexpr uint64_t kSpan = 0;
104
+ static constexpr uint64_t kFlow = 1;
62
105
  };
63
106
 
64
- void Append(const Metadata* metadata, EventType type, uint64_t id) {
65
- events.push_back(
66
- Event{metadata, std::chrono::steady_clock::now(), id, type});
107
+ bool Append(const Metadata* metadata, int64_t timestamp_begin,
108
+ int64_t timestamp_end) {
109
+ Event* ev = &events[num_events];
110
+ ++num_events;
111
+ ev->metadata = metadata;
112
+ ev->timestamp_begin = timestamp_begin;
113
+ ev->timestamp_end = timestamp_end;
114
+ return num_events == kEventsPerBin;
67
115
  }
68
116
 
69
- std::vector<Event> events;
70
- uintptr_t next_free = 0;
117
+ const Event* begin() const { return events.data(); }
118
+ const Event* end() const { return events.data() + num_events; }
119
+
120
+ static constexpr size_t kEventsPerBin = 8192 / sizeof(Event) - 1;
121
+ size_t num_events = 0;
122
+ gpr_thd_id thd_id = gpr_thd_currentid();
123
+ std::array<Event, kEventsPerBin> events;
71
124
  };
72
125
 
73
- class Log {
126
+ void Collect(Notification* notification, absl::Duration timeout,
127
+ size_t memory_limit, Output* output);
128
+
129
+ class Sink {
74
130
  public:
75
- static constexpr uintptr_t kTagMask = (1ULL << TAGGED_POINTER_SIZE_BITS) - 1;
131
+ using EventDump = std::deque<std::unique_ptr<Bin>>;
76
132
 
77
- struct RecordedEvent {
78
- uint64_t thread_id;
79
- uint64_t batch_id;
80
- Bin::Event event;
81
- };
133
+ Sink();
134
+ ~Sink() = delete;
135
+ void Append(std::unique_ptr<Bin> bin);
82
136
 
83
- GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION static uintptr_t IncrementTag(
84
- uintptr_t input) {
85
- return input + (1UL << TAGGED_POINTER_SIZE_BITS);
86
- }
137
+ private:
138
+ friend void Collect(Notification*, absl::Duration, size_t, Output*);
87
139
 
88
- GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION static Bin* ToBin(uintptr_t ptr) {
89
- return reinterpret_cast<Bin*>(ptr & kTagMask);
90
- }
140
+ void Gather();
141
+ void Record(std::unique_ptr<Bin> bin);
91
142
 
92
- static uintptr_t StartBin(void* owner) {
93
- uintptr_t bin_descriptor = free_bins_.load(std::memory_order_acquire);
94
- Bin* bin;
95
- do {
96
- if (bin_descriptor == 0) {
97
- bin = new Bin();
98
- break;
99
- }
100
- bin = ToBin(bin_descriptor);
101
- } while (!free_bins_.compare_exchange_strong(bin_descriptor, bin->next_free,
102
- std::memory_order_acq_rel));
103
- bin_ = bin;
104
- bin_owner_ = owner;
105
- return reinterpret_cast<uintptr_t>(bin);
106
- }
143
+ void Start(size_t max_bins);
144
+ std::unique_ptr<EventDump> Stop();
107
145
 
108
- static void EndBin(uintptr_t bin_descriptor, void* owner) {
109
- if (bin_owner_ != owner || bin_descriptor == 0) return;
110
- FlushBin(ToBin(bin_descriptor));
111
- uintptr_t next_free = free_bins_.load(std::memory_order_acquire);
112
- while (!free_bins_.compare_exchange_strong(
113
- next_free, IncrementTag(bin_descriptor), std::memory_order_acq_rel)) {
146
+ MultiProducerSingleConsumerQueue appending_;
147
+ Thread gatherer_;
148
+ Mutex mu_;
149
+ std::unique_ptr<EventDump> events_ ABSL_GUARDED_BY(mu_);
150
+ size_t max_bins_ ABSL_GUARDED_BY(mu_);
151
+ };
152
+
153
+ class Appender {
154
+ public:
155
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION Appender()
156
+ : Appender(active_sink_.load(std::memory_order_acquire)) {};
157
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION explicit Appender(Sink* sink)
158
+ : sink_(sink) {}
159
+ Appender(const Appender&) = delete;
160
+ Appender& operator=(const Appender&) = delete;
161
+
162
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION bool Enabled() const {
163
+ return sink_ != nullptr;
164
+ }
165
+ void Append(const Metadata* metadata, int64_t timestamp_begin,
166
+ int64_t timestamp_end) {
167
+ DCHECK(Enabled());
168
+ DCHECK_NE(metadata, nullptr);
169
+ if (GPR_UNLIKELY(bin_ == nullptr)) bin_ = std::make_unique<Bin>();
170
+ if (GPR_UNLIKELY(bin_->Append(metadata, timestamp_begin, timestamp_end))) {
171
+ sink_->Append(std::move(bin_));
114
172
  }
115
- bin_ = nullptr;
116
- bin_owner_ = nullptr;
117
173
  }
118
174
 
119
- static Bin* CurrentThreadBin() { return bin_; }
120
-
121
- GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION static Log& Get() {
122
- static Log* log = new Log();
123
- return *log;
175
+ void Flush() {
176
+ if (GPR_UNLIKELY(bin_ != nullptr)) sink_->Append(std::move(bin_));
124
177
  }
125
178
 
126
- void TryPullEventsAndFlush(
127
- absl::FunctionRef<void(absl::Span<const RecordedEvent>)> callback);
128
- std::optional<std::string> TryGenerateJson();
129
-
130
- void OverrideStatsFlusher(
131
- absl::AnyInvocable<void(absl::string_view)> stats_exporter) {
132
- stats_flusher_ = std::move(stats_exporter);
133
- }
179
+ private:
180
+ friend void Collect(Notification*, absl::Duration, size_t, Output*);
134
181
 
135
- // Install an atexit callback that will log to latent_see.json in the working
136
- // directory
137
- static void InstallAtExitHandler();
182
+ static void Enable(Sink* sink);
183
+ static void Disable();
138
184
 
139
- private:
140
- Log() = default;
141
-
142
- static void FlushBin(Bin* bin);
143
-
144
- std::atomic<uint64_t> next_thread_id_{1};
145
- std::atomic<uint64_t> next_batch_id_{1};
146
- static thread_local uint64_t thread_id_;
147
- static thread_local Bin* bin_;
148
- static thread_local void* bin_owner_;
149
- static std::atomic<uintptr_t> free_bins_;
150
- absl::AnyInvocable<void(absl::string_view)> stats_flusher_ = nullptr;
151
- Mutex mu_flushing_;
152
- struct Fragment {
153
- Mutex mu_active ABSL_ACQUIRED_AFTER(mu_flushing_);
154
- std::vector<RecordedEvent> active ABSL_GUARDED_BY(mu_active);
155
- std::vector<RecordedEvent> flushing ABSL_GUARDED_BY(&Log::mu_flushing_);
156
- };
157
- PerCpu<Fragment> fragments_{PerCpuOptions()};
185
+ Sink* sink_;
186
+ static thread_local std::unique_ptr<Bin> bin_;
187
+ static std::atomic<Sink*> active_sink_;
158
188
  };
159
189
 
160
- template <bool kParent>
161
- class Scope {
190
+ inline void Flush() {
191
+ Appender appender;
192
+ if (GPR_UNLIKELY(!appender.Enabled())) return;
193
+ appender.Flush();
194
+ }
195
+
196
+ class Scope final {
162
197
  public:
163
- GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION explicit Scope(const Metadata* metadata)
164
- : metadata_(metadata) {
165
- bin_ = Log::CurrentThreadBin();
166
- if (kParent && bin_ == nullptr) {
167
- bin_descriptor_ = Log::StartBin(this);
168
- bin_ = Log::ToBin(bin_descriptor_);
169
- }
170
- CHECK_NE(bin_, nullptr);
171
- bin_->Append(metadata_, EventType::kBegin, 0);
198
+ Scope(const Scope&) = delete;
199
+ Scope& operator=(const Scope&) = delete;
200
+
201
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION explicit Scope(
202
+ const Metadata* metadata) {
203
+ if (GPR_LIKELY(!appender_.Enabled())) return;
204
+ metadata_ = metadata;
205
+ timestamp_begin_ = absl::GetCurrentTimeNanos();
172
206
  }
207
+
173
208
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~Scope() {
174
- bin_->Append(metadata_, EventType::kEnd, 0);
175
- if (kParent) Log::EndBin(bin_descriptor_, this);
209
+ if (GPR_LIKELY(!appender_.Enabled())) return;
210
+ appender_.Append(metadata_, timestamp_begin_, absl::GetCurrentTimeNanos());
176
211
  }
177
212
 
178
- Scope(const Scope&) = delete;
179
- Scope& operator=(const Scope&) = delete;
180
-
181
213
  private:
182
- const Metadata* const metadata_;
183
- uintptr_t bin_descriptor_ = 0;
184
- Bin* bin_ = nullptr;
214
+ Appender appender_;
215
+ int64_t timestamp_begin_;
216
+ const Metadata* metadata_;
185
217
  };
186
218
 
187
- using ParentScope = Scope<true>;
188
- using InnerScope = Scope<false>;
219
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION static inline void Mark(
220
+ const Metadata* metadata) {
221
+ Appender appender;
222
+ if (GPR_LIKELY(!appender.Enabled())) return;
223
+ const auto ts = absl::GetCurrentTimeNanos();
224
+ appender.Append(metadata, ts, ts);
225
+ }
189
226
 
190
227
  class Flow {
191
228
  public:
192
- GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION Flow() : metadata_(nullptr) {}
193
- GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION explicit Flow(const Metadata* metadata)
194
- : metadata_(metadata),
195
- id_(next_flow_id_.fetch_add(1, std::memory_order_relaxed)) {
196
- Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowStart, id_);
229
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION Flow() : id_(0) {}
230
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION explicit Flow(const Metadata* metadata) {
231
+ Appender appender;
232
+ if (GPR_LIKELY(!appender.Enabled())) {
233
+ id_ = 0;
234
+ return;
235
+ }
236
+ metadata_ = metadata;
237
+ AppendBegin(appender);
197
238
  }
198
239
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION ~Flow() {
199
- if (metadata_ != nullptr) {
200
- Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowEnd, id_);
201
- }
240
+ if (GPR_LIKELY(id_ == 0)) return;
241
+ Appender appender;
242
+ if (GPR_LIKELY(!appender.Enabled())) return;
243
+ AppendEnd(appender);
202
244
  }
203
245
 
204
246
  Flow(const Flow&) = delete;
205
247
  Flow& operator=(const Flow&) = delete;
206
248
  Flow(Flow&& other) noexcept
207
- : metadata_(std::exchange(other.metadata_, nullptr)), id_(other.id_) {}
249
+ : metadata_(other.metadata_), id_(std::exchange(other.id_, 0)) {}
208
250
  Flow& operator=(Flow&& other) noexcept {
209
- if (metadata_ != nullptr) {
210
- Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowEnd, id_);
251
+ if (id_ != 0) {
252
+ Appender appender;
253
+ if (GPR_LIKELY(!appender.Enabled())) AppendEnd(appender);
211
254
  }
212
- metadata_ = std::exchange(other.metadata_, nullptr);
213
- id_ = other.id_;
255
+ metadata_ = other.metadata_;
256
+ id_ = std::exchange(other.id_, 0);
214
257
  return *this;
215
258
  }
216
259
 
217
260
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION bool is_active() const {
218
- return metadata_ != nullptr;
261
+ return id_ != 0;
219
262
  }
220
263
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void End() {
221
- if (metadata_ == nullptr) return;
222
- Log::CurrentThreadBin()->Append(metadata_, EventType::kFlowEnd, id_);
223
- metadata_ = nullptr;
264
+ if (GPR_LIKELY(id_ == 0)) return;
265
+ Appender appender;
266
+ if (GPR_LIKELY(!appender.Enabled())) return;
267
+ AppendEnd(appender);
224
268
  }
225
269
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void Begin(const Metadata* metadata) {
226
- auto* bin = Log::CurrentThreadBin();
227
- if (metadata_ != nullptr) {
228
- bin->Append(metadata_, EventType::kFlowEnd, id_);
229
- }
270
+ Appender appender;
271
+ if (GPR_LIKELY(!appender.Enabled())) return;
272
+ if (id_ != 0) AppendEnd(appender);
230
273
  metadata_ = metadata;
231
- if (metadata_ == nullptr) return;
232
- id_ = next_flow_id_.fetch_add(1, std::memory_order_relaxed);
233
- bin->Append(metadata_, EventType::kFlowStart, id_);
274
+ AppendBegin(appender);
234
275
  }
276
+ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void Begin() { Begin(metadata_); }
235
277
 
236
278
  private:
279
+ void AppendBegin(Appender& appender) {
280
+ id_ = next_id_.fetch_add(1, std::memory_order_relaxed);
281
+ appender.Append(metadata_, -id_, absl::GetCurrentTimeNanos());
282
+ }
283
+ void AppendEnd(Appender& appender) {
284
+ DCHECK_NE(id_, 0);
285
+ appender.Append(metadata_, -id_, -absl::GetCurrentTimeNanos());
286
+ id_ = 0;
287
+ }
237
288
  const Metadata* metadata_;
238
- uint64_t id_;
239
- static std::atomic<uint64_t> next_flow_id_;
289
+ static inline std::atomic<int64_t> next_id_{1};
290
+ int64_t id_;
240
291
  };
241
292
 
242
- GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline void Mark(const Metadata* md) {
243
- Log::CurrentThreadBin()->Append(md, EventType::kMark, 0);
244
- }
245
-
246
293
  template <typename P>
247
294
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION auto Promise(const Metadata* md_poll,
248
295
  const Metadata* md_flow,
249
296
  P promise) {
250
- return [md_poll, md_flow, promise = std::move(promise),
251
- flow = Flow(md_flow)]() mutable {
252
- InnerScope scope(md_poll);
253
- flow.End();
254
- auto r = promise();
255
- flow.Begin(md_flow);
256
- return r;
257
- };
297
+ return
298
+ [md_poll, promise = std::move(promise), flow = Flow(md_flow)]() mutable {
299
+ Scope scope(md_poll);
300
+ flow.End();
301
+ auto r = promise();
302
+ if (IsPending(r)) flow.Begin();
303
+ return r;
304
+ };
258
305
  }
259
306
 
260
307
  } // namespace latent_see
@@ -268,30 +315,35 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION auto Promise(const Metadata* md_poll,
268
315
  name}; \
269
316
  return &metadata; \
270
317
  }()
271
- // Parent scope: logs a begin and end event, and flushes the thread log on scope
272
- // exit. Because the flush takes some time it's better to place one parent scope
273
- // at the top of the stack, and use lighter weight scopes within it.
274
- #define GRPC_LATENT_SEE_PARENT_SCOPE(name) \
275
- grpc_core::latent_see::ParentScope GRPC_LATENT_SEE_SYMBOL(latent_see_scope)( \
276
- GRPC_LATENT_SEE_METADATA(name))
277
- // Inner scope: logs a begin and end event. Lighter weight than parent scope,
278
- // but does not flush the thread state - so should only be enclosed by a parent
279
- // scope.
280
- #define GRPC_LATENT_SEE_INNER_SCOPE(name) \
281
- grpc_core::latent_see::InnerScope GRPC_LATENT_SEE_SYMBOL(latent_see_scope)( \
318
+ // Scope: marks a begin/end event in the log.
319
+ #define GRPC_LATENT_SEE_ALWAYS_ON_SCOPE(name) \
320
+ grpc_core::latent_see::Scope GRPC_LATENT_SEE_SYMBOL(latent_see_scope)( \
282
321
  GRPC_LATENT_SEE_METADATA(name))
283
322
  // Mark: logs a single event.
284
- // This is not flushed automatically, and so should only be used within a parent
285
- // scope.
286
- #define GRPC_LATENT_SEE_MARK(name) \
323
+ #define GRPC_LATENT_SEE_ALWAYS_ON_MARK(name) \
287
324
  grpc_core::latent_see::Mark(GRPC_LATENT_SEE_METADATA(name))
288
- #define GRPC_LATENT_SEE_PROMISE(name, promise) \
289
- grpc_core::latent_see::Promise(GRPC_LATENT_SEE_METADATA("Poll:" name), \
290
- GRPC_LATENT_SEE_METADATA(name), [&]() { \
291
- GRPC_LATENT_SEE_INNER_SCOPE("Setup:" name); \
292
- return promise; \
293
- }())
294
- #else // !def(GRPC_ENABLE_LATENT_SEE)
325
+ #define GRPC_LATENT_SEE_ALWAYS_ON_PROMISE(name, promise) \
326
+ grpc_core::latent_see::Promise( \
327
+ GRPC_LATENT_SEE_METADATA("Poll:" name), GRPC_LATENT_SEE_METADATA(name), \
328
+ [&]() { \
329
+ GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("Setup:" name); \
330
+ return promise; \
331
+ }())
332
+ #ifdef GRPC_EXTRA_LATENT_SEE
333
+ #define GRPC_LATENT_SEE_SCOPE(name) GRPC_LATENT_SEE_ALWAYS_ON_SCOPE(name)
334
+ #define GRPC_LATENT_SEE_MARK(name) GRPC_LATENT_SEE_ALWAYS_ON_MARK(name)
335
+ #define GRPC_LATENT_SEE_PROMISE(name, promise) \
336
+ GRPC_LATENT_SEE_ALWAYS_ON_PROMISE(name, promise)
337
+ #else
338
+ #define GRPC_LATENT_SEE_SCOPE(name) \
339
+ do { \
340
+ } while (0)
341
+ #define GRPC_LATENT_SEE_MARK(name) \
342
+ do { \
343
+ } while (0)
344
+ #define GRPC_LATENT_SEE_PROMISE(name, promise) promise
345
+ #endif
346
+ #else // def(GRPC_DISABLE_LATENT_SEE)
295
347
  namespace grpc_core {
296
348
  namespace latent_see {
297
349
  struct Metadata {};
@@ -300,26 +352,31 @@ struct Flow {
300
352
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void End() {}
301
353
  GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION void Begin(Metadata*) {}
302
354
  };
303
- struct ParentScope {
304
- explicit ParentScope(Metadata*) {}
305
- };
306
- struct InnerScope {
307
- explicit InnerScope(Metadata*) {}
355
+ struct Scope {
356
+ explicit Scope(Metadata*) {}
308
357
  };
358
+
359
+ inline void Collect(Notification*, absl::Duration, size_t, Output* output) {
360
+ output->Finish();
361
+ }
309
362
  } // namespace latent_see
310
363
  } // namespace grpc_core
311
364
  #define GRPC_LATENT_SEE_METADATA(name) nullptr
312
365
  #define GRPC_LATENT_SEE_METADATA_RAW(name) nullptr
313
- #define GRPC_LATENT_SEE_PARENT_SCOPE(name) \
314
- do { \
366
+ #define GRPC_LATENT_SEE_ALWAYS_ON_SCOPE(name) \
367
+ do { \
368
+ } while (0)
369
+ #define GRPC_LATENT_SEE_ALWAYS_ON_MARK(name) \
370
+ do { \
315
371
  } while (0)
316
- #define GRPC_LATENT_SEE_INNER_SCOPE(name) \
317
- do { \
372
+ #define GRPC_LATENT_SEE_ALWAYS_ON_PROMISE(name, promise) promise
373
+ #define GRPC_LATENT_SEE_SCOPE(name) \
374
+ do { \
318
375
  } while (0)
319
376
  #define GRPC_LATENT_SEE_MARK(name) \
320
377
  do { \
321
378
  } while (0)
322
379
  #define GRPC_LATENT_SEE_PROMISE(name, promise) promise
323
- #endif // GRPC_ENABLE_LATENT_SEE
380
+ #endif // GRPC_DISABLE_LATENT_SEE
324
381
 
325
382
  #endif // GRPC_SRC_CORE_UTIL_LATENT_SEE_H
@@ -90,9 +90,10 @@ class SingleSetRefCountedPtr {
90
90
 
91
91
  bool is_set() const { return p_.is_set(); }
92
92
 
93
- RefCountedPtr<T> GetOrCreate() {
93
+ template <typename... Args>
94
+ RefCountedPtr<T> GetOrCreate(Args&&... args) {
94
95
  T* p = Get();
95
- if (p == nullptr) p = Set(MakeRefCounted<T>());
96
+ if (p == nullptr) p = Set(MakeRefCounted<T>(std::forward<Args>(args)...));
96
97
  return p->Ref();
97
98
  }
98
99
  T* Get() const { return p_.Get(); }
@@ -107,6 +108,8 @@ class SingleSetRefCountedPtr {
107
108
 
108
109
  T* Set(RefCountedPtr<T> p) { return p_.Set(p.release()); }
109
110
 
111
+ void Reset() { p_.Reset(); }
112
+
110
113
  private:
111
114
  struct UnrefDeleter {
112
115
  void operator()(T* p) { p->Unref(); }
@@ -197,6 +197,97 @@ GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline uint64_t LowestOneBit(uint64_t x) {
197
197
  return x & -x;
198
198
  }
199
199
 
200
+ namespace useful_detail {
201
+
202
+ // Constexpr implementation of std::log for base e.
203
+ // This is a simple implementation using a Taylor series expansion and may not
204
+ // be as accurate as std::log from <cmath>. It is intended for use in constexpr
205
+ // contexts.
206
+ // It uses the identity log(y) = 2 * atanh((y-1)/(y+1))
207
+ // where atanh(x) = x + x^3/3 + x^5/5 + ...
208
+ constexpr double ConstexprLog(double y) {
209
+ if (y < 0) {
210
+ return std::numeric_limits<double>::quiet_NaN();
211
+ }
212
+ if (y == 0) {
213
+ return -std::numeric_limits<double>::infinity();
214
+ }
215
+ if (y == 1) {
216
+ return 0.0;
217
+ }
218
+ // Bring y into the range [1, 2) to improve convergence.
219
+ // log(y) = log(y / 2^k) + k*log(2)
220
+ int k = 0;
221
+ while (y > 2.0) {
222
+ y /= 2.0;
223
+ k++;
224
+ }
225
+ while (y < 1.0) {
226
+ y *= 2.0;
227
+ k--;
228
+ }
229
+ // Now y is in [1, 2).
230
+ // x = (y-1)/(y+1) is in [0, 1/3).
231
+ // The series will converge quickly.
232
+ double x = (y - 1) / (y + 1);
233
+ double x2 = x * x;
234
+ double term = x;
235
+ double sum = term;
236
+ for (int i = 1; i < 100; ++i) {
237
+ term *= x2;
238
+ double next_sum = sum + term / (2 * i + 1);
239
+ if (next_sum == sum) break;
240
+ sum = next_sum;
241
+ }
242
+ constexpr double kLog2 = 0.693147180559945309417;
243
+ return 2 * sum + k * kLog2;
244
+ }
245
+
246
+ // Constexpr implementation of std::exp.
247
+ // This is a simple implementation using a Taylor series expansion and may not
248
+ // be as accurate as std::exp from <cmath>. It is intended for use in constexpr
249
+ // contexts.
250
+ // It uses exp(x) = 1 + x + x^2/2! + x^3/3! + ...
251
+ // For better convergence, we use range reduction via exp(x) = (exp(x/2))^2.
252
+ constexpr double ConstexprExp(double x) {
253
+ if (x > 2.0 || x < -2.0) {
254
+ const double half = ConstexprExp(x / 2.0);
255
+ return half * half;
256
+ }
257
+ double sum = 1.0;
258
+ double term = 1.0;
259
+ for (int i = 1; i < 30; ++i) {
260
+ term *= x / i;
261
+ double next_sum = sum + term;
262
+ if (next_sum == sum) break;
263
+ sum = next_sum;
264
+ }
265
+ return sum;
266
+ }
267
+
268
+ } // namespace useful_detail
269
+
270
+ // Constexpr implementation of std::pow.
271
+ // This is a simple implementation and may not be as accurate as std::pow from
272
+ // <cmath>. It is intended for use in constexpr contexts.
273
+ // Fuzztests exist in useful_fuzztest.cc to test that the constexpr and
274
+ // non-constexpr implementations are within an acceptable error bound.
275
+ // Replace with std::pow when we move to C++26.
276
+ constexpr double ConstexprPow(double base, double exponent) {
277
+ // For simplicity, only handle non-negative bases.
278
+ // std::pow has more complex rules for negative bases.
279
+ if (base < 0) return std::numeric_limits<double>::quiet_NaN();
280
+ if (base == 0) {
281
+ if (exponent > 0) return 0.0;
282
+ if (exponent == 0) return 1.0;
283
+ return std::numeric_limits<double>::infinity();
284
+ }
285
+ if (exponent == 0.0) return 1.0;
286
+ if (exponent == 1.0) return base;
287
+ return useful_detail::ConstexprExp(exponent *
288
+ useful_detail::ConstexprLog(base));
289
+ }
290
+
200
291
  } // namespace grpc_core
201
292
 
202
293
  #define GPR_ARRAY_SIZE(array) (sizeof(array) / sizeof(*(array)))
@@ -23,6 +23,7 @@
23
23
  #include <sys/stat.h>
24
24
  #include <windows.h>
25
25
 
26
+ #include <memory>
26
27
  #include <string>
27
28
  #include <vector>
28
29