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
@@ -40,88 +40,21 @@ CordRep* ClipSubstring(CordRepSubstring* substring) {
40
40
  return child;
41
41
  }
42
42
 
43
- // Unrefs the provided `concat`, and returns `{concat->left, concat->right}`
44
- // Adds or assumes a reference on `concat->left` and `concat->right`.
45
- // Returns an array of 2 elements containing the left and right nodes.
46
- std::array<CordRep*, 2> ClipConcat(CordRepConcat* concat) {
47
- std::array<CordRep*, 2> result{concat->left, concat->right};
48
- if (concat->refcount.IsOne()) {
49
- delete concat;
50
- } else {
51
- CordRep::Ref(result[0]);
52
- CordRep::Ref(result[1]);
53
- CordRep::Unref(concat);
54
- }
55
- return result;
56
- }
43
+ } // namespace
57
44
 
58
- void Consume(bool forward, CordRep* rep, ConsumeFn consume_fn) {
45
+ void Consume(CordRep* rep, ConsumeFn consume_fn) {
59
46
  size_t offset = 0;
60
47
  size_t length = rep->length;
61
- struct Entry {
62
- CordRep* rep;
63
- size_t offset;
64
- size_t length;
65
- };
66
- absl::InlinedVector<Entry, 40> stack;
67
-
68
- for (;;) {
69
- if (rep->tag == CONCAT) {
70
- std::array<CordRep*, 2> res = ClipConcat(rep->concat());
71
- CordRep* left = res[0];
72
- CordRep* right = res[1];
73
-
74
- if (left->length <= offset) {
75
- // Don't need left node
76
- offset -= left->length;
77
- CordRep::Unref(left);
78
- rep = right;
79
- continue;
80
- }
81
48
 
82
- size_t length_left = left->length - offset;
83
- if (length_left >= length) {
84
- // Don't need right node
85
- CordRep::Unref(right);
86
- rep = left;
87
- continue;
88
- }
89
-
90
- // Need both nodes
91
- size_t length_right = length - length_left;
92
- if (forward) {
93
- stack.push_back({right, 0, length_right});
94
- rep = left;
95
- length = length_left;
96
- } else {
97
- stack.push_back({left, offset, length_left});
98
- rep = right;
99
- offset = 0;
100
- length = length_right;
101
- }
102
- } else if (rep->tag == SUBSTRING) {
103
- offset += rep->substring()->start;
104
- rep = ClipSubstring(rep->substring());
105
- } else {
106
- consume_fn(rep, offset, length);
107
- if (stack.empty()) return;
108
-
109
- rep = stack.back().rep;
110
- offset = stack.back().offset;
111
- length = stack.back().length;
112
- stack.pop_back();
113
- }
49
+ if (rep->tag == SUBSTRING) {
50
+ offset += rep->substring()->start;
51
+ rep = ClipSubstring(rep->substring());
114
52
  }
115
- }
116
-
117
- } // namespace
118
-
119
- void Consume(CordRep* rep, ConsumeFn consume_fn) {
120
- return Consume(true, rep, std::move(consume_fn));
53
+ consume_fn(rep, offset, length);
121
54
  }
122
55
 
123
56
  void ReverseConsume(CordRep* rep, ConsumeFn consume_fn) {
124
- return Consume(false, rep, std::move(consume_fn));
57
+ return Consume(rep, std::move(consume_fn));
125
58
  }
126
59
 
127
60
  } // namespace cord_internal
