grpc 1.42.0 → 1.43.1

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 (739) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +85 -34
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc_security.h +276 -145
  8. data/include/grpc/grpc_security_constants.h +1 -14
  9. data/include/grpc/impl/codegen/port_platform.h +7 -3
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
  11. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  12. data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
  13. data/src/core/ext/filters/client_channel/client_channel.h +5 -4
  14. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
  15. data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
  25. data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
  29. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
  30. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
  32. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
  33. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  34. data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
  35. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  36. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
  37. data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  40. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  41. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  42. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
  43. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  45. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
  46. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  47. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  51. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  54. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  55. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  56. data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
  57. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  58. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
  59. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
  61. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  62. data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
  63. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  64. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  65. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  67. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  68. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  70. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  72. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  73. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  76. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  128. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  129. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  130. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  131. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  132. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
  133. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
  134. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  135. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  136. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
  137. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
  138. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  139. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  140. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  141. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  142. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  143. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  144. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  145. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  146. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  147. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  148. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  149. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  154. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  155. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  157. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  158. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  159. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  160. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  161. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  163. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  164. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  165. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  166. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  167. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  168. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  169. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  170. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  171. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  172. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  173. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  174. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  175. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  176. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  177. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  178. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  179. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  180. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  181. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  182. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  183. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  184. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  185. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  186. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  187. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  188. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  189. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  190. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  191. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  192. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  193. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  194. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  195. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  196. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  197. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  198. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  199. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  200. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  201. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  202. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  203. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  204. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  205. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  206. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  207. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  208. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  209. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  210. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  211. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  212. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  213. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  214. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  215. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  216. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  217. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  218. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  219. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  220. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  221. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  222. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  223. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  224. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  225. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  226. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  227. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  228. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  229. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  230. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  231. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  232. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  233. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  234. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  235. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  236. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  237. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  238. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  239. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  240. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  244. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  245. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  246. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  248. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
  249. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
  250. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  251. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  252. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
  253. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  254. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  255. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  256. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  257. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  259. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  260. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  261. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  262. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
  263. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
  264. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
  265. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  266. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
  267. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  268. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
  269. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  270. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
  271. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  272. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
  273. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  274. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
  275. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  276. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
  277. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
  278. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
  279. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
  280. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  283. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  284. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  285. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  289. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  290. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  291. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
  292. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  293. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  304. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  305. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
  306. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  307. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  308. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  309. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  310. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  311. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  312. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  313. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  314. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  315. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
  316. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  317. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  318. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  319. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  320. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  321. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  322. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  323. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  324. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  325. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  326. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  327. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  328. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  329. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  330. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  331. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  332. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  333. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  334. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  335. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  336. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  337. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  338. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  339. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  340. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  341. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  342. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  343. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  344. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  345. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  346. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  347. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  348. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  349. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  350. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  351. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  352. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  353. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  354. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  355. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  356. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  357. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  358. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  359. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  360. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  361. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
  362. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
  363. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
  364. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
  365. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
  366. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  367. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
  368. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
  369. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
  370. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
  371. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
  372. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
  373. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
  374. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
  375. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  376. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  377. data/src/core/ext/xds/xds_api.cc +409 -304
  378. data/src/core/ext/xds/xds_api.h +3 -1
  379. data/src/core/ext/xds/xds_bootstrap.cc +6 -3
  380. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  381. data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
  382. data/src/core/ext/xds/xds_client.cc +395 -291
  383. data/src/core/ext/xds/xds_client.h +47 -38
  384. data/src/core/ext/xds/xds_routing.cc +247 -0
  385. data/src/core/ext/xds/xds_routing.h +98 -0
  386. data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
  387. data/src/core/lib/avl/avl.h +389 -88
  388. data/src/core/lib/backoff/backoff.cc +2 -2
  389. data/src/core/lib/channel/channel_args.cc +17 -17
  390. data/src/core/lib/channel/channel_args.h +11 -10
  391. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  392. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  393. data/src/core/lib/channel/channel_stack_builder.cc +0 -2
  394. data/src/core/lib/channel/channel_trace.cc +6 -6
  395. data/src/core/lib/channel/channelz.cc +1 -1
  396. data/src/core/lib/compression/compression_args.cc +7 -5
  397. data/src/core/lib/compression/compression_args.h +6 -4
  398. data/src/core/lib/config/core_configuration.cc +3 -1
  399. data/src/core/lib/config/core_configuration.h +11 -0
  400. data/src/core/lib/debug/trace.h +2 -2
  401. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  402. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  403. data/src/core/lib/event_engine/event_engine.cc +0 -13
  404. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  405. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  406. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  407. data/src/core/lib/gpr/tls.h +6 -0
  408. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  409. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  410. data/src/core/lib/gprpp/global_config_env.h +2 -2
  411. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  412. data/src/core/lib/gprpp/orphanable.h +1 -1
  413. data/src/core/lib/gprpp/ref_counted.h +1 -1
  414. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  415. data/src/core/lib/gprpp/status_helper.h +1 -1
  416. data/src/core/lib/gprpp/table.h +13 -1
  417. data/src/core/lib/http/httpcli.cc +30 -26
  418. data/src/core/lib/http/httpcli.h +14 -12
  419. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  420. data/src/core/lib/iomgr/buffer_list.h +13 -13
  421. data/src/core/lib/iomgr/call_combiner.cc +2 -3
  422. data/src/core/lib/iomgr/endpoint.h +0 -1
  423. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  424. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  425. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  426. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  427. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  428. data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
  429. data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
  430. data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
  431. data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
  432. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  433. data/src/core/lib/iomgr/executor.cc +12 -15
  434. data/src/core/lib/iomgr/executor.h +1 -1
  435. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  436. data/src/core/lib/iomgr/tcp_client.h +1 -3
  437. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
  438. data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
  439. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
  440. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  441. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
  442. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  443. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  444. data/src/core/lib/iomgr/tcp_posix.cc +28 -33
  445. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  446. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  447. data/src/core/lib/iomgr/tcp_server.h +6 -8
  448. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
  449. data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
  450. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  451. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  452. data/src/core/lib/iomgr/tcp_windows.cc +2 -7
  453. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  454. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  455. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  456. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  457. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  458. data/src/core/lib/iomgr/work_serializer.h +16 -4
  459. data/src/core/lib/json/json_reader.cc +83 -35
  460. data/src/core/lib/json/json_util.cc +1 -1
  461. data/src/core/lib/promise/activity.cc +115 -0
  462. data/src/core/lib/promise/activity.h +499 -0
  463. data/src/core/lib/promise/context.h +86 -0
  464. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  465. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  466. data/src/core/lib/promise/detail/promise_like.h +85 -0
  467. data/src/core/lib/promise/detail/status.h +44 -0
  468. data/src/core/lib/promise/detail/switch.h +1455 -0
  469. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  470. data/src/core/lib/promise/loop.h +108 -0
  471. data/src/core/lib/promise/map.h +88 -0
  472. data/src/core/lib/promise/poll.h +60 -0
  473. data/src/core/lib/promise/race.h +84 -0
  474. data/src/core/lib/promise/seq.h +71 -0
  475. data/src/core/lib/resource_quota/api.cc +108 -0
  476. data/src/core/lib/resource_quota/api.h +41 -0
  477. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  478. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  479. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  480. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  481. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  482. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  483. data/src/core/lib/resource_quota/trace.cc +19 -0
  484. data/src/core/lib/resource_quota/trace.h +24 -0
  485. data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
  486. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  487. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
  488. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
  489. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
  490. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
  491. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
  492. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
  494. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
  495. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  496. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  497. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  498. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  499. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  500. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
  501. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  502. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  503. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  504. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  505. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
  506. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  507. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  508. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  509. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  510. data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
  511. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  512. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
  513. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
  514. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  515. data/src/core/lib/slice/percent_encoding.cc +30 -86
  516. data/src/core/lib/slice/percent_encoding.h +5 -11
  517. data/src/core/lib/slice/slice.cc +7 -7
  518. data/src/core/lib/slice/slice.h +341 -0
  519. data/src/core/lib/slice/slice_buffer.cc +4 -0
  520. data/src/core/lib/slice/slice_intern.cc +1 -1
  521. data/src/core/lib/slice/slice_refcount.h +5 -1
  522. data/src/core/lib/slice/slice_refcount_base.h +19 -11
  523. data/src/core/lib/slice/static_slice.cc +331 -483
  524. data/src/core/lib/slice/static_slice.h +101 -132
  525. data/src/core/lib/surface/builtins.cc +1 -1
  526. data/src/core/lib/surface/call.cc +85 -59
  527. data/src/core/lib/surface/channel.cc +4 -29
  528. data/src/core/lib/surface/channel.h +2 -12
  529. data/src/core/lib/surface/completion_queue.cc +2 -2
  530. data/src/core/lib/surface/init.cc +0 -1
  531. data/src/core/lib/surface/lame_client.cc +24 -17
  532. data/src/core/lib/surface/server.cc +22 -22
  533. data/src/core/lib/surface/server.h +8 -9
  534. data/src/core/lib/surface/validate_metadata.cc +2 -2
  535. data/src/core/lib/surface/version.cc +2 -2
  536. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  537. data/src/core/lib/transport/byte_stream.cc +4 -0
  538. data/src/core/lib/transport/metadata.h +4 -4
  539. data/src/core/lib/transport/metadata_batch.cc +5 -0
  540. data/src/core/lib/transport/metadata_batch.h +174 -99
  541. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  542. data/src/core/lib/transport/parsed_metadata.h +180 -61
  543. data/src/core/lib/transport/pid_controller.cc +4 -4
  544. data/src/core/lib/transport/static_metadata.cc +529 -614
  545. data/src/core/lib/transport/static_metadata.h +0 -18
  546. data/src/core/lib/transport/transport.cc +4 -26
  547. data/src/core/lib/transport/transport.h +0 -1
  548. data/src/core/lib/transport/transport_op_string.cc +1 -1
  549. data/src/core/lib/uri/uri_parser.cc +19 -19
  550. data/src/core/lib/uri/uri_parser.h +2 -0
  551. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
  552. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  553. data/src/core/tsi/local_transport_security.cc +15 -15
  554. data/src/core/tsi/ssl_transport_security.cc +30 -1
  555. data/src/core/tsi/ssl_transport_security.h +1 -0
  556. data/src/ruby/ext/grpc/extconf.rb +1 -1
  557. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
  558. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
  559. data/src/ruby/lib/grpc/version.rb +1 -1
  560. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  561. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  562. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  563. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  564. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  565. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  566. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  567. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  568. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  569. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  570. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  571. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  572. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  573. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  574. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  575. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  576. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  577. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  578. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  579. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  580. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  581. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  582. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  583. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  584. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  585. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  586. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  587. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  588. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  589. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  590. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  591. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  592. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  593. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  594. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  595. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  596. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  597. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  598. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  599. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  600. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  601. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  602. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  603. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  604. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  605. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  606. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  607. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  608. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  609. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  610. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  611. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  612. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  613. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  614. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  615. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  616. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  617. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  618. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  619. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  621. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  622. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  623. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  624. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  625. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  626. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  627. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  628. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  629. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  630. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  631. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  632. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  633. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  634. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  635. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  636. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  637. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  638. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  639. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  640. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  641. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  642. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  643. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  644. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  645. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  646. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  647. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  648. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  649. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  650. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  651. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  652. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  653. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  654. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  655. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  656. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  657. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  658. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  659. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  660. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  661. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  662. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  663. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  664. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  665. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  666. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  667. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  668. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  669. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  670. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  671. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  672. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  673. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  674. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  675. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  676. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  677. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  678. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  679. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  680. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  681. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  682. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  683. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  684. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  686. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  687. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  689. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  690. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  691. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  692. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  693. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  694. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  696. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  697. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  702. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  703. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  704. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  705. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  706. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  707. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  708. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  709. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  710. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
  711. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  712. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  713. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
  714. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  715. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  716. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  718. data/third_party/upb/upb/decode.c +309 -178
  719. data/third_party/upb/upb/decode_fast.c +1 -1
  720. data/third_party/upb/upb/decode_internal.h +1 -0
  721. data/third_party/upb/upb/def.c +330 -85
  722. data/third_party/upb/upb/def.h +45 -14
  723. data/third_party/upb/upb/def.hpp +17 -4
  724. data/third_party/upb/upb/encode.c +100 -40
  725. data/third_party/upb/upb/msg.c +22 -9
  726. data/third_party/upb/upb/msg_internal.h +90 -8
  727. data/third_party/upb/upb/reflection.c +98 -58
  728. data/third_party/upb/upb/reflection.h +6 -2
  729. data/third_party/upb/upb/text_encode.c +3 -3
  730. data/third_party/upb/upb/upb.c +8 -0
  731. metadata +116 -56
  732. data/src/core/lib/avl/avl.cc +0 -306
  733. data/src/core/lib/gprpp/match.h +0 -73
  734. data/src/core/lib/gprpp/overload.h +0 -59
  735. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  736. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  737. data/src/core/lib/iomgr/resource_quota.h +0 -226
  738. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  739. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -361,43 +361,49 @@ inline void SubstituteAndAppend(
361
361
  // This body of functions catches cases where the number of placeholders
362
362
  // doesn't match the number of data arguments.
363
363
  void SubstituteAndAppend(std::string* output, const char* format)
364
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 0,
365
- "There were no substitution arguments "
366
- "but this format string has a $[0-9] in it");
364
+ ABSL_BAD_CALL_IF(
365
+ substitute_internal::PlaceholderBitmask(format) != 0,
366
+ "There were no substitution arguments "
367
+ "but this format string either has a $[0-9] in it or contains "
368
+ "an unescaped $ character (use $$ instead)");
367
369
 
