grpc 1.47.0 → 1.48.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -26,9 +26,9 @@
26
26
  // support Abseil hashing without requiring you to define a hashing
27
27
  // algorithm.
28
28
  // * `HashState`, a type-erased class which implements the manipulation of the
29
- // hash state (H) itself, contains member functions `combine()` and
30
- // `combine_contiguous()`, which you can use to contribute to an existing
31
- // hash state when hashing your types.
29
+ // hash state (H) itself; contains member functions `combine()`,
30
+ // `combine_contiguous()`, and `combine_unordered()`; and which you can use
31
+ // to contribute to an existing hash state when hashing your types.
32
32
  //
33
33
  // Unlike `std::hash` or other hashing frameworks, the Abseil hashing framework
34
34
  // provides most of its utility by abstracting away the hash algorithm (and its
@@ -40,6 +40,11 @@
40
40
  // each process. E.g., `absl::Hash<int>{}(9)` in one process and
41
41
  // `absl::Hash<int>{}(9)` in another process are likely to differ.
42
42
  //
43
+ // `absl::Hash` may also produce different values from different dynamically
44
+ // loaded libraries. For this reason, `absl::Hash` values must never cross
45
+ // boundries in dynamically loaded libraries (including when used in types like
46
+ // hash containers.)
47
+ //
43
48
  // `absl::Hash` is intended to strongly mix input bits with a target of passing
44
49
  // an [Avalanche Test](https://en.wikipedia.org/wiki/Avalanche_effect).
45
50
  //
@@ -74,7 +79,9 @@
74
79
  #define ABSL_HASH_HASH_H_
75
80
 
76
81
  #include <tuple>
82
+ #include <utility>
77
83
 
84
+ #include "absl/functional/function_ref.h"
78
85
  #include "absl/hash/internal/hash.h"
79
86
 