@@ -0,0 +1,54 @@
1
+ // Copyright 2021 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/strings/internal/cord_rep_crc.h"
16
+
17
+ #include <cassert>
18
+ #include <cstdint>
19
+
20
+ #include "absl/base/config.h"
21
+ #include "absl/strings/internal/cord_internal.h"
22
+
23
+ namespace absl {
24
+ ABSL_NAMESPACE_BEGIN
25
+ namespace cord_internal {
26
+
27
+ CordRepCrc* CordRepCrc::New(CordRep* child, uint32_t crc) {
28
+ assert(child != nullptr);
29
+ if (child->IsCrc()) {
30
+ if (child->refcount.IsOne()) {
31
+ child->crc()->crc = crc;
32
+ return child->crc();
33
+ }
34
+ CordRep* old = child;
35
+ child = old->crc()->child;
36
+ CordRep::Ref(child);
37
+ CordRep::Unref(old);
38
+ }
39
+ auto* new_cordrep = new CordRepCrc;
40
+ new_cordrep->length = child->length;
41
+ new_cordrep->tag = cord_internal::CRC;
42
+ new_cordrep->child = child;
43
+ new_cordrep->crc = crc;
44
+ return new_cordrep;
45
+ }
46
+
47
+ void CordRepCrc::Destroy(CordRepCrc* node) {
48
+ CordRep::Unref(node->child);
49
+ delete node;
50
+ }
51
+
52
+ } // namespace cord_internal
53
+ ABSL_NAMESPACE_END
54
+ } // namespace absl
@@ -0,0 +1,102 @@
1
+ // Copyright 2021 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_STRINGS_INTERNAL_CORD_REP_CRC_H_
16
+ #define ABSL_STRINGS_INTERNAL_CORD_REP_CRC_H_
17
+
18
+ #include <cassert>
19
+ #include <cstdint>
20
+
21
+ #include "absl/base/config.h"
22
+ #include "absl/base/optimization.h"
23
+ #include "absl/strings/internal/cord_internal.h"
24
+
25
+ namespace absl {
26
+ ABSL_NAMESPACE_BEGIN
27
+ namespace cord_internal {
28
+
29
+ // CordRepCrc is a CordRep node intended only to appear at the top level of a
30
+ // cord tree. It associates an "expected CRC" with the contained data, to allow
31
+ // for easy passage of checksum data in Cord data flows.
32
+ //
33
+ // From Cord's perspective, the crc value has no semantics; any validation of
34
+ // the contained checksum is the user's responsibility.
35
+ struct CordRepCrc : public CordRep {
36
+ CordRep* child;
37
+ uint32_t crc;
38
+
39
+ // Consumes `child` and returns a CordRepCrc prefixed tree containing `child`.
40
+ // If the specified `child` is itself a CordRepCrc node, then this method
41
+ // either replaces the existing node, or directly updates the crc value in it
42
+ // depending on the node being shared or not, i.e.: refcount.IsOne().
43
+ // `child` must not be null. Never returns null.
44
+ static CordRepCrc* New(CordRep* child, uint32_t crc);
45
+
46
+ // Destroys (deletes) the provided node. `node` must not be null.
47
+ static void Destroy(CordRepCrc* node);
48
+ };
49
+
50
+ // Consumes `rep` and returns a CordRep* with any outer CordRepCrc wrapper
51
+ // removed. This is usually a no-op (returning `rep`), but this will remove and
52
+ // unref an outer CordRepCrc node.
53
+ inline CordRep* RemoveCrcNode(CordRep* rep) {
54
+ assert(rep != nullptr);
55
+ if (ABSL_PREDICT_FALSE(rep->IsCrc())) {
56
+ CordRep* child = rep->crc()->child;
57
+ if (rep->refcount.IsOne()) {
58
+ delete rep->crc();
59
+ } else {
60
+ CordRep::Ref(child);
61
+ CordRep::Unref(rep);
62
+ }
63
+ return child;
64
+ }
65
+ return rep;
66
+ }
67
+
68
+ // Returns `rep` if it is not a CordRepCrc node, or its child if it is.
69
+ // Does not consume or create a reference on `rep` or the returned value.
70
+ inline CordRep* SkipCrcNode(CordRep* rep) {
71
+ assert(rep != nullptr);
72
+ if (ABSL_PREDICT_FALSE(rep->IsCrc())) {
73
+ return rep->crc()->child;
74
+ } else {
75
+ return rep;
76
+ }
77
+ }
78
+
79
+ inline const CordRep* SkipCrcNode(const CordRep* rep) {
80
+ assert(rep != nullptr);
81
+ if (ABSL_PREDICT_FALSE(rep->IsCrc())) {
82
+ return rep->crc()->child;
83
+ } else {
84
+ return rep;
85
+ }
86
+ }
87
+
88
+ inline CordRepCrc* CordRep::crc() {
89
+ assert(IsCrc());
90
+ return static_cast<CordRepCrc*>(this);
91
+ }
92
+
93
+ inline const CordRepCrc* CordRep::crc() const {
94
+ assert(IsCrc());
95
+ return static_cast<const CordRepCrc*>(this);
96
+ }
97
+
98
+ } // namespace cord_internal
99
+ ABSL_NAMESPACE_END
100
+ } // namespace absl
101
+
102
+ #endif // ABSL_STRINGS_INTERNAL_CORD_REP_CRC_H_
@@ -20,6 +20,8 @@
20
20
  #include <cstdint>
