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
@@ -22,6 +22,7 @@
22
22
  #include "absl/base/attributes.h"
23
23
  #include "absl/base/config.h"
24
24
  #include "absl/base/internal/raw_logging.h"
25
+ #include "absl/strings/internal/cord_data_edge.h"
25
26
  #include "absl/strings/internal/cord_internal.h"
26
27
  #include "absl/strings/internal/cord_rep_consume.h"
27
28
  #include "absl/strings/internal/cord_rep_flat.h"
@@ -32,7 +33,9 @@ namespace absl {
32
33
  ABSL_NAMESPACE_BEGIN
33
34
  namespace cord_internal {
34
35
 
35
- constexpr size_t CordRepBtree::kMaxCapacity; // NOLINT: needed for c++ < c++17
36
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
37
+ constexpr size_t CordRepBtree::kMaxCapacity;
38
+ #endif
36
39
 
37
40
  namespace {
38
41
 
@@ -69,7 +72,7 @@ void DumpAll(const CordRep* rep, bool include_contents, std::ostream& stream,
69
72
  // indentation and prefix / labels keeps us within roughly 80-100 wide.
70
73
  constexpr size_t kMaxDataLength = 60;
71
74
  stream << ", data = \""
72
- << CordRepBtree::EdgeData(r).substr(0, kMaxDataLength)
75
+ << EdgeData(r).substr(0, kMaxDataLength)
73
76
  << (r->length > kMaxDataLength ? "\"..." : "\"");
74
77
  }
75
78
  stream << '\n';
@@ -119,6 +122,7 @@ CordRepSubstring* CreateSubstring(CordRep* rep, size_t offset, size_t n) {
119
122
  rep = CordRep::Ref(substring->child);
120
123
  CordRep::Unref(substring);
121
124
  }
125
+ assert(rep->IsExternal() || rep->IsFlat());
122
126
  CordRepSubstring* substring = new CordRepSubstring();
123
127
  substring->length = n;
124
128
  substring->tag = SUBSTRING;
@@ -149,7 +153,7 @@ inline CordRep* MakeSubstring(CordRep* rep, size_t offset) {
149
153
  CordRep* ResizeEdge(CordRep* edge, size_t length, bool is_mutable) {
150
154
  assert(length > 0);
151
155
  assert(length <= edge->length);
152
- assert(CordRepBtree::IsDataEdge(edge));
156
+ assert(IsDataEdge(edge));
153
157
  if (length >= edge->length) return edge;
154
158
 
155
159
  if (is_mutable && (edge->tag >= FLAT || edge->tag == SUBSTRING)) {
@@ -190,24 +194,29 @@ inline void FastUnref(R* r, Fn&& fn) {
190
194
  }
191
195
  }
192
196
 
193
- // Deletes a leaf node data edge. Requires `rep` to be an EXTERNAL or FLAT
194
- // node, or a SUBSTRING of an EXTERNAL or FLAT node.
195
- void DeleteLeafEdge(CordRep* rep) {
196
- for (;;) {
197
+
198
+ void DeleteSubstring(CordRepSubstring* substring) {
199
+ CordRep* rep = substring->child;
200
+ if (!rep->refcount.Decrement()) {
197
201
  if (rep->tag >= FLAT) {
198
202
  CordRepFlat::Delete(rep->flat());
199
- return;
200
- }
201
- if (rep->tag == EXTERNAL) {
203
+ } else {
204
+ assert(rep->tag == EXTERNAL);
202
205
  CordRepExternal::Delete(rep->external());
203
- return;
204
206
  }
205
- assert(rep->tag == SUBSTRING);
206
- CordRepSubstring* substring = rep->substring();
207
- rep = substring->child;
208
- assert(rep->tag == EXTERNAL || rep->tag >= FLAT);
209
- delete substring;
210
- if (rep->refcount.Decrement()) return;
207
+ }
208
+ delete substring;
209
+ }
210
+
211
+ // Deletes a leaf node data edge. Requires `IsDataEdge(rep)`.
212
+ void DeleteLeafEdge(CordRep* rep) {
213
+ assert(IsDataEdge(rep));
214
+ if (rep->tag >= FLAT) {
215
+ CordRepFlat::Delete(rep->flat());
216
+ } else if (rep->tag == EXTERNAL) {
217
+ CordRepExternal::Delete(rep->external());
218
+ } else {
219
+ DeleteSubstring(rep->substring());
211
220
  }
212
221
  }
213
222
 
@@ -216,8 +225,8 @@ void DeleteLeafEdge(CordRep* rep) {
216
225
  // propagate node changes up the stack.
217
226
  template <EdgeType edge_type>
218
227
  struct StackOperations {
219
- // Returns true if the node at 'depth' is mutable, i.e. has a refcount
220
- // of one, carries no CRC, and all of its parent nodes have a refcount of one.
228
+ // Returns true if the node at 'depth' is not shared, i.e. has a refcount
229
+ // of one and all of its parent nodes have a refcount of one.
221
230
  inline bool owned(int depth) const { return depth < share_depth; }
222
231
 
223
232
  // Returns the node at 'depth'.
@@ -228,11 +237,11 @@ struct StackOperations {
228
237
  inline CordRepBtree* BuildStack(CordRepBtree* tree, int depth) {
229
238
  assert(depth <= tree->height());
230
239
  int current_depth = 0;
231
- while (current_depth < depth && tree->refcount.IsMutable()) {
240
+ while (current_depth < depth && tree->refcount.IsOne()) {
232
241
  stack[current_depth++] = tree;
233
242
  tree = tree->Edge(edge_type)->btree();
234
243
  }
235
- share_depth = current_depth + (tree->refcount.IsMutable() ? 1 : 0);
244
+ share_depth = current_depth + (tree->refcount.IsOne() ? 1 : 0);
236
245
  while (current_depth < depth) {
237
246
  stack[current_depth++] = tree;
238
247
  tree = tree->Edge(edge_type)->btree();
@@ -241,17 +250,17 @@ struct StackOperations {
241
250
  }
242
251
 
243
252
  // Builds a stack with the invariant that all nodes are private owned / not
244
- // shared and carry no CRC data. This is used in iterative updates where a
245
- // previous propagation guaranteed all nodes have this property.
253
+ // shared. This is used in iterative updates where a previous propagation
254
+ // guaranteed all nodes are owned / private.
246
255
  inline void BuildOwnedStack(CordRepBtree* tree, int height) {
247
256
  assert(height <= CordRepBtree::kMaxHeight);
248
257
  int depth = 0;
249
258
  while (depth < height) {
250
- assert(tree->refcount.IsMutable());
259
+ assert(tree->refcount.IsOne());
251
260
  stack[depth++] = tree;
252
261
  tree = tree->Edge(edge_type)->btree();
253
262
  }
254
- assert(tree->refcount.IsMutable());
263
+ assert(tree->refcount.IsOne());
255
264
  share_depth = depth + 1;
256
265
  }
257
266
 
@@ -336,12 +345,12 @@ struct StackOperations {
336
345
  return Unwind</*propagate=*/true>(tree, depth, length, result);
337
346
  }
338
347
 
339
- // `share_depth` contains the depth at which the nodes in the stack cannot
340
- // be mutated. I.e., if the top most level is shared (i.e.:
341
- // `!refcount.IsMutable()`), then `share_depth` is 0. If the 2nd node
342
- // is shared (and implicitly all nodes below that) then `share_depth` is 1,
343
- // etc. A `share_depth` greater than the depth of the stack indicates that
344
- // none of the nodes in the stack are shared.
348
+ // `share_depth` contains the depth at which the nodes in the stack become
349
+ // shared. I.e., if the top most level is shared (i.e.: `!refcount.IsOne()`),
350
+ // then `share_depth` is 0. If the 2nd node is shared (and implicitly all
351
+ // nodes below that) then `share_depth` is 1, etc. A `share_depth` greater
352
+ // than the depth of the stack indicates that none of the nodes in the stack
353
+ // are shared.
345
354
  int share_depth;
346
355
 
347
356
  NodeStack stack;
@@ -372,19 +381,37 @@ void CordRepBtree::Dump(const CordRep* rep, std::ostream& stream) {
372
381
  Dump(rep, absl::string_view(), false, stream);
373
382
  }
374
383
 
375
- void CordRepBtree::DestroyLeaf(CordRepBtree* tree, size_t begin, size_t end) {
376
- for (CordRep* edge : tree->Edges(begin, end)) {
377
- FastUnref(edge, DeleteLeafEdge);
384
+ template <size_t size>
385
+ static void DestroyTree(CordRepBtree* tree) {
386
+ for (CordRep* node : tree->Edges()) {
387
+ if (node->refcount.Decrement()) continue;
388
+ for (CordRep* edge : node->btree()->Edges()) {
389
+ if (edge->refcount.Decrement()) continue;
390
+ if (size == 1) {
391
+ DeleteLeafEdge(edge);
392
+ } else {
393
+ CordRepBtree::Destroy(edge->btree());
394
+ }
395
+ }
396
+ CordRepBtree::Delete(node->btree());
378
397
  }
379
- Delete(tree);
398
+ CordRepBtree::Delete(tree);
380
399
  }
381
400
 
382
- void CordRepBtree::DestroyNonLeaf(CordRepBtree* tree, size_t begin,
383
- size_t end) {
384
- for (CordRep* edge : tree->Edges(begin, end)) {
385
- FastUnref(edge->btree(), Destroy);
401
+ void CordRepBtree::Destroy(CordRepBtree* tree) {
402
+ switch (tree->height()) {
403
+ case 0:
404
+ for (CordRep* edge : tree->Edges()) {
405
+ if (!edge->refcount.Decrement()) {
406
+ DeleteLeafEdge(edge);
407
+ }
408
+ }
409
+ return CordRepBtree::Delete(tree);
410
+ case 1:
411
+ return DestroyTree<1>(tree);
412
+ default:
413
+ return DestroyTree<2>(tree);
386
414
  }
387
- Delete(tree);
388
415
  }
389
416
 
390
417
  bool CordRepBtree::IsValid(const CordRepBtree* tree, bool shallow) {
@@ -773,7 +800,7 @@ CopyResult CordRepBtree::CopyPrefix(size_t n, bool allow_folding) {
773
800
 
774
801
  CordRep* CordRepBtree::ExtractFront(CordRepBtree* tree) {
775
802
  CordRep* front = tree->Edge(tree->begin());
776
- if (tree->refcount.IsMutable()) {
803
+ if (tree->refcount.IsOne()) {
777
804
  Unref(tree->Edges(tree->begin() + 1, tree->end()));
778
805
  CordRepBtree::Delete(tree);
779
806
  } else {
@@ -786,7 +813,7 @@ CordRep* CordRepBtree::ExtractFront(CordRepBtree* tree) {
786
813
  CordRepBtree* CordRepBtree::ConsumeBeginTo(CordRepBtree* tree, size_t end,
787
814
  size_t new_length) {
788
815
  assert(end <= tree->end());
789
- if (tree->refcount.IsMutable()) {
816
+ if (tree->refcount.IsOne()) {
790
817
  Unref(tree->Edges(end, tree->end()));
791
818
  tree->set_end(end);
792
819
  tree->length = new_length;
@@ -813,13 +840,13 @@ CordRep* CordRepBtree::RemoveSuffix(CordRepBtree* tree, size_t n) {
813
840
 
814
841
  size_t length = len - n;
815
842
  int height = tree->height();
816
- bool is_mutable = tree->refcount.IsMutable();
843
+ bool is_mutable = tree->refcount.IsOne();
817
844
 
818
845
  // Extract all top nodes which are reduced to size = 1
819
846
  Position pos = tree->IndexOfLength(length);
820
847
  while (pos.index == tree->begin()) {
821
848
  CordRep* edge = ExtractFront(tree);
822
- is_mutable &= edge->refcount.IsMutable();
849
+ is_mutable &= edge->refcount.IsOne();
823
850
  if (height-- == 0) return ResizeEdge(edge, length, is_mutable);
824
851
  tree = edge->btree();
825
852
  pos = tree->IndexOfLength(length);
@@ -835,8 +862,8 @@ CordRep* CordRepBtree::RemoveSuffix(CordRepBtree* tree, size_t n) {
835
862
  length = pos.n;
836
863
  while (length != edge->length) {
837
864
  // ConsumeBeginTo guarantees `tree` is a clean, privately owned copy.
838
- assert(tree->refcount.IsMutable());
839
- const bool edge_is_mutable = edge->refcount.IsMutable();
865
+ assert(tree->refcount.IsOne());
866
+ const bool edge_is_mutable = edge->refcount.IsOne();
840
867
 
841
868
  if (height-- == 0) {
842
869
  tree->edges_[pos.index] = ResizeEdge(edge, length, edge_is_mutable);
@@ -973,7 +1000,7 @@ char CordRepBtree::GetCharacter(size_t offset) const {
973
1000
  Span<char> CordRepBtree::GetAppendBufferSlow(size_t size) {
974
1001
  // The inlined version in `GetAppendBuffer()` deals with all heights <= 3.
975
1002
  assert(height() >= 4);
976
- assert(refcount.IsMutable());
1003
+ assert(refcount.IsOne());
977
1004
 
978
1005
  // Build a stack of nodes we may potentially need to update if we find a
979
1006
  // non-shared FLAT with capacity at the leaf level.
@@ -982,13 +1009,13 @@ Span<char> CordRepBtree::GetAppendBufferSlow(size_t size) {
982
1009
  CordRepBtree* stack[kMaxDepth];
983
1010
  for (int i = 0; i < depth; ++i) {
984
1011
  node = node->Edge(kBack)->btree();
985
- if (!node->refcount.IsMutable()) return {};
1012
+ if (!node->refcount.IsOne()) return {};
986
1013
  stack[i] = node;
987
1014
  }
988
1015
 
989
1016
  // Must be a privately owned, mutable flat.
990
1017
  CordRep* const edge = node->Edge(kBack);
991
- if (!edge->refcount.IsMutable() || edge->tag < FLAT) return {};
1018
+ if (!edge->refcount.IsOne() || edge->tag < FLAT) return {};
992
1019
 
993
1020
  // Must have capacity.
994
1021
  const size_t avail = edge->flat()->Capacity() - edge->length;
@@ -1123,6 +1150,79 @@ CordRepBtree* CordRepBtree::Rebuild(CordRepBtree* tree) {
1123
1150
  return nullptr;
1124
1151
  }
1125
1152
 
1153
+ CordRepBtree::ExtractResult CordRepBtree::ExtractAppendBuffer(
1154
+ CordRepBtree* tree, size_t extra_capacity) {
1155
+ int depth = 0;
1156
+ NodeStack stack;
1157
+
1158
+ // Set up default 'no success' result which is {tree, nullptr}.
1159
+ ExtractResult result;
1160
+ result.tree = tree;
1161
+ result.extracted = nullptr;
1162
+
1163
+ // Dive down the right side of the tree, making sure no edges are shared.
1164
+ while (tree->height() > 0) {
1165
+ if (!tree->refcount.IsOne()) return result;
1166
+ stack[depth++] = tree;
1167
+ tree = tree->Edge(kBack)->btree();
1168
+ }
1169
+ if (!tree->refcount.IsOne()) return result;
1170
+
1171
+ // Validate we ended on a non shared flat.
1172
+ CordRep* rep = tree->Edge(kBack);
1173
+ if (!(rep->IsFlat() && rep->refcount.IsOne())) return result;
1174
+
1175
+ // Verify it has at least the requested extra capacity.
1176
+ CordRepFlat* flat = rep->flat();
1177
+ const size_t length = flat->length;
1178
+ const size_t avail = flat->Capacity() - flat->length;
1179
+ if (extra_capacity > avail) return result;
1180
+
1181
+ // Set the extracted flat in the result.
1182
+ result.extracted = flat;
1183
+
1184
+ // Cascading delete all nodes that become empty.
1185
+ while (tree->size() == 1) {
1186
+ CordRepBtree::Delete(tree);
1187
+ if (--depth < 0) {
1188
+ // We consumed the entire tree: return nullptr for new tree.
1189
+ result.tree = nullptr;
1190
+ return result;
1191
+ }
1192
+ rep = tree;
1193
+ tree = stack[depth];
1194
+ }
1195
+
1196
+ // Remove the edge or cascaded up parent node.
1197
+ tree->set_end(tree->end() - 1);
1198
+ tree->length -= length;
1199
+
1200
+ // Adjust lengths up the tree.
1201
+ while (depth > 0) {
1202
+ tree = stack[--depth];
1203
+ tree->length -= length;
1204
+ }
1205
+
1206
+ // Remove unnecessary top nodes with size = 1. This may iterate all the way
1207
+ // down to the leaf node in which case we simply return the remaining last
1208
+ // edge in that node and the extracted flat.
1209
+ while (tree->size() == 1) {
1210
+ int height = tree->height();
1211
+ rep = tree->Edge(kBack);
1212
+ Delete(tree);
1213
+ if (height == 0) {
1214
+ // We consumed the leaf: return the sole data edge as the new tree.
1215
+ result.tree = rep;
1216
+ return result;
1217
+ }
1218
+ tree = rep->btree();
1219
+ }
1220
+
1221
+ // Done: return the (new) top level node and extracted flat.
1222
+ result.tree = tree;
1223
+ return result;
1224
+ }
1225
+
1126
1226
  } // namespace cord_internal
1127
1227
  ABSL_NAMESPACE_END
1128
1228
  } // namespace absl
@@ -22,6 +22,7 @@
22
22
  #include "absl/base/config.h"
23
23
  #include "absl/base/internal/raw_logging.h"
24
24
  #include "absl/base/optimization.h"
25
+ #include "absl/strings/internal/cord_data_edge.h"
25
26
  #include "absl/strings/internal/cord_internal.h"
26
27
  #include "absl/strings/internal/cord_rep_flat.h"
27
28
  #include "absl/strings/string_view.h"
@@ -163,6 +164,9 @@ class CordRepBtree : public CordRep {
163
164
  // typically after a ref_count.Decrement() on the last reference count.
164
165
  static void Destroy(CordRepBtree* tree);
165
166
 
167
+ // Destruction
168
+ static void Delete(CordRepBtree* tree) { delete tree; }
169
+
166
170
  // Use CordRep::Unref() as we overload for absl::Span<CordRep* const>.
167
171
  using CordRep::Unref;
168
172
 
@@ -240,11 +244,41 @@ class CordRepBtree : public CordRep {
240
244
  // length of the flat node and involved tree nodes have been increased by
241
245
  // `span.length()`. The caller is responsible for immediately assigning values
242
246
  // to all uninitialized data reference by the returned span.
243
- // Requires `this->refcount.IsMutable()`: this function forces the
244
- // caller to do this fast path check on the top level node, as this is the
245
- // most commonly shared node of a cord tree.
247
+ // Requires `this->refcount.IsOne()`: this function forces the caller to do
248
+ // this fast path check on the top level node, as this is the most commonly
249
+ // shared node of a cord tree.
246
250
  Span<char> GetAppendBuffer(size_t size);
247
251
 
252
+ // Extracts the right-most data edge from this tree iff:
253
+ // - the tree and all internal edges to the right-most node are not shared.
254
+ // - the right-most node is a FLAT node and not shared.
255
+ // - the right-most node has at least the desired extra capacity.
256
+ //
257
+ // Returns {tree, nullptr} if any of the above conditions are not met.
258
+ // This method effectively removes data from the tree. The intent of this
259
+ // method is to allow applications appending small string data to use
260
+ // pre-existing capacity, and add the modified rep back to the tree.
261
+ //
262
+ // Simplified such code would look similar to this:
263
+ // void MyTreeBuilder::Append(string_view data) {
264
+ // ExtractResult result = CordRepBtree::ExtractAppendBuffer(tree_, 1);
265
+ // if (CordRep* rep = result.extracted) {
266
+ // size_t available = rep->Capacity() - rep->length;
267
+ // size_t n = std::min(data.size(), n);
268
+ // memcpy(rep->Data(), data.data(), n);
269
+ // rep->length += n;
270
+ // data.remove_prefix(n);
271
+ // if (!result.tree->IsBtree()) {
272
+ // tree_ = CordRepBtree::Create(result.tree);
273
+ // }
274
+ // tree_ = CordRepBtree::Append(tree_, rep);
275
+ // }
276
+ // ...
277
+ // // Remaining edge in `result.tree`.
278
+ // }
279
+ static ExtractResult ExtractAppendBuffer(CordRepBtree* tree,
280
+ size_t extra_capacity = 1);
281
+
248
282
  // Returns the `height` of the tree. The height of a tree is limited to
249
283
  // kMaxHeight. `height` is implemented as an `int` as in some places we
250
284
  // use negative (-1) values for 'data edges'.
@@ -277,13 +311,6 @@ class CordRepBtree : public CordRep {
277
311
  // Requires this instance to be a leaf node, and `index` to be valid index.
278
312
  inline absl::string_view Data(size_t index) const;
279
313
 
280
- static const char* EdgeDataPtr(const CordRep* r);
281
- static absl::string_view EdgeData(const CordRep* r);
282
-
283
- // Returns true if the provided rep is a FLAT, EXTERNAL or a SUBSTRING node
284
- // holding a FLAT or EXTERNAL child rep.
285
- static bool IsDataEdge(const CordRep* rep);
286
-
287
314
  // Diagnostics: returns true if `tree` is valid and internally consistent.
288
315
  // If `shallow` is false, then the provided top level node and all child nodes
289
316
  // below it are recursively checked. If `shallow` is true, only the provided
@@ -410,12 +437,6 @@ class CordRepBtree : public CordRep {
410
437
  // Requires `offset` < length.
411
438
  Position IndexBeyond(size_t offset) const;
412
439
 
413
- // Destruction
414
- static void DestroyLeaf(CordRepBtree* tree, size_t begin, size_t end);
415
- static void DestroyNonLeaf(CordRepBtree* tree, size_t begin, size_t end);
416
- static void DestroyTree(CordRepBtree* tree, size_t begin, size_t end);
417
- static void Delete(CordRepBtree* tree) { delete tree; }
418
-
419
440
  // Creates a new leaf node containing as much data as possible from `data`.
420
441
  // The data is added either forwards or reversed depending on `edge_type`.
421
442
  // Callers must check the length of the returned node to determine if all data
@@ -604,34 +625,11 @@ inline absl::Span<CordRep* const> CordRepBtree::Edges(size_t begin,
604
625
  return {edges_ + begin, static_cast<size_t>(end - begin)};
605
626
  }
606
627
 
607
- inline const char* CordRepBtree::EdgeDataPtr(const CordRep* r) {
608
- assert(IsDataEdge(r));
609
- size_t offset = 0;
610
- if (r->tag == SUBSTRING) {
611
- offset = r->substring()->start;
612
- r = r->substring()->child;
613
- }
614
- return (r->tag >= FLAT ? r->flat()->Data() : r->external()->base) + offset;
615
- }
616
-
617
- inline absl::string_view CordRepBtree::EdgeData(const CordRep* r) {
618
- return absl::string_view(EdgeDataPtr(r), r->length);
619
- }
620
-
621
628
  inline absl::string_view CordRepBtree::Data(size_t index) const {
622
629
  assert(height() == 0);
623
630
  return EdgeData(Edge(index));
624
631
  }
625
632
 
626
- inline bool CordRepBtree::IsDataEdge(const CordRep* rep) {
627
- // The fast path is that `rep` is an EXTERNAL or FLAT node, making the below
628
- // if a single, well predicted branch. We then repeat the FLAT or EXTERNAL
629
- // check in the slow path the SUBSTRING check to optimize for the hot path.
630
- if (rep->tag == EXTERNAL || rep->tag >= FLAT) return true;
631
- if (rep->tag == SUBSTRING) rep = rep->substring()->child;
632
- return rep->tag == EXTERNAL || rep->tag >= FLAT;
633
- }
634
-
635
633
  inline CordRepBtree* CordRepBtree::New(int height) {
636
634
  CordRepBtree* tree = new CordRepBtree;
637
635
  tree->length = 0;
@@ -659,19 +657,6 @@ inline CordRepBtree* CordRepBtree::New(CordRepBtree* front,
659
657
  return tree;
660
658
  }
661
659
 
662
- inline void CordRepBtree::DestroyTree(CordRepBtree* tree, size_t begin,
663
- size_t end) {
664
- if (tree->height() == 0) {
665
- DestroyLeaf(tree, begin, end);
666
- } else {
667
- DestroyNonLeaf(tree, begin, end);
668
- }
669
- }
670
-
671
- inline void CordRepBtree::Destroy(CordRepBtree* tree) {
672
- DestroyTree(tree, tree->begin(), tree->end());
673
- }
674
-
675
660
  inline void CordRepBtree::Unref(absl::Span<CordRep* const> edges) {
676
661
  for (CordRep* edge : edges) {
677
662
  if (ABSL_PREDICT_FALSE(!edge->refcount.Decrement())) {
@@ -731,7 +716,7 @@ inline void CordRepBtree::AlignBegin() {
731
716
  // size, and then do overlapping load/store of up to 4 pointers (inlined as
732
717
  // XMM, YMM or ZMM load/store) and up to 2 pointers (XMM / YMM), which is a)
733
718
  // compact and b) not clobbering any registers.
734
- ABSL_INTERNAL_ASSUME(new_end <= kMaxCapacity);
719
+ ABSL_ASSUME(new_end <= kMaxCapacity);
735
720
  #ifdef __clang__
736
721
  #pragma unroll 1
737
722
  #endif
@@ -749,7 +734,7 @@ inline void CordRepBtree::AlignEnd() {
749
734
  const size_t new_end = end() + delta;
750
735
  set_begin(new_begin);
751
736
  set_end(new_end);
752
- ABSL_INTERNAL_ASSUME(new_end <= kMaxCapacity);
737
+ ABSL_ASSUME(new_end <= kMaxCapacity);
753
738
  #ifdef __clang__
754
739
  #pragma unroll 1
755
740
  #endif
@@ -849,7 +834,7 @@ inline CordRepBtree* CordRepBtree::Create(CordRep* rep) {
849
834
  }
850
835
 
851
836
  inline Span<char> CordRepBtree::GetAppendBuffer(size_t size) {
852
- assert(refcount.IsMutable());
837
+ assert(refcount.IsOne());
853
838
  CordRepBtree* tree = this;
854
839
  const int height = this->height();
855
840
  CordRepBtree* n1 = tree;
@@ -858,21 +843,21 @@ inline Span<char> CordRepBtree::GetAppendBuffer(size_t size) {
858
843
  switch (height) {
859
844
  case 3:
860
845
  tree = tree->Edge(kBack)->btree();
861
- if (!tree->refcount.IsMutable()) return {};
846
+ if (!tree->refcount.IsOne()) return {};
862
847
  n2 = tree;
863
848
  ABSL_FALLTHROUGH_INTENDED;
864
849
  case 2:
865
850
  tree = tree->Edge(kBack)->btree();
866
- if (!tree->refcount.IsMutable()) return {};
851
+ if (!tree->refcount.IsOne()) return {};
867
852
  n1 = tree;
868
853
  ABSL_FALLTHROUGH_INTENDED;
869
854
  case 1:
870
855
  tree = tree->Edge(kBack)->btree();
871
- if (!tree->refcount.IsMutable()) return {};
856
+ if (!tree->refcount.IsOne()) return {};
872
857
  ABSL_FALLTHROUGH_INTENDED;
873
858
  case 0:
874
859
  CordRep* edge = tree->Edge(kBack);
875
- if (!edge->refcount.IsMutable()) return {};
860
+ if (!edge->refcount.IsOne()) return {};
876
861
  if (edge->tag < FLAT) return {};
877
862
  size_t avail = edge->flat()->Capacity() - edge->length;
878
863
  if (avail == 0) return {};
@@ -16,6 +16,7 @@
16
16
 
17
17
  #include <cassert>
18
18
 
19
+ #include "absl/strings/internal/cord_data_edge.h"
19
20
  #include "absl/strings/internal/cord_internal.h"
20
21
  #include "absl/strings/internal/cord_rep_btree.h"
21
22
 
@@ -39,7 +40,7 @@ inline CordRep* Substring(CordRep* rep, size_t offset, size_t n) {
39
40
  assert(n <= rep->length);
40
41
  assert(offset < rep->length);
41
42
  assert(offset <= rep->length - n);
42
- assert(CordRepBtree::IsDataEdge(rep));
43
+ assert(IsDataEdge(rep));
43
44
 
44
45
  if (n == 0) return nullptr;
45
46
  if (n == rep->length) return CordRep::Ref(rep);
@@ -49,6 +50,7 @@ inline CordRep* Substring(CordRep* rep, size_t offset, size_t n) {
49
50
  rep = rep->substring()->child;
50
51
  }
51
52
 
53
+ assert(rep->IsExternal() || rep->IsFlat());
52
54
  CordRepSubstring* substring = new CordRepSubstring();
53
55
  substring->length = n;
54
56
  substring->tag = SUBSTRING;
@@ -143,8 +143,8 @@ class CordRepBtreeNavigator {
143
143
  // `index_` and `node_` contain the navigation state as the 'path' to the
144
144
  // current data edge which is at `node_[0]->Edge(index_[0])`. The contents
145
145
  // of these are undefined until the instance is initialized (`height_ >= 0`).
146
- uint8_t index_[CordRepBtree::kMaxHeight];
147
- CordRepBtree* node_[CordRepBtree::kMaxHeight];
146
+ uint8_t index_[CordRepBtree::kMaxDepth];
147
+ CordRepBtree* node_[CordRepBtree::kMaxDepth];
148
148
  };
149
149
 
150
150
  // Returns true if this instance is not empty.
@@ -173,6 +173,7 @@ template <CordRepBtree::EdgeType edge_type>
173
173
  inline CordRep* CordRepBtreeNavigator::Init(CordRepBtree* tree) {
174
174
  assert(tree != nullptr);
175
175
  assert(tree->size() > 0);
176
+ assert(tree->height() <= CordRepBtree::kMaxHeight);
176
177
  int height = height_ = tree->height();
177
178
  size_t index = tree->index(edge_type);
178
179
  node_[height] = tree;
@@ -206,6 +207,7 @@ inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::Seek(
206
207
  inline CordRepBtreeNavigator::Position CordRepBtreeNavigator::InitOffset(
207
208
  CordRepBtree* tree, size_t offset) {
208
209
  assert(tree != nullptr);
210
+ assert(tree->height() <= CordRepBtree::kMaxHeight);
209
211
  if (ABSL_PREDICT_FALSE(offset >= tree->length)) return {nullptr, 0};
210
212
  height_ = tree->height();
211
213
  node_[height_] = tree;
@@ -17,6 +17,7 @@
17
17
  #include <cassert>
18
18
 
19
19
  #include "absl/base/config.h"
20
+ #include "absl/strings/internal/cord_data_edge.h"
20
21
  #include "absl/strings/internal/cord_internal.h"
21
22
  #include "absl/strings/internal/cord_rep_btree.h"
22
23
  #include "absl/strings/internal/cord_rep_btree_navigator.h"
@@ -44,7 +45,7 @@ absl::string_view CordRepBtreeReader::Read(size_t n, size_t chunk_size,
44
45
  // can directly return the substring into the current data edge as the next
45
46
  // chunk. We can easily establish from the above code that `navigator_.Next()`
46
47
  // has not been called as that requires `chunk_size` to be zero.
47
- if (n < chunk_size) return CordRepBtree::EdgeData(edge).substr(result.n);
48
+ if (n < chunk_size) return EdgeData(edge).substr(result.n);
48
49
 
49
50
  // The amount of data taken from the last edge is `chunk_size` and `result.n`
50
51
  // contains the offset into the current edge trailing the read data (which can
@@ -60,7 +61,7 @@ absl::string_view CordRepBtreeReader::Read(size_t n, size_t chunk_size,
60
61
  // We did not read all data, return remaining data from current edge.
61
62
  edge = navigator_.Current();
62
63
  remaining_ -= consumed_by_read + edge->length;
63
- return CordRepBtree::EdgeData(edge).substr(result.n);
64
+ return EdgeData(edge).substr(result.n);
64
65
  }
65
66
 
66
67
  } // namespace cord_internal
@@ -18,6 +18,7 @@
18
18
  #include <cassert>
19
19
 
20
20
  #include "absl/base/config.h"
21
+ #include "absl/strings/internal/cord_data_edge.h"
21
22
  #include "absl/strings/internal/cord_internal.h"
22
23
  #include "absl/strings/internal/cord_rep_btree.h"
23
24
  #include "absl/strings/internal/cord_rep_btree_navigator.h"
@@ -167,7 +168,7 @@ inline absl::string_view CordRepBtreeReader::Init(CordRepBtree* tree) {
167
168
  assert(tree != nullptr);
168
169
  const CordRep* edge = navigator_.InitFirst(tree);
169
170
  remaining_ = tree->length - edge->length;
170
- return CordRepBtree::EdgeData(edge);
171
+ return EdgeData(edge);
171
172
  }
172
173
 
173
174
  inline absl::string_view CordRepBtreeReader::Next() {
@@ -175,7 +176,7 @@ inline absl::string_view CordRepBtreeReader::Next() {
175
176
  const CordRep* edge = navigator_.Next();
176
177
  assert(edge != nullptr);
177
178
  remaining_ -= edge->length;
178
- return CordRepBtree::EdgeData(edge);
179
+ return EdgeData(edge);
179
180
  }
180
181
 
181
182
  inline absl::string_view CordRepBtreeReader::Skip(size_t skip) {
@@ -190,7 +191,7 @@ inline absl::string_view CordRepBtreeReader::Skip(size_t skip) {
190
191
  // The combined length of all edges skipped before `pos.edge` is `skip -
191
192
  // pos.offset`, all of which are 'consumed', as well as the current edge.
192
193
  remaining_ -= skip - pos.offset + pos.edge->length;
193
- return CordRepBtree::EdgeData(pos.edge).substr(pos.offset);
194
+ return EdgeData(pos.edge).substr(pos.offset);
194
195
  }
195
196
 
196
197
  inline absl::string_view CordRepBtreeReader::Seek(size_t offset) {
@@ -199,7 +200,7 @@ inline absl::string_view CordRepBtreeReader::Seek(size_t offset) {
199
200
  remaining_ = 0;
200
201
  return {};
201
202
  }
202
- absl::string_view chunk = CordRepBtree::EdgeData(pos.edge).substr(pos.offset);
203
+ absl::string_view chunk = EdgeData(pos.edge).substr(pos.offset);
203
204
  remaining_ = length() - offset - chunk.length();
204
205
  return chunk;
205
206
  }