368
370
  void SubstituteAndAppend(std::string* output, const char* format,
369
371
  const substitute_internal::Arg& a0)
370
372
  ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1,
371
373
  "There was 1 substitution argument given, but "
372
- "this format string is either missing its $0, or "
373
- "contains one of $1-$9");
374
+ "this format string is missing its $0, contains "
375
+ "one of $1-$9, or contains an unescaped $ character (use "
376
+ "$$ instead)");
374
377
 
375
378
  void SubstituteAndAppend(std::string* output, const char* format,
376
379
  const substitute_internal::Arg& a0,
377
380
  const substitute_internal::Arg& a1)
378
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 3,
379
- "There were 2 substitution arguments given, but "
380
- "this format string is either missing its $0/$1, or "
381
- "contains one of $2-$9");
381
+ ABSL_BAD_CALL_IF(
382
+ substitute_internal::PlaceholderBitmask(format) != 3,
383
+ "There were 2 substitution arguments given, but this format string is "
384
+ "missing its $0/$1, contains one of $2-$9, or contains an "
385
+ "unescaped $ character (use $$ instead)");
382
386
 
383
387
  void SubstituteAndAppend(std::string* output, const char* format,
384
388
  const substitute_internal::Arg& a0,
385
389
  const substitute_internal::Arg& a1,
386
390
  const substitute_internal::Arg& a2)
