grpc 1.41.0.pre2 → 1.42.0

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 (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +81 -68
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. data/src/core/lib/transport/authority_override.h +0 -37
@@ -102,18 +102,6 @@ class XdsClient : public DualRefCounted<XdsClient> {
102
102
 
103
103
  grpc_pollset_set* interested_parties() const { return interested_parties_; }
104
104
 
105
- // TODO(roth): When we add federation, there will be multiple channels
106
- // inside the XdsClient, and the set of channels may change over time,
107
- // but not every channel may use every one of the child channels, so
108
- // this API will need to change. At minumum, we will need to hold a
109
- // ref to the parent channelz node so that we can update its list of
110
- // children as the set of xDS channels changes. However, we may also
111
- // want to make this a bit more selective such that only those
112
- // channels on which a given parent channel is actually requesting
113
- // resources will actually be marked as its children.
114
- void AddChannelzLinkage(channelz::ChannelNode* parent_channelz_node);
115
- void RemoveChannelzLinkage(channelz::ChannelNode* parent_channelz_node);
116
-
117
105
  void Orphan() override;
118
106
 
119
107
  // Start and cancel listener data watch for a listener.
@@ -210,12 +198,7 @@ class XdsClient : public DualRefCounted<XdsClient> {
210
198
  private:
211
199
  // Contains a channel to the xds server and all the data related to the
212
200
  // channel. Holds a ref to the xds client object.
213
- //
214
- // Currently, there is only one ChannelState object per XdsClient
215
- // object, and it has essentially the same lifetime. But in the
216
- // future, when we add federation support, a single XdsClient may have
217
- // multiple underlying channels to talk to different xDS servers.
218
- class ChannelState : public InternallyRefCounted<ChannelState> {
201
+ class ChannelState : public DualRefCounted<ChannelState> {
219
202
  public:
220
203
  template <typename T>
221
204
  class RetryableCall;
@@ -243,9 +226,11 @@ class XdsClient : public DualRefCounted<XdsClient> {
243
226
  void StartConnectivityWatchLocked();
244
227
  void CancelConnectivityWatchLocked();
245
228
 
246
- void SubscribeLocked(const std::string& type_url, const std::string& name)
229
+ void SubscribeLocked(const std::string& type_url,
230
+ const XdsApi::ResourceName& resource)
247
231
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
248
- void UnsubscribeLocked(const std::string& type_url, const std::string& name,
232
+ void UnsubscribeLocked(const std::string& type_url,
233
+ const XdsApi::ResourceName& resource,
249
234
  bool delay_unsubscription)
250
235
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(&XdsClient::mu_);
251
236
 
@@ -260,11 +245,15 @@ class XdsClient : public DualRefCounted<XdsClient> {
260
245
  // The channel and its status.
261
246
  grpc_channel* channel_;
262
247
  bool shutting_down_ = false;
263
- StateWatcher* watcher_ = nullptr;
248
+ StateWatcher* watcher_;
264
249
 
265
250
  // The retryable XDS calls.
266
251
  OrphanablePtr<RetryableCall<AdsCallState>> ads_calld_;
267
252
  OrphanablePtr<RetryableCall<LrsCallState>> lrs_calld_;
253
+
254
+ // Stores the most recent accepted resource version for each resource type.
255
+ std::map<std::string /*type*/, std::string /*version*/>
256
+ resource_type_version_map_;
268
257
  };
269
258
 
270
259
  struct ListenerState {
@@ -302,6 +291,20 @@ class XdsClient : public DualRefCounted<XdsClient> {
302
291
  XdsApi::ResourceMetadata meta;
303
292
  };
304
293
 
294
+ struct AuthorityState {
295
+ RefCountedPtr<ChannelState> channel_state;
296
+ std::map<std::string /*listener_name*/, ListenerState> listener_map;
297
+ std::map<std::string /*route_config_name*/, RouteConfigState>
298
+ route_config_map;
299
+ std::map<std::string /*cluster_name*/, ClusterState> cluster_map;
300
+ std::map<std::string /*eds_service_name*/, EndpointState> endpoint_map;
301
+
302
+ bool HasSubscribedResources() {
303
+ return !listener_map.empty() || !route_config_map.empty() ||
304
+ !cluster_map.empty() || !endpoint_map.empty();
305
+ }
306
+ };
307
+
305
308
  struct LoadReportState {
306
309
  struct LocalityState {
307
310
  XdsClusterLocalityStats* locality_stats = nullptr;
@@ -324,6 +327,9 @@ class XdsClient : public DualRefCounted<XdsClient> {
324
327
  bool send_all_clusters, const std::set<std::string>& clusters)
325
328
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
326
329
 
330
+ RefCountedPtr<ChannelState> GetOrCreateChannelStateLocked(
331
+ const XdsBootstrap::XdsServer& server) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
332
+
327
333
  std::unique_ptr<XdsBootstrap> bootstrap_;
328
334
  grpc_channel_args* args_;
329
335
  const grpc_millis request_timeout_;
@@ -333,20 +339,11 @@ class XdsClient : public DualRefCounted<XdsClient> {
333
339
 
334
340
  Mutex mu_;
335
341
 
336
- // The channel for communicating with the xds server.
337
- OrphanablePtr<ChannelState> chand_ ABSL_GUARDED_BY(mu_);
338
-
339
- // One entry for each watched LDS resource.
340
- std::map<std::string /*listener_name*/, ListenerState> listener_map_
341
- ABSL_GUARDED_BY(mu_);
342
- // One entry for each watched RDS resource.
343
- std::map<std::string /*route_config_name*/, RouteConfigState>
344
- route_config_map_ ABSL_GUARDED_BY(mu_);
345
- // One entry for each watched CDS resource.
346
- std::map<std::string /*cluster_name*/, ClusterState> cluster_map_
342
+ // Map of existing xDS server channels.
343
+ std::map<XdsBootstrap::XdsServer, ChannelState*> xds_server_channel_map_
347
344
  ABSL_GUARDED_BY(mu_);
348
- // One entry for each watched EDS resource.
349
- std::map<std::string /*eds_service_name*/, EndpointState> endpoint_map_
345
+
346
+ std::map<std::string /*authority*/, AuthorityState> authority_state_map_
350
347
  ABSL_GUARDED_BY(mu_);
351
348
 
352
349
  // Load report data.
@@ -355,9 +352,17 @@ class XdsClient : public DualRefCounted<XdsClient> {
355
352
  LoadReportState>
356
353
  load_report_map_ ABSL_GUARDED_BY(mu_);
357
354
 
358
- // Stores the most recent accepted resource version for each resource type.
359
- std::map<std::string /*type*/, std::string /*version*/> resource_version_map_
360
- ABSL_GUARDED_BY(mu_);
355
+ // Stores started watchers whose resource name was not parsed successfully,
356
+ // waiting to be cancelled or reset in Orphan().
357
+ std::map<ListenerWatcherInterface*, std::unique_ptr<ListenerWatcherInterface>>
358
+ invalid_listener_watchers_ ABSL_GUARDED_BY(mu_);
359
+ std::map<RouteConfigWatcherInterface*,
360
+ std::unique_ptr<RouteConfigWatcherInterface>>
361
+ invalid_route_config_watchers_ ABSL_GUARDED_BY(mu_);
362
+ std::map<ClusterWatcherInterface*, std::unique_ptr<ClusterWatcherInterface>>
363
+ invalid_cluster_watchers_ ABSL_GUARDED_BY(mu_);
364
+ std::map<EndpointWatcherInterface*, std::unique_ptr<EndpointWatcherInterface>>
365
+ invalid_endpoint_watchers_ ABSL_GUARDED_BY(mu_);
361
366
 
362
367
  bool shutting_down_ ABSL_GUARDED_BY(mu_) = false;
363
368
  };
@@ -46,7 +46,7 @@ class XdsLocalityName : public RefCounted<XdsLocalityName> {
46
46
  struct Less {
47
47
  bool operator()(const XdsLocalityName* lhs,
48
48
  const XdsLocalityName* rhs) const {
49
- if (lhs == nullptr || rhs == nullptr) return GPR_ICMP(lhs, rhs);
49
+ if (lhs == nullptr || rhs == nullptr) return QsortCompare(lhs, rhs);
50
50
  return lhs->Compare(*rhs) < 0;
51
51
  }
52
52
 
@@ -353,12 +353,12 @@ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
353
353
  GPR_ASSERT(xds_client_ != nullptr);
354
354
  }
355
355
 
356
- void StartWatch(std::string listening_address, grpc_channel_args* args,
356
+ void StartWatch(std::string listening_address,
357
357
  std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
358
358
  watcher) override {
359
359
  grpc_server_config_fetcher::WatcherInterface* watcher_ptr = watcher.get();
360
360
  auto listener_watcher = absl::make_unique<ListenerWatcher>(
361
- std::move(watcher), args, xds_client_, serving_status_notifier_,
361
+ std::move(watcher), xds_client_, serving_status_notifier_,
362
362
  listening_address);
363
363
  auto* listener_watcher_ptr = listener_watcher.get();
364
364
  listening_address = absl::StrReplaceAll(
@@ -396,17 +396,14 @@ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
396
396
  explicit ListenerWatcher(
397
397
  std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
398
398
  server_config_watcher,
399
- grpc_channel_args* args, RefCountedPtr<XdsClient> xds_client,
399
+ RefCountedPtr<XdsClient> xds_client,
400
400
  grpc_server_xds_status_notifier serving_status_notifier,
401
401
  std::string listening_address)
402
402
  : server_config_watcher_(std::move(server_config_watcher)),
403
- args_(args),
404
403
  xds_client_(std::move(xds_client)),
405
404
  serving_status_notifier_(serving_status_notifier),
406
405
  listening_address_(std::move(listening_address)) {}
407
406
 
408
- ~ListenerWatcher() override { grpc_channel_args_destroy(args_); }
409
-
410
407
  // Deleted due to special handling required for args_. Copy the channel args
411
408
  // if we ever need these.
412
409
  ListenerWatcher(const ListenerWatcher&) = delete;
@@ -498,7 +495,6 @@ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
498
495
  private:
499
496
  std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
500
497
  server_config_watcher_;
501
- grpc_channel_args* args_;
502
498
  RefCountedPtr<XdsClient> xds_client_;
503
499
  grpc_server_xds_status_notifier serving_status_notifier_;
504
500
  std::string listening_address_;
@@ -524,10 +520,12 @@ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create(
524
520
  grpc_server_xds_status_notifier notifier, const grpc_channel_args* args) {
525
521
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
526
522
  grpc_core::ExecCtx exec_ctx;
523
+ args = grpc_channel_args_remove_grpc_internal(args);
527
524
  GRPC_API_TRACE("grpc_server_config_fetcher_xds_create()", 0, ());
528
525
  grpc_error_handle error = GRPC_ERROR_NONE;
529
526
  grpc_core::RefCountedPtr<grpc_core::XdsClient> xds_client =
530
527
  grpc_core::XdsClient::GetOrCreate(args, &error);
528
+ grpc_channel_args_destroy(args);
531
529
  if (error != GRPC_ERROR_NONE) {
532
530
  gpr_log(GPR_ERROR, "Failed to create xds client: %s",
533
531
  grpc_error_std_string(error).c_str());
@@ -83,6 +83,7 @@ namespace grpc_core {
83
83
 
84
84
  grpc_error_handle UnixSockaddrPopulate(absl::string_view path,
85
85
  grpc_resolved_address* resolved_addr) {
86
+ memset(resolved_addr, 0, sizeof(*resolved_addr));
86
87
  struct sockaddr_un* un =
87
88
  reinterpret_cast<struct sockaddr_un*>(resolved_addr->addr);
88
89
  const size_t maxlen = sizeof(un->sun_path) - 1;
@@ -99,6 +100,7 @@ grpc_error_handle UnixSockaddrPopulate(absl::string_view path,
99
100
 
100
101
  grpc_error_handle UnixAbstractSockaddrPopulate(
101
102
  absl::string_view path, grpc_resolved_address* resolved_addr) {
103
+ memset(resolved_addr, 0, sizeof(*resolved_addr));
102
104
  struct sockaddr_un* un =
103
105
  reinterpret_cast<struct sockaddr_un*>(resolved_addr->addr);
104
106
  const size_t maxlen = sizeof(un->sun_path) - 1;
@@ -23,11 +23,11 @@
23
23
  #include <assert.h>
24
24
  #include <stdlib.h>
25
25
 
26
+ #include <algorithm>
27
+
26
28
  #include <grpc/support/alloc.h>
27
29
  #include <grpc/support/string_util.h>
28
30
 
29
- #include "src/core/lib/gpr/useful.h"
30
-
31
31
  grpc_avl grpc_avl_create(const grpc_avl_vtable* vtable) {
32
32
  grpc_avl out;
33
33
  out.vtable = vtable;
@@ -63,8 +63,8 @@ static long node_height(grpc_avl_node* node) {
63
63
  #ifndef NDEBUG
64
64
  static long calculate_height(grpc_avl_node* node) {
65
65
  return node == nullptr ? 0
66
- : 1 + GPR_MAX(calculate_height(node->left),
67
- calculate_height(node->right));
66
+ : 1 + std::max(calculate_height(node->left),
67
+ calculate_height(node->right));
68
68
  }
69
69
 
70
70
  static grpc_avl_node* assert_invariants(grpc_avl_node* n) {
@@ -87,7 +87,7 @@ grpc_avl_node* new_node(void* key, void* value, grpc_avl_node* left,
87
87
  node->value = value;
88
88
  node->left = assert_invariants(left);
89
89
  node->right = assert_invariants(right);
90
- node->height = 1 + GPR_MAX(node_height(left), node_height(right));
90
+ node->height = 1 + std::max(node_height(left), node_height(right));
91
91
  return node;
92
92
  }
93
93
 
@@ -39,7 +39,7 @@ double generate_uniform_random_number(uint32_t* rng_state) {
39
39
  double generate_uniform_random_number_between(uint32_t* rng_state, double a,
40
40
  double b) {
41
41
  if (a == b) return a;
42
- if (a > b) GPR_SWAP(double, a, b); // make sure a < b
42
+ if (a > b) std::swap(a, b); // make sure a < b
43
43
  const double range = b - a;
44
44
  return a + generate_uniform_random_number(rng_state) * range;
45
45
  }
@@ -25,6 +25,7 @@
25
25
 
26
26
  #include <vector>
27
27
 
28
+ #include "absl/strings/match.h"
28
29
  #include "absl/strings/str_format.h"
29
30
  #include "absl/strings/str_join.h"
30
31
 
@@ -72,6 +73,22 @@ grpc_channel_args* grpc_channel_args_copy_and_remove(
72
73
  num_to_remove, nullptr, 0);
73
74
  }
74
75
 
76
+ grpc_channel_args* grpc_channel_args_remove_grpc_internal(
77
+ const grpc_channel_args* src) {
78
+ if (src == nullptr) return nullptr;
79
+ // Create result.
80
+ grpc_channel_args* dst =
81
+ static_cast<grpc_channel_args*>(gpr_malloc(sizeof(grpc_channel_args)));
82
+ dst->args =
83
+ static_cast<grpc_arg*>(gpr_malloc(sizeof(grpc_arg) * src->num_args));
84
+ dst->num_args = 0;
85
+ for (size_t i = 0; i < src->num_args; ++i) {
86
+ if (absl::StartsWith(src->args[i].key, "grpc.internal.")) continue;
87
+ dst->args[dst->num_args++] = copy_arg(&src->args[i]);
88
+ }
89
+ return dst;
90
+ }
91
+
75
92
  static bool should_remove_arg(const grpc_arg* arg, const char** to_remove,
76
93
  size_t num_to_remove) {
77
94
  for (size_t i = 0; i < num_to_remove; ++i) {
@@ -146,7 +163,7 @@ grpc_channel_args* grpc_channel_args_union(const grpc_channel_args* a,
146
163
  }
147
164
 
148
165
  static int cmp_arg(const grpc_arg* a, const grpc_arg* b) {
149
- int c = GPR_ICMP(a->type, b->type);
166
+ int c = grpc_core::QsortCompare(a->type, b->type);
150
167
  if (c != 0) return c;
151
168
  c = strcmp(a->key, b->key);
152
169
  if (c != 0) return c;
@@ -154,11 +171,12 @@ static int cmp_arg(const grpc_arg* a, const grpc_arg* b) {
154
171
  case GRPC_ARG_STRING:
155
172
  return strcmp(a->value.string, b->value.string);
156
173
  case GRPC_ARG_INTEGER:
157
- return GPR_ICMP(a->value.integer, b->value.integer);
174
+ return grpc_core::QsortCompare(a->value.integer, b->value.integer);
158
175
  case GRPC_ARG_POINTER:
159
- c = GPR_ICMP(a->value.pointer.p, b->value.pointer.p);
176
+ c = grpc_core::QsortCompare(a->value.pointer.p, b->value.pointer.p);
160
177
  if (c != 0) {
161
- c = GPR_ICMP(a->value.pointer.vtable, b->value.pointer.vtable);
178
+ c = grpc_core::QsortCompare(a->value.pointer.vtable,
179
+ b->value.pointer.vtable);
162
180
  if (c == 0) {
163
181
  c = a->value.pointer.vtable->cmp(a->value.pointer.p,
164
182
  b->value.pointer.p);
@@ -175,7 +193,7 @@ static int cmp_key_stable(const void* ap, const void* bp) {
175
193
  const grpc_arg* const* a = static_cast<const grpc_arg* const*>(ap);
176
194
  const grpc_arg* const* b = static_cast<const grpc_arg* const*>(bp);
177
195
  int c = strcmp((*a)->key, (*b)->key);
178
- if (c == 0) c = GPR_ICMP(*a, *b);
196
+ if (c == 0) c = grpc_core::QsortCompare(*a, *b);
179
197
  return c;
180
198
  }
181
199
 
@@ -225,7 +243,7 @@ int grpc_channel_args_compare(const grpc_channel_args* a,
225
243
  const grpc_channel_args* b) {
226
244
  if (a == nullptr && b == nullptr) return 0;
227
245
  if (a == nullptr || b == nullptr) return a == nullptr ? -1 : 1;
228
- int c = GPR_ICMP(a->num_args, b->num_args);
246
+ int c = grpc_core::QsortCompare(a->num_args, b->num_args);
229
247
  if (c != 0) return c;
230
248
  for (size_t i = 0; i < a->num_args; i++) {
231
249
  c = cmp_arg(&a->args[i], &b->args[i]);
@@ -41,6 +41,15 @@ grpc_channel_args* grpc_channel_args_copy_and_add(const grpc_channel_args* src,
41
41
  const grpc_arg* to_add,
42
42
  size_t num_to_add);
43
43
 
44
+ /** Remove any channel args prefixed with 'grpc.internal.'
45
+ * These are used for internal implementation details and are not intended to
46
+ * be exposed to users.
47
+ * Returns a new channel args instance.
48
+ * Does not take ownership of \a src.
49
+ * Should be called by any public API that receives channel args. */
50
+ grpc_channel_args* grpc_channel_args_remove_grpc_internal(
51
+ const grpc_channel_args* src);
52
+
44
53
  /** Copies the arguments in \a src except for those whose keys are in
45
54
  \a to_remove. */
46
55
  grpc_channel_args* grpc_channel_args_copy_and_remove(
@@ -25,6 +25,8 @@
25
25
  #include <grpc/support/alloc.h>
26
26
  #include <grpc/support/string_util.h>
27
27
 
28
+ #include "src/core/lib/gprpp/memory.h"
29
+
28
30
  typedef struct filter_node {
29
31
  struct filter_node* next;
30
32
  struct filter_node* prev;
@@ -53,15 +55,13 @@ struct grpc_channel_stack_builder_iterator {
53
55
 
54
56
  grpc_channel_stack_builder* grpc_channel_stack_builder_create(void) {
55
57
  grpc_channel_stack_builder* b =
56
- static_cast<grpc_channel_stack_builder*>(gpr_zalloc(sizeof(*b)));
57
-
58
+ grpc_core::Zalloc<grpc_channel_stack_builder>();
58
59
  b->begin.filter = nullptr;
59
60
  b->end.filter = nullptr;
60
61
  b->begin.next = &b->end;
61
62
  b->begin.prev = &b->end;
62
63
  b->end.next = &b->begin;
63
64
  b->end.prev = &b->begin;
64
-
65
65
  return b;
66
66
  }
67
67
 
@@ -16,7 +16,7 @@
16
16
  *
17
17
  */
18
18
 
19
- #include <grpc/impl/codegen/port_platform.h>
19
+ #include <grpc/support/port_platform.h>
20
20
 
21
21
  #include "src/core/lib/channel/channel_trace.h"
22
22
 
@@ -19,7 +19,7 @@
19
19
  #ifndef GRPC_CORE_LIB_CHANNEL_CHANNEL_TRACE_H
20
20
  #define GRPC_CORE_LIB_CHANNEL_CHANNEL_TRACE_H
21
21
 
22
- #include <grpc/impl/codegen/port_platform.h>
22
+ #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include <grpc/grpc.h>
25
25
 
@@ -16,7 +16,7 @@
16
16
  *
17
17
  */
18
18
 
19
- #include <grpc/impl/codegen/port_platform.h>
19
+ #include <grpc/support/port_platform.h>
20
20
 
21
21
  #include "src/core/lib/channel/channelz.h"
22
22
 
@@ -77,7 +77,7 @@ std::string BaseNode::RenderJsonString() {
77
77
  //
78
78
 
79
79
  CallCountingHelper::CallCountingHelper() {
80
- num_cores_ = GPR_MAX(1, gpr_cpu_num_cores());
80
+ num_cores_ = std::max(1u, gpr_cpu_num_cores());
81
81
  per_cpu_counter_data_storage_.reserve(num_cores_);
82
82
  for (size_t i = 0; i < num_cores_; ++i) {
83
83
  per_cpu_counter_data_storage_.emplace_back();
@@ -398,7 +398,7 @@ void SecurityArgDestroy(void* p) {
398
398
  xds_certificate_provider->Unref();
399
399
  }
400
400
 
401
- int SecurityArgCmp(void* p, void* q) { return GPR_ICMP(p, q); }
401
+ int SecurityArgCmp(void* p, void* q) { return grpc_core::QsortCompare(p, q); }
402
402
 
403
403
  const grpc_arg_pointer_vtable kChannelArgVtable = {
404
404
  SecurityArgCopy, SecurityArgDestroy, SecurityArgCmp};
@@ -19,7 +19,7 @@
19
19
  #ifndef GRPC_CORE_LIB_CHANNEL_CHANNELZ_H
20
20
  #define GRPC_CORE_LIB_CHANNEL_CHANNELZ_H
21
21
 
22
- #include <grpc/impl/codegen/port_platform.h>
22
+ #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include <atomic>
25
25
  #include <set>
@@ -41,7 +41,7 @@
41
41
  #include "src/core/lib/json/json.h"
42
42
 
43
43
  // Channel arg key for channelz node.
44
- #define GRPC_ARG_CHANNELZ_CHANNEL_NODE "grpc.channelz_channel_node"
44
+ #define GRPC_ARG_CHANNELZ_CHANNEL_NODE "grpc.internal.channelz_channel_node"
45
45
 
46
46
  // Channel arg key for indicating an internal channel.
47
47
  #define GRPC_ARG_CHANNELZ_IS_INTERNAL_CHANNEL \
@@ -16,7 +16,7 @@
16
16
  *
17
17
  */
18
18
 
19
- #include <grpc/impl/codegen/port_platform.h>
19
+ #include <grpc/support/port_platform.h>
20
20
 
21
21
  #include "src/core/lib/channel/channelz_registry.h"
22
22
 
@@ -19,7 +19,7 @@
19
19
  #ifndef GRPC_CORE_LIB_CHANNEL_CHANNELZ_REGISTRY_H
20
20
  #define GRPC_CORE_LIB_CHANNEL_CHANNELZ_REGISTRY_H
21
21
 
22
- #include <grpc/impl/codegen/port_platform.h>
22
+ #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include <stdint.h>
25
25
 
@@ -232,9 +232,7 @@ static void bind_transport(grpc_channel_stack* channel_stack,
232
232
  grpc_transport_stream_size(static_cast<grpc_transport*>(t));
233
233
  }
234
234
 
235
- bool grpc_add_connected_filter(grpc_channel_stack_builder* builder,
236
- void* arg_must_be_null) {
237
- GPR_ASSERT(arg_must_be_null == nullptr);
235
+ bool grpc_add_connected_filter(grpc_channel_stack_builder* builder) {
238
236
  grpc_transport* t = grpc_channel_stack_builder_get_transport(builder);
239
237
  GPR_ASSERT(t != nullptr);
240
238
  return grpc_channel_stack_builder_append_filter(
@@ -25,8 +25,7 @@
25
25
 
26
26
  extern const grpc_channel_filter grpc_connected_filter;
27
27
 
28
- bool grpc_add_connected_filter(grpc_channel_stack_builder* builder,
29
- void* arg_must_be_null);
28
+ bool grpc_add_connected_filter(grpc_channel_stack_builder* builder);
30
29
 
31
30
  /* Debug helper to dig the transport stream out of a call element */
32
31
  grpc_stream* grpc_connected_channel_get_stream(grpc_call_element* elem);
@@ -116,12 +116,12 @@ void grpc_compression_options_init(grpc_compression_options* opts) {
116
116
 
117
117
  void grpc_compression_options_enable_algorithm(
118
118
  grpc_compression_options* opts, grpc_compression_algorithm algorithm) {
119
- GPR_BITSET(&opts->enabled_algorithms_bitset, algorithm);
119
+ grpc_core::SetBit(&opts->enabled_algorithms_bitset, algorithm);
120
120
  }
121
121
 
122
122
  void grpc_compression_options_disable_algorithm(
123
123
  grpc_compression_options* opts, grpc_compression_algorithm algorithm) {
124
- GPR_BITCLEAR(&opts->enabled_algorithms_bitset, algorithm);
124
+ grpc_core::ClearBit(&opts->enabled_algorithms_bitset, algorithm);
125
125
  }
126
126
 
127
127
  int grpc_compression_options_is_algorithm_enabled(
@@ -101,9 +101,9 @@ grpc_channel_args* grpc_channel_args_compression_algorithm_set_state(
101
101
  algo_name);
102
102
  } else if (states_arg_found) {
103
103
  if (state != 0) {
104
- GPR_BITSET((unsigned*)states_arg, algorithm);
104
+ grpc_core::SetBit(reinterpret_cast<unsigned*>(states_arg), algorithm);
105
105
  } else if (algorithm != GRPC_COMPRESS_NONE) {
106
- GPR_BITCLEAR((unsigned*)states_arg, algorithm);
106
+ grpc_core::ClearBit(reinterpret_cast<unsigned*>(states_arg), algorithm);
107
107
  }
108
108
  } else {
109
109
  /* create a new arg */
@@ -114,9 +114,11 @@ grpc_channel_args* grpc_channel_args_compression_algorithm_set_state(
114
114
  /* all enabled by default */
115
115
  tmp.value.integer = (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1;
116
116
  if (state != 0) {
117
- GPR_BITSET((unsigned*)&tmp.value.integer, algorithm);
117
+ grpc_core::SetBit(reinterpret_cast<unsigned*>(&tmp.value.integer),
118
+ algorithm);
118
119
  } else if (algorithm != GRPC_COMPRESS_NONE) {
119
- GPR_BITCLEAR((unsigned*)&tmp.value.integer, algorithm);
120
+ grpc_core::ClearBit(reinterpret_cast<unsigned*>(&tmp.value.integer),
121
+ algorithm);
120
122
  }
121
123
  result = grpc_channel_args_copy_and_add(*a, &tmp, 1);
122
124
  grpc_channel_args_destroy(*a);
@@ -207,7 +207,7 @@ grpc_message_compression_algorithm grpc_message_compression_algorithm_for_level(
207
207
  }
208
208
 
209
209
  const size_t num_supported =
210
- GPR_BITCOUNT(accepted_encodings) - 1; /* discard NONE */
210
+ grpc_core::BitCount(accepted_encodings) - 1; /* discard NONE */
211
211
  if (level == GRPC_COMPRESS_LEVEL_NONE || num_supported == 0) {
212
212
  return GRPC_MESSAGE_COMPRESS_NONE;
213
213
  }
@@ -228,7 +228,7 @@ grpc_message_compression_algorithm grpc_message_compression_algorithm_for_level(
228
228
  for (size_t i = 0; i < GPR_ARRAY_SIZE(algos_ranking); i++) {
229
229
  const grpc_message_compression_algorithm alg = algos_ranking[i];
230
230
  for (size_t j = 0; j < num_supported; j++) {
231
- if (GPR_BITGET(accepted_encodings, alg) == 1) {
231
+ if (grpc_core::GetBit(accepted_encodings, alg) == 1) {
232
232
  /* if \a alg in supported */
233
233
  sorted_supported_algos[algos_supported_idx++] = alg;
234
234
  break;
@@ -91,7 +91,7 @@ int grpc_stream_compression_algorithm_parse(
91
91
  inline int grpc_compression_options_is_algorithm_enabled_internal(
92
92
  const grpc_compression_options* opts,
93
93
  grpc_compression_algorithm algorithm) {
94
- return GPR_BITGET(opts->enabled_algorithms_bitset, algorithm);
94
+ return grpc_core::GetBit(opts->enabled_algorithms_bitset, algorithm);
95
95
  }
96
96
 
97
97
  #endif /* GRPC_CORE_LIB_COMPRESSION_COMPRESSION_INTERNAL_H */
@@ -12,13 +12,17 @@
12
12
  // See the License for the specific language governing permissions and
13
13
  // limitations under the License.
14
14
 
15
- #include <grpc/impl/codegen/port_platform.h>
15
+ #include <grpc/support/port_platform.h>
16
16
 
17
17
  #include "src/core/lib/config/core_configuration.h"
18
18
 
19
+ #include <grpc/support/log.h>
20
+
19
21
  namespace grpc_core {
20
22
 
21
23
  std::atomic<CoreConfiguration*> CoreConfiguration::config_{nullptr};
24
+ std::atomic<CoreConfiguration::RegisteredBuilder*> CoreConfiguration::builders_{
25
+ nullptr};
22
26
 
23
27
  CoreConfiguration::Builder::Builder() = default;
24
28
 
@@ -27,11 +31,42 @@ CoreConfiguration* CoreConfiguration::Builder::Build() {
27
31
  }
28
32
 
29
33
  CoreConfiguration::CoreConfiguration(Builder* builder)
30
- : handshaker_registry_(builder->handshaker_registry_.Build()) {}
34
+ : channel_init_(builder->channel_init_.Build()),
35
+ handshaker_registry_(builder->handshaker_registry_.Build()) {}
36
+
37
+ void CoreConfiguration::RegisterBuilder(std::function<void(Builder*)> builder) {
38
+ GPR_ASSERT(config_.load(std::memory_order_relaxed) == nullptr &&
39
+ "CoreConfiguration was already instantiated before builder "
40
+ "registration was completed");
41
+ RegisteredBuilder* n = new RegisteredBuilder();
42
+ n->builder = std::move(builder);
43
+ n->next = builders_.load(std::memory_order_relaxed);
44
+ while (!builders_.compare_exchange_weak(n->next, n, std::memory_order_acq_rel,
45
+ std::memory_order_relaxed)) {
46
+ }
47
+ GPR_ASSERT(config_.load(std::memory_order_relaxed) == nullptr &&
48
+ "CoreConfiguration was already instantiated before builder "
49
+ "registration was completed");
50
+ }
31
51
 
32
52
  const CoreConfiguration& CoreConfiguration::BuildNewAndMaybeSet() {
33
53
  // Construct builder, pass it up to code that knows about build configuration
34
54
  Builder builder;
55
+ // The linked list of builders stores things in reverse registration order.
56
+ // To get things registered as systems relying on this expect however, we
57
+ // actually need to run things in forward registration order, so we iterate
58
+ // once over the linked list to build a vector of builders, and then iterate
59
+ // over said vector in reverse to actually run the builders.
60
+ std::vector<RegisteredBuilder*> registered_builders;
61
+ for (RegisteredBuilder* b = builders_.load(std::memory_order_acquire);
62
+ b != nullptr; b = b->next) {
63
+ registered_builders.push_back(b);
64
+ }
65
+ for (auto it = registered_builders.rbegin(); it != registered_builders.rend();
66
+ ++it) {
67
+ (*it)->builder(&builder);
68
+ }
69
+ // Finally, call the built in configuration builder.
35
70
  BuildCoreConfiguration(&builder);
36
71
  // Use builder to construct a confguration
37
72
  CoreConfiguration* p = builder.Build();
@@ -49,6 +84,13 @@ const CoreConfiguration& CoreConfiguration::BuildNewAndMaybeSet() {
49
84
 
50
85
  void CoreConfiguration::Reset() {
51
86
  delete config_.exchange(nullptr, std::memory_order_acquire);
87
+ RegisteredBuilder* builder =
88
+ builders_.exchange(nullptr, std::memory_order_acquire);
89
+ while (builder != nullptr) {
90
+ RegisteredBuilder* next = builder->next;
91
+ delete builder;
92
+ builder = next;
93
+ }
52
94
  }
53
95
 
54
96
  } // namespace grpc_core