grpc 1.41.0 → 1.42.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (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 +83 -70
  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
@@ -15,11 +15,12 @@
15
15
  #ifndef GRPC_CORE_LIB_CONFIG_CORE_CONFIGURATION_H
16
16
  #define GRPC_CORE_LIB_CONFIG_CORE_CONFIGURATION_H
17
17
 
18
- #include <grpc/impl/codegen/port_platform.h>
18
+ #include <grpc/support/port_platform.h>
19
19
 
20
20
  #include <atomic>
21
21
 
22
22
  #include "src/core/lib/channel/handshaker_registry.h"
23
+ #include "src/core/lib/surface/channel_init.h"
23
24
 
24
25
  namespace grpc_core {
25
26
 
@@ -34,6 +35,8 @@ class CoreConfiguration {
34
35
  // their configuration and assemble the published CoreConfiguration.
35
36
  class Builder {
36
37
  public:
38
+ ChannelInit::Builder* channel_init() { return &channel_init_; }
39
+
37
40
  HandshakerRegistry::Builder* handshaker_registry() {
38
41
  return &handshaker_registry_;
39
42
  }
@@ -41,6 +44,7 @@ class CoreConfiguration {
41
44
  private:
42
45
  friend class CoreConfiguration;
43
46
 
47
+ ChannelInit::Builder channel_init_;
44
48
  HandshakerRegistry::Builder handshaker_registry_;
45
49
 
46
50
  Builder();
@@ -77,13 +81,38 @@ class CoreConfiguration {
77
81
  delete config_.exchange(p, std::memory_order_release);
78
82
  }
79
83
 
84
+ // Attach a registration function globally.
85
+ // Each registration function is called *in addition to*
86
+ // BuildCoreConfiguration for the default core configuration. When using
87
+ // BuildSpecialConfiguration, one can use CallRegisteredBuilders to call them.
88
+ // Must be called before a configuration is built.
89
+ static void RegisterBuilder(std::function<void(Builder*)> builder);
90
+
91
+ // Call all registered builders.
92
+ // See RegisterBuilder for why you might want to call this.
93
+ static void CallRegisteredBuilders(Builder* builder);
94
+
80
95
  // Drop the core configuration. Users must ensure no other threads are
81
96
  // accessing the configuration.
82
97
  // Clears any dynamically registered builders.
83
98
  static void Reset();
84
99
 
100
+ // Helper for tests: Reset the configuration, build a special one, run some
101
+ // code, and then reset the configuration again.
102
+ // Templatized to be sure no codegen in normal builds.
103
+ template <typename BuildFunc, typename RunFunc>
104
+ static void RunWithSpecialConfiguration(BuildFunc build_configuration,
105
+ RunFunc code_to_run) {
106
+ Reset();
107
+ BuildSpecialConfiguration(build_configuration);
108
+ code_to_run();
109
+ Reset();
110
+ }
111
+
85
112
  // Accessors
86
113
 
114
+ const ChannelInit& channel_init() const { return channel_init_; }
115
+
87
116
  const HandshakerRegistry& handshaker_registry() const {
88
117
  return handshaker_registry_;
89
118
  }
@@ -91,13 +120,22 @@ class CoreConfiguration {
91
120
  private:
92
121
  explicit CoreConfiguration(Builder* builder);
93
122
 
123
+ // Stores a builder for RegisterBuilder
124
+ struct RegisteredBuilder {
125
+ std::function<void(Builder*)> builder;
126
+ RegisteredBuilder* next;
127
+ };
128
+
94
129
  // Create a new CoreConfiguration, and either set it or throw it away.
95
130
  // We allow multiple CoreConfiguration's to be created in parallel.
96
131
  static const CoreConfiguration& BuildNewAndMaybeSet();
97
132
 
98
133
  // The configuration
99
134
  static std::atomic<CoreConfiguration*> config_;
135
+ // Extra registered builders
136
+ static std::atomic<RegisteredBuilder*> builders_;
100
137
 
138
+ ChannelInit channel_init_;
101
139
  HandshakerRegistry handshaker_registry_;
102
140
  };
103
141
 
@@ -38,7 +38,7 @@ grpc_stats_data* grpc_stats_per_cpu_storage = nullptr;
38
38
  static size_t g_num_cores;
39
39
 
40
40
  void grpc_stats_init(void) {
41
- g_num_cores = GPR_MAX(1, gpr_cpu_num_cores());
41
+ g_num_cores = std::max(1u, gpr_cpu_num_cores());
42
42
  grpc_stats_per_cpu_storage = static_cast<grpc_stats_data*>(
43
43
  gpr_zalloc(sizeof(grpc_stats_data) * g_num_cores));
44
44
  }
@@ -353,7 +353,7 @@ const uint8_t grpc_stats_table_7[102] = {
353
353
  const int grpc_stats_table_8[9] = {0, 1, 2, 4, 7, 13, 23, 39, 64};
354
354
  const uint8_t grpc_stats_table_9[9] = {0, 0, 1, 2, 2, 3, 4, 4, 5};
355
355
  void grpc_stats_inc_call_initial_size(int value) {
356
- value = GPR_CLAMP(value, 0, 262144);
356
+ value = grpc_core::Clamp(value, 0, 262144);
357
357
  if (value < 6) {
358
358
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_CALL_INITIAL_SIZE, value);
359
359
  return;
@@ -376,7 +376,7 @@ void grpc_stats_inc_call_initial_size(int value) {
376
376
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_0, 64));
377
377
  }
378
378
  void grpc_stats_inc_poll_events_returned(int value) {
379
- value = GPR_CLAMP(value, 0, 1024);
379
+ value = grpc_core::Clamp(value, 0, 1024);
380
380
  if (value < 29) {
381
381
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_POLL_EVENTS_RETURNED, value);
382
382
  return;
@@ -399,7 +399,7 @@ void grpc_stats_inc_poll_events_returned(int value) {
399
399
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_2, 128));
400
400
  }
401
401
  void grpc_stats_inc_tcp_write_size(int value) {
402
- value = GPR_CLAMP(value, 0, 16777216);
402
+ value = grpc_core::Clamp(value, 0, 16777216);
403
403
  if (value < 5) {
404
404
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_TCP_WRITE_SIZE, value);
405
405
  return;
@@ -422,7 +422,7 @@ void grpc_stats_inc_tcp_write_size(int value) {
422
422
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_4, 64));
423
423
  }
424
424
  void grpc_stats_inc_tcp_write_iov_size(int value) {
425
- value = GPR_CLAMP(value, 0, 1024);
425
+ value = grpc_core::Clamp(value, 0, 1024);
426
426
  if (value < 13) {
427
427
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_TCP_WRITE_IOV_SIZE, value);
428
428
  return;
@@ -445,7 +445,7 @@ void grpc_stats_inc_tcp_write_iov_size(int value) {
445
445
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_6, 64));
446
446
  }
447
447
  void grpc_stats_inc_tcp_read_size(int value) {
448
- value = GPR_CLAMP(value, 0, 16777216);
448
+ value = grpc_core::Clamp(value, 0, 16777216);
449
449
  if (value < 5) {
450
450
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_TCP_READ_SIZE, value);
451
451
  return;
@@ -468,7 +468,7 @@ void grpc_stats_inc_tcp_read_size(int value) {
468
468
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_4, 64));
469
469
  }
470
470
  void grpc_stats_inc_tcp_read_offer(int value) {
471
- value = GPR_CLAMP(value, 0, 16777216);
471
+ value = grpc_core::Clamp(value, 0, 16777216);
472
472
  if (value < 5) {
473
473
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_TCP_READ_OFFER, value);
474
474
  return;
@@ -491,7 +491,7 @@ void grpc_stats_inc_tcp_read_offer(int value) {
491
491
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_4, 64));
492
492
  }