387
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 7,
388
- "There were 3 substitution arguments given, but "
389
- "this format string is either missing its $0/$1/$2, or "
390
- "contains one of $3-$9");
391
+ ABSL_BAD_CALL_IF(
392
+ substitute_internal::PlaceholderBitmask(format) != 7,
393
+ "There were 3 substitution arguments given, but "
394
+ "this format string is missing its $0/$1/$2, contains one of "
395
+ "$3-$9, or contains an unescaped $ character (use $$ instead)");
391
396
 
392
397
  void SubstituteAndAppend(std::string* output, const char* format,
393
398
  const substitute_internal::Arg& a0,
394
399
  const substitute_internal::Arg& a1,
395
400
  const substitute_internal::Arg& a2,
396
401
  const substitute_internal::Arg& a3)
397
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 15,
398
- "There were 4 substitution arguments given, but "
399
- "this format string is either missing its $0-$3, or "
400
- "contains one of $4-$9");
402
+ ABSL_BAD_CALL_IF(
403
+ substitute_internal::PlaceholderBitmask(format) != 15,
404
+ "There were 4 substitution arguments given, but "
405
+ "this format string is missing its $0-$3, contains one of "
406
+ "$4-$9, or contains an unescaped $ character (use $$ instead)");
401
407
 
402
408
  void SubstituteAndAppend(std::string* output, const char* format,
403
409
  const substitute_internal::Arg& a0,
@@ -405,10 +411,11 @@ void SubstituteAndAppend(std::string* output, const char* format,
405
411
  const substitute_internal::Arg& a2,
406
412
  const substitute_internal::Arg& a3,
407
413
  const substitute_internal::Arg& a4)
408
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 31,
409
- "There were 5 substitution arguments given, but "
410
- "this format string is either missing its $0-$4, or "
411
- "contains one of $5-$9");
414
+ ABSL_BAD_CALL_IF(
415
+ substitute_internal::PlaceholderBitmask(format) != 31,
416
+ "There were 5 substitution arguments given, but "
417
+ "this format string is missing its $0-$4, contains one of "
418
+ "$5-$9, or contains an unescaped $ character (use $$ instead)");
412
419
 