80
87
  namespace absl {
@@ -107,14 +114,27 @@ ABSL_NAMESPACE_BEGIN
107
114
  // * std::string_view (as well as any instance of std::basic_string that
108
115
  // uses char and std::char_traits)
109
116
  // * All the standard sequence containers (provided the elements are hashable)
110
- // * All the standard ordered associative containers (provided the elements are
117
+ // * All the standard associative containers (provided the elements are
111
118
  // hashable)
112
119
  // * absl types such as the following:
113
120
  // * absl::string_view
114
- // * absl::InlinedVector
115
- // * absl::FixedArray
116
121
  // * absl::uint128
117
122
  // * absl::Time, absl::Duration, and absl::TimeZone
123
+ // * absl containers (provided the elements are hashable) such as the
124
+ // following:
125
+ // * absl::flat_hash_set, absl::node_hash_set, absl::btree_set
126
+ // * absl::flat_hash_map, absl::node_hash_map, absl::btree_map
127
+ // * absl::btree_multiset, absl::btree_multimap
128
+ // * absl::InlinedVector
129
+ // * absl::FixedArray
130
+ //
131
+ // When absl::Hash is used to hash an unordered container with a custom hash
132
+ // functor, the elements are hashed using default absl::Hash semantics, not
133
+ // the custom hash functor. This is consistent with the behavior of
134
+ // operator==() on unordered containers, which compares elements pairwise with
135
+ // operator==() rather than the custom equality functor. It is usually a
136
+ // mistake to use either operator==() or absl::Hash on unordered collections
137
+ // that use functors incompatible with operator==() equality.
118
138
  //
119
139
  // Note: the list above is not meant to be exhaustive. Additional type support
120
140
  // may be added, in which case the above list will be updated.
@@ -153,7 +173,8 @@ ABSL_NAMESPACE_BEGIN
153
173
  // that are otherwise difficult to extend using `AbslHashValue()`. (See the
154
174
  // `HashState` class below.)
155
175
  //
156
- // The "hash state" concept contains two member functions for mixing hash state:
176
+ // The "hash state" concept contains three member functions for mixing hash
177
+ // state:
157
178
  //
158
179
  // * `H::combine(state, values...)`
159
180
  //
@@ -187,6 +208,15 @@ ABSL_NAMESPACE_BEGIN
187
208
  // (it may perform internal optimizations). If you need this guarantee, use a
188
209
  // loop instead.
189
210
  //
211
+ // * `H::combine_unordered(state, begin, end)`
212
+ //
213
+ // Combines a set of elements denoted by an iterator pair into a hash
214
+ // state, returning the updated state. Note that the existing hash
215
+ // state is move-only and must be passed by value.
216
+ //
217
+ // Unlike the other two methods, the hashing is order-independent.
218
+ // This can be used to hash unordered collections.
219
+ //
190
220
  // -----------------------------------------------------------------------------
191
221
  // Adding Type Support to `absl::Hash`
192
222
  // -----------------------------------------------------------------------------
@@ -243,8 +273,9 @@ size_t HashOf(const Types&... values) {
243
273
  // classes, virtual functions, etc.). The type erasure adds overhead so it
244
274
  // should be avoided unless necessary.
245
275
  //
246
- // Note: This wrapper will only erase calls to:
276
+ // Note: This wrapper will only erase calls to
247
277
  // combine_contiguous(H, const unsigned char*, size_t)
278
+ // RunCombineUnordered(H, CombinerF)
248
279
  //
249
280
  // All other calls will be handled internally and will not invoke overloads
250
281
  // provided by the wrapped class.
@@ -318,6 +349,8 @@ class HashState : public hash_internal::HashStateBase<HashState> {
318
349
  private:
319
350
  HashState() = default;
320
351
 
352
+ friend class HashState::HashStateBase;
353
+
321
354
  template <typename T>
322
355
  static void CombineContiguousImpl(void* p, const unsigned char* first,
323
356
  size_t size) {
@@ -329,16 +362,57 @@ class HashState : public hash_internal::HashStateBase<HashState> {
329
362
  void Init(T* state) {
330
363
  state_ = state;
331
364
  combine_contiguous_ = &CombineContiguousImpl<T>;
365
+ run_combine_unordered_ = &RunCombineUnorderedImpl<T>;
366
+ }
367
+
368
+ template <typename HS>
369
+ struct CombineUnorderedInvoker {
370
+ template <typename T, typename ConsumerT>
371
+ void operator()(T inner_state, ConsumerT inner_cb) {
372
+ f(HashState::Create(&inner_state),
373
+ [&](HashState& inner_erased) { inner_cb(inner_erased.Real<T>()); });
374
+ }
375
+
376
+ absl::FunctionRef<void(HS, absl::FunctionRef<void(HS&)>)> f;
377
+ };
378
+
379
+ template <typename T>
380
+ static HashState RunCombineUnorderedImpl(
381
+ HashState state,
382
+ absl::FunctionRef<void(HashState, absl::FunctionRef<void(HashState&)>)>
383
+ f) {
384
+ // Note that this implementation assumes that inner_state and outer_state
385
+ // are the same type. This isn't true in the SpyHash case, but SpyHash
386
+ // types are move-convertible to each other, so this still works.
387
+ T& real_state = state.Real<T>();
388
+ real_state = T::RunCombineUnordered(
389
+ std::move(real_state), CombineUnorderedInvoker<HashState>{f});
390
+ return state;
391
+ }
392
+
393
+ template <typename CombinerT>
394
+ static HashState RunCombineUnordered(HashState state, CombinerT combiner) {
395
+ auto* run = state.run_combine_unordered_;
396
+ return run(std::move(state), std::ref(combiner));
332
397
  }
333
398
 
334
399
  // Do not erase an already erased state.
335
400
  void Init(HashState* state) {
336
401
  state_ = state->state_;
337
402
  combine_contiguous_ = state->combine_contiguous_;
403
+ run_combine_unordered_ = state->run_combine_unordered_;
404
+ }
405
+
406
+ template <typename T>
407
+ T& Real() {
408
+ return *static_cast<T*>(state_);
338
409
  }
339
410
 
340
411
  void* state_;
341
412
  void (*combine_contiguous_)(void*, const unsigned char*, size_t);
413
+ HashState (*run_combine_unordered_)(
414
+ HashState state,
415
+ absl::FunctionRef<void(HashState, absl::FunctionRef<void(HashState&)>)>);
342
416
  };
343
417
 
344
418
  ABSL_NAMESPACE_END
@@ -23,6 +23,7 @@
23
23
  #include <array>
24
24
  #include <bitset>
25
25
  #include <cmath>
26
+ #include <cstddef>
26
27
  #include <cstring>
27
28
  #include <deque>
28
29
  #include <forward_list>
@@ -36,6 +37,8 @@
36
37
  #include <string>
37
38
  #include <tuple>
38
39
  #include <type_traits>
40
+ #include <unordered_map>
41
+ #include <unordered_set>
39
42
  #include <utility>
40
43
  #include <vector>
41
44
 
@@ -54,6 +57,9 @@
54
57
 
55
58
  namespace absl {
56
59
  ABSL_NAMESPACE_BEGIN
60
+
61
+ class HashState;
62
+
57
63
  namespace hash_internal {
58
64
 
59
65
  // Internal detail: Large buffers are hashed in smaller chunks. This function
@@ -115,24 +121,66 @@ class PiecewiseCombiner {
115
121
  size_t position_;
116
122
  };
117
123
 
124
+ // is_hashable()
125
+ //
126
+ // Trait class which returns true if T is hashable by the absl::Hash framework.
127
+ // Used for the AbslHashValue implementations for composite types below.
128
+ template <typename T>
129
+ struct is_hashable;
130
+
118
131
  // HashStateBase
119
132
  //
120
- // A hash state object represents an intermediate state in the computation
121
- // of an unspecified hash algorithm. `HashStateBase` provides a CRTP style
122
- // base class for hash state implementations. Developers adding type support
123
- // for `absl::Hash` should not rely on any parts of the state object other than
124
- // the following member functions:
133
+ // An internal implementation detail that contains common implementation details
134
+ // for all of the "hash state objects" objects generated by Abseil. This is not
135
+ // a public API; users should not create classes that inherit from this.
136
+ //
137
+ // A hash state object is the template argument `H` passed to `AbslHashValue`.
138
+ // It represents an intermediate state in the computation of an unspecified hash
139
+ // algorithm. `HashStateBase` provides a CRTP style base class for hash state
140
+ // implementations. Developers adding type support for `absl::Hash` should not
141
+ // rely on any parts of the state object other than the following member
142
+ // functions:
125
143
  //
126
144
  // * HashStateBase::combine()
127
145
  // * HashStateBase::combine_contiguous()
146
+ // * HashStateBase::combine_unordered()
128
147
  //
129
- // A derived hash state class of type `H` must provide a static member function
148
+ // A derived hash state class of type `H` must provide a public member function
130
149
  // with a signature similar to the following:
131
150
  //
132
151
  // `static H combine_contiguous(H state, const unsigned char*, size_t)`.
133
152
  //
153
+ // It must also provide a private template method named RunCombineUnordered.
154
+ //
155
+ // A "consumer" is a 1-arg functor returning void. Its argument is a reference
156
+ // to an inner hash state object, and it may be called multiple times. When
157
+ // called, the functor consumes the entropy from the provided state object,
158
+ // and resets that object to its empty state.
159
+ //
160
+ // A "combiner" is a stateless 2-arg functor returning void. Its arguments are
161
+ // an inner hash state object and an ElementStateConsumer functor. A combiner
162
+ // uses the provided inner hash state object to hash each element of the
163
+ // container, passing the inner hash state object to the consumer after hashing
164
+ // each element.
165
+ //
166
+ // Given these definitions, a derived hash state class of type H
167
+ // must provide a private template method with a signature similar to the
168
+ // following:
169
+ //
170
+ // `template <typename CombinerT>`
171
+ // `static H RunCombineUnordered(H outer_state, CombinerT combiner)`
172
+ //
173
+ // This function is responsible for constructing the inner state object and
174
+ // providing a consumer to the combiner. It uses side effects of the consumer
175
+ // and combiner to mix the state of each element in an order-independent manner,
176
+ // and uses this to return an updated value of `outer_state`.
177
+ //
178
+ // This inside-out approach generates efficient object code in the normal case,
179
+ // but allows us to use stack storage to implement the absl::HashState type
180
+ // erasure mechanism (avoiding heap allocations while hashing).
181
+ //
134
182
  // `HashStateBase` will provide a complete implementation for a hash state
135
- // object in terms of this method.
183
+ // object in terms of these two methods.
136
184
  //
137
185
  // Example:
138
186
  //
@@ -141,6 +189,10 @@ class PiecewiseCombiner {
141
189
  // static H combine_contiguous(H state, const unsigned char*, size_t);
142
190
  // using MyHashState::HashStateBase::combine;
143
191
  // using MyHashState::HashStateBase::combine_contiguous;
192
+ // using MyHashState::HashStateBase::combine_unordered;
193
+ // private:
194
+ // template <typename CombinerT>
195
+ // static H RunCombineUnordered(H state, CombinerT combiner);
144
196
  // };
145
197
  template <typename H>
146
198
  class HashStateBase {
@@ -181,7 +233,30 @@ class HashStateBase {
181
233
  template <typename T>
182
234
  static H combine_contiguous(H state, const T* data, size_t size);
183
235
 
236
+ template <typename I>
237
+ static H combine_unordered(H state, I begin, I end);
238
+
184
239
  using AbslInternalPiecewiseCombiner = PiecewiseCombiner;
240
+
241
+ template <typename T>
242
+ using is_hashable = absl::hash_internal::is_hashable<T>;
243
+
244
+ private:
245
+ // Common implementation of the iteration step of a "combiner", as described
246
+ // above.
247
+ template <typename I>
248
+ struct CombineUnorderedCallback {
249
+ I begin;
250
+ I end;
251
+
252
+ template <typename InnerH, typename ElementStateConsumer>
253
+ void operator()(InnerH inner_state, ElementStateConsumer cb) {
254
+ for (; begin != end; ++begin) {
255
+ inner_state = H::combine(std::move(inner_state), *begin);
256
+ cb(inner_state);
257
+ }
258
+ }
259
+ };
185
260
  };
186
261
 
187
262
  // is_uniquely_represented
@@ -346,17 +421,43 @@ H AbslHashValue(H hash_state, std::nullptr_t) {
346
421
  return H::combine(std::move(hash_state), static_cast<void*>(nullptr));
347
422
  }
348
423
 
424
+ // AbslHashValue() for hashing pointers-to-member
425
+ template <typename H, typename T, typename C>
426
+ H AbslHashValue(H hash_state, T C::* ptr) {
427
+ auto salient_ptm_size = [](std::size_t n) -> std::size_t {
428
+ #if defined(_MSC_VER)
429
+ // Pointers-to-member-function on MSVC consist of one pointer plus 0, 1, 2,
430
+ // or 3 ints. In 64-bit mode, they are 8-byte aligned and thus can contain
431
+ // padding (namely when they have 1 or 3 ints). The value below is a lower
432
+ // bound on the number of salient, non-padding bytes that we use for
433
+ // hashing.
434
+ if (alignof(T C::*) == alignof(int)) {
435
+ // No padding when all subobjects have the same size as the total
436
+ // alignment. This happens in 32-bit mode.
437
+ return n;
438
+ } else {
439
+ // Padding for 1 int (size 16) or 3 ints (size 24).
440
+ // With 2 ints, the size is 16 with no padding, which we pessimize.
441
+ return n == 24 ? 20 : n == 16 ? 12 : n;
442
+ }
443
+ #else
444
+ // On other platforms, we assume that pointers-to-members do not have
445
+ // padding.
446
+ #ifdef __cpp_lib_has_unique_object_representations
447
+ static_assert(std::has_unique_object_representations_v<T C::*>);
448
+ #endif // __cpp_lib_has_unique_object_representations
449
+ return n;
450
+ #endif
451
+ };
452
+ return H::combine_contiguous(std::move(hash_state),
453
+ reinterpret_cast<unsigned char*>(&ptr),
454
+ salient_ptm_size(sizeof ptr));
455
+ }
456
+
349
457
  // -----------------------------------------------------------------------------
350
458
  // AbslHashValue for Composite Types
351
459
  // -----------------------------------------------------------------------------
352
460
 
353
- // is_hashable()
354
- //
355
- // Trait class which returns true if T is hashable by the absl::Hash framework.
356
- // Used for the AbslHashValue implementations for composite types below.
357
- template <typename T>
358
- struct is_hashable;
359
-
360
461
  // AbslHashValue() for hashing pairs
361
462
  template <typename H, typename T1, typename T2>
362
463
  typename std::enable_if<is_hashable<T1>::value && is_hashable<T2>::value,
@@ -502,10 +603,11 @@ AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
502
603
  vector.size());
503
604
  }
504
605
 
606
+ // AbslHashValue special cases for hashing std::vector<bool>
607
+
505
608
  #if defined(ABSL_IS_BIG_ENDIAN) && \
506
609
  (defined(__GLIBCXX__) || defined(__GLIBCPP__))
507
- // AbslHashValue for hashing std::vector<bool>
508
- //
610
+
509
611
  // std::hash in libstdc++ does not work correctly with vector<bool> on Big
510
612
  // Endian platforms therefore we need to implement a custom AbslHashValue for
511
613
  // it. More details on the bug:
@@ -521,6 +623,22 @@ AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
521
623
  }
522
624
  return H::combine(combiner.finalize(std::move(hash_state)), vector.size());
523
625
  }
626
+ #else
627
+ // When not working around the libstdc++ bug above, we still have to contend
628
+ // with the fact that std::hash<vector<bool>> is often poor quality, hashing
629
+ // directly on the internal words and on no other state. On these platforms,
630
+ // vector<bool>{1, 1} and vector<bool>{1, 1, 0} hash to the same value.
631
+ //
632
+ // Mixing in the size (as we do in our other vector<> implementations) on top
633
+ // of the library-provided hash implementation avoids this QOI issue.
634
+ template <typename H, typename T, typename Allocator>
635
+ typename std::enable_if<is_hashable<T>::value && std::is_same<T, bool>::value,
636
+ H>::type
637
+ AbslHashValue(H hash_state, const std::vector<T, Allocator>& vector) {
638
+ return H::combine(std::move(hash_state),
639
+ std::hash<std::vector<T, Allocator>>{}(vector),
640
+ vector.size());
641
+ }
524
642
  #endif
525
643
 
526
644
  // -----------------------------------------------------------------------------
@@ -572,6 +690,55 @@ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
572
690
  return H::combine(std::move(hash_state), set.size());
573
691
  }
574
692
 
693
+ // -----------------------------------------------------------------------------
694
+ // AbslHashValue for Unordered Associative Containers
695
+ // -----------------------------------------------------------------------------
696
+
697
+ // AbslHashValue for hashing std::unordered_set
698
+ template <typename H, typename Key, typename Hash, typename KeyEqual,
699
+ typename Alloc>
700
+ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
701
+ H hash_state, const std::unordered_set<Key, Hash, KeyEqual, Alloc>& s) {
702
+ return H::combine(
703
+ H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
704
+ s.size());
705
+ }
706
+
707
+ // AbslHashValue for hashing std::unordered_multiset
708
+ template <typename H, typename Key, typename Hash, typename KeyEqual,
709
+ typename Alloc>
710
+ typename std::enable_if<is_hashable<Key>::value, H>::type AbslHashValue(
711
+ H hash_state,
712
+ const std::unordered_multiset<Key, Hash, KeyEqual, Alloc>& s) {
713
+ return H::combine(
714
+ H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
715
+ s.size());
716
+ }
717
+
718
+ // AbslHashValue for hashing std::unordered_set
719
+ template <typename H, typename Key, typename T, typename Hash,
720
+ typename KeyEqual, typename Alloc>
721
+ typename std::enable_if<is_hashable<Key>::value && is_hashable<T>::value,
722
+ H>::type
723
+ AbslHashValue(H hash_state,
724
+ const std::unordered_map<Key, T, Hash, KeyEqual, Alloc>& s) {
725
+ return H::combine(
726
+ H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
727
+ s.size());
728
+ }
729
+
730
+ // AbslHashValue for hashing std::unordered_multiset
731
+ template <typename H, typename Key, typename T, typename Hash,
732
+ typename KeyEqual, typename Alloc>
733
+ typename std::enable_if<is_hashable<Key>::value && is_hashable<T>::value,
734
+ H>::type
735
+ AbslHashValue(H hash_state,
736
+ const std::unordered_multimap<Key, T, Hash, KeyEqual, Alloc>& s) {
737
+ return H::combine(
738
+ H::combine_unordered(std::move(hash_state), s.begin(), s.end()),
739
+ s.size());
740
+ }
741
+
575
742
  // -----------------------------------------------------------------------------
576
743
  // AbslHashValue for Wrapper Types
577
744
  // -----------------------------------------------------------------------------
@@ -815,6 +982,31 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
815
982
  // move-only ensures that there is only one non-moved-from object.
816
983
  MixingHashState() : state_(Seed()) {}
817
984
 
985
+ friend class MixingHashState::HashStateBase;
986
+
987
+ template <typename CombinerT>
988
+ static MixingHashState RunCombineUnordered(MixingHashState state,
989
+ CombinerT combiner) {
990
+ uint64_t unordered_state = 0;
991
+ combiner(MixingHashState{}, [&](MixingHashState& inner_state) {
992
+ // Add the hash state of the element to the running total, but mix the
993
+ // carry bit back into the low bit. This in intended to avoid losing
994
+ // entropy to overflow, especially when unordered_multisets contain
995
+ // multiple copies of the same value.
996
+ auto element_state = inner_state.state_;
997
+ unordered_state += element_state;
998
+ if (unordered_state < element_state) {
999
+ ++unordered_state;
1000
+ }
1001
+ inner_state = MixingHashState{};
1002
+ });
1003
+ return MixingHashState::combine(std::move(state), unordered_state);
1004
+ }
1005
+
1006
+ // Allow the HashState type-erasure implementation to invoke
1007
+ // RunCombinedUnordered() directly.
1008
+ friend class absl::HashState;
1009
+
818
1010
  // Workaround for MSVC bug.
819
1011
  // We make the type copyable to fix the calling convention, even though we
820
1012
  // never actually copy it. Keep it private to not affect the public API of the
@@ -898,15 +1090,10 @@ class ABSL_DLL MixingHashState : public HashStateBase<MixingHashState> {
898
1090
  }
899
1091
 
900
1092
  ABSL_ATTRIBUTE_ALWAYS_INLINE static uint64_t Mix(uint64_t state, uint64_t v) {
901
- #if defined(__aarch64__)
902
- // On AArch64, calculating a 128-bit product is inefficient, because it
903
- // requires a sequence of two instructions to calculate the upper and lower
904
- // halves of the result.
905
- using MultType = uint64_t;
906
- #else
1093
+ // Though the 128-bit product on AArch64 needs two instructions, it is
1094
+ // still a good balance between speed and hash quality.
907
1095
  using MultType =
908
1096
  absl::conditional_t<sizeof(size_t) == 4, uint64_t, uint128>;
909
- #endif
910
1097
  // We do the addition in 64-bit space to make sure the 128-bit
911
1098
  // multiplication is fast. If we were to do it as MultType the compiler has
912
1099
  // to assume that the high word is non-zero and needs to perform 2
@@ -1049,6 +1236,14 @@ H HashStateBase<H>::combine_contiguous(H state, const T* data, size_t size) {
1049
1236
  return hash_internal::hash_range_or_bytes(std::move(state), data, size);
1050
1237
  }
1051
1238
 
1239
+ // HashStateBase::combine_unordered()
1240
+ template <typename H>
1241
+ template <typename I>
1242
+ H HashStateBase<H>::combine_unordered(H state, I begin, I end) {
1243
+ return H::RunCombineUnordered(std::move(state),
1244
+ CombineUnorderedCallback<I>{begin, end});
1245
+ }
1246
+
1052
1247
  // HashStateBase::PiecewiseCombiner::add_buffer()
1053
1248
  template <typename H>
1054
1249
  H PiecewiseCombiner::add_buffer(H state, const unsigned char* data,
@@ -133,7 +133,8 @@ template <class T>
133
133
  ABSL_INTERNAL_CONSTEXPR_CLZ inline
134
134
  typename std::enable_if<std::is_unsigned<T>::value, T>::type
135
135
  bit_width(T x) noexcept {
136
- return std::numeric_limits<T>::digits - countl_zero(x);
136
+ return std::numeric_limits<T>::digits -
137
+ static_cast<unsigned int>(countl_zero(x));
137
138
  }
138
139
 
139
140
  // Returns: If x == 0, 0; otherwise the maximal value y such that
@@ -42,11 +42,11 @@ namespace {
42
42
  // Returns: 2
43
43
  inline ABSL_ATTRIBUTE_ALWAYS_INLINE int Fls128(uint128 n) {
44
44
  if (uint64_t hi = Uint128High64(n)) {
45
- ABSL_INTERNAL_ASSUME(hi != 0);
45
+ ABSL_ASSUME(hi != 0);
46
46
  return 127 - countl_zero(hi);
47
47
  }
48
48
  const uint64_t low = Uint128Low64(n);
49
- ABSL_INTERNAL_ASSUME(low != 0);
49
+ ABSL_ASSUME(low != 0);
50
50
  return 63 - countl_zero(low);
51
51
  }
52
52
 
@@ -332,6 +332,7 @@ std::ostream& operator<<(std::ostream& os, int128 v) {
332
332
  ABSL_NAMESPACE_END
333
333
  } // namespace absl
334
334
 
335
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
335
336
  namespace std {
336
337
  constexpr bool numeric_limits<absl::uint128>::is_specialized;
337
338
  constexpr bool numeric_limits<absl::uint128>::is_signed;
@@ -381,3 +382,4 @@ constexpr int numeric_limits<absl::int128>::max_exponent10;
381
382
  constexpr bool numeric_limits<absl::int128>::traps;
382
383
  constexpr bool numeric_limits<absl::int128>::tinyness_before;
383
384
  } // namespace std
385
+ #endif
@@ -44,7 +44,7 @@
44
44
  // builtin type. We need to make sure not to define operator wchar_t()
45
45
  // alongside operator unsigned short() in these instances.
46
46
  #define ABSL_INTERNAL_WCHAR_T __wchar_t
47
- #if defined(_M_X64)
47
+ #if defined(_M_X64) && !defined(_M_ARM64EC)
48
48
  #include <intrin.h>
49
49
  #pragma intrinsic(_umul128)
50
50
  #endif // defined(_M_X64)
@@ -980,7 +980,7 @@ inline uint128 operator*(uint128 lhs, uint128 rhs) {
980
980
  // can be used for uint128 storage.
981
981
  return static_cast<unsigned __int128>(lhs) *
982
982
  static_cast<unsigned __int128>(rhs);
983
- #elif defined(_MSC_VER) && defined(_M_X64)
983
+ #elif defined(_MSC_VER) && defined(_M_X64) && !defined(_M_ARM64EC)
984
984
  uint64_t carry;
985
985
  uint64_t low = _umul128(Uint128Low64(lhs), Uint128Low64(rhs), &carry);
986
986
  return MakeUint128(Uint128Low64(lhs) * Uint128High64(rhs) +
@@ -46,6 +46,7 @@ struct Sample {
46
46
  absl::Mutex init_mu;
47
47
  T* next = nullptr;
48
48
  T* dead ABSL_GUARDED_BY(init_mu) = nullptr;
49
+ int64_t weight; // How many sampling events were required to sample this one.
49
50
  };
50
51
 
51
52
  // Holds samples and their associated stack traces with a soft limit of
@@ -59,7 +60,8 @@ class SampleRecorder {
59
60
  ~SampleRecorder();
60
61
 
61
62
  // Registers for sampling. Returns an opaque registration info.
62
- T* Register();
63
+ template <typename... Targs>
64
+ T* Register(Targs&&... args);
63
65
 
64
66
  // Unregisters the sample.
65
67
  void Unregister(T* sample);
@@ -75,12 +77,14 @@ class SampleRecorder {
75
77
  // samples that have been dropped.
76
78
  int64_t Iterate(const std::function<void(const T& stack)>& f);
77
79
 
80
+ int32_t GetMaxSamples() const;
78
81
  void SetMaxSamples(int32_t max);
79
82
 
80
83
  private:
81
84
  void PushNew(T* sample);
82
85
  void PushDead(T* sample);
83
- T* PopDead();
86
+ template <typename... Targs>
87
+ T* PopDead(Targs... args);
84
88
 
85
89
  std::atomic<size_t> dropped_samples_;
86
90
  std::atomic<size_t> size_estimate_;
@@ -162,7 +166,8 @@ void SampleRecorder<T>::PushDead(T* sample) {
162
166
  }
163
167
 
164
168
  template <typename T>
165
- T* SampleRecorder<T>::PopDead() {
169
+ template <typename... Targs>
170
+ T* SampleRecorder<T>::PopDead(Targs... args) {
166
171
  absl::MutexLock graveyard_lock(&graveyard_.init_mu);
167
172
 
168
173
  // The list is circular, so eventually it collapses down to
@@ -174,12 +179,13 @@ T* SampleRecorder<T>::PopDead() {
174
179
  absl::MutexLock sample_lock(&sample->init_mu);
175
180
  graveyard_.dead = sample->dead;
176
181
  sample->dead = nullptr;
177
- sample->PrepareForSampling();
182
+ sample->PrepareForSampling(std::forward<Targs>(args)...);
178
183
  return sample;
179
184
  }
180
185
 
181
186
  template <typename T>
182
- T* SampleRecorder<T>::Register() {
187
+ template <typename... Targs>
188
+ T* SampleRecorder<T>::Register(Targs&&... args) {
183
189
  int64_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed);
184
190
  if (size > max_samples_.load(std::memory_order_relaxed)) {
185
191
  size_estimate_.fetch_sub(1, std::memory_order_relaxed);
@@ -187,10 +193,14 @@ T* SampleRecorder<T>::Register() {
187
193
  return nullptr;
188
194
  }
189
195
 
190
- T* sample = PopDead();
196
+ T* sample = PopDead(args...);
191
197
  if (sample == nullptr) {
192
198
  // Resurrection failed. Hire a new warlock.
193
199
  sample = new T();
200
+ {
201
+ absl::MutexLock sample_lock(&sample->init_mu);
202
+ sample->PrepareForSampling(std::forward<Targs>(args)...);
203
+ }
194
204
  PushNew(sample);
195
205
  }
196
206
 
@@ -223,6 +233,11 @@ void SampleRecorder<T>::SetMaxSamples(int32_t max) {
223
233
  max_samples_.store(max, std::memory_order_release);
224
234
  }
225
235
 
236
+ template <typename T>
237
+ int32_t SampleRecorder<T>::GetMaxSamples() const {
238
+ return max_samples_.load(std::memory_order_acquire);
239
+ }
240
+
226
241
  } // namespace profiling_internal
227
242
  ABSL_NAMESPACE_END
228
243
  } // namespace absl
@@ -138,16 +138,16 @@ bool bernoulli_distribution::Generate(double p,
138
138
  // 64 bits.
139
139
  //
140
140
  // Second, `c` is constructed by first casting explicitly to a signed
141
- // integer and then converting implicitly to an unsigned integer of the same
141
+ // integer and then casting explicitly to an unsigned integer of the same
142
142
  // size. This is done because the hardware conversion instructions produce
143
143
  // signed integers from double; if taken as a uint64_t the conversion would
144
144
  // be wrong for doubles greater than 2^63 (not relevant in this use-case).
145
145
  // If converted directly to an unsigned integer, the compiler would end up
146
146
  // emitting code to handle such large values that are not relevant due to
147
147
  // the known bounds on `c`. To avoid these extra instructions this
148
- // implementation converts first to the signed type and then use the
149
- // implicit conversion to unsigned (which is a no-op).
150
- const uint64_t c = static_cast<int64_t>(p * kP32);
148
+ // implementation converts first to the signed type and then convert to
149
+ // unsigned (which is a no-op).
150
+ const uint64_t c = static_cast<uint64_t>(static_cast<int64_t>(p * kP32));
151
151
  const uint32_t v = fast_u32(g);
152
152
  // FAST PATH: this path fails with probability 1/2^32. Note that simply
153
153
  // returning v <= c would approximate P very well (up to an absolute error