493
493
  void grpc_stats_inc_tcp_read_offer_iov_size(int value) {
494
- value = GPR_CLAMP(value, 0, 1024);
494
+ value = grpc_core::Clamp(value, 0, 1024);
495
495
  if (value < 13) {
496
496
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_TCP_READ_OFFER_IOV_SIZE,
497
497
  value);
@@ -516,7 +516,7 @@ void grpc_stats_inc_tcp_read_offer_iov_size(int value) {
516
516
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_6, 64));
517
517
  }
518
518
  void grpc_stats_inc_http2_send_message_size(int value) {
519
- value = GPR_CLAMP(value, 0, 16777216);
519
+ value = grpc_core::Clamp(value, 0, 16777216);
520
520
  if (value < 5) {
521
521
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_SIZE,
522
522
  value);
@@ -541,7 +541,7 @@ void grpc_stats_inc_http2_send_message_size(int value) {
541
541
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_4, 64));
542
542
  }
543
543
  void grpc_stats_inc_http2_send_initial_metadata_per_write(int value) {
544
- value = GPR_CLAMP(value, 0, 1024);
544
+ value = grpc_core::Clamp(value, 0, 1024);
545
545
  if (value < 13) {
546
546
  GRPC_STATS_INC_HISTOGRAM(
547
547
  GRPC_STATS_HISTOGRAM_HTTP2_SEND_INITIAL_METADATA_PER_WRITE, value);
@@ -566,7 +566,7 @@ void grpc_stats_inc_http2_send_initial_metadata_per_write(int value) {
566
566
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_6, 64));
567
567
  }