413
420
  void SubstituteAndAppend(std::string* output, const char* format,
414
421
  const substitute_internal::Arg& a0,
@@ -417,20 +424,22 @@ void SubstituteAndAppend(std::string* output, const char* format,
417
424
  const substitute_internal::Arg& a3,
418
425
  const substitute_internal::Arg& a4,
419
426
  const substitute_internal::Arg& a5)
420
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 63,
421
- "There were 6 substitution arguments given, but "
422
- "this format string is either missing its $0-$5, or "
423
- "contains one of $6-$9");
427
+ ABSL_BAD_CALL_IF(
428
+ substitute_internal::PlaceholderBitmask(format) != 63,
429
+ "There were 6 substitution arguments given, but "
430
+ "this format string is missing its $0-$5, contains one of "
431
+ "$6-$9, or contains an unescaped $ character (use $$ instead)");
424
432
 
425
433
  void SubstituteAndAppend(
426
434
  std::string* output, const char* format, const substitute_internal::Arg& a0,
427
435
  const substitute_internal::Arg& a1, const substitute_internal::Arg& a2,
428
436
  const substitute_internal::Arg& a3, const substitute_internal::Arg& a4,
429
437
  const substitute_internal::Arg& a5, const substitute_internal::Arg& a6)
430
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 127,
431
- "There were 7 substitution arguments given, but "
432
- "this format string is either missing its $0-$6, or "
433
- "contains one of $7-$9");
438
+ ABSL_BAD_CALL_IF(
439
+ substitute_internal::PlaceholderBitmask(format) != 127,
440
+ "There were 7 substitution arguments given, but "
441
+ "this format string is missing its $0-$6, contains one of "
442
+ "$7-$9, or contains an unescaped $ character (use $$ instead)");
434
443
 
435
444
  void SubstituteAndAppend(
436
445
  std::string* output, const char* format, const substitute_internal::Arg& a0,
@@ -438,10 +447,11 @@ void SubstituteAndAppend(
438
447
  const substitute_internal::Arg& a3, const substitute_internal::Arg& a4,
439
448
  const substitute_internal::Arg& a5, const substitute_internal::Arg& a6,
440
449
  const substitute_internal::Arg& a7)
441
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 255,
442
- "There were 8 substitution arguments given, but "
443
- "this format string is either missing its $0-$7, or "
444
- "contains one of $8-$9");
450
+ ABSL_BAD_CALL_IF(
451
+ substitute_internal::PlaceholderBitmask(format) != 255,
452
+ "There were 8 substitution arguments given, but "
453
+ "this format string is missing its $0-$7, contains one of "
454
+ "$8-$9, or contains an unescaped $ character (use $$ instead)");
445
455
 
446
456
  void SubstituteAndAppend(
447
457
  std::string* output, const char* format, const substitute_internal::Arg& a0,
@@ -452,7 +462,8 @@ void SubstituteAndAppend(
452
462
  ABSL_BAD_CALL_IF(
453
463
  substitute_internal::PlaceholderBitmask(format) != 511,
454
464
  "There were 9 substitution arguments given, but "
455
- "this format string is either missing its $0-$8, or contains a $9");
465
+ "this format string is missing its $0-$8, contains a $9, or "
466
+ "contains an unescaped $ character (use $$ instead)");
456
467
 
457
468
  void SubstituteAndAppend(
458
469
  std::string* output, const char* format, const substitute_internal::Arg& a0,
@@ -461,9 +472,11 @@ void SubstituteAndAppend(
461
472
  const substitute_internal::Arg& a5, const substitute_internal::Arg& a6,
462
473
  const substitute_internal::Arg& a7, const substitute_internal::Arg& a8,
463
474
  const substitute_internal::Arg& a9)
464
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1023,
465
- "There were 10 substitution arguments given, but this "
466
- "format string doesn't contain all of $0 through $9");
475
+ ABSL_BAD_CALL_IF(
476
+ substitute_internal::PlaceholderBitmask(format) != 1023,
477
+ "There were 10 substitution arguments given, but this "
478
+ "format string either doesn't contain all of $0 through $9 or "
479
+ "contains an unescaped $ character (use $$ instead)");
467
480
  #endif // ABSL_BAD_CALL_IF
468
481
 
469
482
  // Substitute()
@@ -589,47 +602,53 @@ ABSL_MUST_USE_RESULT inline std::string Substitute(
589
602
  std::string Substitute(const char* format)
590
603
  ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 0,
591
604
  "There were no substitution arguments "
592
- "but this format string has a $[0-9] in it");
605
+ "but this format string either has a $[0-9] in it or "
606
+ "contains an unescaped $ character (use $$ instead)");
593
607
 
594
608
  std::string Substitute(const char* format, const substitute_internal::Arg& a0)