21
21
  #include <memory>
22
22
 
23
+ #include "absl/base/config.h"
24
+ #include "absl/base/macros.h"
23
25
  #include "absl/strings/internal/cord_internal.h"
24
26
 
25
27
  namespace absl {
@@ -42,23 +44,45 @@ static constexpr size_t kMinFlatSize = 32;
42
44
  static constexpr size_t kMaxFlatSize = 4096;
43
45
  static constexpr size_t kMaxFlatLength = kMaxFlatSize - kFlatOverhead;
44
46
  static constexpr size_t kMinFlatLength = kMinFlatSize - kFlatOverhead;
47
+ static constexpr size_t kMaxLargeFlatSize = 256 * 1024;
48
+ static constexpr size_t kMaxLargeFlatLength = kMaxLargeFlatSize - kFlatOverhead;
45
49
 
50
+ // kTagBase should make the Size <--> Tag computation resilient
51
+ // against changes to the value of FLAT when we add a new tag..
52
+ static constexpr uint8_t kTagBase = FLAT - 4;
53
+
54
+ // Converts the provided rounded size to the corresponding tag
46
55
  constexpr uint8_t AllocatedSizeToTagUnchecked(size_t size) {
47
- return static_cast<uint8_t>((size <= 1024) ? size / 8 + 1
48
- : 129 + size / 32 - 1024 / 32);
56
+ return static_cast<uint8_t>(size <= 512 ? kTagBase + size / 8
57
+ : size <= 8192
58
+ ? kTagBase + 512 / 8 + size / 64 - 512 / 64
59
+ : kTagBase + 512 / 8 + ((8192 - 512) / 64) +
60
+ size / 4096 - 8192 / 4096);
61
+ }
62
+
63
+ // Converts the provided tag to the corresponding allocated size
64
+ constexpr size_t TagToAllocatedSize(uint8_t tag) {
65
+ return (tag <= kTagBase + 512 / 8) ? tag * 8 - kTagBase * 8
66
+ : (tag <= kTagBase + (512 / 8) + ((8192 - 512) / 64))
67
+ ? 512 + tag * 64 - kTagBase * 64 - 512 / 8 * 64
68
+ : 8192 + tag * 4096 - kTagBase * 4096 -
69
+ ((512 / 8) + ((8192 - 512) / 64)) * 4096;
49
70
  }
50
71
 
51
- static_assert(kMinFlatSize / 8 + 1 >= FLAT, "");
52
- static_assert(AllocatedSizeToTagUnchecked(kMaxFlatSize) <= MAX_FLAT_TAG, "");
72
+ static_assert(AllocatedSizeToTagUnchecked(kMinFlatSize) == FLAT, "");
73
+ static_assert(AllocatedSizeToTagUnchecked(kMaxLargeFlatSize) == MAX_FLAT_TAG,
74
+ "");
53
75
 
54
- // Helper functions for rounded div, and rounding to exact sizes.
55
- constexpr size_t DivUp(size_t n, size_t m) { return (n + m - 1) / m; }
56
- constexpr size_t RoundUp(size_t n, size_t m) { return DivUp(n, m) * m; }
76
+ // RoundUp logically performs `((n + m - 1) / m) * m` to round up to the nearest
77
+ // multiple of `m`, optimized for the invariant that `m` is a power of 2.
78
+ constexpr size_t RoundUp(size_t n, size_t m) {
79
+ return (n + m - 1) & (0 - m);
80
+ }
57
81
 
58
82
  // Returns the size to the nearest equal or larger value that can be
59
83
  // expressed exactly as a tag value.
60
84
  inline size_t RoundUpForTag(size_t size) {
61
- return RoundUp(size, (size <= 1024) ? 8 : 32);
85
+ return RoundUp(size, (size <= 512) ? 8 : (size <= 8192 ? 64 : 4096));
62
86
  }
63
87
 
64
88
  // Converts the allocated size to a tag, rounding down if the size
@@ -71,26 +95,26 @@ inline uint8_t AllocatedSizeToTag(size_t size) {
71
95
  return tag;
72
96
  }
73
97
 
74
- // Converts the provided tag to the corresponding allocated size
75
- constexpr size_t TagToAllocatedSize(uint8_t tag) {
76
- return (tag <= 129) ? ((tag - 1) * 8) : (1024 + (tag - 129) * 32);
77
- }
78
-
79
98
  // Converts the provided tag to the corresponding available data length
80
99
  constexpr size_t TagToLength(uint8_t tag) {
81
100
  return TagToAllocatedSize(tag) - kFlatOverhead;
82
101
  }
83
102
 
84
103
  // Enforce that kMaxFlatSize maps to a well-known exact tag value.
85
- static_assert(TagToAllocatedSize(225) == kMaxFlatSize, "Bad tag logic");
104
+ static_assert(TagToAllocatedSize(MAX_FLAT_TAG) == kMaxLargeFlatSize,
105
+ "Bad tag logic");
86
106
 
87
107
  struct CordRepFlat : public CordRep {
108
+ // Tag for explicit 'large flat' allocation
109
+ struct Large {};
110
+
88
111
  // Creates a new flat node.
89
- static CordRepFlat* New(size_t len) {
112
+ template <size_t max_flat_size, typename... Args>
113
+ static CordRepFlat* NewImpl(size_t len, Args... args ABSL_ATTRIBUTE_UNUSED) {
90
114
  if (len <= kMinFlatLength) {
91
115
  len = kMinFlatLength;
92
- } else if (len > kMaxFlatLength) {
93
- len = kMaxFlatLength;
116
+ } else if (len > max_flat_size - kFlatOverhead) {
117
+ len = max_flat_size - kFlatOverhead;
94
118
  }
95
119
 
96
120
  // Round size up so it matches a size we can exactly express in a tag.
@@ -101,6 +125,12 @@ struct CordRepFlat : public CordRep {
101
125
  return rep;
102
126
  }
103
127
 
128
+ static CordRepFlat* New(size_t len) { return NewImpl<kMaxFlatSize>(len); }
129
+
130
+ static CordRepFlat* New(Large, size_t len) {
131
+ return NewImpl<kMaxLargeFlatSize>(len);
132
+ }
133
+
104
134
  // Deletes a CordRepFlat instance created previously through a call to New().
105
135
  // Flat CordReps are allocated and constructed with raw ::operator new and
106
136
  // placement new, and must be destructed and deallocated accordingly.
@@ -117,6 +147,17 @@ struct CordRepFlat : public CordRep {
117
147
  #endif
118
148
  }
119
149
 
150
+ // Create a CordRepFlat containing `data`, with an optional additional
151
+ // extra capacity of up to `extra` bytes. Requires that `data.size()`
152
+ // is less than kMaxFlatLength.
153
+ static CordRepFlat* Create(absl::string_view data, size_t extra = 0) {
154
+ assert(data.size() <= kMaxFlatLength);
155
+ CordRepFlat* flat = New(data.size() + (std::min)(extra, kMaxFlatLength));
156
+ memcpy(flat->Data(), data.data(), data.size());
157
+ flat->length = data.size();
158
+ return flat;
159
+ }
160
+
120
161
  // Returns a pointer to the data inside this flat rep.
121
162
  char* Data() { return reinterpret_cast<char*>(storage); }
122
163
  const char* Data() const { return reinterpret_cast<const char*>(storage); }
@@ -129,7 +129,9 @@ class CordRepRing::Filler {
129
129
  index_type pos_;
130
130
  };
131
131
 
132
- constexpr size_t CordRepRing::kMaxCapacity; // NOLINT: needed for c++11
132
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
133
+ constexpr size_t CordRepRing::kMaxCapacity;
134
+ #endif
133
135
 
134
136
  bool CordRepRing::IsValid(std::ostream& output) const {
135
137
  if (capacity_ == 0) {
@@ -277,7 +279,7 @@ CordRepRing* CordRepRing::Mutable(CordRepRing* rep, size_t extra) {
277
279
  // Get current number of entries, and check for max capacity.
278
280
  size_t entries = rep->entries();
279
281
 
280
- if (!rep->refcount.IsMutable()) {
282
+ if (!rep->refcount.IsOne()) {
281
283
  return Copy(rep, rep->head(), rep->tail(), extra);
282
284
  } else if (entries + extra > rep->capacity()) {
283
285
  const size_t min_grow = rep->capacity() + rep->capacity() / 2;
@@ -292,10 +294,10 @@ CordRepRing* CordRepRing::Mutable(CordRepRing* rep, size_t extra) {
292
294
  }
293
295
 
294
296
  Span<char> CordRepRing::GetAppendBuffer(size_t size) {
295
- assert(refcount.IsMutable());
297
+ assert(refcount.IsOne());
296
298
  index_type back = retreat(tail_);
297
299
  CordRep* child = entry_child(back);
298
- if (child->tag >= FLAT && child->refcount.IsMutable()) {
300
+ if (child->tag >= FLAT && child->refcount.IsOne()) {
299
301
  size_t capacity = child->flat()->Capacity();
300
302
  pos_type end_pos = entry_end_pos(back);
301
303
  size_t data_offset = entry_data_offset(back);
@@ -312,10 +314,10 @@ Span<char> CordRepRing::GetAppendBuffer(size_t size) {
312
314
  }
313
315
 
314
316
  Span<char> CordRepRing::GetPrependBuffer(size_t size) {
315
- assert(refcount.IsMutable());
317
+ assert(refcount.IsOne());
316
318
  CordRep* child = entry_child(head_);
317
319
  size_t data_offset = entry_data_offset(head_);
318
- if (data_offset && child->refcount.IsMutable() && child->tag >= FLAT) {
320
+ if (data_offset && child->refcount.IsOne() && child->tag >= FLAT) {
319
321
  size_t n = (std::min)(data_offset, size);
320
322
  this->length += n;
321
323
  begin_pos_ -= n;
@@ -504,7 +506,7 @@ CordRepRing* CordRepRing::Prepend(CordRepRing* rep, CordRep* child) {
504
506
 
505
507
  CordRepRing* CordRepRing::Append(CordRepRing* rep, absl::string_view data,
506
508
  size_t extra) {
507
- if (rep->refcount.IsMutable()) {
509
+ if (rep->refcount.IsOne()) {
508
510
  Span<char> avail = rep->GetAppendBuffer(data.length());
509
511
  if (!avail.empty()) {
510
512
  memcpy(avail.data(), data.data(), avail.length());
@@ -538,7 +540,7 @@ CordRepRing* CordRepRing::Append(CordRepRing* rep, absl::string_view data,
538
540
 
539
541
  CordRepRing* CordRepRing::Prepend(CordRepRing* rep, absl::string_view data,
540
542
  size_t extra) {
541
- if (rep->refcount.IsMutable()) {
543
+ if (rep->refcount.IsOne()) {
542
544
  Span<char> avail = rep->GetPrependBuffer(data.length());
543
545
  if (!avail.empty()) {
544
546
  const char* tail = data.data() + data.length() - avail.length();
@@ -678,7 +680,7 @@ CordRepRing* CordRepRing::SubRing(CordRepRing* rep, size_t offset,
678
680
  Position tail = rep->FindTail(head.index, offset + len);
679
681
  const size_t new_entries = rep->entries(head.index, tail.index);
680
682
 
681
- if (rep->refcount.IsMutable() && extra <= (rep->capacity() - new_entries)) {
683
+ if (rep->refcount.IsOne() && extra <= (rep->capacity() - new_entries)) {
682
684
  // We adopt a privately owned rep and no extra entries needed.
683
685
  if (head.index != rep->head_) UnrefEntries(rep, rep->head_, head.index);
684
686
  if (tail.index != rep->tail_) UnrefEntries(rep, tail.index, rep->tail_);
@@ -715,7 +717,7 @@ CordRepRing* CordRepRing::RemovePrefix(CordRepRing* rep, size_t len,
715
717
  }
716
718
 
717
719
  Position head = rep->Find(len);
718
- if (rep->refcount.IsMutable()) {
720
+ if (rep->refcount.IsOne()) {
719
721
  if (head.index != rep->head_) UnrefEntries(rep, rep->head_, head.index);
720
722
  rep->head_ = head.index;
721
723
  } else {
@@ -745,7 +747,7 @@ CordRepRing* CordRepRing::RemoveSuffix(CordRepRing* rep, size_t len,
745
747
  }
746
748
 
747
749
  Position tail = rep->FindTail(rep->length - len);
748
- if (rep->refcount.IsMutable()) {
750
+ if (rep->refcount.IsOne()) {
749
751
  // We adopt a privately owned rep, scrub.
750
752
  if (tail.index != rep->tail_) UnrefEntries(rep, tail.index, rep->tail_);
751
753
  rep->tail_ = tail.index;
@@ -20,6 +20,7 @@
20
20
  #include "absl/debugging/stacktrace.h"
21
21
  #include "absl/strings/internal/cord_internal.h"
22
22
  #include "absl/strings/internal/cord_rep_btree.h"
23
+ #include "absl/strings/internal/cord_rep_crc.h"
23
24
  #include "absl/strings/internal/cord_rep_ring.h"
24
25
  #include "absl/strings/internal/cordz_handle.h"
25
26
  #include "absl/strings/internal/cordz_statistics.h"
@@ -33,7 +34,9 @@ namespace cord_internal {
33
34
 
34
35
  using ::absl::base_internal::SpinLockHolder;
35
36
 
37
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
36
38
  constexpr int CordzInfo::kMaxStackDepth;
39
+ #endif
37
40
 
38
41
  ABSL_CONST_INIT CordzInfo::List CordzInfo::global_list_{absl::kConstInit};
39
42
 
@@ -81,6 +84,14 @@ class CordRepAnalyzer {
81
84
  size_t refcount = rep->refcount.Get();
82
85
  RepRef repref{rep, (refcount > 1) ? refcount - 1 : 1};
83
86
 
87
+ // Process the top level CRC node, if present.
88
+ if (repref.rep->tag == CRC) {
89
+ statistics_.node_count++;
90
+ statistics_.node_counts.crc++;
91
+ memory_usage_.Add(sizeof(CordRepCrc), repref.refcount);
92
+ repref = repref.Child(repref.rep->crc()->child);
93
+ }
94
+
84
95
  // Process all top level linear nodes (substrings and flats).
85
96
  repref = CountLinearReps(repref, memory_usage_);
86
97
 
@@ -89,8 +100,6 @@ class CordRepAnalyzer {
89
100
  AnalyzeRing(repref);
90
101
  } else if (repref.rep->tag == BTREE) {
91
102
  AnalyzeBtree(repref);
92
- } else if (repref.rep->tag == CONCAT) {
93
- AnalyzeConcat(repref);
94
103
  } else {
95
104
  // We should have either a concat, btree, or ring node if not null.
96
105
  assert(false);
@@ -132,14 +141,6 @@ class CordRepAnalyzer {
132
141
  }
133
142
  };
134
143
 
135
- // Returns `rr` if `rr.rep` is not null and a CONCAT type.
136
- // Asserts that `rr.rep` is a concat node or null.
137
- static RepRef AssertConcat(RepRef repref) {
138
- const CordRep* rep = repref.rep;
139
- assert(rep == nullptr || rep->tag == CONCAT);
140
- return (rep != nullptr && rep->tag == CONCAT) ? repref : RepRef{nullptr, 0};
141
- }
142
-
143
144
  // Counts a flat of the provide allocated size
144
145
  void CountFlat(size_t size) {
145
146
  statistics_.node_count++;
@@ -192,34 +193,6 @@ class CordRepAnalyzer {
192
193
  return rep;
193
194
  }
194
195
 
195
- // Analyzes the provided concat node in a flattened recursive way.
196
- void AnalyzeConcat(RepRef rep) {
197
- absl::InlinedVector<RepRef, 47> pending;
198
-
199
- while (rep.rep != nullptr) {
200
- const CordRepConcat* concat = rep.rep->concat();
201
- RepRef left = rep.Child(concat->left);
202
- RepRef right = rep.Child(concat->right);
203
-
204
- statistics_.node_count++;
205
- statistics_.node_counts.concat++;
206
- memory_usage_.Add(sizeof(CordRepConcat), rep.refcount);
207
-
208
- right = AssertConcat(CountLinearReps(right, memory_usage_));
209
- rep = AssertConcat(CountLinearReps(left, memory_usage_));
210
- if (rep.rep != nullptr) {
211
- if (right.rep != nullptr) {
212
- pending.push_back(right);
213
- }
214
- } else if (right.rep != nullptr) {
215
- rep = right;
216
- } else if (!pending.empty()) {
217
- rep = pending.back();
218
- pending.pop_back();
219
- }
220
- }
221
- }
222
-
223
196
  // Analyzes the provided ring.
224
197
  void AnalyzeRing(RepRef rep) {
225
198
  statistics_.node_count++;
@@ -41,6 +41,7 @@ struct CordzStatistics {
41
41
  size_t concat = 0; // #concat reps
42
42
  size_t ring = 0; // #ring buffer reps
43
43
  size_t btree = 0; // #btree reps
44
+ size_t crc = 0; // #crc reps
44
45
  };
45
46
 
46
47
  // The size of the cord in bytes. This matches the result of Cord::size().
@@ -39,8 +39,8 @@ class CordzUpdateTracker {
39
39
  // Tracked update methods.
40
40
  enum MethodIdentifier {
41
41
  kUnknown,
42
- kAppendBuffer,
43
42
  kAppendCord,
43
+ kAppendCordBuffer,
44
44
  kAppendExternalMemory,
45
45
  kAppendString,
46
46
  kAssignCord,
@@ -50,16 +50,18 @@ class CordzUpdateTracker {
50
50
  kConstructorString,
51
51
  kCordReader,
52
52
  kFlatten,
53
+ kGetAppendBuffer,
53
54
  kGetAppendRegion,
54
55
  kMakeCordFromExternal,
55
56
  kMoveAppendCord,
56
57
  kMoveAssignCord,
57
58
  kMovePrependCord,
58
- kPrependBuffer,
59
59
  kPrependCord,
60
+ kPrependCordBuffer,
60
61
  kPrependString,
61
62
  kRemovePrefix,
62
63
  kRemoveSuffix,
64
+ kSetExpectedChecksum,
63
65
  kSubCord,
64
66
 
65
67
  // kNumMethods defines the number of entries: must be the last entry.
@@ -21,7 +21,7 @@ namespace absl {
21
21
  ABSL_NAMESPACE_BEGIN
22
22
  namespace strings_internal {
23
23
 
24
- const char kBase64Chars[] =
24
+ ABSL_CONST_INIT const char kBase64Chars[] =
25
25
  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
26
26
 
27
27
  size_t CalculateBase64EscapedLenInternal(size_t input_len, bool do_padding) {
@@ -102,8 +102,8 @@ size_t Base64EscapeInternal(const unsigned char* src, size_t szsrc, char* dest,
102
102
  }
103
103
  }
104
104
  // To save time, we didn't update szdest or szsrc in the loop. So do it now.
105
- szdest = limit_dest - cur_dest;
106
- szsrc = limit_src - cur_src;
105
+ szdest = static_cast<size_t>(limit_dest - cur_dest);
106
+ szsrc = static_cast<size_t>(limit_src - cur_src);
107
107
 
108
108
  /* now deal with the tail (<=3 bytes) */
109
109
  switch (szsrc) {
@@ -154,7 +154,8 @@ size_t Base64EscapeInternal(const unsigned char* src, size_t szsrc, char* dest,
154
154
  // the loop because the loop above always reads 4 bytes, and the fourth
155
155
  // byte is past the end of the input.
156
156
  if (szdest < 4) return 0;
157
- uint32_t in = (cur_src[0] << 16) + absl::big_endian::Load16(cur_src + 1);
157
+ uint32_t in =
158
+ (uint32_t{cur_src[0]} << 16) + absl::big_endian::Load16(cur_src + 1);
158
159
  cur_dest[0] = base64[in >> 18];
159
160
  in &= 0x3FFFF;
160
161
  cur_dest[1] = base64[in >> 12];
@@ -172,7 +173,7 @@ size_t Base64EscapeInternal(const unsigned char* src, size_t szsrc, char* dest,
172
173
  ABSL_RAW_LOG(FATAL, "Logic problem? szsrc = %zu", szsrc);
173
174
  break;
174
175
  }
175
- return (cur_dest - dest);
176
+ return static_cast<size_t>(cur_dest - dest);
176
177
  }
177
178
 
178
179
  } // namespace strings_internal
@@ -27,7 +27,7 @@ OStringStream::Buf::int_type OStringStream::overflow(int c) {
27
27
 
28
28
  std::streamsize OStringStream::xsputn(const char* s, std::streamsize n) {
29
29
  assert(s_);
30
- s_->append(s, n);
30
+ s_->append(s, static_cast<size_t>(n));
31
31
  return n;
32
32
  }
33
33
 
@@ -320,7 +320,7 @@ bool ConvertIntArg(T v, const FormatConversionSpecImpl conv,
320
320
  return ConvertFloatImpl(static_cast<double>(v), conv, sink);
321
321
 
322
322
  default:
323
- ABSL_INTERNAL_ASSUME(false);
323
+ ABSL_ASSUME(false);
324
324
  }
325
325
 
326
326
  if (conv.is_basic()) {
@@ -144,7 +144,7 @@ StringConvertResult FormatConvertImpl(const AbslCord& value,
144
144
  size_t space_remaining = 0;
145
145
 
146
146
  int width = conv.width();
147
- if (width >= 0) space_remaining = width;
147
+ if (width >= 0) space_remaining = static_cast<size_t>(width);
148
148
 
149
149
  size_t to_write = value.size();
150
150