568
568
  void grpc_stats_inc_http2_send_message_per_write(int value) {
569
- value = GPR_CLAMP(value, 0, 1024);
569
+ value = grpc_core::Clamp(value, 0, 1024);
570
570
  if (value < 13) {
571
571
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_HTTP2_SEND_MESSAGE_PER_WRITE,
572
572
  value);
@@ -591,7 +591,7 @@ void grpc_stats_inc_http2_send_message_per_write(int value) {
591
591
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_6, 64));
592
592
  }
593
593
  void grpc_stats_inc_http2_send_trailing_metadata_per_write(int value) {
594
- value = GPR_CLAMP(value, 0, 1024);
594
+ value = grpc_core::Clamp(value, 0, 1024);
595
595
  if (value < 13) {
596
596
  GRPC_STATS_INC_HISTOGRAM(
597
597
  GRPC_STATS_HISTOGRAM_HTTP2_SEND_TRAILING_METADATA_PER_WRITE, value);
@@ -616,7 +616,7 @@ void grpc_stats_inc_http2_send_trailing_metadata_per_write(int value) {
616
616
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_6, 64));
617
617
  }
618
618
  void grpc_stats_inc_http2_send_flowctl_per_write(int value) {
619
- value = GPR_CLAMP(value, 0, 1024);
619
+ value = grpc_core::Clamp(value, 0, 1024);
620
620
  if (value < 13) {
621
621
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_HTTP2_SEND_FLOWCTL_PER_WRITE,
622
622
  value);
@@ -641,7 +641,7 @@ void grpc_stats_inc_http2_send_flowctl_per_write(int value) {
641
641
  grpc_stats_histo_find_bucket_slow(value, grpc_stats_table_6, 64));
642
642
  }
