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
@@ -0,0 +1,572 @@
1
+ // Copyright 2021 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ //
15
+ // -----------------------------------------------------------------------------
16
+ // File: cord_buffer.h
17
+ // -----------------------------------------------------------------------------
18
+ //
19
+ // This file defines an `absl::CordBuffer` data structure to hold data for
20
+ // eventual inclusion within an existing `Cord` data structure. Cord buffers are
21
+ // useful for building large Cords that may require custom allocation of its
22
+ // associated memory.
23
+ //
24
+ #ifndef ABSL_STRINGS_CORD_BUFFER_H_
25
+ #define ABSL_STRINGS_CORD_BUFFER_H_
26
+
27
+ #include <algorithm>
28
+ #include <cassert>
29
+ #include <cstddef>
30
+ #include <cstdint>
31
+ #include <memory>
32
+ #include <utility>
33
+
34
+ #include "absl/base/config.h"
35
+ #include "absl/base/macros.h"
36
+ #include "absl/numeric/bits.h"
37
+ #include "absl/strings/internal/cord_internal.h"
38
+ #include "absl/strings/internal/cord_rep_flat.h"
39
+ #include "absl/types/span.h"
40
+
41
+ namespace absl {
42
+ ABSL_NAMESPACE_BEGIN
43
+
44
+ class Cord;
45
+ class CordBufferTestPeer;
46
+
47
+ // CordBuffer
48
+ //
49
+ // CordBuffer manages memory buffers for purposes such as zero-copy APIs as well
50
+ // as applications building cords with large data requiring granular control
51
+ // over the allocation and size of cord data. For example, a function creating
52
+ // a cord of random data could use a CordBuffer as follows:
53
+ //
54
+ // absl::Cord CreateRandomCord(size_t length) {
55
+ // absl::Cord cord;
56
+ // while (length > 0) {
57
+ // CordBuffer buffer = CordBuffer::CreateWithDefaultLimit(length);
58
+ // absl::Span<char> data = buffer.available_up_to(length);
59
+ // FillRandomValues(data.data(), data.size());
60
+ // buffer.IncreaseLengthBy(data.size());
61
+ // cord.Append(std::move(buffer));
62
+ // length -= data.size();
63
+ // }
64
+ // return cord;
65
+ // }
66
+ //
67
+ // CordBuffer instances are by default limited to a capacity of `kDefaultLimit`
68
+ // bytes. `kDefaultLimit` is currently just under 4KiB, but this default may
69
+ // change in the future and/or for specific architectures. The default limit is
70
+ // aimed to provide a good trade-off between performance and memory overhead.
71
+ // Smaller buffers typically incur more compute cost while larger buffers are
72
+ // more CPU efficient but create significant memory overhead because of such
73
+ // allocations being less granular. Using larger buffers may also increase the
74
+ // risk of memory fragmentation.
75
+ //
76
+ // Applications create a buffer using one of the `CreateWithDefaultLimit()` or
77
+ // `CreateWithCustomLimit()` methods. The returned instance will have a non-zero
78
+ // capacity and a zero length. Applications use the `data()` method to set the
79
+ // contents of the managed memory, and once done filling the buffer, use the
80
+ // `IncreaseLengthBy()` or 'SetLength()' method to specify the length of the
81
+ // initialized data before adding the buffer to a Cord.
82
+ //
83
+ // The `CreateWithCustomLimit()` method is intended for applications needing
84
+ // larger buffers than the default memory limit, allowing the allocation of up
85
+ // to a capacity of `kCustomLimit` bytes minus some minimum internal overhead.
86
+ // The usage of `CreateWithCustomLimit()` should be limited to only those use
87
+ // cases where the distribution of the input is relatively well known, and/or
88
+ // where the trade-off between the efficiency gains outweigh the risk of memory
89
+ // fragmentation. See the documentation for `CreateWithCustomLimit()` for more
90
+ // information on using larger custom limits.
91
+ //
92
+ // The capacity of a `CordBuffer` returned by one of the `Create` methods may
93
+ // be larger than the requested capacity due to rounding, alignment and
94
+ // granularity of the memory allocator. Applications should use the `capacity`
95
+ // method to obtain the effective capacity of the returned instance as
96
+ // demonstrated in the provided example above.
97
+ //
98
+ // CordBuffer is a move-only class. All references into the managed memory are
99
+ // invalidated when an instance is moved into either another CordBuffer instance
100
+ // or a Cord. Writing to a location obtained by a previous call to `data()`
101
+ // after an instance was moved will lead to undefined behavior.
102
+ //
103
+ // A `moved from` CordBuffer instance will have a valid, but empty state.
104
+ // CordBuffer is thread compatible.
105
+ class CordBuffer {
106
+ public:
107
+ // kDefaultLimit
108
+ //
109
+ // Default capacity limits of allocated CordBuffers.
110
+ // See the class comments for more information on allocation limits.
111
+ static constexpr size_t kDefaultLimit = cord_internal::kMaxFlatLength;
112
+
113
+ // kCustomLimit
114
+ //
115
+ // Maximum size for CreateWithCustomLimit() allocated buffers.
116
+ // Note that the effective capacity may be slightly less
117
+ // because of internal overhead of internal cord buffers.
118
+ static constexpr size_t kCustomLimit = 64U << 10;
119
+
120
+ // Constructors, Destructors and Assignment Operators
121
+
122
+ // Creates an empty CordBuffer.
123
+ CordBuffer() = default;
124
+
125
+ // Destroys this CordBuffer instance and, if not empty, releases any memory
126
+ // managed by this instance, invalidating previously returned references.
127
+ ~CordBuffer();
128
+
129
+ // CordBuffer is move-only
130
+ CordBuffer(CordBuffer&& rhs) noexcept;
131
+ CordBuffer& operator=(CordBuffer&&) noexcept;
132
+ CordBuffer(const CordBuffer&) = delete;
133
+ CordBuffer& operator=(const CordBuffer&) = delete;
134
+
135
+ // CordBuffer::MaximumPayload()
136
+ //
137
+ // Returns the guaranteed maximum payload for a CordBuffer returned by the
138
+ // `CreateWithDefaultLimit()` method. While small, each internal buffer inside
139
+ // a Cord incurs an overhead to manage the length, type and reference count
140
+ // for the buffer managed inside the cord tree. Applications can use this
141
+ // method to get approximate number of buffers required for a given byte
142
+ // size, etc.
143
+ //
144
+ // For example:
145
+ // const size_t payload = absl::CordBuffer::MaximumPayload();
146
+ // const size_t buffer_count = (total_size + payload - 1) / payload;
147
+ // buffers.reserve(buffer_count);
148
+ static constexpr size_t MaximumPayload();
149
+
150
+ // Overload to the above `MaximumPayload()` except that it returns the
151
+ // maximum payload for a CordBuffer returned by the `CreateWithCustomLimit()`
152
+ // method given the provided `block_size`.
153
+ static constexpr size_t MaximumPayload(size_t block_size);
154
+
155
+ // CordBuffer::CreateWithDefaultLimit()
156
+ //
157
+ // Creates a CordBuffer instance of the desired `capacity`, capped at the
158
+ // default limit `kDefaultLimit`. The returned buffer has a guaranteed
159
+ // capacity of at least `min(kDefaultLimit, capacity)`. See the class comments
160
+ // for more information on buffer capacities and intended usage.
161
+ static CordBuffer CreateWithDefaultLimit(size_t capacity);
162
+
163
+
164
+ // CordBuffer::CreateWithCustomLimit()
165
+ //
166
+ // Creates a CordBuffer instance of the desired `capacity` rounded to an
167
+ // appropriate power of 2 size less than, or equal to `block_size`.
168
+ // Requires `block_size` to be a power of 2.
169
+ //
170
+ // If `capacity` is less than or equal to `kDefaultLimit`, then this method
171
+ // behaves identical to `CreateWithDefaultLimit`, which means that the caller
172
+ // is guaranteed to get a buffer of at least the requested capacity.
173
+ //
174
+ // If `capacity` is greater than or equal to `block_size`, then this method
175
+ // returns a buffer with an `allocated size` of `block_size` bytes. Otherwise,
176
+ // this methods returns a buffer with a suitable smaller power of 2 block size
177
+ // to satisfy the request. The actual size depends on a number of factors, and
178
+ // is typically (but not necessarily) the highest or second highest power of 2
179
+ // value less than or equal to `capacity`.
180
+ //
181
+ // The 'allocated size' includes a small amount of overhead required for
182
+ // internal state, which is currently 13 bytes on 64-bit platforms. For
183
+ // example: a buffer created with `block_size` and `capacity' set to 8KiB
184
+ // will have an allocated size of 8KiB, and an effective internal `capacity`
185
+ // of 8KiB - 13 = 8179 bytes.
186
+ //
187
+ // To demonstrate this in practice, let's assume we want to read data from
188
+ // somewhat larger files using approximately 64KiB buffers:
189
+ //
190
+ // absl::Cord ReadFromFile(int fd, size_t n) {
191
+ // absl::Cord cord;
192
+ // while (n > 0) {
193
+ // CordBuffer buffer = CordBuffer::CreateWithCustomLimit(64 << 10, n);
194
+ // absl::Span<char> data = buffer.available_up_to(n);
195
+ // ReadFileDataOrDie(fd, data.data(), data.size());
196
+ // buffer.IncreaseLengthBy(data.size());
197
+ // cord.Append(std::move(buffer));
198
+ // n -= data.size();
199
+ // }
200
+ // return cord;
201
+ // }
202
+ //
203
+ // If we'd use this function to read a file of 659KiB, we may get the
204
+ // following pattern of allocated cord buffer sizes:
205
+ //
206
+ // CreateWithCustomLimit(64KiB, 674816) --> ~64KiB (65523)
207
+ // CreateWithCustomLimit(64KiB, 674816) --> ~64KiB (65523)
208
+ // ...
209
+ // CreateWithCustomLimit(64KiB, 19586) --> ~16KiB (16371)
210
+ // CreateWithCustomLimit(64KiB, 3215) --> 3215 (at least 3215)
211
+ //
212
+ // The reason the method returns a 16K buffer instead of a roughly 19K buffer
213
+ // is to reduce memory overhead and fragmentation risks. Using carefully
214
+ // chosen power of 2 values reduces the entropy of allocated memory sizes.
215
+ //
216
+ // Additionally, let's assume we'd use the above function on files that are
217
+ // generally smaller than 64K. If we'd use 'precise' sized buffers for such
218
+ // files, than we'd get a very wide distribution of allocated memory sizes
219
+ // rounded to 4K page sizes, and we'd end up with a lot of unused capacity.
220
+ //
221
+ // In general, application should only use custom sizes if the data they are
222
+ // consuming or storing is expected to be many times the chosen block size,
223
+ // and be based on objective data and performance metrics. For example, a
224
+ // compress function may work faster and consume less CPU when using larger
225
+ // buffers. Such an application should pick a size offering a reasonable
226
+ // trade-off between expected data size, compute savings with larger buffers,
227
+ // and the cost or fragmentation effect of larger buffers.
228
+ // Applications must pick a reasonable spot on that curve, and make sure their
229
+ // data meets their expectations in size distributions such as "mostly large".
230
+ static CordBuffer CreateWithCustomLimit(size_t block_size, size_t capacity);
231
+
232
+ // CordBuffer::available()
233
+ //
234
+ // Returns the span delineating the available capacity in this buffer
235
+ // which is defined as `{ data() + length(), capacity() - length() }`.
236
+ absl::Span<char> available();
237
+
238
+ // CordBuffer::available_up_to()
239
+ //
240
+ // Returns the span delineating the available capacity in this buffer limited
241
+ // to `size` bytes. This is equivalent to `available().subspan(0, size)`.
242
+ absl::Span<char> available_up_to(size_t size);
243
+
244
+ // CordBuffer::data()
245
+ //
246
+ // Returns a non-null reference to the data managed by this instance.
247
+ // Applications are allowed to write up to `capacity` bytes of instance data.
248
+ // CordBuffer data is uninitialized by default. Reading data from an instance
249
+ // that has not yet been initialized will lead to undefined behavior.
250
+ char* data();
251
+ const char* data() const;
252
+
253
+ // CordBuffer::length()
254
+ //
255
+ // Returns the length of this instance. The default length of a CordBuffer is
256
+ // 0, indicating an 'empty' CordBuffer. Applications must specify the length
257
+ // of the data in a CordBuffer before adding it to a Cord.
258
+ size_t length() const;
259
+
260
+ // CordBuffer::capacity()
261
+ //
262
+ // Returns the capacity of this instance. All instances have a non-zero
263
+ // capacity: default and `moved from` instances have a small internal buffer.
264
+ size_t capacity() const;
265
+
266
+ // CordBuffer::IncreaseLengthBy()
267
+ //
268
+ // Increases the length of this buffer by the specified 'n' bytes.
269
+ // Applications must make sure all data in this buffer up to the new length
270
+ // has been initialized before adding a CordBuffer to a Cord: failure to do so
271
+ // will lead to undefined behavior. Requires `length() + n <= capacity()`.
272
+ // Typically, applications will use 'available_up_to()` to get a span of the
273
+ // desired capacity, and use `span.size()` to increase the length as in:
274
+ // absl::Span<char> span = buffer.available_up_to(desired);
275
+ // buffer.IncreaseLengthBy(span.size());
276
+ // memcpy(span.data(), src, span.size());
277
+ // etc...
278
+ void IncreaseLengthBy(size_t n);
279
+
280
+ // CordBuffer::SetLength()
281
+ //
282
+ // Sets the data length of this instance. Applications must make sure all data
283
+ // of the specified length has been initialized before adding a CordBuffer to
284
+ // a Cord: failure to do so will lead to undefined behavior.
285
+ // Setting the length to a small value or zero does not release any memory
286
+ // held by this CordBuffer instance. Requires `length <= capacity()`.
287
+ // Applications should preferably use the `IncreaseLengthBy()` method above
288
+ // in combination with the 'available()` or `available_up_to()` methods.
289
+ void SetLength(size_t length);
290
+
291
+ private:
292
+ // Make sure we don't accidentally over promise.
293
+ static_assert(kCustomLimit <= cord_internal::kMaxLargeFlatSize, "");
294
+
295
+ // Assume the cost of an 'uprounded' allocation to CeilPow2(size) versus
296
+ // the cost of allocating at least 1 extra flat <= 4KB:
297
+ // - Flat overhead = 13 bytes
298
+ // - Btree amortized cost / node =~ 13 bytes
299
+ // - 64 byte granularity of tcmalloc at 4K =~ 32 byte average
300
+ // CPU cost and efficiency requires we should at least 'save' something by
301
+ // splitting, as a poor man's measure, we say the slop needs to be
302
+ // at least double the cost offset to make it worth splitting: ~128 bytes.
303
+ static constexpr size_t kMaxPageSlop = 128;
304
+
305
+ // Overhead for allocation a flat.
306
+ static constexpr size_t kOverhead = cord_internal::kFlatOverhead;
307
+
308
+ using CordRepFlat = cord_internal::CordRepFlat;
309
+
310
+ // `Rep` is the internal data representation of a CordBuffer. The internal
311
+ // representation has an internal small size optimization similar to
312
+ // std::string (SSO).
313
+ struct Rep {
314
+ // Inline SSO size of a CordBuffer
315
+ static constexpr size_t kInlineCapacity = sizeof(intptr_t) * 2 - 1;
316
+
317
+ // Creates a default instance with kInlineCapacity.
318
+ Rep() : short_rep{} {}
319
+
320
+ // Creates an instance managing an allocated non zero CordRep.
321
+ explicit Rep(cord_internal::CordRepFlat* rep) : long_rep{rep} {
322
+ assert(rep != nullptr);
323
+ }
324
+
325
+ // Returns true if this instance manages the SSO internal buffer.
326
+ bool is_short() const {
327
+ constexpr size_t offset = offsetof(Short, raw_size);
328
+ return (reinterpret_cast<const char*>(this)[offset] & 1) != 0;
329
+ }
330
+
331
+ // Returns the available area of the internal SSO data
332
+ absl::Span<char> short_available() {
333
+ assert(is_short());
334
+ const size_t length = (short_rep.raw_size >> 1);
335
+ return absl::Span<char>(short_rep.data + length,
336
+ kInlineCapacity - length);
337
+ }
338
+
339
+ // Returns the available area of the internal SSO data
340
+ absl::Span<char> long_available() {
341
+ assert(!is_short());
342
+ const size_t length = long_rep.rep->length;
343
+ return absl::Span<char>(long_rep.rep->Data() + length,
344
+ long_rep.rep->Capacity() - length);
345
+ }
346
+
347
+ // Returns the length of the internal SSO data.
348
+ size_t short_length() const {
349
+ assert(is_short());
350
+ return short_rep.raw_size >> 1;
351
+ }
352
+
353
+ // Sets the length of the internal SSO data.
354
+ // Disregards any previously set CordRep instance.
355
+ void set_short_length(size_t length) {
356
+ short_rep.raw_size = static_cast<char>((length << 1) + 1);
357
+ }
358
+
359
+ // Adds `n` to the current short length.
360
+ void add_short_length(size_t n) {
361
+ assert(is_short());
362
+ short_rep.raw_size += static_cast<char>(n << 1);
363
+ }
364
+
365
+ // Returns reference to the internal SSO data buffer.
366
+ char* data() {
367
+ assert(is_short());
368
+ return short_rep.data;
369
+ }
370
+ const char* data() const {
371
+ assert(is_short());
372
+ return short_rep.data;
373
+ }
374
+
375
+ // Returns a pointer the external CordRep managed by this instance.
376
+ cord_internal::CordRepFlat* rep() const {
377
+ assert(!is_short());
378
+ return long_rep.rep;
379
+ }
380
+
381
+ // The internal representation takes advantage of the fact that allocated
382
+ // memory is always on an even address, and uses the least significant bit
383
+ // of the first or last byte (depending on endianness) as the inline size
384
+ // indicator overlapping with the least significant byte of the CordRep*.
385
+ #if defined(ABSL_IS_BIG_ENDIAN)
386
+ struct Long {
387
+ explicit Long(cord_internal::CordRepFlat* rep_arg) : rep(rep_arg) {}
388
+ void* padding;
389
+ cord_internal::CordRepFlat* rep;
390
+ };
391
+ struct Short {
392
+ char data[sizeof(Long) - 1];
393
+ char raw_size = 1;
394
+ };
395
+ #else
396
+ struct Long {
397
+ explicit Long(cord_internal::CordRepFlat* rep_arg) : rep(rep_arg) {}
398
+ cord_internal::CordRepFlat* rep;
399
+ void* padding;
400
+ };
401
+ struct Short {
402
+ char raw_size = 1;
403
+ char data[sizeof(Long) - 1];
404
+ };
405
+ #endif
406
+
407
+ union {
408
+ Long long_rep;
409
+ Short short_rep;
410
+ };
411
+ };
412
+
413
+ // Power2 functions
414
+ static bool IsPow2(size_t size) { return absl::has_single_bit(size); }
415
+ static size_t Log2Floor(size_t size) { return absl::bit_width(size) - 1; }
416
+ static size_t Log2Ceil(size_t size) { return absl::bit_width(size - 1); }
417
+
418
+ // Implementation of `CreateWithCustomLimit()`.
419
+ // This implementation allows for future memory allocation hints to
420
+ // be passed down into the CordRepFlat allocation function.
421
+ template <typename... AllocationHints>
422
+ static CordBuffer CreateWithCustomLimitImpl(size_t block_size,
423
+ size_t capacity,
424
+ AllocationHints... hints);
425
+
426
+ // Consumes the value contained in this instance and resets the instance.
427
+ // This method returns a non-null Cordrep* if the current instances manages a
428
+ // CordRep*, and resets the instance to an empty SSO instance. If the current
429
+ // instance is an SSO instance, then this method returns nullptr and sets
430
+ // `short_value` to the inlined data value. In either case, the current
431
+ // instance length is reset to zero.
432
+ // This method is intended to be used by Cord internal functions only.
433
+ cord_internal::CordRep* ConsumeValue(absl::string_view& short_value) {
434
+ cord_internal::CordRep* rep = nullptr;
435
+ if (rep_.is_short()) {
436
+ short_value = absl::string_view(rep_.data(), rep_.short_length());
437
+ } else {
438
+ rep = rep_.rep();
439
+ }
440
+ rep_.set_short_length(0);
441
+ return rep;
442
+ }
443
+
444
+ // Internal constructor.
445
+ explicit CordBuffer(cord_internal::CordRepFlat* rep) : rep_(rep) {
446
+ assert(rep != nullptr);
447
+ }
448
+
449
+ Rep rep_;
450
+
451
+ friend class Cord;
452
+ friend class CordBufferTestPeer;
453
+ };
454
+
455
+ inline constexpr size_t CordBuffer::MaximumPayload() {
456
+ return cord_internal::kMaxFlatLength;
457
+ }
458
+
459
+ inline constexpr size_t CordBuffer::MaximumPayload(size_t block_size) {
460
+ // TODO(absl-team): Use std::min when C++11 support is dropped.
461
+ return (kCustomLimit < block_size ? kCustomLimit : block_size) -
462
+ cord_internal::kFlatOverhead;
463
+ }
464
+
465
+ inline CordBuffer CordBuffer::CreateWithDefaultLimit(size_t capacity) {
466
+ if (capacity > Rep::kInlineCapacity) {
467
+ auto* rep = cord_internal::CordRepFlat::New(capacity);
468
+ rep->length = 0;
469
+ return CordBuffer(rep);
470
+ }
471
+ return CordBuffer();
472
+ }
473
+
474
+ template <typename... AllocationHints>
475
+ inline CordBuffer CordBuffer::CreateWithCustomLimitImpl(
476
+ size_t block_size, size_t capacity, AllocationHints... hints) {
477
+ assert(IsPow2(block_size));
478
+ capacity = (std::min)(capacity, kCustomLimit);
479
+ block_size = (std::min)(block_size, kCustomLimit);
480
+ if (capacity + kOverhead >= block_size) {
481
+ capacity = block_size;
482
+ } else if (capacity <= kDefaultLimit) {
483
+ capacity = capacity + kOverhead;
484
+ } else if (!IsPow2(capacity)) {
485
+ // Check if rounded up to next power 2 is a good enough fit
486
+ // with limited waste making it an acceptable direct fit.
487
+ const size_t rounded_up = size_t{1} << Log2Ceil(capacity);
488
+ const size_t slop = rounded_up - capacity;
489
+ if (slop >= kOverhead && slop <= kMaxPageSlop + kOverhead) {
490
+ capacity = rounded_up;
491
+ } else {
492
+ // Round down to highest power of 2 <= capacity.
493
+ // Consider a more aggressive step down if that may reduce the
494
+ // risk of fragmentation where 'people are holding it wrong'.
495
+ const size_t rounded_down = size_t{1} << Log2Floor(capacity);
496
+ capacity = rounded_down;
497
+ }
498
+ }
499
+ const size_t length = capacity - kOverhead;
500
+ auto* rep = CordRepFlat::New(CordRepFlat::Large(), length, hints...);
501
+ rep->length = 0;
502
+ return CordBuffer(rep);
503
+ }
504
+
505
+ inline CordBuffer CordBuffer::CreateWithCustomLimit(size_t block_size,
506
+ size_t capacity) {
507
+ return CreateWithCustomLimitImpl(block_size, capacity);
508
+ }
509
+
510
+ inline CordBuffer::~CordBuffer() {
511
+ if (!rep_.is_short()) {
512
+ cord_internal::CordRepFlat::Delete(rep_.rep());
513
+ }
514
+ }
515
+
516
+ inline CordBuffer::CordBuffer(CordBuffer&& rhs) noexcept : rep_(rhs.rep_) {
517
+ rhs.rep_.set_short_length(0);
518
+ }
519
+
520
+ inline CordBuffer& CordBuffer::operator=(CordBuffer&& rhs) noexcept {
521
+ if (!rep_.is_short()) cord_internal::CordRepFlat::Delete(rep_.rep());
522
+ rep_ = rhs.rep_;
523
+ rhs.rep_.set_short_length(0);
524
+ return *this;
525
+ }
526
+
527
+ inline absl::Span<char> CordBuffer::available() {
528
+ return rep_.is_short() ? rep_.short_available() : rep_.long_available();
529
+ }
530
+
531
+ inline absl::Span<char> CordBuffer::available_up_to(size_t size) {
532
+ return available().subspan(0, size);
533
+ }
534
+
535
+ inline char* CordBuffer::data() {
536
+ return rep_.is_short() ? rep_.data() : rep_.rep()->Data();
537
+ }
538
+
539
+ inline const char* CordBuffer::data() const {
540
+ return rep_.is_short() ? rep_.data() : rep_.rep()->Data();
541
+ }
542
+
543
+ inline size_t CordBuffer::capacity() const {
544
+ return rep_.is_short() ? Rep::kInlineCapacity : rep_.rep()->Capacity();
545
+ }
546
+
547
+ inline size_t CordBuffer::length() const {
548
+ return rep_.is_short() ? rep_.short_length() : rep_.rep()->length;
549
+ }
550
+
551
+ inline void CordBuffer::SetLength(size_t length) {
552
+ ABSL_HARDENING_ASSERT(length <= capacity());
553
+ if (rep_.is_short()) {
554
+ rep_.set_short_length(length);
555
+ } else {
556
+ rep_.rep()->length = length;
557
+ }
558
+ }
559
+
560
+ inline void CordBuffer::IncreaseLengthBy(size_t n) {
561
+ ABSL_HARDENING_ASSERT(n <= capacity() && length() + n <= capacity());
562
+ if (rep_.is_short()) {
563
+ rep_.add_short_length(n);
564
+ } else {
565
+ rep_.rep()->length += n;
566
+ }
567
+ }
568
+
569
+ ABSL_NAMESPACE_END
570
+ } // namespace absl
571
+
572
+ #endif // ABSL_STRINGS_CORD_BUFFER_H_
@@ -0,0 +1,63 @@
1
+ // Copyright 2022 The Abseil Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_STRINGS_INTERNAL_CORD_DATA_EDGE_H_
16
+ #define ABSL_STRINGS_INTERNAL_CORD_DATA_EDGE_H_
17
+
18
+ #include <cassert>
19
+ #include <cstddef>
20
+
21
+ #include "absl/base/config.h"
22
+ #include "absl/strings/internal/cord_internal.h"
23
+ #include "absl/strings/internal/cord_rep_flat.h"
24
+ #include "absl/strings/string_view.h"
25
+
26
+ namespace absl {
27
+ ABSL_NAMESPACE_BEGIN
28
+ namespace cord_internal {
29
+
30
+ // Returns true if the provided rep is a FLAT, EXTERNAL or a SUBSTRING node
31
+ // holding a FLAT or EXTERNAL child rep. Requires `rep != nullptr`.
32
+ inline bool IsDataEdge(const CordRep* edge) {
33
+ assert(edge != nullptr);
34
+
35
+ // The fast path is that `edge` is an EXTERNAL or FLAT node, making the below
36
+ // if a single, well predicted branch. We then repeat the FLAT or EXTERNAL
37
+ // check in the slow path of the SUBSTRING check to optimize for the hot path.
38
+ if (edge->tag == EXTERNAL || edge->tag >= FLAT) return true;
39
+ if (edge->tag == SUBSTRING) edge = edge->substring()->child;
40
+ return edge->tag == EXTERNAL || edge->tag >= FLAT;
41
+ }
42
+
43
+ // Returns the `absl::string_view` data reference for the provided data edge.
44
+ // Requires 'IsDataEdge(edge) == true`.
45
+ inline absl::string_view EdgeData(const CordRep* edge) {
46
+ assert(IsDataEdge(edge));
47
+
48
+ size_t offset = 0;
49
+ const size_t length = edge->length;
50
+ if (edge->IsSubstring()) {
51
+ offset = edge->substring()->start;
52
+ edge = edge->substring()->child;
53
+ }
54
+ return edge->tag >= FLAT
55
+ ? absl::string_view{edge->flat()->Data() + offset, length}
56
+ : absl::string_view{edge->external()->base + offset, length};
57
+ }
58
+
59
+ } // namespace cord_internal
60
+ ABSL_NAMESPACE_END
61
+ } // namespace absl
62
+
63
+ #endif // ABSL_STRINGS_INTERNAL_CORD_DATA_EDGE_H_