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
@@ -70,6 +70,7 @@
70
70
  #include <string>
71
71
  #include <type_traits>
72
72
 
73
+ #include "absl/base/attributes.h"
73
74
  #include "absl/base/config.h"
74
75
  #include "absl/base/internal/endian.h"
75
76
  #include "absl/base/internal/per_thread_tls.h"
@@ -78,9 +79,13 @@
78
79
  #include "absl/container/inlined_vector.h"
79
80
  #include "absl/functional/function_ref.h"
80
81
  #include "absl/meta/type_traits.h"
82
+ #include "absl/strings/cord_analysis.h"
83
+ #include "absl/strings/cord_buffer.h"
84
+ #include "absl/strings/internal/cord_data_edge.h"
81
85
  #include "absl/strings/internal/cord_internal.h"
82
86
  #include "absl/strings/internal/cord_rep_btree.h"
83
87
  #include "absl/strings/internal/cord_rep_btree_reader.h"
88
+ #include "absl/strings/internal/cord_rep_crc.h"
84
89
  #include "absl/strings/internal/cord_rep_ring.h"
85
90
  #include "absl/strings/internal/cordz_functions.h"
86
91
  #include "absl/strings/internal/cordz_info.h"
@@ -100,6 +105,20 @@ template <typename Releaser>
100
105
  Cord MakeCordFromExternal(absl::string_view, Releaser&&);
101
106
  void CopyCordToString(const Cord& src, std::string* dst);
102
107
 
108
+ // Cord memory accounting modes
109
+ enum class CordMemoryAccounting {
110
+ // Counts the *approximate* number of bytes held in full or in part by this
111
+ // Cord (which may not remain the same between invocations). Cords that share
112
+ // memory could each be "charged" independently for the same shared memory.
113
+ kTotal,
114
+
115
+ // Counts the *approximate* number of bytes held in full or in part by this
116
+ // Cord weighted by the sharing ratio of that data. For example, if some data
117
+ // edge is shared by 4 different Cords, then each cord is attributed 1/4th of
118
+ // the total memory usage as a 'fair share' of the total memory usage.
119
+ kFairShare,
120
+ };
121
+
103
122
  // Cord
104
123
  //
105
124
  // A Cord is a sequence of characters, designed to be more efficient than a
