grpc 1.37.1 → 1.38.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 (544) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +64 -58
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +2 -2
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +5 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  35. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
  41. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  43. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  56. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  57. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
  58. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  62. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  63. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  64. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  65. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  66. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  67. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  68. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  72. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  76. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  77. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  78. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  80. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  83. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  86. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
  99. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  100. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  104. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  106. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  107. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  108. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  109. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  112. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  114. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  119. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  120. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  121. data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  125. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  126. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  127. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  128. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  129. data/src/core/ext/xds/xds_api.cc +101 -93
  130. data/src/core/ext/xds/xds_api.h +6 -6
  131. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  132. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  133. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  134. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  135. data/src/core/ext/xds/xds_channel_args.h +5 -2
  136. data/src/core/ext/xds/xds_client.cc +310 -178
  137. data/src/core/ext/xds/xds_client.h +41 -27
  138. data/src/core/ext/xds/xds_client_stats.h +3 -2
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  140. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  141. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  142. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
  143. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
  144. data/src/core/lib/channel/channel_stack.cc +10 -9
  145. data/src/core/lib/channel/channel_stack.h +10 -9
  146. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  147. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  148. data/src/core/lib/channel/channelz.cc +21 -13
  149. data/src/core/lib/channel/connected_channel.cc +4 -4
  150. data/src/core/lib/channel/handshaker.cc +7 -6
  151. data/src/core/lib/channel/handshaker.h +5 -5
  152. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  153. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  154. data/src/core/lib/gprpp/ref_counted.h +28 -14
  155. data/src/core/lib/gprpp/status_helper.cc +407 -0
  156. data/src/core/lib/gprpp/status_helper.h +180 -0
  157. data/src/core/lib/http/httpcli.cc +11 -11
  158. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  159. data/src/core/lib/http/parser.cc +16 -16
  160. data/src/core/lib/http/parser.h +4 -4
  161. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  162. data/src/core/lib/iomgr/buffer_list.h +4 -5
  163. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  164. data/src/core/lib/iomgr/call_combiner.h +12 -14
  165. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  166. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  167. data/src/core/lib/iomgr/closure.h +7 -6
  168. data/src/core/lib/iomgr/combiner.cc +14 -12
  169. data/src/core/lib/iomgr/combiner.h +2 -2
  170. data/src/core/lib/iomgr/endpoint.cc +1 -1
  171. data/src/core/lib/iomgr/endpoint.h +2 -2
  172. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  173. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  174. data/src/core/lib/iomgr/error.cc +167 -61
  175. data/src/core/lib/iomgr/error.h +217 -106
  176. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  177. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  178. data/src/core/lib/iomgr/error_internal.h +5 -1
  179. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  181. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  182. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  183. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  184. data/src/core/lib/iomgr/ev_posix.h +9 -9
  185. data/src/core/lib/iomgr/exec_ctx.cc +4 -4
  186. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  187. data/src/core/lib/iomgr/executor.cc +8 -8
  188. data/src/core/lib/iomgr/executor.h +2 -2
  189. data/src/core/lib/iomgr/iomgr.cc +1 -1
  190. data/src/core/lib/iomgr/iomgr.h +1 -1
  191. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  192. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  193. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  194. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  195. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  196. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  197. data/src/core/lib/iomgr/load_file.cc +4 -4
  198. data/src/core/lib/iomgr/load_file.h +2 -2
  199. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  200. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  201. data/src/core/lib/iomgr/pollset.cc +5 -5
  202. data/src/core/lib/iomgr/pollset.h +9 -9
  203. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  204. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  205. data/src/core/lib/iomgr/port.h +1 -1
  206. data/src/core/lib/iomgr/python_util.h +1 -1
  207. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  208. data/src/core/lib/iomgr/resolve_address.h +6 -6
  209. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  210. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  211. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  212. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  213. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  214. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  215. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  216. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  217. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  218. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  219. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  220. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  221. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  222. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  223. data/src/core/lib/iomgr/tcp_posix.cc +36 -34
  224. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  225. data/src/core/lib/iomgr/tcp_server.h +12 -11
  226. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  227. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  228. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  229. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  230. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  231. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  232. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  233. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  234. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  235. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  236. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  237. data/src/core/lib/iomgr/timer_custom.h +1 -1
  238. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  239. data/src/core/lib/iomgr/udp_server.cc +21 -20
  240. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  241. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  242. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  243. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  244. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  245. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  246. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  247. data/src/core/lib/iomgr/work_serializer.h +17 -1
  248. data/src/core/lib/json/json.h +1 -1
  249. data/src/core/lib/json/json_reader.cc +4 -4
  250. data/src/core/lib/matchers/matchers.cc +39 -39
  251. data/src/core/lib/matchers/matchers.h +28 -28
  252. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  253. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  254. data/src/core/lib/security/credentials/credentials.h +2 -2
  255. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  256. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  257. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  258. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  259. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  260. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  261. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  262. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  263. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  264. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  265. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  271. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  274. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  276. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  278. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  279. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  280. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  281. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  282. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  283. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  284. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  285. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  286. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  287. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  288. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  289. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  290. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  291. data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
  292. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  293. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  294. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  295. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  296. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  297. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  298. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  299. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  300. data/src/core/lib/security/transport/tsi_error.h +2 -1
  301. data/src/core/lib/security/util/json_util.cc +2 -2
  302. data/src/core/lib/security/util/json_util.h +1 -1
  303. data/src/core/lib/surface/call.cc +46 -45
  304. data/src/core/lib/surface/call.h +2 -2
  305. data/src/core/lib/surface/channel.cc +6 -6
  306. data/src/core/lib/surface/channel.h +3 -2
  307. data/src/core/lib/surface/channel_ping.cc +1 -1
  308. data/src/core/lib/surface/completion_queue.cc +46 -47
  309. data/src/core/lib/surface/completion_queue.h +2 -1
  310. data/src/core/lib/surface/lame_client.cc +11 -11
  311. data/src/core/lib/surface/lame_client.h +1 -1
  312. data/src/core/lib/surface/server.cc +28 -22
  313. data/src/core/lib/surface/server.h +16 -15
  314. data/src/core/lib/surface/validate_metadata.cc +7 -7
  315. data/src/core/lib/surface/validate_metadata.h +3 -2
  316. data/src/core/lib/surface/version.cc +4 -2
  317. data/src/core/lib/transport/byte_stream.cc +5 -5
  318. data/src/core/lib/transport/byte_stream.h +8 -8
  319. data/src/core/lib/transport/connectivity_state.cc +1 -1
  320. data/src/core/lib/transport/error_utils.cc +19 -8
  321. data/src/core/lib/transport/error_utils.h +11 -5
  322. data/src/core/lib/transport/metadata_batch.cc +37 -37
  323. data/src/core/lib/transport/metadata_batch.h +19 -18
  324. data/src/core/lib/transport/transport.cc +4 -3
  325. data/src/core/lib/transport/transport.h +4 -4
  326. data/src/core/lib/transport/transport_op_string.cc +5 -5
  327. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  329. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  331. data/src/core/tsi/ssl_transport_security.cc +32 -14
  332. data/src/core/tsi/ssl_transport_security.h +3 -4
  333. data/src/ruby/bin/math_services_pb.rb +1 -1
  334. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  335. data/src/ruby/lib/grpc/version.rb +1 -1
  336. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  337. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  338. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  339. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  340. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  341. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  342. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  343. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  344. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  345. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  346. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  347. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  348. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  349. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  350. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  351. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  352. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  353. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  354. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  355. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  356. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  357. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  358. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  359. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  360. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  361. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  362. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  363. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  364. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  365. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  366. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  367. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  368. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  369. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  370. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  371. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  372. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  373. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  374. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  375. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  376. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  377. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  381. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  382. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  383. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  384. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  385. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  387. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  388. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  389. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  390. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  391. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  392. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  393. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  394. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  395. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  396. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  397. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  398. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  399. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  400. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  401. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  402. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  403. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  404. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  405. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  406. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  407. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  408. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  409. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  410. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  411. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  412. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  413. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  414. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  415. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  416. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  417. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  418. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  420. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  421. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  422. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  423. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  424. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  425. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  426. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  427. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  428. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  429. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  430. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  431. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  432. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  433. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  434. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  435. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  436. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  437. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  438. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  439. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  440. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  441. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  442. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  443. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  444. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  445. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  446. data/third_party/boringssl-with-bazel/err_data.c +477 -461
  447. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  448. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  449. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  450. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  451. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  453. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  454. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  455. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  457. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  458. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  459. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  461. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  462. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  463. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  464. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  465. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  467. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  468. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  469. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  480. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  481. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  482. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  483. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  484. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  485. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  486. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  487. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  488. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  489. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  490. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  491. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  504. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  505. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  506. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  507. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  508. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  509. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  511. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  512. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  513. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  514. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  515. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  516. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  517. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  518. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  519. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  520. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  521. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
  522. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  523. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
  524. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  525. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  526. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  527. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  528. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  529. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  530. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  531. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  532. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  533. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  534. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  535. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
  536. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  537. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  538. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  539. metadata +68 -45
  540. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  541. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  542. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  543. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -246,8 +246,8 @@ constexpr int DigitMagnitude<16>() {
246
246
  // ConsumeDigits does not protect against overflow on *out; max_digits must
247
247
  // be chosen with respect to type T to avoid the possibility of overflow.
248
248
  template <int base, typename T>
249
- std::size_t ConsumeDigits(const char* begin, const char* end, int max_digits,
250
- T* out, bool* dropped_nonzero_digit) {
249
+ int ConsumeDigits(const char* begin, const char* end, int max_digits, T* out,
250
+ bool* dropped_nonzero_digit) {
251
251
  if (base == 10) {
252
252
  assert(max_digits <= std::numeric_limits<T>::digits10);
253
253
  } else if (base == 16) {
@@ -282,7 +282,7 @@ std::size_t ConsumeDigits(const char* begin, const char* end, int max_digits,
282
282
  *dropped_nonzero_digit = true;
283
283
  }
284
284
  *out = accumulator;
285
- return begin - original_begin;
285
+ return static_cast<int>(begin - original_begin);
286
286
  }
287
287
 
288
288
  // Returns true if `v` is one of the chars allowed inside parentheses following
@@ -372,7 +372,7 @@ strings_internal::ParsedFloat ParseFloat(const char* begin, const char* end,
372
372
 
373
373
  int exponent_adjustment = 0;
374
374
  bool mantissa_is_inexact = false;
375
- std::size_t pre_decimal_digits = ConsumeDigits<base>(
375
+ int pre_decimal_digits = ConsumeDigits<base>(
376
376
  begin, end, MantissaDigitsMax<base>(), &mantissa, &mantissa_is_inexact);
377
377
  begin += pre_decimal_digits;
378
378
  int digits_left;
@@ -398,14 +398,14 @@ strings_internal::ParsedFloat ParseFloat(const char* begin, const char* end,
398
398
  while (begin < end && *begin == '0') {
399
399
  ++begin;
400
400
  }
401
- std::size_t zeros_skipped = begin - begin_zeros;
401
+ int zeros_skipped = static_cast<int>(begin - begin_zeros);
402
402
  if (zeros_skipped >= DigitLimit<base>()) {
403
403
  // refuse to parse pathological inputs
404
404
  return result;
405
405
  }
406
406
  exponent_adjustment -= static_cast<int>(zeros_skipped);
407
407
  }
408
- std::size_t post_decimal_digits = ConsumeDigits<base>(
408
+ int post_decimal_digits = ConsumeDigits<base>(
409
409
  begin, end, digits_left, &mantissa, &mantissa_is_inexact);
410
410
  begin += post_decimal_digits;
411
411
 
@@ -0,0 +1,83 @@
1
+ // Copyright 2020 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
+ #include "absl/strings/internal/cord_internal.h"
15
+
16
+ #include <atomic>
17
+ #include <cassert>
18
+ #include <memory>
19
+
20
+ #include "absl/container/inlined_vector.h"
21
+ #include "absl/strings/internal/cord_rep_flat.h"
22
+ #include "absl/strings/internal/cord_rep_ring.h"
23
+
24
+ namespace absl {
25
+ ABSL_NAMESPACE_BEGIN
26
+ namespace cord_internal {
27
+
28
+ ABSL_CONST_INIT std::atomic<bool> cord_ring_buffer_enabled(
29
+ kCordEnableRingBufferDefault);
30
+ ABSL_CONST_INIT std::atomic<bool> shallow_subcords_enabled(
31
+ kCordShallowSubcordsDefault);
32
+
33
+ void CordRep::Destroy(CordRep* rep) {
34
+ assert(rep != nullptr);
35
+
36
+ absl::InlinedVector<CordRep*, Constants::kInlinedVectorSize> pending;
37
+ while (true) {
38
+ assert(!rep->refcount.IsImmortal());
39
+ if (rep->tag == CONCAT) {
40
+ CordRepConcat* rep_concat = rep->concat();
41
+ CordRep* right = rep_concat->right;
42
+ if (!right->refcount.Decrement()) {
43
+ pending.push_back(right);
44
+ }
45
+ CordRep* left = rep_concat->left;
46
+ delete rep_concat;
47
+ rep = nullptr;
48
+ if (!left->refcount.Decrement()) {
49
+ rep = left;
50
+ continue;
51
+ }
52
+ } else if (rep->tag == RING) {
53
+ CordRepRing::Destroy(rep->ring());
54
+ rep = nullptr;
55
+ } else if (rep->tag == EXTERNAL) {
56
+ CordRepExternal::Delete(rep);
57
+ rep = nullptr;
58
+ } else if (rep->tag == SUBSTRING) {
59
+ CordRepSubstring* rep_substring = rep->substring();
60
+ CordRep* child = rep_substring->child;
61
+ delete rep_substring;
62
+ rep = nullptr;
63
+ if (!child->refcount.Decrement()) {
64
+ rep = child;
65
+ continue;
66
+ }
67
+ } else {
68
+ CordRepFlat::Delete(rep);
69
+ rep = nullptr;
70
+ }
71
+
72
+ if (!pending.empty()) {
73
+ rep = pending.back();
74
+ pending.pop_back();
75
+ } else {
76
+ break;
77
+ }
78
+ }
79
+ }
80
+
81
+ } // namespace cord_internal
82
+ ABSL_NAMESPACE_END
83
+ } // namespace absl
@@ -1,4 +1,4 @@
1
- // Copyright 2020 The Abseil Authors.
1
+ // Copyright 2021 The Abseil Authors.
2
2
  //
3
3
  // Licensed under the Apache License, Version 2.0 (the "License");
4
4
  // you may not use this file except in compliance with the License.
@@ -21,7 +21,10 @@
21
21
  #include <cstdint>
22
22
  #include <type_traits>
23
23
 
24
+ #include "absl/base/config.h"
25
+ #include "absl/base/internal/endian.h"
24
26
  #include "absl/base/internal/invoke.h"
27
+ #include "absl/base/optimization.h"
25
28
  #include "absl/container/internal/compressed_tuple.h"
26
29
  #include "absl/meta/type_traits.h"
27
30
  #include "absl/strings/string_view.h"
@@ -30,17 +33,55 @@ namespace absl {
30
33
  ABSL_NAMESPACE_BEGIN
31
34
  namespace cord_internal {
32
35
 
36
+ class CordzInfo;
37
+
38
+ // Default feature enable states for cord ring buffers
39
+ enum CordFeatureDefaults {
40
+ kCordEnableRingBufferDefault = false,
41
+ kCordShallowSubcordsDefault = false
42
+ };
43
+
44
+ extern std::atomic<bool> cord_ring_buffer_enabled;
45
+ extern std::atomic<bool> shallow_subcords_enabled;
46
+
47
+ inline void enable_cord_ring_buffer(bool enable) {
48
+ cord_ring_buffer_enabled.store(enable, std::memory_order_relaxed);
49
+ }
50
+
51
+ inline void enable_shallow_subcords(bool enable) {
52
+ shallow_subcords_enabled.store(enable, std::memory_order_relaxed);
53
+ }
54
+
55
+ enum Constants {
56
+ // The inlined size to use with absl::InlinedVector.
57
+ //
58
+ // Note: The InlinedVectors in this file (and in cord.h) do not need to use
59
+ // the same value for their inlined size. The fact that they do is historical.
60
+ // It may be desirable for each to use a different inlined size optimized for
61
+ // that InlinedVector's usage.
62
+ //
63
+ // TODO(jgm): Benchmark to see if there's a more optimal value than 47 for
64
+ // the inlined vector size (47 exists for backward compatibility).
65
+ kInlinedVectorSize = 47,
66
+
67
+ // Prefer copying blocks of at most this size, otherwise reference count.
68
+ kMaxBytesToCopy = 511
69
+ };
70
+
33
71
  // Wraps std::atomic for reference counting.
34
72
  class Refcount {
35
73
  public:
36
- Refcount() : count_{1} {}
37
- ~Refcount() {}
74
+ constexpr Refcount() : count_{kRefIncrement} {}
75
+ struct Immortal {};
76
+ explicit constexpr Refcount(Immortal) : count_(kImmortalTag) {}
38
77
 
39
- // Increments the reference count by 1. Imposes no memory ordering.
40
- inline void Increment() { count_.fetch_add(1, std::memory_order_relaxed); }
78
+ // Increments the reference count. Imposes no memory ordering.
79
+ inline void Increment() {
80
+ count_.fetch_add(kRefIncrement, std::memory_order_relaxed);
81
+ }
41
82
 
42
83
  // Asserts that the current refcount is greater than 0. If the refcount is
43
- // greater than 1, decrements the reference count by 1.
84
+ // greater than 1, decrements the reference count.
44
85
  //
45
86
  // Returns false if there are no references outstanding; true otherwise.
46
87
  // Inserts barriers to ensure that state written before this method returns
@@ -48,19 +89,24 @@ class Refcount {
48
89
  // false.
49
90
  inline bool Decrement() {
50
91
  int32_t refcount = count_.load(std::memory_order_acquire);
51
- assert(refcount > 0);
52
- return refcount != 1 && count_.fetch_sub(1, std::memory_order_acq_rel) != 1;
92
+ assert(refcount > 0 || refcount & kImmortalTag);
93
+ return refcount != kRefIncrement &&
94
+ count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel) !=
95
+ kRefIncrement;
53
96
  }
54
97
 
55
98
  // Same as Decrement but expect that refcount is greater than 1.
56
99
  inline bool DecrementExpectHighRefcount() {
57
- int32_t refcount = count_.fetch_sub(1, std::memory_order_acq_rel);
58
- assert(refcount > 0);
59
- return refcount != 1;
100
+ int32_t refcount =
101
+ count_.fetch_sub(kRefIncrement, std::memory_order_acq_rel);
102
+ assert(refcount > 0 || refcount & kImmortalTag);
103
+ return refcount != kRefIncrement;
60
104
  }
61
105
 
62
106
  // Returns the current reference count using acquire semantics.
63
- inline int32_t Get() const { return count_.load(std::memory_order_acquire); }
107
+ inline int32_t Get() const {
108
+ return count_.load(std::memory_order_acquire) >> kImmortalShift;
109
+ }
64
110
 
65
111
  // Returns whether the atomic integer is 1.
66
112
  // If the reference count is used in the conventional way, a
@@ -70,9 +116,27 @@ class Refcount {
70
116
  // performs the memory barrier needed for the owning thread
71
117
  // to act on the object, knowing that it has exclusive access to the
72
118
  // object.
73
- inline bool IsOne() { return count_.load(std::memory_order_acquire) == 1; }
119
+ inline bool IsOne() {
120
+ return count_.load(std::memory_order_acquire) == kRefIncrement;
121
+ }
122
+
123
+ bool IsImmortal() const {
124
+ return (count_.load(std::memory_order_relaxed) & kImmortalTag) != 0;
125
+ }
74
126
 
75
127
  private:
128
+ // We reserve the bottom bit to tag a reference count as immortal.
129
+ // By making it `1` we ensure that we never reach `0` when adding/subtracting
130
+ // `2`, thus it never looks as if it should be destroyed.
131
+ // These are used for the StringConstant constructor where we do not increase
132
+ // the refcount at construction time (due to constinit requirements) but we
133
+ // will still decrease it at destruction time to avoid branching on Unref.
134
+ enum {
135
+ kImmortalShift = 1,
136
+ kRefIncrement = 1 << kImmortalShift,
137
+ kImmortalTag = kRefIncrement - 1
138
+ };
139
+
76
140
  std::atomic<int32_t> count_;
77
141
  };
78
142
 
@@ -82,10 +146,33 @@ class Refcount {
82
146
  // functions in the base class.
83
147
 
84
148
  struct CordRepConcat;
85
- struct CordRepSubstring;
86
149
  struct CordRepExternal;
150
+ struct CordRepFlat;
151
+ struct CordRepSubstring;
152
+ class CordRepRing;
153
+
154
+ // Various representations that we allow
155
+ enum CordRepKind {
156
+ CONCAT = 0,
157
+ EXTERNAL = 1,
158
+ SUBSTRING = 2,
159
+ RING = 3,
160
+
161
+ // We have different tags for different sized flat arrays,
162
+ // starting with FLAT, and limited to MAX_FLAT_TAG. The 224 value is based on
163
+ // the current 'size to tag' encoding of 8 / 32 bytes. If a new tag is needed
164
+ // in the future, then 'FLAT' and 'MAX_FLAT_TAG' should be adjusted as well
165
+ // as the Tag <---> Size logic so that FLAT stil represents the minimum flat
166
+ // allocation size. (32 bytes as of now).
167
+ FLAT = 4,
168
+ MAX_FLAT_TAG = 224
169
+ };
87
170
 
88
171
  struct CordRep {
172
+ CordRep() = default;
173
+ constexpr CordRep(Refcount::Immortal immortal, size_t l)
174
+ : length(l), refcount(immortal), tag(EXTERNAL), storage{} {}
175
+
89
176
  // The following three fields have to be less than 32 bytes since
90
177
  // that is the smallest supported flat node size.
91
178
  size_t length;
@@ -93,22 +180,40 @@ struct CordRep {
93
180
  // If tag < FLAT, it represents CordRepKind and indicates the type of node.
94
181
  // Otherwise, the node type is CordRepFlat and the tag is the encoded size.
95
182
  uint8_t tag;
96
- char data[1]; // Starting point for flat array: MUST BE LAST FIELD of CordRep
183
+ char storage[1]; // Starting point for flat array: MUST BE LAST FIELD
97
184
 
185
+ inline CordRepRing* ring();
186
+ inline const CordRepRing* ring() const;
98
187
  inline CordRepConcat* concat();
99
188
  inline const CordRepConcat* concat() const;
100
189
  inline CordRepSubstring* substring();
101
190
  inline const CordRepSubstring* substring() const;
102
191
  inline CordRepExternal* external();
103
192
  inline const CordRepExternal* external() const;
193
+ inline CordRepFlat* flat();
194
+ inline const CordRepFlat* flat() const;
195
+
196
+ // --------------------------------------------------------------------
197
+ // Memory management
198
+
199
+ // Destroys the provided `rep`.
200
+ static void Destroy(CordRep* rep);
201
+
202
+ // Increments the reference count of `rep`.
203
+ // Requires `rep` to be a non-null pointer value.
204
+ static inline CordRep* Ref(CordRep* rep);
205
+
206
+ // Decrements the reference count of `rep`. Destroys rep if count reaches
207
+ // zero. Requires `rep` to be a non-null pointer value.
208
+ static inline void Unref(CordRep* rep);
104
209
  };
105
210
 
106
211
  struct CordRepConcat : public CordRep {
107
212
  CordRep* left;
108
213
  CordRep* right;
109
214
 
110
- uint8_t depth() const { return static_cast<uint8_t>(data[0]); }
111
- void set_depth(uint8_t depth) { data[0] = static_cast<char>(depth); }
215
+ uint8_t depth() const { return static_cast<uint8_t>(storage[0]); }
216
+ void set_depth(uint8_t depth) { storage[0] = static_cast<char>(depth); }
112
217
  };
113
218
 
114
219
  struct CordRepSubstring : public CordRep {
@@ -124,9 +229,19 @@ using ExternalReleaserInvoker = void (*)(CordRepExternal*);
124
229
  // External CordReps are allocated together with a type erased releaser. The
125
230
  // releaser is stored in the memory directly following the CordRepExternal.
126
231
  struct CordRepExternal : public CordRep {
232
+ CordRepExternal() = default;
233
+ explicit constexpr CordRepExternal(absl::string_view str)
234
+ : CordRep(Refcount::Immortal{}, str.size()),
235
+ base(str.data()),
236
+ releaser_invoker(nullptr) {}
237
+
127
238
  const char* base;
128
239
  // Pointer to function that knows how to call and destroy the releaser.
129
240
  ExternalReleaserInvoker releaser_invoker;
241
+
242
+ // Deletes (releases) the external rep.
243
+ // Requires rep != nullptr and rep->tag == EXTERNAL
244
+ static void Delete(CordRep* rep);
130
245
  };
131
246
 
132
247
  struct Rank1 {};
@@ -167,7 +282,262 @@ struct CordRepExternalImpl
167
282
  }
168
283
  };
169
284
 
285
+ inline void CordRepExternal::Delete(CordRep* rep) {
286
+ assert(rep != nullptr && rep->tag == EXTERNAL);
287
+ auto* rep_external = static_cast<CordRepExternal*>(rep);
288
+ assert(rep_external->releaser_invoker != nullptr);
289
+ rep_external->releaser_invoker(rep_external);
290
+ }
291
+
292
+ template <typename Str>
293
+ struct ConstInitExternalStorage {
294
+ ABSL_CONST_INIT static CordRepExternal value;
295
+ };
296
+
297
+ template <typename Str>
298
+ CordRepExternal ConstInitExternalStorage<Str>::value(Str::value);
299
+
300
+ enum {
301
+ kMaxInline = 15,
302
+ };
303
+
304
+ constexpr char GetOrNull(absl::string_view data, size_t pos) {
305
+ return pos < data.size() ? data[pos] : '\0';
306
+ }
307
+
308
+ // We store cordz_info as 64 bit pointer value in big endian format. This
309
+ // guarantees that the least significant byte of cordz_info matches the last
310
+ // byte of the inline data representation in as_chars_, which holds the inlined
311
+ // size or the 'is_tree' bit.
312
+ using cordz_info_t = int64_t;
313
+
314
+ // Assert that the `cordz_info` pointer value perfectly overlaps the last half
315
+ // of `as_chars_` and can hold a pointer value.
316
+ static_assert(sizeof(cordz_info_t) * 2 == kMaxInline + 1, "");
317
+ static_assert(sizeof(cordz_info_t) >= sizeof(intptr_t), "");
318
+
319
+ // BigEndianByte() creates a big endian representation of 'value', i.e.: a big
320
+ // endian value where the last byte in the host's representation holds 'value`,
321
+ // with all other bytes being 0.
322
+ static constexpr cordz_info_t BigEndianByte(unsigned char value) {
323
+ #if defined(ABSL_IS_BIG_ENDIAN)
324
+ return value;
325
+ #else
326
+ return static_cast<cordz_info_t>(value) << ((sizeof(cordz_info_t) - 1) * 8);
327
+ #endif
328
+ }
329
+
330
+ class InlineData {
331
+ public:
332
+ // kNullCordzInfo holds the big endian representation of intptr_t(1)
333
+ // This is the 'null' / initial value of 'cordz_info'. The null value
334
+ // is specifically big endian 1 as with 64-bit pointers, the last
335
+ // byte of cordz_info overlaps with the last byte holding the tag.
336
+ static constexpr cordz_info_t kNullCordzInfo = BigEndianByte(1);
337
+
338
+ // kFakeCordzInfo holds a 'fake', non-null cordz-info value we use to
339
+ // emulate the previous 'kProfiled' tag logic in 'set_profiled' until
340
+ // cord code is changed to store cordz_info values in InlineData.
341
+ static constexpr cordz_info_t kFakeCordzInfo = BigEndianByte(9);
342
+
343
+ constexpr InlineData() : as_chars_{0} {}
344
+ explicit constexpr InlineData(CordRep* rep) : as_tree_(rep) {}
345
+ explicit constexpr InlineData(absl::string_view chars)
346
+ : as_chars_{
347
+ GetOrNull(chars, 0), GetOrNull(chars, 1),
348
+ GetOrNull(chars, 2), GetOrNull(chars, 3),
349
+ GetOrNull(chars, 4), GetOrNull(chars, 5),
350
+ GetOrNull(chars, 6), GetOrNull(chars, 7),
351
+ GetOrNull(chars, 8), GetOrNull(chars, 9),
352
+ GetOrNull(chars, 10), GetOrNull(chars, 11),
353
+ GetOrNull(chars, 12), GetOrNull(chars, 13),
354
+ GetOrNull(chars, 14), static_cast<char>((chars.size() << 1))} {}
355
+
356
+ // Returns true if the current instance is empty.
357
+ // The 'empty value' is an inlined data value of zero length.
358
+ bool is_empty() const { return tag() == 0; }
359
+
360
+ // Returns true if the current instance holds a tree value.
361
+ bool is_tree() const { return (tag() & 1) != 0; }
362
+
363
+ // Returns true if the current instance holds a cordz_info value.
364
+ // Requires the current instance to hold a tree value.
365
+ bool is_profiled() const {
366
+ assert(is_tree());
367
+ return as_tree_.cordz_info != kNullCordzInfo;
368
+ }
369
+
370
+ // Returns the cordz_info sampling instance for this instance, or nullptr
371
+ // if the current instance is not sampled and does not have CordzInfo data.
372
+ // Requires the current instance to hold a tree value.
373
+ CordzInfo* cordz_info() const {
374
+ assert(is_tree());
375
+ intptr_t info =
376
+ static_cast<intptr_t>(absl::big_endian::ToHost64(as_tree_.cordz_info));
377
+ assert(info & 1);
378
+ return reinterpret_cast<CordzInfo*>(info - 1);
379
+ }
380
+
381
+ // Sets the current cordz_info sampling instance for this instance, or nullptr
382
+ // if the current instance is not sampled and does not have CordzInfo data.
383
+ // Requires the current instance to hold a tree value.
384
+ void set_cordz_info(CordzInfo* cordz_info) {
385
+ assert(is_tree());
386
+ intptr_t info = reinterpret_cast<intptr_t>(cordz_info) | 1;
387
+ as_tree_.cordz_info = absl::big_endian::FromHost64(info);
388
+ }
389
+
390
+ // Resets the current cordz_info to null / empty.
391
+ void clear_cordz_info() {
392
+ assert(is_tree());
393
+ as_tree_.cordz_info = kNullCordzInfo;
394
+ }
395
+
396
+ // Returns a read only pointer to the character data inside this instance.
397
+ // Requires the current instance to hold inline data.
398
+ const char* as_chars() const {
399
+ assert(!is_tree());
400
+ return as_chars_;
401
+ }
402
+
403
+ // Returns a mutable pointer to the character data inside this instance.
404
+ // Should be used for 'write only' operations setting an inlined value.
405
+ // Applications can set the value of inlined data either before or after
406
+ // setting the inlined size, i.e., both of the below are valid:
407
+ //
408
+ // // Set inlined data and inline size
409
+ // memcpy(data_.as_chars(), data, size);
410
+ // data_.set_inline_size(size);
411
+ //
412
+ // // Set inlined size and inline data
413
+ // data_.set_inline_size(size);
414
+ // memcpy(data_.as_chars(), data, size);
415
+ //
416
+ // It's an error to read from the returned pointer without a preceding write
417
+ // if the current instance does not hold inline data, i.e.: is_tree() == true.
418
+ char* as_chars() { return as_chars_; }
419
+
420
+ // Returns the tree value of this value.
421
+ // Requires the current instance to hold a tree value.
422
+ CordRep* as_tree() const {
423
+ assert(is_tree());
424
+ return as_tree_.rep;
425
+ }
426
+
427
+ // Initialize this instance to holding the tree value `rep`,
428
+ // initializing the cordz_info to null, i.e.: 'not profiled'.
429
+ void make_tree(CordRep* rep) {
430
+ as_tree_.rep = rep;
431
+ as_tree_.cordz_info = kNullCordzInfo;
432
+ }
433
+
434
+ // Set the tree value of this instance to 'rep`.
435
+ // Requires the current instance to already hold a tree value.
436
+ // Does not affect the value of cordz_info.
437
+ void set_tree(CordRep* rep) {
438
+ assert(is_tree());
439
+ as_tree_.rep = rep;
440
+ }
441
+
442
+ // Returns the size of the inlined character data inside this instance.
443
+ // Requires the current instance to hold inline data.
444
+ size_t inline_size() const {
445
+ assert(!is_tree());
446
+ return tag() >> 1;
447
+ }
448
+
449
+ // Sets the size of the inlined character data inside this instance.
450
+ // Requires `size` to be <= kMaxInline.
451
+ // See the documentation on 'as_chars()' for more information and examples.
452
+ void set_inline_size(size_t size) {
453
+ ABSL_ASSERT(size <= kMaxInline);
454
+ tag() = static_cast<char>(size << 1);
455
+ }
456
+
457
+ // Sets or unsets the 'is_profiled' state of this instance.
458
+ // Requires the current instance to hold a tree value.
459
+ void set_profiled(bool profiled) {
460
+ assert(is_tree());
461
+ as_tree_.cordz_info = profiled ? kFakeCordzInfo : kNullCordzInfo;
462
+ }
463
+
464
+ private:
465
+ // See cordz_info_t for forced alignment and size of `cordz_info` details.
466
+ struct AsTree {
467
+ explicit constexpr AsTree(absl::cord_internal::CordRep* tree)
468
+ : rep(tree), cordz_info(kNullCordzInfo) {}
469
+ // This union uses up extra space so that whether rep is 32 or 64 bits,
470
+ // cordz_info will still start at the eighth byte, and the last
471
+ // byte of cordz_info will still be the last byte of InlineData.
472
+ union {
473
+ absl::cord_internal::CordRep* rep;
474
+ cordz_info_t unused_aligner;
475
+ };
476
+ cordz_info_t cordz_info;
477
+ };
478
+
479
+ char& tag() { return reinterpret_cast<char*>(this)[kMaxInline]; }
480
+ char tag() const { return reinterpret_cast<const char*>(this)[kMaxInline]; }
481
+
482
+ // If the data has length <= kMaxInline, we store it in `as_chars_`, and
483
+ // store the size in the last char of `as_chars_` shifted left + 1.
484
+ // Else we store it in a tree and store a pointer to that tree in
485
+ // `as_tree_.rep` and store a tag in `tagged_size`.
486
+ union {
487
+ char as_chars_[kMaxInline + 1];
488
+ AsTree as_tree_;
489
+ };
490
+ };
491
+
492
+ static_assert(sizeof(InlineData) == kMaxInline + 1, "");
493
+
494
+ inline CordRepConcat* CordRep::concat() {
495
+ assert(tag == CONCAT);
496
+ return static_cast<CordRepConcat*>(this);
497
+ }
498
+
499
+ inline const CordRepConcat* CordRep::concat() const {
500
+ assert(tag == CONCAT);
501
+ return static_cast<const CordRepConcat*>(this);
502
+ }
503
+
504
+ inline CordRepSubstring* CordRep::substring() {
505
+ assert(tag == SUBSTRING);
506
+ return static_cast<CordRepSubstring*>(this);
507
+ }
508
+
509
+ inline const CordRepSubstring* CordRep::substring() const {
510
+ assert(tag == SUBSTRING);
511
+ return static_cast<const CordRepSubstring*>(this);
512
+ }
513
+
514
+ inline CordRepExternal* CordRep::external() {
515
+ assert(tag == EXTERNAL);
516
+ return static_cast<CordRepExternal*>(this);
517
+ }
518
+
519
+ inline const CordRepExternal* CordRep::external() const {
520
+ assert(tag == EXTERNAL);
521
+ return static_cast<const CordRepExternal*>(this);
522
+ }
523
+
524
+ inline CordRep* CordRep::Ref(CordRep* rep) {
525
+ assert(rep != nullptr);
526
+ rep->refcount.Increment();
527
+ return rep;
528
+ }
529
+
530
+ inline void CordRep::Unref(CordRep* rep) {
531
+ assert(rep != nullptr);
532
+ // Expect refcount to be 0. Avoiding the cost of an atomic decrement should
533
+ // typically outweigh the cost of an extra branch checking for ref == 1.
534
+ if (ABSL_PREDICT_FALSE(!rep->refcount.DecrementExpectHighRefcount())) {
535
+ Destroy(rep);
536
+ }
537
+ }
538
+
170
539
  } // namespace cord_internal
540
+
171
541
  ABSL_NAMESPACE_END
172
542
  } // namespace absl
173
543
  #endif // ABSL_STRINGS_INTERNAL_CORD_INTERNAL_H_