595
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1,
596
- "There was 1 substitution argument given, but "
597
- "this format string is either missing its $0, or "
598
- "contains one of $1-$9");
609
+ ABSL_BAD_CALL_IF(
610
+ substitute_internal::PlaceholderBitmask(format) != 1,
611
+ "There was 1 substitution argument given, but "
612
+ "this format string is missing its $0, contains one of $1-$9, "
613
+ "or contains an unescaped $ character (use $$ instead)");
599
614
 
600
615
  std::string Substitute(const char* format, const substitute_internal::Arg& a0,
601
616
  const substitute_internal::Arg& a1)
602
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 3,
603
- "There were 2 substitution arguments given, but "
604
- "this format string is either missing its $0/$1, or "
605
- "contains one of $2-$9");
617
+ ABSL_BAD_CALL_IF(
618
+ substitute_internal::PlaceholderBitmask(format) != 3,
619
+ "There were 2 substitution arguments given, but "
620
+ "this format string is missing its $0/$1, contains one of "
621
+ "$2-$9, or contains an unescaped $ character (use $$ instead)");
606
622
 
607
623
  std::string Substitute(const char* format, const substitute_internal::Arg& a0,
608
624
  const substitute_internal::Arg& a1,
609
625
  const substitute_internal::Arg& a2)
610
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 7,
611
- "There were 3 substitution arguments given, but "
612
- "this format string is either missing its $0/$1/$2, or "
613
- "contains one of $3-$9");
626
+ ABSL_BAD_CALL_IF(
627
+ substitute_internal::PlaceholderBitmask(format) != 7,
628
+ "There were 3 substitution arguments given, but "
629
+ "this format string is missing its $0/$1/$2, contains one of "
630
+ "$3-$9, or contains an unescaped $ character (use $$ instead)");
614
631
 
615
632
  std::string Substitute(const char* format, const substitute_internal::Arg& a0,
616
633
  const substitute_internal::Arg& a1,
617
634
  const substitute_internal::Arg& a2,
618
635
  const substitute_internal::Arg& a3)
619
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 15,
620
- "There were 4 substitution arguments given, but "
621
- "this format string is either missing its $0-$3, or "
622
- "contains one of $4-$9");
636
+ ABSL_BAD_CALL_IF(
637
+ substitute_internal::PlaceholderBitmask(format) != 15,
638
+ "There were 4 substitution arguments given, but "
639
+ "this format string is missing its $0-$3, contains one of "
640
+ "$4-$9, or contains an unescaped $ character (use $$ instead)");
623
641
 
624
642
  std::string Substitute(const char* format, const substitute_internal::Arg& a0,
625
643
  const substitute_internal::Arg& a1,
626
644
  const substitute_internal::Arg& a2,
627
645
  const substitute_internal::Arg& a3,
628
646
  const substitute_internal::Arg& a4)
629
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 31,
630
- "There were 5 substitution arguments given, but "
631
- "this format string is either missing its $0-$4, or "
632
- "contains one of $5-$9");
647
+ ABSL_BAD_CALL_IF(
648
+ substitute_internal::PlaceholderBitmask(format) != 31,
649
+ "There were 5 substitution arguments given, but "
650
+ "this format string is missing its $0-$4, contains one of "
651
+ "$5-$9, or contains an unescaped $ character (use $$ instead)");
633
652
 
634
653
  std::string Substitute(const char* format, const substitute_internal::Arg& a0,
635
654
  const substitute_internal::Arg& a1,
@@ -637,10 +656,11 @@ std::string Substitute(const char* format, const substitute_internal::Arg& a0,
637
656
  const substitute_internal::Arg& a3,
638
657
  const substitute_internal::Arg& a4,
639
658
  const substitute_internal::Arg& a5)
640
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 63,
641
- "There were 6 substitution arguments given, but "
642
- "this format string is either missing its $0-$5, or "
643
- "contains one of $6-$9");
659
+ ABSL_BAD_CALL_IF(
660
+ substitute_internal::PlaceholderBitmask(format) != 63,
661
+ "There were 6 substitution arguments given, but "
662
+ "this format string is missing its $0-$5, contains one of "
663
+ "$6-$9, or contains an unescaped $ character (use $$ instead)");
644
664
 
645
665
  std::string Substitute(const char* format, const substitute_internal::Arg& a0,
646
666
  const substitute_internal::Arg& a1,
@@ -649,10 +669,11 @@ std::string Substitute(const char* format, const substitute_internal::Arg& a0,
649
669
  const substitute_internal::Arg& a4,
650
670
  const substitute_internal::Arg& a5,
651
671
  const substitute_internal::Arg& a6)
652
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 127,
653
- "There were 7 substitution arguments given, but "
654
- "this format string is either missing its $0-$6, or "
655
- "contains one of $7-$9");
672
+ ABSL_BAD_CALL_IF(
673
+ substitute_internal::PlaceholderBitmask(format) != 127,
674
+ "There were 7 substitution arguments given, but "
675
+ "this format string is missing its $0-$6, contains one of "
676
+ "$7-$9, or contains an unescaped $ character (use $$ instead)");
656
677
 