@@ -214,7 +233,7 @@ class Cord {
214
233
  //
215
234
  // Releases the Cord data. Any nodes that share data with other Cords, if
216
235
  // applicable, will have their reference counts reduced by 1.
217
- void Clear();
236
+ ABSL_ATTRIBUTE_REINITIALIZES void Clear();
218
237
 
219
238
  // Cord::Append()
220
239
  //
@@ -226,6 +245,45 @@ class Cord {
226
245
  template <typename T, EnableIfString<T> = 0>
227
246
  void Append(T&& src);
228
247
 
248
+ // Appends `buffer` to this cord, unless `buffer` has a zero length in which
249
+ // case this method has no effect on this cord instance.
250
+ // This method is guaranteed to consume `buffer`.
251
+ void Append(CordBuffer buffer);
252
+
253
+ // Returns a CordBuffer, re-using potential existing capacity in this cord.
254
+ //
255
+ // Cord instances may have additional unused capacity in the last (or first)
256
+ // nodes of the underlying tree to facilitate amortized growth. This method
257
+ // allows applications to explicitly use this spare capacity if available,
258
+ // or create a new CordBuffer instance otherwise.
259
+ // If this cord has a final non-shared node with at least `min_capacity`
260
+ // available, then this method will return that buffer including its data
261
+ // contents. I.e.; the returned buffer will have a non-zero length, and
262
+ // a capacity of at least `buffer.length + min_capacity`. Otherwise, this
263
+ // method will return `CordBuffer::CreateWithDefaultLimit(capacity)`.
264
+ //
265
+ // Below an example of using GetAppendBuffer. Notice that in this example we
266
+ // use `GetAppendBuffer()` only on the first iteration. As we know nothing
267
+ // about any initial extra capacity in `cord`, we may be able to use the extra
268
+ // capacity. But as we add new buffers with fully utilized contents after that
269
+ // we avoid calling `GetAppendBuffer()` on subsequent iterations: while this
270
+ // works fine, it results in an unnecessary inspection of cord contents:
271
+ //
272
+ // void AppendRandomDataToCord(absl::Cord &cord, size_t n) {
273
+ // bool first = true;
274
+ // while (n > 0) {
275
+ // CordBuffer buffer = first ? cord.GetAppendBuffer(n)
276
+ // : CordBuffer::CreateWithDefaultLimit(n);
277
+ // absl::Span<char> data = buffer.available_up_to(n);
278
+ // FillRandomValues(data.data(), data.size());
279
+ // buffer.IncreaseLengthBy(data.size());
280
+ // cord.Append(std::move(buffer));
281
+ // n -= data.size();
282
+ // first = false;
283
+ // }
284
+ // }
285
+ CordBuffer GetAppendBuffer(size_t capacity, size_t min_capacity = 16);
286
+
229
287
  // Cord::Prepend()
230
288
  //
231
289
  // Prepends data to the Cord, which may come from another Cord or other string
@@ -235,6 +293,11 @@ class Cord {
235
293
  template <typename T, EnableIfString<T> = 0>
236
294
  void Prepend(T&& src);
237
295
 
296
+ // Prepends `buffer` to this cord, unless `buffer` has a zero length in which
297
+ // case this method has no effect on this cord instance.
298
+ // This method is guaranteed to consume `buffer`.
299
+ void Prepend(CordBuffer buffer);
300
+
238
301
  // Cord::RemovePrefix()
239
302
  //
240
303
  // Removes the first `n` bytes of a Cord.
@@ -270,11 +333,10 @@ class Cord {
270
333
 
271
334
  // Cord::EstimatedMemoryUsage()
272
335
  //
273
- // Returns the *approximate* number of bytes held in full or in part by this
274
- // Cord (which may not remain the same between invocations). Note that Cords
275
- // that share memory could each be "charged" independently for the same shared
276
- // memory.
277
- size_t EstimatedMemoryUsage() const;
336
+ // Returns the *approximate* number of bytes held by this cord.
337
+ // See CordMemoryAccounting for more information on the accounting method.
338
+ size_t EstimatedMemoryUsage(CordMemoryAccounting accounting_method =
339
+ CordMemoryAccounting::kTotal) const;
278
340
 
279
341
  // Cord::Compare()
280
342
  //
@@ -324,7 +386,7 @@ class Cord {
324
386
  //----------------------------------------------------------------------------
325
387
  //
326
388
  // A `Cord::ChunkIterator` allows iteration over the constituent chunks of its
327
- // Cord. Such iteration allows you to perform non-const operatons on the data
389
+ // Cord. Such iteration allows you to perform non-const operations on the data
328
390
  // of a Cord without modifying it.
329
391
  //
330
392
  // Generally, you do not instantiate a `Cord::ChunkIterator` directly;
@@ -372,12 +434,6 @@ class Cord {
372
434
  using CordRepBtree = absl::cord_internal::CordRepBtree;
373
435
  using CordRepBtreeReader = absl::cord_internal::CordRepBtreeReader;
374
436
 
375
- // Stack of right children of concat nodes that we have to visit.
376
- // Keep this at the end of the structure to avoid cache-thrashing.
377
- // TODO(jgm): Benchmark to see if there's a more optimal value than 47 for
378
- // the inlined vector size (47 exists for backward compatibility).
379
- using Stack = absl::InlinedVector<absl::cord_internal::CordRep*, 47>;
380
-
381
437
  // Constructs a `begin()` iterator from `tree`. `tree` must not be null.
382
438
  explicit ChunkIterator(cord_internal::CordRep* tree);
383
439
 
@@ -393,17 +449,10 @@ class Cord {
393
449
  Cord AdvanceAndReadBytes(size_t n);
394
450
  void AdvanceBytes(size_t n);
395
451
 
396
- // Stack specific operator++
397
- ChunkIterator& AdvanceStack();
398
-
399
452
  // Btree specific operator++
400
453
  ChunkIterator& AdvanceBtree();
401
454
  void AdvanceBytesBtree(size_t n);
402
455
 
403
- // Iterates `n` bytes, where `n` is expected to be greater than or equal to
404
- // `current_chunk_.size()`.
405
- void AdvanceBytesSlowPath(size_t n);
406
-
407
456
  // A view into bytes of the current `CordRep`. It may only be a view to a
408
457
  // suffix of bytes if this is being used by `CharIterator`.
409
458
  absl::string_view current_chunk_;
@@ -416,12 +465,9 @@ class Cord {
416
465
 
417
466
  // Cord reader for cord btrees. Empty if not traversing a btree.
418
467
  CordRepBtreeReader btree_reader_;
419
-
420
- // See 'Stack' alias definition.
421
- Stack stack_of_right_children_;
422
468
  };
423
469
 
424
- // Cord::ChunkIterator::chunk_begin()
470
+ // Cord::chunk_begin()
425
471
  //
426
472
  // Returns an iterator to the first chunk of the `Cord`.
427
473
  //
@@ -437,7 +483,7 @@ class Cord {
437
483
  // }
438
484
  ChunkIterator chunk_begin() const;
439
485
 
440
- // Cord::ChunkItertator::chunk_end()
486
+ // Cord::chunk_end()
441
487
  //
442
488
  // Returns an iterator one increment past the last chunk of the `Cord`.
443
489
  //
@@ -447,7 +493,7 @@ class Cord {
447
493
  ChunkIterator chunk_end() const;
448
494
 
449
495
  //----------------------------------------------------------------------------
450
- // Cord::ChunkIterator::ChunkRange
496
+ // Cord::ChunkRange
451
497
  //----------------------------------------------------------------------------
452
498
  //
453
499
  // `ChunkRange` is a helper class for iterating over the chunks of the `Cord`,
@@ -461,7 +507,7 @@ class Cord {
461
507
  class ChunkRange {
462
508
  public:
463
509
  // Fulfill minimum c++ container requirements [container.requirements]
464
- // Theses (partial) container type definitions allow ChunkRange to be used
510
+ // These (partial) container type definitions allow ChunkRange to be used
465
511
  // in various utilities expecting a subset of [container.requirements].
466
512
  // For example, the below enables using `::testing::ElementsAre(...)`
467
513
  using value_type = absl::string_view;
@@ -481,9 +527,9 @@ class Cord {
481
527
 
482
528
  // Cord::Chunks()
483
529
  //
484
- // Returns a `Cord::ChunkIterator::ChunkRange` for iterating over the chunks
485
- // of a `Cord` with a range-based for-loop. For most iteration tasks on a
486
- // Cord, use `Cord::Chunks()` to retrieve this iterator.
530
+ // Returns a `Cord::ChunkRange` for iterating over the chunks of a `Cord` with
531
+ // a range-based for-loop. For most iteration tasks on a Cord, use
532
+ // `Cord::Chunks()` to retrieve this iterator.
487
533
  //
488
534
  // Example:
489
535
  //
@@ -549,7 +595,7 @@ class Cord {
549
595
  ChunkIterator chunk_iterator_;
550
596
  };
551
597
 
552
- // Cord::CharIterator::AdvanceAndRead()
598
+ // Cord::AdvanceAndRead()
553
599
  //
554
600
  // Advances the `Cord::CharIterator` by `n_bytes` and returns the bytes
555
601
  // advanced as a separate `Cord`. `n_bytes` must be less than or equal to the
@@ -557,21 +603,21 @@ class Cord {
557
603
  // valid to pass `char_end()` and `0`.
558
604
  static Cord AdvanceAndRead(CharIterator* it, size_t n_bytes);
559
605
 
560
- // Cord::CharIterator::Advance()
606
+ // Cord::Advance()
561
607
  //
562
608
  // Advances the `Cord::CharIterator` by `n_bytes`. `n_bytes` must be less than
563
609
  // or equal to the number of bytes remaining within the Cord; otherwise,
564
610
  // behavior is undefined. It is valid to pass `char_end()` and `0`.
565
611
  static void Advance(CharIterator* it, size_t n_bytes);
566
612
 
567
- // Cord::CharIterator::ChunkRemaining()
613
+ // Cord::ChunkRemaining()
568
614
  //
569
615
  // Returns the longest contiguous view starting at the iterator's position.
570
616
  //
571
617
  // `it` must be dereferenceable.
572
618
  static absl::string_view ChunkRemaining(const CharIterator& it);
573
619
 
574
- // Cord::CharIterator::char_begin()
620
+ // Cord::char_begin()
575
621
  //
576
622
  // Returns an iterator to the first character of the `Cord`.
577
623
  //
@@ -580,7 +626,7 @@ class Cord {
580
626
  // a `CharIterator` where range-based for-loops may not be available.
581
627
  CharIterator char_begin() const;
582
628
 
583
- // Cord::CharIterator::char_end()
629
+ // Cord::char_end()
584
630
  //
585
631
  // Returns an iterator to one past the last character of the `Cord`.
586
632
  //
@@ -589,13 +635,13 @@ class Cord {
589
635
  // a `CharIterator` where range-based for-loops are not useful.
590
636
  CharIterator char_end() const;
591
637
 
592
- // Cord::CharIterator::CharRange
638
+ // Cord::CharRange
593
639
  //
594
640
  // `CharRange` is a helper class for iterating over the characters of a
595
641
  // producing an iterator which can be used within a range-based for loop.
596
642
  // Construction of a `CharRange` will return an iterator pointing to the first
597
643
  // character of the Cord. Generally, do not construct a `CharRange` directly;
598
- // instead, prefer to use the `Cord::Chars()` method show below.
644
+ // instead, prefer to use the `Cord::Chars()` method shown below.
599
645
  //
600
646
  // Implementation note: `CharRange` is simply a convenience wrapper over
601
647
  // `Cord::char_begin()` and `Cord::char_end()`.
@@ -620,11 +666,11 @@ class Cord {
620
666
  const Cord* cord_;
621
667
  };
622
668
 
623
- // Cord::CharIterator::Chars()
669
+ // Cord::Chars()
624
670
  //
625
- // Returns a `Cord::CharIterator` for iterating over the characters of a
626
- // `Cord` with a range-based for-loop. For most character-based iteration
627
- // tasks on a Cord, use `Cord::Chars()` to retrieve this iterator.
671
+ // Returns a `Cord::CharRange` for iterating over the characters of a `Cord`
672
+ // with a range-based for-loop. For most character-based iteration tasks on a
673
+ // Cord, use `Cord::Chars()` to retrieve this iterator.
628
674
  //
629
675
  // Example:
630
676
  //
@@ -671,6 +717,29 @@ class Cord {
671
717
  cord->Append(part);
672
718
  }
673
719
 
720
+ // Cord::SetExpectedChecksum()
721
+ //
722
+ // Stores a checksum value with this non-empty cord instance, for later
723
+ // retrieval.
724
+ //
725
+ // The expected checksum is a number stored out-of-band, alongside the data.
726
+ // It is preserved across copies and assignments, but any mutations to a cord
727
+ // will cause it to lose its expected checksum.
728
+ //
729
+ // The expected checksum is not part of a Cord's value, and does not affect
730
+ // operations such as equality or hashing.
731
+ //
732
+ // This field is intended to store a CRC32C checksum for later validation, to
733
+ // help support end-to-end checksum workflows. However, the Cord API itself
734
+ // does no CRC validation, and assigns no meaning to this number.
735
+ //
736
+ // This call has no effect if this cord is empty.
737
+ void SetExpectedChecksum(uint32_t crc);
738
+
739
+ // Returns this cord's expected checksum, if it has one. Otherwise, returns
740
+ // nullopt.
741
+ absl::optional<uint32_t> ExpectedChecksum() const;
742
+
674
743
  template <typename H>
675
744
  friend H AbslHashValue(H hash_state, const absl::Cord& c) {
676
745
  absl::optional<absl::string_view> maybe_flat = c.TryFlat();
@@ -686,7 +755,8 @@ class Cord {
686
755
  // be used by spelling absl::strings_internal::MakeStringConstant, which is
687
756
  // also an internal API.
688
757
  template <typename T>
689
- explicit constexpr Cord(strings_internal::StringConstant<T>);
758
+ // NOLINTNEXTLINE(google-explicit-constructor)
759
+ constexpr Cord(strings_internal::StringConstant<T>);
690
760
 
691
761
  private:
692
762
  using CordRep = absl::cord_internal::CordRep;
@@ -738,12 +808,12 @@ class Cord {
738
808
  bool empty() const;
739
809
  size_t size() const;
740
810
  const char* data() const; // Returns nullptr if holding pointer
741
- void set_data(const char* data, size_t n,
742
- bool nullify_tail); // Discards pointer, if any
743
- char* set_data(size_t n); // Write data to the result
811
+ void set_data(const char* data, size_t n); // Discards pointer, if any
812
+ char* set_data(size_t n); // Write data to the result
744
813
  // Returns nullptr if holding bytes
745
814
  absl::cord_internal::CordRep* tree() const;
746
815
  absl::cord_internal::CordRep* as_tree() const;
816
+ const char* as_chars() const;
747
817
  // Returns non-null iff was holding a pointer
748
818
  absl::cord_internal::CordRep* clear();
749
819
  // Converts to pointer if necessary.
@@ -831,6 +901,11 @@ class Cord {
831
901
  // Returns true if the Cord is being profiled by cordz.
832
902
  bool is_profiled() const { return data_.is_tree() && data_.is_profiled(); }
833
903
 
904
+ // Returns the available inlined capacity, or 0 if is_tree() == true.
905
+ size_t remaining_inline_capacity() const {
906
+ return data_.is_tree() ? 0 : kMaxInline - data_.inline_size();
907
+ }
908
+
834
909
  // Returns the profiled CordzInfo, or nullptr if not sampled.
835
910
  absl::cord_internal::CordzInfo* cordz_info() const {
836
911
  return data_.cordz_info();
@@ -861,9 +936,6 @@ class Cord {
861
936
  };
862
937
  InlineRep contents_;
863
938
 
864
- // Helper for MemoryUsage().
865
- static size_t MemoryUsageAux(const absl::cord_internal::CordRep* rep);
866
-
867
939
  // Helper for GetFlat() and TryFlat().
868
940
  static bool GetFlatAux(absl::cord_internal::CordRep* rep,
869
941
  absl::string_view* fragment);
@@ -901,6 +973,15 @@ class Cord {
901
973
  template <typename C>
902
974
  void AppendImpl(C&& src);
903
975
 
976
+ // Appends / Prepends `src` to this instance, using precise sizing.
977
+ // This method does explicitly not attempt to use any spare capacity
978
+ // in any pending last added private owned flat.
979
+ // Requires `src` to be <= kMaxFlatLength.
980
+ void AppendPrecise(absl::string_view src, MethodIdentifier method);
981
+ void PrependPrecise(absl::string_view src, MethodIdentifier method);
982
+
983
+ CordBuffer GetAppendBufferSlowPath(size_t capacity, size_t min_capacity);
984
+
904
985
  // Prepends the provided data to this instance. `method` contains the public
905
986
  // API method for this action which is tracked for Cordz sampling purposes.
906
987
  void PrependArray(absl::string_view src, MethodIdentifier method);
@@ -938,8 +1019,8 @@ namespace cord_internal {
938
1019
  // Fast implementation of memmove for up to 15 bytes. This implementation is
939
1020
  // safe for overlapping regions. If nullify_tail is true, the destination is
940
1021
  // padded with '\0' up to 16 bytes.
941
- inline void SmallMemmove(char* dst, const char* src, size_t n,
942
- bool nullify_tail = false) {
1022
+ template <bool nullify_tail = false>
1023
+ inline void SmallMemmove(char* dst, const char* src, size_t n) {
943
1024
  if (n >= 8) {
944
1025
  assert(n <= 16);
945
1026
  uint64_t buf1;
@@ -976,22 +1057,16 @@ inline void SmallMemmove(char* dst, const char* src, size_t n,
976
1057
  }
977
1058
 
978
1059
  // Does non-template-specific `CordRepExternal` initialization.
979
- // Expects `data` to be non-empty.
1060
+ // Requires `data` to be non-empty.
980
1061
  void InitializeCordRepExternal(absl::string_view data, CordRepExternal* rep);
981
1062
 
982
1063
  // Creates a new `CordRep` that owns `data` and `releaser` and returns a pointer
983
- // to it, or `nullptr` if `data` was empty.
1064
+ // to it. Requires `data` to be non-empty.
984
1065
  template <typename Releaser>
985
1066
  // NOLINTNEXTLINE - suppress clang-tidy raw pointer return.
986
1067
  CordRep* NewExternalRep(absl::string_view data, Releaser&& releaser) {
1068
+ assert(!data.empty());
987
1069
  using ReleaserType = absl::decay_t<Releaser>;
988
- if (data.empty()) {
989
- // Never create empty external nodes.
990
- InvokeReleaser(Rank0{}, ReleaserType(std::forward<Releaser>(releaser)),
991
- data);
992
- return nullptr;
993
- }
994
-
995
1070
  CordRepExternal* rep = new CordRepExternalImpl<ReleaserType>(
996
1071
  std::forward<Releaser>(releaser), 0);
997
1072
  InitializeCordRepExternal(data, rep);
@@ -1011,10 +1086,15 @@ inline CordRep* NewExternalRep(absl::string_view data,
1011
1086
  template <typename Releaser>
1012
1087
  Cord MakeCordFromExternal(absl::string_view data, Releaser&& releaser) {
1013
1088
  Cord cord;
1014
- if (auto* rep = ::absl::cord_internal::NewExternalRep(
1015
- data, std::forward<Releaser>(releaser))) {
1016
- cord.contents_.EmplaceTree(rep,
1089
+ if (ABSL_PREDICT_TRUE(!data.empty())) {
1090
+ cord.contents_.EmplaceTree(::absl::cord_internal::NewExternalRep(
1091
+ data, std::forward<Releaser>(releaser)),
1017
1092
  Cord::MethodIdentifier::kMakeCordFromExternal);
1093
+ } else {
1094
+ using ReleaserType = absl::decay_t<Releaser>;
1095
+ cord_internal::InvokeReleaser(
1096
+ cord_internal::Rank0{}, ReleaserType(std::forward<Releaser>(releaser)),
1097
+ data);
1018
1098
  }
1019
1099
  return cord;
1020
1100
  }
@@ -1069,6 +1149,11 @@ inline const char* Cord::InlineRep::data() const {
1069
1149
  return is_tree() ? nullptr : data_.as_chars();
1070
1150
  }
1071
1151
 
1152
+ inline const char* Cord::InlineRep::as_chars() const {
1153
+ assert(!data_.is_tree());
1154
+ return data_.as_chars();
1155
+ }
1156
+
1072
1157
  inline absl::cord_internal::CordRep* Cord::InlineRep::as_tree() const {
1073
1158
  assert(data_.is_tree());
1074
1159
  return data_.as_tree();
@@ -1207,10 +1292,15 @@ inline size_t Cord::size() const {
1207
1292
 
1208
1293
  inline bool Cord::empty() const { return contents_.empty(); }
1209
1294
 
1210
- inline size_t Cord::EstimatedMemoryUsage() const {
1295
+ inline size_t Cord::EstimatedMemoryUsage(
1296
+ CordMemoryAccounting accounting_method) const {
1211
1297
  size_t result = sizeof(Cord);
1212
1298
  if (const absl::cord_internal::CordRep* rep = contents_.tree()) {
1213
- result += MemoryUsageAux(rep);
1299
+ if (accounting_method == CordMemoryAccounting::kFairShare) {
1300
+ result += cord_internal::GetEstimatedFairShareMemoryUsage(rep);
1301
+ } else {
1302
+ result += cord_internal::GetEstimatedMemoryUsage(rep);
1303
+ }
1214
1304
  }
1215
1305
  return result;
1216
1306
  }
@@ -1248,6 +1338,31 @@ inline void Cord::Prepend(absl::string_view src) {
1248
1338
  PrependArray(src, CordzUpdateTracker::kPrependString);
1249
1339
  }
1250
1340
 
1341
+ inline void Cord::Append(CordBuffer buffer) {
1342
+ if (ABSL_PREDICT_FALSE(buffer.length() == 0)) return;
1343
+ absl::string_view short_value;
1344
+ if (CordRep* rep = buffer.ConsumeValue(short_value)) {
1345
+ contents_.AppendTree(rep, CordzUpdateTracker::kAppendCordBuffer);
1346
+ } else {
1347
+ AppendPrecise(short_value, CordzUpdateTracker::kAppendCordBuffer);
1348
+ }
1349
+ }
1350
+
1351
+ inline void Cord::Prepend(CordBuffer buffer) {
1352
+ if (ABSL_PREDICT_FALSE(buffer.length() == 0)) return;
1353
+ absl::string_view short_value;
1354
+ if (CordRep* rep = buffer.ConsumeValue(short_value)) {
1355
+ contents_.PrependTree(rep, CordzUpdateTracker::kPrependCordBuffer);
1356
+ } else {
1357
+ PrependPrecise(short_value, CordzUpdateTracker::kPrependCordBuffer);
1358
+ }
1359
+ }
1360
+
1361
+ inline CordBuffer Cord::GetAppendBuffer(size_t capacity, size_t min_capacity) {
1362
+ if (empty()) return CordBuffer::CreateWithDefaultLimit(capacity);
1363
+ return GetAppendBufferSlowPath(capacity, min_capacity);
1364
+ }
1365
+
1251
1366
  extern template void Cord::Append(std::string&& src);
1252
1367
  extern template void Cord::Prepend(std::string&& src);
1253
1368
 
@@ -1274,27 +1389,27 @@ inline bool Cord::StartsWith(absl::string_view rhs) const {
1274
1389
  }
1275
1390
 
1276
1391
  inline void Cord::ChunkIterator::InitTree(cord_internal::CordRep* tree) {
1392
+ tree = cord_internal::SkipCrcNode(tree);
1277
1393
  if (tree->tag == cord_internal::BTREE) {
1278
1394
  current_chunk_ = btree_reader_.Init(tree->btree());
1279
- return;
1395
+ } else {
1396
+ current_leaf_ = tree;
1397
+ current_chunk_ = cord_internal::EdgeData(tree);
1280
1398
  }
1281
-
1282
- stack_of_right_children_.push_back(tree);
1283
- operator++();
1284
1399
  }
1285
1400
 
1286
- inline Cord::ChunkIterator::ChunkIterator(cord_internal::CordRep* tree)
1287
- : bytes_remaining_(tree->length) {
1401
+ inline Cord::ChunkIterator::ChunkIterator(cord_internal::CordRep* tree) {
1402
+ bytes_remaining_ = tree->length;
1288
1403
  InitTree(tree);
1289
1404
  }
1290
1405
 
1291
- inline Cord::ChunkIterator::ChunkIterator(const Cord* cord)
1292
- : bytes_remaining_(cord->size()) {
1293
- if (cord->contents_.is_tree()) {
1294
- InitTree(cord->contents_.as_tree());
1406
+ inline Cord::ChunkIterator::ChunkIterator(const Cord* cord) {
1407
+ if (CordRep* tree = cord->contents_.tree()) {
1408
+ bytes_remaining_ = tree->length;
1409
+ InitTree(tree);
1295
1410
  } else {
1296
- current_chunk_ =
1297
- absl::string_view(cord->contents_.data(), bytes_remaining_);
1411
+ bytes_remaining_ = cord->contents_.inline_size();
1412
+ current_chunk_ = {cord->contents_.data(), bytes_remaining_};
1298
1413
  }
1299
1414
  }
1300
1415
 
@@ -1324,8 +1439,11 @@ inline Cord::ChunkIterator& Cord::ChunkIterator::operator++() {
1324
1439
  assert(bytes_remaining_ >= current_chunk_.size());
1325
1440
  bytes_remaining_ -= current_chunk_.size();
1326
1441
  if (bytes_remaining_ > 0) {
1327
- return btree_reader_ ? AdvanceBtree() : AdvanceStack();
1328
- } else {
1442
+ if (btree_reader_) {
1443
+ return AdvanceBtree();
1444
+ } else {
1445
+ assert(!current_chunk_.empty()); // Called on invalid iterator.
1446
+ }
1329
1447
  current_chunk_ = {};
1330
1448
  }
1331
1449
  return *this;
@@ -1366,7 +1484,11 @@ inline void Cord::ChunkIterator::AdvanceBytes(size_t n) {
1366
1484
  if (ABSL_PREDICT_TRUE(n < current_chunk_.size())) {
1367
1485
  RemoveChunkPrefix(n);
1368
1486
  } else if (n != 0) {
1369
- btree_reader_ ? AdvanceBytesBtree(n) : AdvanceBytesSlowPath(n);
1487
+ if (btree_reader_) {
1488
+ AdvanceBytesBtree(n);
1489
+ } else {
1490
+ bytes_remaining_ = 0;
1491
+ }
1370
1492
  }
1371
1493
  }
1372
1494
 
@@ -1457,7 +1579,7 @@ inline void Cord::ForEachChunk(
1457
1579
  }
1458
1580
  }
1459
1581
 
1460
- // Nonmember Cord-to-Cord relational operarators.
1582
+ // Nonmember Cord-to-Cord relational operators.
1461
1583
  inline bool operator==(const Cord& lhs, const Cord& rhs) {
1462
1584
  if (lhs.contents_.IsSame(rhs.contents_)) return true;
1463
1585
  size_t rhs_size = rhs.size();
@@ -1508,7 +1630,6 @@ class CordTestAccess {
1508
1630
  public:
1509
1631
  static size_t FlatOverhead();
1510
1632
  static size_t MaxFlatLength();
1511
- static size_t SizeofCordRepConcat();
1512
1633
  static size_t SizeofCordRepExternal();
1513
1634
  static size_t SizeofCordRepSubstring();
1514
1635
  static size_t FlatTagToLength(uint8_t tag);