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
@@ -21,33 +21,43 @@
21
21
  #include <limits>
22
22
 
23
23
  #include "absl/base/attributes.h"
24
- #include "absl/container/internal/have_sse.h"
24
+ #include "absl/base/config.h"
25
25
  #include "absl/debugging/stacktrace.h"
26
26
  #include "absl/memory/memory.h"
27
27
  #include "absl/profiling/internal/exponential_biased.h"
28
28
  #include "absl/profiling/internal/sample_recorder.h"
29
29
  #include "absl/synchronization/mutex.h"
30
+ #include "absl/utility/utility.h"
30
31
 
31
32
  namespace absl {
32
33
  ABSL_NAMESPACE_BEGIN
33
34
  namespace container_internal {
35
+
36
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
34
37
  constexpr int HashtablezInfo::kMaxStackDepth;
38
+ #endif
35
39
 
36
40
  namespace {
37
41
  ABSL_CONST_INIT std::atomic<bool> g_hashtablez_enabled{
38
42
  false
39
43
  };
40
44
  ABSL_CONST_INIT std::atomic<int32_t> g_hashtablez_sample_parameter{1 << 10};
45
+ std::atomic<HashtablezConfigListener> g_hashtablez_config_listener{nullptr};
41
46
 
42
47
  #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
43
48
  ABSL_PER_THREAD_TLS_KEYWORD absl::profiling_internal::ExponentialBiased
44
49
  g_exponential_biased_generator;
45
50
  #endif
46
51
 
52
+ void TriggerHashtablezConfigListener() {
53
+ auto* listener = g_hashtablez_config_listener.load(std::memory_order_acquire);
54
+ if (listener != nullptr) listener();
55
+ }
56
+
47
57
  } // namespace
48
58
 
49
59
  #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
50
- ABSL_PER_THREAD_TLS_KEYWORD int64_t global_next_sample = 0;
60
+ ABSL_PER_THREAD_TLS_KEYWORD SamplingState global_next_sample = {0, 0};
51
61
  #endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
52
62
 
53
63
  HashtablezSampler& GlobalHashtablezSampler() {
@@ -55,13 +65,11 @@ HashtablezSampler& GlobalHashtablezSampler() {
55
65
  return *sampler;
56
66
  }
57
67
 
58
- // TODO(bradleybear): The comments at this constructors declaration say that the
59
- // fields are not initialized, but this definition does initialize the fields.
60
- // Something needs to be cleaned up.
61
- HashtablezInfo::HashtablezInfo() { PrepareForSampling(); }
68
+ HashtablezInfo::HashtablezInfo() = default;
62
69
  HashtablezInfo::~HashtablezInfo() = default;
63
70
 
64
- void HashtablezInfo::PrepareForSampling() {
71
+ void HashtablezInfo::PrepareForSampling(int64_t stride,
72
+ size_t inline_element_size_value) {
65
73
  capacity.store(0, std::memory_order_relaxed);
66
74
  size.store(0, std::memory_order_relaxed);
67
75
  num_erases.store(0, std::memory_order_relaxed);
@@ -74,11 +82,13 @@ void HashtablezInfo::PrepareForSampling() {
74
82
  max_reserve.store(0, std::memory_order_relaxed);
75
83
 
76
84
  create_time = absl::Now();
85
+ weight = stride;
77
86
  // The inliner makes hardcoded skip_count difficult (especially when combined
78
87
  // with LTO). We use the ability to exclude stacks by regex when encoding
79
88
  // instead.
80
89
  depth = absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth,
81
90
  /* skip_count= */ 0);
91
+ inline_element_size = inline_element_size_value;
82
92
  }
83
93
 
84
94
  static bool ShouldForceSampling() {
@@ -101,23 +111,32 @@ static bool ShouldForceSampling() {
101
111
  return state == kForce;
102
112
  }
103
113
 
104
- HashtablezInfo* SampleSlow(int64_t* next_sample, size_t inline_element_size) {
114
+ HashtablezInfo* SampleSlow(SamplingState& next_sample,
115
+ size_t inline_element_size) {
105
116
  if (ABSL_PREDICT_FALSE(ShouldForceSampling())) {
106
- *next_sample = 1;
107
- HashtablezInfo* result = GlobalHashtablezSampler().Register();
108
- result->inline_element_size = inline_element_size;
117
+ next_sample.next_sample = 1;
118
+ const int64_t old_stride = exchange(next_sample.sample_stride, 1);
119
+ HashtablezInfo* result =
120
+ GlobalHashtablezSampler().Register(old_stride, inline_element_size);
109
121
  return result;
110
122
  }
111
123
 
112
124
  #if !defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
113
- *next_sample = std::numeric_limits<int64_t>::max();
125
+ next_sample = {
126
+ std::numeric_limits<int64_t>::max(),
127
+ std::numeric_limits<int64_t>::max(),
128
+ };
114
129
  return nullptr;
115
130
  #else
116
- bool first = *next_sample < 0;
117
- *next_sample = g_exponential_biased_generator.GetStride(
131
+ bool first = next_sample.next_sample < 0;
132
+
133
+ const int64_t next_stride = g_exponential_biased_generator.GetStride(
118
134
  g_hashtablez_sample_parameter.load(std::memory_order_relaxed));
135
+
136
+ next_sample.next_sample = next_stride;
137
+ const int64_t old_stride = exchange(next_sample.sample_stride, next_stride);
119
138
  // Small values of interval are equivalent to just sampling next time.
120
- ABSL_ASSERT(*next_sample >= 1);
139
+ ABSL_ASSERT(next_stride >= 1);
121
140
 
122
141
  // g_hashtablez_enabled can be dynamically flipped, we need to set a threshold
123
142
  // low enough that we will start sampling in a reasonable time, so we just use
@@ -127,13 +146,11 @@ HashtablezInfo* SampleSlow(int64_t* next_sample, size_t inline_element_size) {
127
146
  // We will only be negative on our first count, so we should just retry in
128
147
  // that case.
129
148
  if (first) {
130
- if (ABSL_PREDICT_TRUE(--*next_sample > 0)) return nullptr;
149
+ if (ABSL_PREDICT_TRUE(--next_sample.next_sample > 0)) return nullptr;
131
150
  return SampleSlow(next_sample, inline_element_size);
132
151
  }
133
152
 
134
- HashtablezInfo* result = GlobalHashtablezSampler().Register();
135
- result->inline_element_size = inline_element_size;
136
- return result;
153
+ return GlobalHashtablezSampler().Register(old_stride, inline_element_size);
137
154
  #endif
138
155
  }
139
156
 
@@ -146,7 +163,7 @@ void RecordInsertSlow(HashtablezInfo* info, size_t hash,
146
163
  // SwissTables probe in groups of 16, so scale this to count items probes and
147
164
  // not offset from desired.
148
165
  size_t probe_length = distance_from_desired;
149
- #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
166
+ #ifdef ABSL_INTERNAL_HAVE_SSE2
150
167
  probe_length /= 16;
151
168
  #else
152
169
  probe_length /= 8;
@@ -163,11 +180,33 @@ void RecordInsertSlow(HashtablezInfo* info, size_t hash,
163
180
  info->size.fetch_add(1, std::memory_order_relaxed);
164
181
  }
165
182
 
183
+ void SetHashtablezConfigListener(HashtablezConfigListener l) {
184
+ g_hashtablez_config_listener.store(l, std::memory_order_release);
185
+ }
186
+
187
+ bool IsHashtablezEnabled() {
188
+ return g_hashtablez_enabled.load(std::memory_order_acquire);
189
+ }
190
+
166
191
  void SetHashtablezEnabled(bool enabled) {
192
+ SetHashtablezEnabledInternal(enabled);
193
+ TriggerHashtablezConfigListener();
194
+ }
195
+
196
+ void SetHashtablezEnabledInternal(bool enabled) {
167
197
  g_hashtablez_enabled.store(enabled, std::memory_order_release);
168
198
  }
169
199
 
200
+ int32_t GetHashtablezSampleParameter() {
201
+ return g_hashtablez_sample_parameter.load(std::memory_order_acquire);
202
+ }
203
+
170
204
  void SetHashtablezSampleParameter(int32_t rate) {
205
+ SetHashtablezSampleParameterInternal(rate);
206
+ TriggerHashtablezConfigListener();
207
+ }
208
+
209
+ void SetHashtablezSampleParameterInternal(int32_t rate) {
171
210
  if (rate > 0) {
172
211
  g_hashtablez_sample_parameter.store(rate, std::memory_order_release);
173
212
  } else {
@@ -176,7 +215,16 @@ void SetHashtablezSampleParameter(int32_t rate) {
176
215
  }
177
216
  }
178
217
 
218
+ int32_t GetHashtablezMaxSamples() {
219
+ return GlobalHashtablezSampler().GetMaxSamples();
220
+ }
221
+
179
222
  void SetHashtablezMaxSamples(int32_t max) {
223
+ SetHashtablezMaxSamplesInternal(max);
224
+ TriggerHashtablezConfigListener();
225
+ }
226
+
227
+ void SetHashtablezMaxSamplesInternal(int32_t max) {
180
228
  if (max > 0) {
181
229
  GlobalHashtablezSampler().SetMaxSamples(max);
182
230
  } else {
@@ -44,9 +44,9 @@
44
44
  #include <memory>
45
45
  #include <vector>
46
46
 
47
+ #include "absl/base/config.h"
47
48
  #include "absl/base/internal/per_thread_tls.h"
48
49
  #include "absl/base/optimization.h"
49
- #include "absl/container/internal/have_sse.h"
50
50
  #include "absl/profiling/internal/sample_recorder.h"
51
51
  #include "absl/synchronization/mutex.h"
52
52
  #include "absl/utility/utility.h"
@@ -67,7 +67,8 @@ struct HashtablezInfo : public profiling_internal::Sample<HashtablezInfo> {
67
67
 
68
68
  // Puts the object into a clean state, fills in the logically `const` members,
69
69
  // blocking for any readers that are currently sampling the object.
70
- void PrepareForSampling() ABSL_EXCLUSIVE_LOCKS_REQUIRED(init_mu);
70
+ void PrepareForSampling(int64_t stride, size_t inline_element_size_value)
71
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(init_mu);
71
72
 
72
73
  // These fields are mutated by the various Record* APIs and need to be
73
74
  // thread-safe.
@@ -84,18 +85,18 @@ struct HashtablezInfo : public profiling_internal::Sample<HashtablezInfo> {
84
85
 
85
86
  // All of the fields below are set by `PrepareForSampling`, they must not be
86
87
  // mutated in `Record*` functions. They are logically `const` in that sense.
87
- // These are guarded by init_mu, but that is not externalized to clients, who
88
- // can only read them during `HashtablezSampler::Iterate` which will hold the
89
- // lock.
88
+ // These are guarded by init_mu, but that is not externalized to clients,
89
+ // which can read them only during `SampleRecorder::Iterate` which will hold
90
+ // the lock.
90
91
  static constexpr int kMaxStackDepth = 64;
91
92
  absl::Time create_time;
92
93
  int32_t depth;
93
94
  void* stack[kMaxStackDepth];
94
- size_t inline_element_size;
95
+ size_t inline_element_size; // How big is the slot?
95
96
  };
96
97
 
97
98
  inline void RecordRehashSlow(HashtablezInfo* info, size_t total_probe_length) {
98
- #if ABSL_INTERNAL_RAW_HASH_SET_HAVE_SSE2
99
+ #ifdef ABSL_INTERNAL_HAVE_SSE2
99
100
  total_probe_length /= 16;
100
101
  #else
101
102
  total_probe_length /= 8;
@@ -144,7 +145,15 @@ inline void RecordEraseSlow(HashtablezInfo* info) {
144
145
  std::memory_order_relaxed);
145
146
  }
146
147
 
147
- HashtablezInfo* SampleSlow(int64_t* next_sample, size_t inline_element_size);
148
+ struct SamplingState {
149
+ int64_t next_sample;
150
+ // When we make a sampling decision, we record that distance so we can weight
151
+ // each sample.
152
+ int64_t sample_stride;
153
+ };
154
+
155
+ HashtablezInfo* SampleSlow(SamplingState& next_sample,
156
+ size_t inline_element_size);
148
157
  void UnsampleSlow(HashtablezInfo* info);
149
158
 
150
159
  #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
@@ -234,7 +243,7 @@ class HashtablezInfoHandle {
234
243
  #endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
235
244
 
236
245
  #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
237
- extern ABSL_PER_THREAD_TLS_KEYWORD int64_t global_next_sample;
246
+ extern ABSL_PER_THREAD_TLS_KEYWORD SamplingState global_next_sample;
238
247
  #endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
239
248
 
240
249
  // Returns an RAII sampling handle that manages registration and unregistation
@@ -242,11 +251,11 @@ extern ABSL_PER_THREAD_TLS_KEYWORD int64_t global_next_sample;
242
251
  inline HashtablezInfoHandle Sample(
243
252
  size_t inline_element_size ABSL_ATTRIBUTE_UNUSED) {
244
253
  #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
245
- if (ABSL_PREDICT_TRUE(--global_next_sample > 0)) {
254
+ if (ABSL_PREDICT_TRUE(--global_next_sample.next_sample > 0)) {
246
255
  return HashtablezInfoHandle(nullptr);
247
256
  }
248
257
  return HashtablezInfoHandle(
249
- SampleSlow(&global_next_sample, inline_element_size));
258
+ SampleSlow(global_next_sample, inline_element_size));
250
259
  #else
251
260
  return HashtablezInfoHandle(nullptr);
252
261
  #endif // !ABSL_PER_THREAD_TLS
@@ -258,14 +267,23 @@ using HashtablezSampler =
258
267
  // Returns a global Sampler.
259
268
  HashtablezSampler& GlobalHashtablezSampler();
260
269
 
270
+ using HashtablezConfigListener = void (*)();
271
+ void SetHashtablezConfigListener(HashtablezConfigListener l);
272
+
261
273
  // Enables or disables sampling for Swiss tables.
274
+ bool IsHashtablezEnabled();
262
275
  void SetHashtablezEnabled(bool enabled);
276
+ void SetHashtablezEnabledInternal(bool enabled);
263
277
 
264
278
  // Sets the rate at which Swiss tables will be sampled.
279
+ int32_t GetHashtablezSampleParameter();
265
280
  void SetHashtablezSampleParameter(int32_t rate);
281
+ void SetHashtablezSampleParameterInternal(int32_t rate);
266
282
 
267
283
  // Sets a soft max for the number of samples that will be kept.
284
+ int32_t GetHashtablezMaxSamples();
268
285
  void SetHashtablezMaxSamples(int32_t max);
286
+ void SetHashtablezMaxSamplesInternal(int32_t max);
269
287
 
270
288
  // Configuration override.
271
289
  // This allows process-wide sampling without depending on order of
@@ -40,7 +40,6 @@ namespace inlined_vector_internal {
40
40
  #if !defined(__clang__) && defined(__GNUC__)
41
41
  #pragma GCC diagnostic push
42
42
  #pragma GCC diagnostic ignored "-Warray-bounds"
43
- #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
44
43
  #endif
45
44
 
46
45
  template <typename A>
@@ -94,16 +93,30 @@ struct TypeIdentity {
94
93
  template <typename T>
95
94
  using NoTypeDeduction = typename TypeIdentity<T>::type;
96
95
 
96
+ template <typename A, bool IsTriviallyDestructible =
97
+ absl::is_trivially_destructible<ValueType<A>>::value>
98
+ struct DestroyAdapter;
99
+
97
100
  template <typename A>
98
- void DestroyElements(NoTypeDeduction<A>& allocator, Pointer<A> destroy_first,
99
- SizeType<A> destroy_size) {
100
- if (destroy_first != nullptr) {
101
+ struct DestroyAdapter<A, /* IsTriviallyDestructible */ false> {
102
+ static void DestroyElements(A& allocator, Pointer<A> destroy_first,
103
+ SizeType<A> destroy_size) {
101
104
  for (SizeType<A> i = destroy_size; i != 0;) {
102
105
  --i;
103
106
  AllocatorTraits<A>::destroy(allocator, destroy_first + i);
104
107
  }
105
108
  }
106
- }
109
+ };
110
+
111
+ template <typename A>
112
+ struct DestroyAdapter<A, /* IsTriviallyDestructible */ true> {
113
+ static void DestroyElements(A& allocator, Pointer<A> destroy_first,
114
+ SizeType<A> destroy_size) {
115
+ static_cast<void>(allocator);
116
+ static_cast<void>(destroy_first);
117
+ static_cast<void>(destroy_size);
118
+ }
119
+ };
107
120
 
108
121
  template <typename A>
109
122
  struct Allocation {
@@ -133,7 +146,7 @@ void ConstructElements(NoTypeDeduction<A>& allocator,
133
146
  for (SizeType<A> i = 0; i < construct_size; ++i) {
134
147
  ABSL_INTERNAL_TRY { values.ConstructNext(allocator, construct_first + i); }
135
148
  ABSL_INTERNAL_CATCH_ANY {
136
- DestroyElements<A>(allocator, construct_first, i);
149
+ DestroyAdapter<A>::DestroyElements(allocator, construct_first, i);
137
150
  ABSL_INTERNAL_RETHROW;
138
151
  }
139
152
  }
@@ -253,7 +266,7 @@ class ConstructionTransaction {
253
266
 
254
267
  ~ConstructionTransaction() {
255
268
  if (DidConstruct()) {
256
- DestroyElements<A>(GetAllocator(), GetData(), GetSize());
269
+ DestroyAdapter<A>::DestroyElements(GetAllocator(), GetData(), GetSize());
257
270
  }
258
271
  }
259
272
 
@@ -297,10 +310,10 @@ class Storage {
297
310
  // Storage Constructors and Destructor
298
311
  // ---------------------------------------------------------------------------
299
312
 
300
- Storage() : metadata_(A(), /* size and is_allocated */ 0) {}
313
+ Storage() : metadata_(A(), /* size and is_allocated */ 0u) {}
301
314
 
302
315
  explicit Storage(const A& allocator)
303
- : metadata_(allocator, /* size and is_allocated */ 0) {}
316
+ : metadata_(allocator, /* size and is_allocated */ 0u) {}
304
317
 
305
318
  ~Storage() {
306
319
  if (GetSizeAndIsAllocated() == 0) {
@@ -416,7 +429,7 @@ class Storage {
416
429
  }
417
430
 
418
431
  void SubtractSize(SizeType<A> count) {
419
- assert(count <= GetSize());
432
+ ABSL_HARDENING_ASSERT(count <= GetSize());
420
433
 
421
434
  GetSizeAndIsAllocated() -= count << static_cast<SizeType<A>>(1);
422
435
  }
@@ -427,7 +440,8 @@ class Storage {
427
440
  }
428
441
 
429
442
  void MemcpyFrom(const Storage& other_storage) {
430
- assert(IsMemcpyOk<A>::value || other_storage.GetIsAllocated());
443
+ ABSL_HARDENING_ASSERT(IsMemcpyOk<A>::value ||
444
+ other_storage.GetIsAllocated());
431
445
 
432
446
  GetSizeAndIsAllocated() = other_storage.GetSizeAndIsAllocated();
433
447
  data_ = other_storage.data_;
@@ -469,14 +483,14 @@ class Storage {
469
483
  template <typename T, size_t N, typename A>
470
484
  void Storage<T, N, A>::DestroyContents() {
471
485
  Pointer<A> data = GetIsAllocated() ? GetAllocatedData() : GetInlinedData();
472
- DestroyElements<A>(GetAllocator(), data, GetSize());
486
+ DestroyAdapter<A>::DestroyElements(GetAllocator(), data, GetSize());
473
487
  DeallocateIfAllocated();
474
488
  }
475
489
 
476
490
  template <typename T, size_t N, typename A>
477
491
  void Storage<T, N, A>::InitFrom(const Storage& other) {
478
492
  const SizeType<A> n = other.GetSize();
479
- assert(n > 0); // Empty sources handled handled in caller.
493
+ ABSL_HARDENING_ASSERT(n > 0); // Empty sources handled handled in caller.
480
494
  ConstPointer<A> src;
481
495
  Pointer<A> dst;
482
496
  if (!other.GetIsAllocated()) {
@@ -508,8 +522,8 @@ template <typename ValueAdapter>
508
522
  auto Storage<T, N, A>::Initialize(ValueAdapter values, SizeType<A> new_size)
509
523
  -> void {
510
524
  // Only callable from constructors!
511
- assert(!GetIsAllocated());
512
- assert(GetSize() == 0);
525
+ ABSL_HARDENING_ASSERT(!GetIsAllocated());
526
+ ABSL_HARDENING_ASSERT(GetSize() == 0);
513
527
 
514
528
  Pointer<A> construct_data;
515
529
  if (new_size > GetInlinedCapacity()) {
@@ -566,7 +580,8 @@ auto Storage<T, N, A>::Assign(ValueAdapter values, SizeType<A> new_size)
566
580
  ConstructElements<A>(GetAllocator(), construct_loop.data(), values,
567
581
  construct_loop.size());
568
582
 
569
- DestroyElements<A>(GetAllocator(), destroy_loop.data(), destroy_loop.size());
583
+ DestroyAdapter<A>::DestroyElements(GetAllocator(), destroy_loop.data(),
584
+ destroy_loop.size());
570
585
 
571
586
  if (allocation_tx.DidAllocate()) {
572
587
  DeallocateIfAllocated();
@@ -587,7 +602,7 @@ auto Storage<T, N, A>::Resize(ValueAdapter values, SizeType<A> new_size)
587
602
  A& alloc = GetAllocator();
588
603
  if (new_size <= size) {
589
604
  // Destroy extra old elements.
590
- DestroyElements<A>(alloc, base + new_size, size - new_size);
605
+ DestroyAdapter<A>::DestroyElements(alloc, base + new_size, size - new_size);
591
606
  } else if (new_size <= storage_view.capacity) {
592
607
  // Construct new elements in place.
593
608
  ConstructElements<A>(alloc, base + size, values, new_size - size);
@@ -595,7 +610,7 @@ auto Storage<T, N, A>::Resize(ValueAdapter values, SizeType<A> new_size)
595
610
  // Steps:
596
611
  // a. Allocate new backing store.
597
612
  // b. Construct new elements in new backing store.
598
- // c. Move existing elements from old backing store to now.
613
+ // c. Move existing elements from old backing store to new backing store.
599
614
  // d. Destroy all elements in old backing store.
600
615
  // Use transactional wrappers for the first two steps so we can roll
601
616
  // back if necessary due to exceptions.
@@ -611,7 +626,7 @@ auto Storage<T, N, A>::Resize(ValueAdapter values, SizeType<A> new_size)
611
626
  (MoveIterator<A>(base)));
612
627
  ConstructElements<A>(alloc, new_data, move_values, size);
613
628
 
614
- DestroyElements<A>(alloc, base, size);
629
+ DestroyAdapter<A>::DestroyElements(alloc, base, size);
615
630
  std::move(construction_tx).Commit();
616
631
  DeallocateIfAllocated();
617
632
  SetAllocation(std::move(allocation_tx).Release());
@@ -650,7 +665,8 @@ auto Storage<T, N, A>::Insert(ConstIterator<A> pos, ValueAdapter values,
650
665
  ConstructElements<A>(GetAllocator(), new_data + insert_end_index,
651
666
  move_values, storage_view.size - insert_index);
652
667
 
653
- DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
668
+ DestroyAdapter<A>::DestroyElements(GetAllocator(), storage_view.data,
669
+ storage_view.size);
654
670
 
655
671
  std::move(construction_tx).Commit();
656
672
  std::move(move_construction_tx).Commit();
@@ -753,7 +769,8 @@ auto Storage<T, N, A>::EmplaceBackSlow(Args&&... args) -> Reference<A> {
753
769
  ABSL_INTERNAL_RETHROW;
754
770
  }
755
771
  // Destroy elements in old backing store.
756
- DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
772
+ DestroyAdapter<A>::DestroyElements(GetAllocator(), storage_view.data,
773
+ storage_view.size);
757
774
 
758
775
  DeallocateIfAllocated();
759
776
  SetAllocation(std::move(allocation_tx).Release());
@@ -778,9 +795,9 @@ auto Storage<T, N, A>::Erase(ConstIterator<A> from, ConstIterator<A> to)
778
795
  AssignElements<A>(storage_view.data + erase_index, move_values,
779
796
  storage_view.size - erase_end_index);
780
797
 
781
- DestroyElements<A>(GetAllocator(),
782
- storage_view.data + (storage_view.size - erase_size),
783
- erase_size);
798
+ DestroyAdapter<A>::DestroyElements(
799
+ GetAllocator(), storage_view.data + (storage_view.size - erase_size),
800
+ erase_size);
784
801
 
785
802
  SubtractSize(erase_size);
786
803
  return Iterator<A>(storage_view.data + erase_index);
@@ -804,7 +821,8 @@ auto Storage<T, N, A>::Reserve(SizeType<A> requested_capacity) -> void {
804
821
  ConstructElements<A>(GetAllocator(), new_data, move_values,
805
822
  storage_view.size);
806
823
 
807
- DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
824
+ DestroyAdapter<A>::DestroyElements(GetAllocator(), storage_view.data,
825
+ storage_view.size);
808
826
 
809
827
  DeallocateIfAllocated();
810
828
  SetAllocation(std::move(allocation_tx).Release());
@@ -814,7 +832,7 @@ auto Storage<T, N, A>::Reserve(SizeType<A> requested_capacity) -> void {
814
832
  template <typename T, size_t N, typename A>
815
833
  auto Storage<T, N, A>::ShrinkToFit() -> void {
816
834
  // May only be called on allocated instances!
817
- assert(GetIsAllocated());
835
+ ABSL_HARDENING_ASSERT(GetIsAllocated());
818
836
 
819
837
  StorageView<A> storage_view{GetAllocatedData(), GetSize(),
820
838
  GetAllocatedCapacity()};
@@ -847,7 +865,8 @@ auto Storage<T, N, A>::ShrinkToFit() -> void {
847
865
  ABSL_INTERNAL_RETHROW;
848
866
  }
849
867
 
850
- DestroyElements<A>(GetAllocator(), storage_view.data, storage_view.size);
868
+ DestroyAdapter<A>::DestroyElements(GetAllocator(), storage_view.data,
869
+ storage_view.size);
851
870
 
852
871
  MallocAdapter<A>::Deallocate(GetAllocator(), storage_view.data,
853
872
  storage_view.capacity);
@@ -862,7 +881,7 @@ auto Storage<T, N, A>::ShrinkToFit() -> void {
862
881
  template <typename T, size_t N, typename A>
863
882
  auto Storage<T, N, A>::Swap(Storage* other_storage_ptr) -> void {
864
883
  using std::swap;
865
- assert(this != other_storage_ptr);
884
+ ABSL_HARDENING_ASSERT(this != other_storage_ptr);
866
885
 
867
886
  if (GetIsAllocated() && other_storage_ptr->GetIsAllocated()) {
868
887
  swap(data_.allocated, other_storage_ptr->data_.allocated);
@@ -883,9 +902,10 @@ auto Storage<T, N, A>::Swap(Storage* other_storage_ptr) -> void {
883
902
  move_values,
884
903
  large_ptr->GetSize() - small_ptr->GetSize());
885
904
 
886
- DestroyElements<A>(large_ptr->GetAllocator(),
887
- large_ptr->GetInlinedData() + small_ptr->GetSize(),
888
- large_ptr->GetSize() - small_ptr->GetSize());
905
+ DestroyAdapter<A>::DestroyElements(
906
+ large_ptr->GetAllocator(),
907
+ large_ptr->GetInlinedData() + small_ptr->GetSize(),
908
+ large_ptr->GetSize() - small_ptr->GetSize());
889
909
  } else {
890
910
  Storage* allocated_ptr = this;
891
911
  Storage* inlined_ptr = other_storage_ptr;
@@ -904,23 +924,24 @@ auto Storage<T, N, A>::Swap(Storage* other_storage_ptr) -> void {
904
924
  inlined_ptr->GetSize());
905
925
  }
906
926
  ABSL_INTERNAL_CATCH_ANY {
907
- allocated_ptr->SetAllocation(
908
- {allocated_storage_view.data, allocated_storage_view.capacity});
927
+ allocated_ptr->SetAllocation(Allocation<A>{
928
+ allocated_storage_view.data, allocated_storage_view.capacity});
909
929
  ABSL_INTERNAL_RETHROW;
910
930
  }
911
931
 
912
- DestroyElements<A>(inlined_ptr->GetAllocator(),
913
- inlined_ptr->GetInlinedData(), inlined_ptr->GetSize());
932
+ DestroyAdapter<A>::DestroyElements(inlined_ptr->GetAllocator(),
933
+ inlined_ptr->GetInlinedData(),
934
+ inlined_ptr->GetSize());
914
935
 
915
- inlined_ptr->SetAllocation(
916
- {allocated_storage_view.data, allocated_storage_view.capacity});
936
+ inlined_ptr->SetAllocation(Allocation<A>{allocated_storage_view.data,
937
+ allocated_storage_view.capacity});
917
938
  }
918
939
 
919
940
  swap(GetSizeAndIsAllocated(), other_storage_ptr->GetSizeAndIsAllocated());
920
941
  swap(GetAllocator(), other_storage_ptr->GetAllocator());
921
942
  }
922
943
 
923
- // End ignore "array-bounds" and "maybe-uninitialized"
944
+ // End ignore "array-bounds"
924
945
  #if !defined(__clang__) && defined(__GNUC__)
925
946
  #pragma GCC diagnostic pop
926
947
  #endif
@@ -23,13 +23,17 @@ namespace absl {
23
23
  ABSL_NAMESPACE_BEGIN
24
24
  namespace container_internal {
25
25
 
26
+ // A single block of empty control bytes for tables without any slots allocated.
27
+ // This enables removing a branch in the hot path of find().
26
28
  alignas(16) ABSL_CONST_INIT ABSL_DLL const ctrl_t kEmptyGroup[16] = {
27
29
  ctrl_t::kSentinel, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
28
30
  ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
29
31
  ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty,
30
32
  ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty, ctrl_t::kEmpty};
31
33
 
34
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
32
35
  constexpr size_t Group::kWidth;
36
+ #endif
33
37
 
34
38
  // Returns "random" seed.
35
39
  inline size_t RandomSeed() {