657
678
  std::string Substitute(const char* format, const substitute_internal::Arg& a0,
658
679
  const substitute_internal::Arg& a1,
@@ -662,10 +683,11 @@ std::string Substitute(const char* format, const substitute_internal::Arg& a0,
662
683
  const substitute_internal::Arg& a5,
663
684
  const substitute_internal::Arg& a6,
664
685
  const substitute_internal::Arg& a7)
665
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 255,
666
- "There were 8 substitution arguments given, but "
667
- "this format string is either missing its $0-$7, or "
668
- "contains one of $8-$9");
686
+ ABSL_BAD_CALL_IF(
687
+ substitute_internal::PlaceholderBitmask(format) != 255,
688
+ "There were 8 substitution arguments given, but "
689
+ "this format string is missing its $0-$7, contains one of "
690
+ "$8-$9, or contains an unescaped $ character (use $$ instead)");
669
691
 
670
692
  std::string Substitute(
671
693
  const char* format, const substitute_internal::Arg& a0,
@@ -676,7 +698,8 @@ std::string Substitute(
676
698
  ABSL_BAD_CALL_IF(
677
699
  substitute_internal::PlaceholderBitmask(format) != 511,
678
700
  "There were 9 substitution arguments given, but "
679
- "this format string is either missing its $0-$8, or contains a $9");
701
+ "this format string is missing its $0-$8, contains a $9, or "
702
+ "contains an unescaped $ character (use $$ instead)");
680
703
 
681
704
  std::string Substitute(
682
705
  const char* format, const substitute_internal::Arg& a0,
@@ -685,9 +708,11 @@ std::string Substitute(
685
708
  const substitute_internal::Arg& a5, const substitute_internal::Arg& a6,
686
709
  const substitute_internal::Arg& a7, const substitute_internal::Arg& a8,
687
710
  const substitute_internal::Arg& a9)
688
- ABSL_BAD_CALL_IF(substitute_internal::PlaceholderBitmask(format) != 1023,
689
- "There were 10 substitution arguments given, but this "
690
- "format string doesn't contain all of $0 through $9");
711
+ ABSL_BAD_CALL_IF(
712
+ substitute_internal::PlaceholderBitmask(format) != 1023,
713
+ "There were 10 substitution arguments given, but this "
714
+ "format string either doesn't contain all of $0 through $9 or "
715
+ "contains an unescaped $ character (use $$ instead)");
691
716
  #endif // ABSL_BAD_CALL_IF
692
717
 
693
718
  ABSL_NAMESPACE_END
@@ -14,41 +14,51 @@
14
14
 
15
15
  #include "absl/synchronization/blocking_counter.h"
16
16
 
17
+ #include <atomic>
18
+
17
19
  #include "absl/base/internal/raw_logging.h"
18
20
 
19
21
  namespace absl {
20
22
  ABSL_NAMESPACE_BEGIN
21
23
 
22
- // Return whether int *arg is zero.
23
- static bool IsZero(void *arg) {
24
- return 0 == *reinterpret_cast<int *>(arg);
24
+ namespace {
25
+
26
+ // Return whether int *arg is true.
27
+ bool IsDone(void *arg) { return *reinterpret_cast<bool *>(arg); }
28
+
29
+ } // namespace
30
+
31
+ BlockingCounter::BlockingCounter(int initial_count)
32
+ : count_(initial_count),
33
+ num_waiting_(0),
34
+ done_{initial_count == 0 ? true : false} {
35
+ ABSL_RAW_CHECK(initial_count >= 0, "BlockingCounter initial_count negative");
25
36
  }
26
37
 
27
38
  bool BlockingCounter::DecrementCount() {
28
- MutexLock l(&lock_);
29
- count_--;
30
- if (count_ < 0) {
31
- ABSL_RAW_LOG(
32
- FATAL,
33
- "BlockingCounter::DecrementCount() called too many times. count=%d",
34
- count_);
39
+ int count = count_.fetch_sub(1, std::memory_order_acq_rel) - 1;
40
+ ABSL_RAW_CHECK(count >= 0,
41
+ "BlockingCounter::DecrementCount() called too many times");
42
+ if (count == 0) {
43
+ MutexLock l(&lock_);
44
+ done_ = true;
45
+ return true;
35
46
  }
36
- return count_ == 0;
47
+ return false;
37
48
  }
38
49
 
39
50
  void BlockingCounter::Wait() {
40
51
  MutexLock l(&this->lock_);
41
- ABSL_RAW_CHECK(count_ >= 0, "BlockingCounter underflow");
42
52
 
43
53
  // only one thread may call Wait(). To support more than one thread,
44
54
  // implement a counter num_to_exit, like in the Barrier class.
45
55
  ABSL_RAW_CHECK(num_waiting_ == 0, "multiple threads called Wait()");
46
56
  num_waiting_++;
47
57
 
48
- this->lock_.Await(Condition(IsZero, &this->count_));
58
+ this->lock_.Await(Condition(IsDone, &this->done_));
49
59
 
50
- // At this point, We know that all threads executing DecrementCount have
51
- // released the lock, and so will not touch this object again.
60
+ // At this point, we know that all threads executing DecrementCount
61
+ // will not touch this object again.
52
62
  // Therefore, the thread calling this method is free to delete the object
53
63
  // after we return from this method.
54
64
  }
@@ -20,6 +20,8 @@
20
20
  #ifndef ABSL_SYNCHRONIZATION_BLOCKING_COUNTER_H_
21
21
  #define ABSL_SYNCHRONIZATION_BLOCKING_COUNTER_H_
22
22
 
23
+ #include <atomic>
24
+
23
25
  #include "absl/base/thread_annotations.h"
24
26
  #include "absl/synchronization/mutex.h"
25
27
 
@@ -60,8 +62,7 @@ ABSL_NAMESPACE_BEGIN
60
62
  //
61
63
  class BlockingCounter {
62
64
  public:
63
- explicit BlockingCounter(int initial_count)
64
- : count_(initial_count), num_waiting_(0) {}
65
+ explicit BlockingCounter(int initial_count);
65
66
 
66
67
  BlockingCounter(const BlockingCounter&) = delete;
67
68
  BlockingCounter& operator=(const BlockingCounter&) = delete;
@@ -89,8 +90,9 @@ class BlockingCounter {
89
90
 
90
91
  private:
91
92
  Mutex lock_;
92
- int count_ ABSL_GUARDED_BY(lock_);
93
+ std::atomic<int> count_;
93
94
  int num_waiting_ ABSL_GUARDED_BY(lock_);
95
+ bool done_ ABSL_GUARDED_BY(lock_);
94
96
  };
95
97
 
96
98
  ABSL_NAMESPACE_END
@@ -79,6 +79,7 @@ bool Waiter::Wait(KernelTimeout t) {
79
79
  // Note that, since the thread ticker is just reset, we don't need to check
80
80
  // whether the thread is idle on the very first pass of the loop.
81
81
  bool first_pass = true;
82
+
82
83
  while (true) {
83
84
  int32_t x = futex_.load(std::memory_order_relaxed);
84
85
  while (x != 0) {
@@ -90,7 +91,6 @@ bool Waiter::Wait(KernelTimeout t) {
90
91
  return true; // Consumed a wakeup, we are done.
91
92
  }
92
93
 
93
-
94
94
  if (!first_pass) MaybeBecomeIdle();
95
95
  const int err = Futex::WaitUntil(&futex_, 0, t);
96
96
  if (err != 0) {
@@ -778,9 +778,9 @@ class Condition {
778
778
  //
779
779
  // Usage to wake T is:
780
780
  // mu.Lock();
781
- // // process data, possibly establishing C
782
- // if (C) { cv->Signal(); }
783
- // mu.Unlock();
781
+ // // process data, possibly establishing C
782
+ // if (C) { cv->Signal(); }
783
+ // mu.Unlock();
784
784
  //
785
785
  // If C may be useful to more than one waiter, use `SignalAll()` instead of
786
786
  // `Signal()`.
@@ -38,9 +38,7 @@ std::string FormatYearAnd(string_view fmt, CivilSecond cs) {
38
38
  const CivilSecond ncs(NormalizeYear(cs.year()), cs.month(), cs.day(),
39
39
  cs.hour(), cs.minute(), cs.second());
40
40
  const TimeZone utc = UTCTimeZone();
41
- // TODO(absl-team): Avoid conversion of fmt string.
42
- return StrCat(cs.year(),
43
- FormatTime(std::string(fmt), FromCivil(ncs, utc), utc));
41
+ return StrCat(cs.year(), FormatTime(fmt, FromCivil(ncs, utc), utc));
44
42
  }
45
43
 
46
44
  template <typename CivilT>
@@ -22,6 +22,7 @@
22
22
 
23
23
  #include <chrono>
24
24
  #include <cstdint>
25
+ #include <limits>
25
26
  #include <string>
26
27
  #include <utility>
27
28
 
@@ -41,20 +42,9 @@ using sys_seconds = seconds; // Deprecated. Use cctz::seconds instead.
41
42
 
42
43
  namespace detail {
43
44
  template <typename D>
44
- inline std::pair<time_point<seconds>, D> split_seconds(
45
- const time_point<D>& tp) {
46
- auto sec = std::chrono::time_point_cast<seconds>(tp);
47
- auto sub = tp - sec;
48
- if (sub.count() < 0) {
49
- sec -= seconds(1);
50
- sub += seconds(1);
51
- }
52
- return {sec, std::chrono::duration_cast<D>(sub)};
53
- }
54
- inline std::pair<time_point<seconds>, seconds> split_seconds(
55
- const time_point<seconds>& tp) {
56
- return {tp, seconds::zero()};
57
- }
45
+ std::pair<time_point<seconds>, D> split_seconds(const time_point<D>& tp);
46
+ std::pair<time_point<seconds>, seconds> split_seconds(
47
+ const time_point<seconds>& tp);
58
48
  } // namespace detail
59
49
 
60
50
  // cctz::time_zone is an opaque, small, value-type class representing a
@@ -279,6 +269,20 @@ std::string format(const std::string&, const time_point<seconds>&,
279
269
  const femtoseconds&, const time_zone&);
280
270
  bool parse(const std::string&, const std::string&, const time_zone&,
281
271
  time_point<seconds>*, femtoseconds*, std::string* err = nullptr);
272
+ template <typename Rep, std::intmax_t Denom>
273
+ bool join_seconds(
274
+ const time_point<seconds>& sec, const femtoseconds& fs,
275
+ time_point<std::chrono::duration<Rep, std::ratio<1, Denom>>>* tpp);
276
+ template <typename Rep, std::intmax_t Num>
277
+ bool join_seconds(
278
+ const time_point<seconds>& sec, const femtoseconds& fs,
279
+ time_point<std::chrono::duration<Rep, std::ratio<Num, 1>>>* tpp);
280
+ template <typename Rep>
281
+ bool join_seconds(
282
+ const time_point<seconds>& sec, const femtoseconds& fs,
283
+ time_point<std::chrono::duration<Rep, std::ratio<1, 1>>>* tpp);
284
+ bool join_seconds(const time_point<seconds>& sec, const femtoseconds&,
285
+ time_point<seconds>* tpp);
282
286
  } // namespace detail
283
287
 
284
288
  // Formats the given time_point in the given cctz::time_zone according to
@@ -369,15 +373,84 @@ inline bool parse(const std::string& fmt, const std::string& input,
369
373
  const time_zone& tz, time_point<D>* tpp) {
370
374
  time_point<seconds> sec;
371
375
  detail::femtoseconds fs;
372
- const bool b = detail::parse(fmt, input, tz, &sec, &fs);
373
- if (b) {
374
- // TODO: Return false if unrepresentable as a time_point<D>.
375
- *tpp = std::chrono::time_point_cast<D>(sec);
376
- *tpp += std::chrono::duration_cast<D>(fs);
376
+ return detail::parse(fmt, input, tz, &sec, &fs) &&
377
+ detail::join_seconds(sec, fs, tpp);
378
+ }
379
+
380
+ namespace detail {
381
+
382
+ // Split a time_point<D> into a time_point<seconds> and a D subseconds.
383
+ // Undefined behavior if time_point<seconds> is not of sufficient range.
384
+ // Note that this means it is UB to call cctz::time_zone::lookup(tp) or
385
+ // cctz::format(fmt, tp, tz) with a time_point that is outside the range
386
+ // of a 64-bit std::time_t.
387
+ template <typename D>
388
+ std::pair<time_point<seconds>, D> split_seconds(const time_point<D>& tp) {
389
+ auto sec = std::chrono::time_point_cast<seconds>(tp);
390
+ auto sub = tp - sec;
391
+ if (sub.count() < 0) {
392
+ sec -= seconds(1);
393
+ sub += seconds(1);
377
394
  }
378
- return b;
395
+ return {sec, std::chrono::duration_cast<D>(sub)};
396
+ }
397
+
398
+ inline std::pair<time_point<seconds>, seconds> split_seconds(
399
+ const time_point<seconds>& tp) {
400
+ return {tp, seconds::zero()};
379
401
  }
380
402
 
403
+ // Join a time_point<seconds> and femto subseconds into a time_point<D>.
404
+ // Floors to the resolution of time_point<D>. Returns false if time_point<D>
405
+ // is not of sufficient range.
406
+ template <typename Rep, std::intmax_t Denom>
407
+ bool join_seconds(
408
+ const time_point<seconds>& sec, const femtoseconds& fs,
409
+ time_point<std::chrono::duration<Rep, std::ratio<1, Denom>>>* tpp) {
410
+ using D = std::chrono::duration<Rep, std::ratio<1, Denom>>;
411
+ // TODO(#199): Return false if result unrepresentable as a time_point<D>.
412
+ *tpp = std::chrono::time_point_cast<D>(sec);
413
+ *tpp += std::chrono::duration_cast<D>(fs);
414
+ return true;
415
+ }
416
+
417
+ template <typename Rep, std::intmax_t Num>
418
+ bool join_seconds(
419
+ const time_point<seconds>& sec, const femtoseconds&,
420
+ time_point<std::chrono::duration<Rep, std::ratio<Num, 1>>>* tpp) {
421
+ using D = std::chrono::duration<Rep, std::ratio<Num, 1>>;
422
+ auto count = sec.time_since_epoch().count();
423
+ if (count >= 0 || count % Num == 0) {
424
+ count /= Num;
425
+ } else {
426
+ count /= Num;
427
+ count -= 1;
428
+ }
429
+ if (count > (std::numeric_limits<Rep>::max)()) return false;
430
+ if (count < (std::numeric_limits<Rep>::min)()) return false;
431
+ *tpp = time_point<D>() + D{static_cast<Rep>(count)};
432
+ return true;
433
+ }
434
+
435
+ template <typename Rep>
436
+ bool join_seconds(
437
+ const time_point<seconds>& sec, const femtoseconds&,
438
+ time_point<std::chrono::duration<Rep, std::ratio<1, 1>>>* tpp) {
439
+ using D = std::chrono::duration<Rep, std::ratio<1, 1>>;
440
+ auto count = sec.time_since_epoch().count();
441
+ if (count > (std::numeric_limits<Rep>::max)()) return false;
442
+ if (count < (std::numeric_limits<Rep>::min)()) return false;
443
+ *tpp = time_point<D>() + D{static_cast<Rep>(count)};
444
+ return true;
445
+ }
446
+
447
+ inline bool join_seconds(const time_point<seconds>& sec, const femtoseconds&,
448
+ time_point<seconds>* tpp) {
449
+ *tpp = sec;
450
+ return true;
451
+ }
452
+
453
+ } // namespace detail
381
454
  } // namespace cctz
382
455
  } // namespace time_internal
383
456
  ABSL_NAMESPACE_END
@@ -53,7 +53,7 @@ int Parse02d(const char* p) {
53
53
  } // namespace
54
54
 
55
55
  bool FixedOffsetFromName(const std::string& name, seconds* offset) {
56
- if (name.compare(0, std::string::npos, "UTC", 3) == 0) {
56
+ if (name == "UTC" || name == "UTC0") {
57
57
  *offset = seconds::zero();
58
58
  return true;
59
59
  }
@@ -56,7 +56,8 @@ class TimeZoneIf {
56
56
 
57
57
  // Convert between time_point<seconds> and a count of seconds since the
58
58
  // Unix epoch. We assume that the std::chrono::system_clock and the
59
- // Unix clock are second aligned, but not that they share an epoch.
59
+ // Unix clock are second aligned, and that the results are representable.
60
+ // (That is, that they share an epoch, which is required since C++20.)
60
61
  inline std::int_fast64_t ToUnixSeconds(const time_point<seconds>& tp) {
61
62
  return (tp - std::chrono::time_point_cast<seconds>(
62
63
  std::chrono::system_clock::from_time_t(0)))