643
643
  void grpc_stats_inc_server_cqs_checked(int value) {
644
- value = GPR_CLAMP(value, 0, 64);
644
+ value = grpc_core::Clamp(value, 0, 64);
645
645
  if (value < 3) {
646
646
  GRPC_STATS_INC_HISTOGRAM(GRPC_STATS_HISTOGRAM_SERVER_CQS_CHECKED, value);
647
647
  return;
@@ -28,7 +28,7 @@ gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta,
28
28
  gpr_atm new_value;
29
29
  do {
30
30
  current_value = gpr_atm_no_barrier_load(value);
31
- new_value = GPR_CLAMP(current_value + delta, min, max);
31
+ new_value = grpc_core::Clamp(current_value + delta, min, max);
32
32
  if (new_value == current_value) break;
33
33
  } while (!gpr_atm_no_barrier_cas(value, current_value, new_value));
34
34
  return new_value;
@@ -77,7 +77,7 @@ unsigned gpr_cpu_current_cpu(void) {
77
77
  pthread_setspecific(thread_id_key, thread_id);
78
78
  }
79
79
 
80
- return (unsigned)GPR_HASH_POINTER(thread_id, gpr_cpu_num_cores());
80
+ return (unsigned)grpc_core::HashPointer(thread_id, gpr_cpu_num_cores());
81
81
  }
82
82
 
83
83
  #endif /* GPR_CPU_POSIX */
@@ -89,7 +89,7 @@ static dump_out dump_out_create(void) {
89
89
 
90
90
  static void dump_out_append(dump_out* out, char c) {
91
91
  if (out->length == out->capacity) {
92
- out->capacity = GPR_MAX(8, 2 * out->capacity);
92
+ out->capacity = std::max(size_t(8), 2 * out->capacity);
93
93
  out->data = static_cast<char*>(gpr_realloc(out->data, out->capacity));
94
94
  }
95
95
  out->data[out->length++] = c;
@@ -290,7 +290,7 @@ static void add_string_to_split(const char* beg, const char* end, char*** strs,
290
290
  memcpy(out, beg, static_cast<size_t>(end - beg));
291
291
  out[end - beg] = 0;
292
292
  if (*nstrs == *capstrs) {
293
- *capstrs = GPR_MAX(8, 2 * *capstrs);
293
+ *capstrs = std::max(size_t(8), 2 * *capstrs);
294
294
  *strs = static_cast<char**>(gpr_realloc(*strs, sizeof(*strs) * *capstrs));
295
295
  }
296
296
  (*strs)[*nstrs] = out;
@@ -19,7 +19,7 @@
19
19
  #ifndef GRPC_CORE_LIB_GPR_TLS_H
20
20
  #define GRPC_CORE_LIB_GPR_TLS_H
21
21
 
22
- #include <grpc/impl/codegen/port_platform.h>
22
+ #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include <type_traits>
25
25
 
@@ -19,48 +19,95 @@
19
19
  #ifndef GRPC_CORE_LIB_GPR_USEFUL_H
20
20
  #define GRPC_CORE_LIB_GPR_USEFUL_H
21
21
 
22
- /** useful macros that don't belong anywhere else */
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <cstddef>
25
+
26
+ /** useful utilities that don't belong anywhere else */
27
+
28
+ namespace grpc_core {
29
+
30
+ template <typename T>
31
+ T Clamp(T val, T min, T max) {
32
+ if (val < min) return min;
33
+ if (max < val) return max;
34
+ return val;
35
+ }
23
36
 
24
- #define GPR_MIN(a, b) ((a) < (b) ? (a) : (b))
25
- #define GPR_MAX(a, b) ((a) > (b) ? (a) : (b))
26
- #define GPR_CLAMP(a, min, max) ((a) < (min) ? (min) : (a) > (max) ? (max) : (a))
27
37
  /** rotl, rotr assume x is unsigned */
28
- #define GPR_ROTL(x, n) (((x) << (n)) | ((x) >> (sizeof(x) * 8 - (n))))
29
- #define GPR_ROTR(x, n) (((x) >> (n)) | ((x) << (sizeof(x) * 8 - (n))))
38
+ template <typename T>
39
+ constexpr T RotateLeft(T x, T n) {
40
+ return ((x << n) | (x >> (sizeof(x) * 8 - n)));
41
+ }
42
+ template <typename T>
43
+ constexpr T RotateRight(T x, T n) {
44
+ return ((x >> n) | (x << (sizeof(x) * 8 - n)));
45
+ }
30
46
 
31
- #define GPR_ARRAY_SIZE(array) (sizeof(array) / sizeof(*(array)))
47
+ // Set the n-th bit of i
48
+ template <typename T>
49
+ T SetBit(T* i, size_t n) {
50
+ return *i |= (T(1) << n);
51
+ }
52
+
53
+ // Clear the n-th bit of i
54
+ template <typename T>
55
+ T ClearBit(T* i, size_t n) {
56
+ return *i &= ~(T(1) << n);
57
+ }
32
58
 
33
- #define GPR_SWAP(type, a, b) \
34
- do { \
35
- type x = a; \
36
- (a) = b; \
37
- (b) = x; \
38
- } while (0)
59
+ // Get the n-th bit of i
60
+ template <typename T>
61
+ bool GetBit(T i, size_t n) {
62
+ return (i & (T(1) << n)) != 0;
63
+ }
39
64
 
40
- /** Set the \a n-th bit of \a i (a mutable pointer). */
41
- #define GPR_BITSET(i, n) ((*(i)) |= (1u << (n)))
65
+ namespace useful_detail {
66
+ inline constexpr uint32_t HexdigitBitcount(uint32_t x) {
67
+ return (x - ((x >> 1) & 0x77777777) - ((x >> 2) & 0x33333333) -
68
+ ((x >> 3) & 0x11111111));
69
+ }
70
+ } // namespace useful_detail
42
71
 
43
- /** Clear the \a n-th bit of \a i (a mutable pointer). */
44
- #define GPR_BITCLEAR(i, n) ((*(i)) &= ~(1u << (n)))
72
+ inline constexpr uint32_t BitCount(uint32_t i) {
73
+ return (((useful_detail::HexdigitBitcount(i) +
74
+ (useful_detail::HexdigitBitcount(i) >> 4)) &
75
+ 0x0f0f0f0f) %
76
+ 255);
77
+ }
45
78
 
46
- /** Get the \a n-th bit of \a i */
47
- #define GPR_BITGET(i, n) (((i) & (1u << (n))) != 0)
79
+ inline constexpr uint32_t BitCount(uint64_t i) {
80
+ return BitCount(uint32_t(i)) + BitCount(uint32_t(i >> 32));
81
+ }
48
82
 
49
- #define GPR_INTERNAL_HEXDIGIT_BITCOUNT(x) \
50
- ((x) - (((x) >> 1) & 0x77777777) - (((x) >> 2) & 0x33333333) - \
51
- (((x) >> 3) & 0x11111111))
83
+ inline constexpr uint32_t BitCount(uint16_t i) { return BitCount(uint32_t(i)); }
84
+ inline constexpr uint32_t BitCount(uint8_t i) { return BitCount(uint32_t(i)); }
85
+ inline constexpr uint32_t BitCount(int64_t i) { return BitCount(uint64_t(i)); }
86
+ inline constexpr uint32_t BitCount(int32_t i) { return BitCount(uint32_t(i)); }
87
+ inline constexpr uint32_t BitCount(int16_t i) { return BitCount(uint16_t(i)); }
88
+ inline constexpr uint32_t BitCount(int8_t i) { return BitCount(uint8_t(i)); }
52
89
 
53
- /** Returns number of bits set in bitset \a i */
54
- #define GPR_BITCOUNT(i) \
55
- (((GPR_INTERNAL_HEXDIGIT_BITCOUNT(i) + \
56
- (GPR_INTERNAL_HEXDIGIT_BITCOUNT(i) >> 4)) & \
57
- 0x0f0f0f0f) % \
58
- 255)
90
+ // This function uses operator< to implement a qsort-style comparison, whereby:
91
+ // if a is smaller than b, a number smaller than 0 is returned.
92
+ // if a is bigger than b, a number greater than 0 is returned.
93
+ // if a is neither smaller nor bigger than b, 0 is returned.
94
+ template <typename T>
95
+ int QsortCompare(const T& a, const T& b) {
96
+ if (a < b) return -1;
97
+ if (b < a) return 1;
98
+ return 0;
99
+ }
59
100
 
60
- #define GPR_ICMP(a, b) ((a) < (b) ? -1 : ((a) > (b) ? 1 : 0))
101
+ template <typename T>
102
+ constexpr size_t HashPointer(T* p, size_t range) {
103
+ return (((reinterpret_cast<size_t>(p)) >> 4) ^
104
+ ((reinterpret_cast<size_t>(p)) >> 9) ^
105
+ ((reinterpret_cast<size_t>(p)) >> 14)) %
106
+ range;
107
+ }
61
108
 
62
- #define GPR_HASH_POINTER(x, range) \
63
- (((((size_t)(x)) >> 4) ^ (((size_t)(x)) >> 9) ^ (((size_t)(x)) >> 14)) % \
64
- (range))
109
+ } // namespace grpc_core
110
+
111
+ #define GPR_ARRAY_SIZE(array) (sizeof(array) / sizeof(*(array)))
65
112
 
66
113
  #endif /* GRPC_CORE_LIB_GPR_USEFUL_H */
@@ -30,6 +30,7 @@
30
30
  #include <stddef.h>
31
31
 
32
32
  #include <atomic>
33
+ #include <memory>
33
34
  #include <new>
34
35
  #include <utility>
35
36
 
@@ -116,6 +117,15 @@ class Arena {
116
117
  Zone* last_zone_ = nullptr;
117
118
  };
118
119
 
120
+ // Smart pointer for arenas when the final size is not required.
121
+ struct ScopedArenaDeleter {
122
+ void operator()(Arena* arena) { arena->Destroy(); }
123
+ };
124
+ using ScopedArenaPtr = std::unique_ptr<Arena, ScopedArenaDeleter>;
125
+ inline ScopedArenaPtr MakeScopedArena(size_t initial_size) {
126
+ return ScopedArenaPtr(Arena::Create(initial_size));
127
+ }
128
+
119
129
  } // namespace grpc_core
120
130
 
121
131
  #endif /* GRPC_CORE_LIB_GPRPP_ARENA_H */
@@ -15,10 +15,12 @@
15
15
  #ifndef GRPC_CORE_LIB_GPRPP_BITSET_H
16
16
  #define GRPC_CORE_LIB_GPRPP_BITSET_H
17
17
 
18
- #include <grpc/impl/codegen/port_platform.h>
18
+ #include <grpc/support/port_platform.h>
19
19
 
20
20
  #include <utility>
21
21
 
22
+ #include "src/core/lib/gpr/useful.h"
23
+
22
24
  #if __cplusplus > 201103l
23
25
  #define GRPC_BITSET_CONSTEXPR_MUTATOR constexpr
24
26
  #else
@@ -29,7 +31,7 @@ namespace grpc_core {
29
31
 
30
32
  // Given a bit count as an integer, vend as member type `Type` a type with
31
33
  // exactly that number of bits. Undefined if that bit count is not available.
32
- template <std::size_t kBits>
34
+ template <size_t kBits>
33
35
  struct UintSelector;
34
36
  template <>
35
37
  struct UintSelector<8> {
@@ -49,7 +51,7 @@ struct UintSelector<64> {
49
51
  };
50
52
 
51
53
  // An unsigned integer of some number of bits.
52
- template <std::size_t kBits>
54
+ template <size_t kBits>
53
55
  using Uint = typename UintSelector<kBits>::Type;
54
56
 
55
57
  // Given the total number of bits that need to be stored, choose the size of
@@ -58,7 +60,7 @@ using Uint = typename UintSelector<kBits>::Type;
58
60
  // size and performance
59
61
  // - the details will likely be tweaked into the future.
60
62
  // Once we get over 96 bits, we just use uint64_t for everything.
61
- constexpr std::size_t ChooseUnitBitsForBitSet(std::size_t total_bits) {
63
+ constexpr size_t ChooseUnitBitsForBitSet(size_t total_bits) {
62
64
  return total_bits <= 8 ? 8
63
65
  : total_bits <= 16 ? 16
64
66
  : total_bits <= 24 ? 8
@@ -74,11 +76,10 @@ constexpr std::size_t ChooseUnitBitsForBitSet(std::size_t total_bits) {
74
76
  // kUnitBits. e.g. to store 72 bits in 8 bit chunks, we'd say BitSet<72, 8>.
75
77
  // Since most users shouldn't care about the size of unit used, we default
76
78
  // kUnitBits to whatever is selected by ChooseUnitBitsForBitSet
77
- template <std::size_t kTotalBits,
78
- std::size_t kUnitBits = ChooseUnitBitsForBitSet(kTotalBits)>
79
+ template <size_t kTotalBits,
80
+ size_t kUnitBits = ChooseUnitBitsForBitSet(kTotalBits)>
79
81
  class BitSet {
80
- static constexpr std::size_t kUnits =
81
- (kTotalBits + kUnitBits - 1) / kUnitBits;
82
+ static constexpr size_t kUnits = (kTotalBits + kUnitBits - 1) / kUnitBits;
82
83
 
83
84
  public:
84
85
  // Initialize to all bits false
@@ -113,7 +114,7 @@ class BitSet {
113
114
  if (kTotalBits % kUnitBits == 0) {
114
115
  // kTotalBits is a multiple of kUnitBits ==> we can just check for all
115
116
  // ones in each unit.
116
- for (std::size_t i = 0; i < kUnits; i++) {
117
+ for (size_t i = 0; i < kUnits; i++) {
117
118
  if (units_[i] != all_ones()) return false;
118
119
  }
119
120
  return true;
@@ -121,7 +122,7 @@ class BitSet {
121
122
  // kTotalBits is not a multiple of kUnitBits ==> we need special handling
122
123
  // for checking partial filling of the last unit (since not all of its
123
124
  // bits are used!)
124
- for (std::size_t i = 0; i < kUnits - 1; i++) {
125
+ for (size_t i = 0; i < kUnits - 1; i++) {
125
126
  if (units_[i] != all_ones()) return false;
126
127
  }
127
128
  return units_[kUnits - 1] == n_ones(kTotalBits % kUnitBits);
@@ -130,20 +131,27 @@ class BitSet {
130
131
 
131
132
  // Return true if *no* bits are set.
132
133
  bool none() const {
133
- for (std::size_t i = 0; i < kUnits; i++) {
134
+ for (size_t i = 0; i < kUnits; i++) {
134
135
  if (units_[i] != 0) return false;
135
136
  }
136
137
  return true;
137
138
  }
138
139
 
140
+ // Return a count of how many bits are set.
141
+ uint32_t count() const {
142
+ uint32_t count = 0;
143
+ for (size_t i = 0; i < kUnits; i++) {
144
+ count += BitCount(units_[i]);
145
+ }
146
+ return count;
147
+ }
148
+
139
149
  private:
140
150
  // Given a bit index, return which unit it's stored in.
141
- static constexpr std::size_t unit_for(std::size_t bit) {
142
- return bit / kUnitBits;
143
- }
151
+ static constexpr size_t unit_for(size_t bit) { return bit / kUnitBits; }
144
152
 
145
153
  // Given a bit index, return a mask to access that bit within it's unit.
146
- static constexpr Uint<kUnitBits> mask_for(std::size_t bit) {
154
+ static constexpr Uint<kUnitBits> mask_for(size_t bit) {
147
155
  return Uint<kUnitBits>{1} << (bit % kUnitBits);
148
156
  }
149
157
 
@@ -153,7 +161,7 @@ class BitSet {
153
161
  }
154
162
 
155
163
  // Return a value with n bottom bits ones
156
- static constexpr Uint<kUnitBits> n_ones(std::size_t n) {
164
+ static constexpr Uint<kUnitBits> n_ones(size_t n) {
157
165
  return n == kUnitBits ? all_ones() : (Uint<kUnitBits>(1) << n) - 1;
158
166
  }
159
167
 
@@ -161,6 +169,20 @@ class BitSet {
161
169
  Uint<kUnitBits> units_[kUnits];
162
170
  };
163
171
 
172
+ // Zero-size specialization of BitSet.
173
+ // Useful for generic programming.
174
+ // Make a compile time error out of get/set type accesses, and hard-codes
175
+ // queries that do make sense.
176
+ template <>
177
+ class BitSet<0> {
178
+ public:
179
+ constexpr BitSet() {}
180
+
181
+ bool all() const { return true; }
182
+ bool none() const { return true; }
183
+ uint32_t count() const { return 0; }
184
+ };
185
+
164
186
  } // namespace grpc_core
165
187
 
166
188
  #endif // GRPC_CORE_LIB_GPRPP_BITSET_H