grpc 1.28.0.pre2 → 1.31.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 (660) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +8313 -11862
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +30 -9
  5. data/include/grpc/grpc_security_constants.h +4 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +23 -23
  7. data/include/grpc/impl/codegen/port_platform.h +6 -34
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -12
  10. data/src/core/ext/filters/client_channel/client_channel.cc +618 -482
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/config_selector.cc +62 -0
  13. data/src/core/ext/filters/client_channel/config_selector.h +93 -0
  14. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +24 -2
  15. data/src/core/ext/filters/client_channel/health/health_check_client.cc +9 -22
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +6 -5
  18. data/src/core/ext/filters/client_channel/http_proxy.cc +23 -14
  19. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  20. data/src/core/ext/filters/client_channel/lb_policy.h +44 -33
  21. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +297 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +311 -497
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  30. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +9 -17
  33. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +117 -41
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +1142 -0
  39. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +10 -7
  40. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  41. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  42. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  43. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +78 -61
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +41 -40
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +22 -24
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +12 -10
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +79 -122
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +199 -163
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  53. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +46 -45
  54. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +64 -12
  58. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  59. data/src/core/ext/filters/client_channel/resolver_registry.cc +19 -17
  60. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +21 -22
  62. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  63. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +73 -217
  64. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +45 -27
  65. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  66. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  67. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  68. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  69. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  70. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +142 -0
  71. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  72. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  73. data/src/core/ext/filters/client_channel/subchannel.cc +55 -25
  74. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  75. data/src/core/ext/filters/client_channel/xds/xds_api.cc +1200 -246
  76. data/src/core/ext/filters/client_channel/xds/xds_api.h +130 -44
  77. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +90 -29
  78. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +9 -4
  79. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  80. data/src/core/ext/filters/client_channel/xds/xds_client.cc +839 -431
  81. data/src/core/ext/filters/client_channel/xds/xds_client.h +84 -33
  82. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  83. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +40 -28
  84. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -33
  85. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  86. data/src/core/ext/filters/http/http_filters_plugin.cc +28 -12
  87. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  88. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +399 -0
  89. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +31 -0
  90. data/src/core/ext/filters/message_size/message_size_filter.cc +61 -88
  91. data/src/core/ext/filters/message_size/message_size_filter.h +10 -4
  92. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +386 -350
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.h +6 -2
  94. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +1 -1
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -13
  96. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +7 -8
  97. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +42 -26
  99. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  100. data/src/core/ext/transport/chttp2/transport/flow_control.cc +25 -30
  101. data/src/core/ext/transport/chttp2/transport/flow_control.h +14 -16
  102. data/src/core/ext/transport/chttp2/transport/frame_data.cc +9 -12
  103. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +4 -6
  104. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  105. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  106. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  107. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +12 -13
  108. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  109. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  111. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +9 -12
  112. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  114. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -29
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +13 -17
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  119. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  120. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  121. data/src/core/ext/transport/chttp2/transport/internal.h +27 -21
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +33 -43
  123. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  124. data/src/core/ext/transport/chttp2/transport/writing.cc +24 -22
  125. data/src/core/ext/transport/inproc/inproc_transport.cc +54 -15
  126. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +0 -1
  127. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +3 -4
  128. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  129. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -876
  130. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  131. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +429 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  133. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +198 -0
  134. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +388 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +1 -2
  138. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +23 -10
  139. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +352 -310
  140. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  141. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +42 -34
  142. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +7 -7
  144. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  145. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +79 -61
  146. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  147. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +55 -49
  148. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +79 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +48 -27
  151. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +258 -214
  152. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  153. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +51 -45
  154. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +71 -0
  156. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  157. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +107 -100
  158. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  159. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +157 -122
  160. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  161. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +9 -9
  162. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  163. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +173 -73
  164. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  165. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +88 -0
  166. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +2 -1
  167. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +95 -101
  168. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +1 -2
  170. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +2 -1
  171. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +49 -65
  172. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -1
  174. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  175. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +53 -38
  176. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  177. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +70 -62
  178. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  179. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +1 -2
  180. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  181. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +95 -63
  182. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  183. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -1
  184. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +3 -2
  185. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +91 -80
  186. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  187. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +9 -10
  188. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  189. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +1 -2
  190. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  191. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +36 -31
  192. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  193. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -1
  194. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +68 -46
  195. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +770 -722
  196. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  197. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +16 -15
  198. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  199. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +1 -2
  200. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +2 -1
  201. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +95 -88
  202. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  203. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +305 -210
  204. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  205. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +5 -5
  206. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  207. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  208. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  209. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +1 -2
  210. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  211. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +22 -16
  212. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  213. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -1
  214. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  215. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +48 -11
  216. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  217. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +14 -14
  218. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  219. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +23 -23
  220. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  221. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +8 -9
  222. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  223. data/src/core/ext/upb-generated/envoy/type/range.upb.h +15 -16
  224. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  225. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +7 -8
  226. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  227. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +36 -35
  228. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -1
  229. data/src/core/ext/upb-generated/google/api/annotations.upb.h +0 -1
  230. data/src/core/ext/upb-generated/google/api/http.upb.h +29 -28
  231. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +5 -6
  232. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +12 -11
  233. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +421 -389
  234. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +5 -6
  235. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +1 -2
  236. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +1 -1
  237. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +33 -54
  238. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +5 -6
  239. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -28
  240. data/src/core/ext/upb-generated/google/rpc/status.upb.h +8 -8
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +1 -1
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +32 -45
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +4 -4
  244. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +157 -178
  245. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +14 -13
  246. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -7
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +59 -56
  248. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +11 -12
  249. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +0 -1
  250. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  251. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +64 -0
  252. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +6 -6
  253. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +41 -68
  254. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  255. data/src/core/ext/upb-generated/validate/validate.upb.h +569 -562
  256. data/src/core/lib/channel/channel_args.cc +15 -14
  257. data/src/core/lib/channel/channel_args.h +3 -1
  258. data/src/core/lib/channel/channel_stack.h +20 -13
  259. data/src/core/lib/channel/channel_trace.cc +2 -6
  260. data/src/core/lib/channel/channelz.cc +10 -21
  261. data/src/core/lib/channel/channelz.h +3 -2
  262. data/src/core/lib/channel/channelz_registry.cc +5 -3
  263. data/src/core/lib/channel/connected_channel.cc +7 -5
  264. data/src/core/lib/channel/context.h +1 -1
  265. data/src/core/lib/channel/handshaker.cc +11 -13
  266. data/src/core/lib/channel/handshaker.h +4 -2
  267. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  268. data/src/core/lib/channel/status_util.cc +2 -3
  269. data/src/core/lib/compression/message_compress.cc +5 -1
  270. data/src/core/lib/debug/stats.cc +21 -27
  271. data/src/core/lib/debug/stats.h +3 -1
  272. data/src/core/lib/gpr/log_linux.cc +6 -8
  273. data/src/core/lib/gpr/log_posix.cc +6 -8
  274. data/src/core/lib/gpr/spinlock.h +2 -3
  275. data/src/core/lib/gpr/string.cc +10 -33
  276. data/src/core/lib/gpr/string.h +4 -18
  277. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  278. data/src/core/lib/gpr/time.cc +4 -0
  279. data/src/core/lib/gpr/time_posix.cc +1 -1
  280. data/src/core/lib/gprpp/atomic.h +6 -6
  281. data/src/core/lib/gprpp/fork.cc +1 -1
  282. data/src/core/lib/gprpp/global_config_env.cc +8 -6
  283. data/src/core/lib/gprpp/host_port.cc +29 -35
  284. data/src/core/lib/gprpp/host_port.h +14 -17
  285. data/src/core/lib/gprpp/map.h +5 -11
  286. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  287. data/src/core/lib/gprpp/sync.h +9 -0
  288. data/src/core/lib/http/format_request.cc +46 -65
  289. data/src/core/lib/http/httpcli.cc +15 -13
  290. data/src/core/lib/http/httpcli.h +2 -3
  291. data/src/core/lib/http/httpcli_security_connector.cc +10 -10
  292. data/src/core/lib/http/parser.h +2 -3
  293. data/src/core/lib/iomgr/buffer_list.h +22 -21
  294. data/src/core/lib/iomgr/call_combiner.h +3 -2
  295. data/src/core/lib/iomgr/cfstream_handle.cc +4 -2
  296. data/src/core/lib/iomgr/closure.h +2 -3
  297. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  298. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  299. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  300. data/src/core/lib/iomgr/endpoint_pair_posix.cc +10 -10
  301. data/src/core/lib/iomgr/error.cc +6 -9
  302. data/src/core/lib/iomgr/error.h +0 -1
  303. data/src/core/lib/iomgr/error_cfstream.cc +9 -8
  304. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  305. data/src/core/lib/iomgr/ev_apple.h +43 -0
  306. data/src/core/lib/iomgr/ev_epoll1_linux.cc +25 -29
  307. data/src/core/lib/iomgr/ev_epollex_linux.cc +17 -24
  308. data/src/core/lib/iomgr/ev_poll_posix.cc +9 -8
  309. data/src/core/lib/iomgr/ev_posix.cc +4 -3
  310. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  311. data/src/core/lib/iomgr/iomgr.cc +10 -0
  312. data/src/core/lib/iomgr/iomgr.h +10 -0
  313. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  314. data/src/core/lib/iomgr/is_epollexclusive_available.cc +14 -0
  315. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  316. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  317. data/src/core/lib/iomgr/port.h +2 -21
  318. data/src/core/lib/iomgr/python_util.h +46 -0
  319. data/src/core/lib/iomgr/resolve_address.h +4 -6
  320. data/src/core/lib/iomgr/resolve_address_custom.cc +42 -57
  321. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  322. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  323. data/src/core/lib/iomgr/resolve_address_windows.cc +16 -25
  324. data/src/core/lib/iomgr/resource_quota.cc +38 -37
  325. data/src/core/lib/iomgr/sockaddr_utils.cc +29 -33
  326. data/src/core/lib/iomgr/sockaddr_utils.h +10 -15
  327. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  328. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  329. data/src/core/lib/iomgr/socket_utils_common_posix.cc +102 -81
  330. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  331. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  332. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -18
  333. data/src/core/lib/iomgr/tcp_client_custom.cc +6 -9
  334. data/src/core/lib/iomgr/tcp_client_posix.cc +30 -36
  335. data/src/core/lib/iomgr/tcp_client_windows.cc +10 -11
  336. data/src/core/lib/iomgr/tcp_custom.cc +3 -4
  337. data/src/core/lib/iomgr/tcp_custom.h +1 -1
  338. data/src/core/lib/iomgr/tcp_server.cc +3 -4
  339. data/src/core/lib/iomgr/tcp_server.h +7 -5
  340. data/src/core/lib/iomgr/tcp_server_custom.cc +11 -23
  341. data/src/core/lib/iomgr/tcp_server_posix.cc +38 -44
  342. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -4
  343. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +7 -8
  344. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +10 -18
  345. data/src/core/lib/iomgr/tcp_server_windows.cc +16 -16
  346. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  347. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  348. data/src/core/lib/iomgr/timer_generic.cc +15 -15
  349. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  350. data/src/core/lib/iomgr/timer_heap.h +2 -3
  351. data/src/core/lib/iomgr/udp_server.cc +32 -36
  352. data/src/core/lib/iomgr/udp_server.h +5 -2
  353. data/src/core/lib/iomgr/unix_sockets_posix.cc +9 -14
  354. data/src/core/lib/iomgr/unix_sockets_posix.h +3 -1
  355. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +5 -2
  356. data/src/core/lib/json/json.h +3 -2
  357. data/src/core/lib/json/json_reader.cc +25 -26
  358. data/src/core/lib/json/json_writer.cc +13 -12
  359. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  360. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  361. data/src/core/lib/security/credentials/credentials.cc +0 -84
  362. data/src/core/lib/security/credentials/credentials.h +13 -62
  363. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  364. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -6
  365. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -17
  366. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  367. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  368. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  369. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  370. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +7 -4
  371. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  372. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  373. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  374. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +73 -54
  375. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  376. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +19 -6
  377. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  378. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -0
  379. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +10 -0
  380. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  381. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +48 -11
  382. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  383. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -17
  384. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  385. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  386. data/src/core/lib/security/security_connector/security_connector.cc +2 -0
  387. data/src/core/lib/security/security_connector/security_connector.h +2 -2
  388. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +38 -36
  389. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +8 -5
  390. data/src/core/lib/security/security_connector/ssl_utils.cc +89 -21
  391. data/src/core/lib/security/security_connector/ssl_utils.h +18 -12
  392. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +101 -72
  393. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  394. data/src/core/lib/security/transport/auth_filters.h +0 -5
  395. data/src/core/lib/security/transport/client_auth_filter.cc +11 -11
  396. data/src/core/lib/security/util/json_util.cc +12 -13
  397. data/src/core/lib/slice/slice.cc +38 -1
  398. data/src/core/lib/slice/slice_intern.cc +2 -3
  399. data/src/core/lib/slice/slice_internal.h +15 -0
  400. data/src/core/lib/slice/slice_utils.h +9 -0
  401. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  402. data/src/core/lib/surface/call.cc +42 -44
  403. data/src/core/lib/surface/call_log_batch.cc +50 -58
  404. data/src/core/lib/surface/channel.cc +53 -31
  405. data/src/core/lib/surface/channel.h +35 -4
  406. data/src/core/lib/surface/channel_ping.cc +2 -3
  407. data/src/core/lib/surface/completion_queue.cc +304 -47
  408. data/src/core/lib/surface/completion_queue.h +8 -0
  409. data/src/core/lib/surface/event_string.cc +18 -25
  410. data/src/core/lib/surface/event_string.h +3 -1
  411. data/src/core/lib/surface/init.cc +2 -0
  412. data/src/core/lib/surface/init_secure.cc +1 -4
  413. data/src/core/lib/surface/server.cc +971 -837
  414. data/src/core/lib/surface/server.h +66 -12
  415. data/src/core/lib/surface/version.cc +2 -2
  416. data/src/core/lib/transport/byte_stream.h +7 -2
  417. data/src/core/lib/transport/connectivity_state.cc +7 -6
  418. data/src/core/lib/transport/connectivity_state.h +5 -3
  419. data/src/core/lib/transport/metadata.cc +3 -3
  420. data/src/core/lib/transport/metadata_batch.h +2 -3
  421. data/src/core/lib/transport/static_metadata.h +1 -1
  422. data/src/core/lib/transport/status_conversion.cc +6 -14
  423. data/src/core/lib/transport/transport.cc +2 -3
  424. data/src/core/lib/transport/transport.h +9 -2
  425. data/src/core/lib/transport/transport_op_string.cc +61 -102
  426. data/src/core/lib/uri/uri_parser.cc +8 -15
  427. data/src/core/lib/uri/uri_parser.h +2 -3
  428. data/src/core/plugin_registry/grpc_plugin_registry.cc +24 -4
  429. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  430. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +31 -14
  431. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  432. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +34 -2
  433. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  434. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +2 -0
  435. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  436. data/src/core/tsi/fake_transport_security.cc +10 -15
  437. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  438. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  439. data/src/core/tsi/ssl_transport_security.cc +154 -50
  440. data/src/core/tsi/ssl_transport_security.h +22 -10
  441. data/src/core/tsi/ssl_types.h +0 -2
  442. data/src/core/tsi/transport_security.h +6 -9
  443. data/src/core/tsi/transport_security_grpc.h +2 -3
  444. data/src/core/tsi/transport_security_interface.h +8 -3
  445. data/src/ruby/ext/grpc/extconf.rb +5 -2
  446. data/src/ruby/ext/grpc/rb_call.c +12 -3
  447. data/src/ruby/ext/grpc/rb_call.h +4 -0
  448. data/src/ruby/ext/grpc/rb_call_credentials.c +57 -12
  449. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  450. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  451. data/src/ruby/lib/grpc/errors.rb +103 -42
  452. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  453. data/src/ruby/lib/grpc/generic/interceptors.rb +5 -5
  454. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  455. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  456. data/src/ruby/lib/grpc/structs.rb +1 -1
  457. data/src/ruby/lib/grpc/version.rb +1 -1
  458. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  459. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  460. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  461. data/src/ruby/spec/debug_message_spec.rb +134 -0
  462. data/src/ruby/spec/generic/service_spec.rb +2 -0
  463. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  464. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +7 -0
  465. data/src/ruby/spec/pb/codegen/package_option_spec.rb +7 -1
  466. data/src/ruby/spec/support/services.rb +10 -4
  467. data/src/ruby/spec/testdata/ca.pem +18 -13
  468. data/src/ruby/spec/testdata/client.key +26 -14
  469. data/src/ruby/spec/testdata/client.pem +18 -12
  470. data/src/ruby/spec/testdata/server1.key +26 -14
  471. data/src/ruby/spec/testdata/server1.pem +20 -14
  472. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  473. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  474. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  475. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  476. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  477. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  478. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  481. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  482. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  483. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  484. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  485. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  486. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  487. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  488. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  489. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  490. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  491. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  492. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  493. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  494. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  495. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  496. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  497. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  498. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  499. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  500. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  501. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  502. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  503. data/third_party/boringssl-with-bazel/err_data.c +335 -297
  504. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +3 -3
  505. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +3 -3
  506. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +1 -1
  507. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +3 -3
  508. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  509. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +1 -1
  510. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -1
  511. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +1 -1
  512. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +1 -1
  513. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +1 -1
  514. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  515. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  516. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +1 -0
  517. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  518. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  519. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  520. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  521. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  522. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  523. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  524. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  525. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  526. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +385 -0
  527. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +56 -0
  528. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  529. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  530. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +143 -0
  531. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  532. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  533. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  534. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  535. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +25 -12
  536. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  537. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  538. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  539. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  540. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  541. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  542. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  543. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +434 -161
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  545. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +18 -25
  546. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  547. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +104 -122
  548. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +740 -0
  549. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  550. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  551. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  552. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  553. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  554. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  555. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  556. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  557. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  558. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  559. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  560. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  561. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  562. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  563. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  564. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  565. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  566. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  567. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +62 -0
  568. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  569. data/third_party/boringssl-with-bazel/src/crypto/mem.c +47 -16
  570. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  571. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -0
  572. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +36 -5
  573. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  574. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  575. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  576. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  577. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +249 -0
  578. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1227 -0
  579. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +682 -0
  580. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +4 -4
  581. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +8 -0
  582. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +4 -4
  583. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  584. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +13 -6
  585. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +10 -0
  586. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +57 -0
  587. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +4 -1
  588. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +33 -9
  589. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +25 -0
  590. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  591. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +35 -13
  592. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +0 -154
  593. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +28 -6
  594. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +5 -0
  595. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +74 -35
  596. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  597. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +22 -22
  598. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +6 -2
  599. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  600. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  601. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  602. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  603. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  604. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  605. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +69 -0
  606. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  607. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  608. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  609. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  610. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +191 -79
  611. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  612. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +282 -0
  613. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +791 -715
  614. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  615. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  616. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  617. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  618. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  619. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +23 -5
  620. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +30 -22
  621. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +21 -4
  622. data/third_party/boringssl-with-bazel/src/ssl/internal.h +74 -54
  623. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  624. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  625. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  626. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  627. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  628. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +34 -1
  629. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  630. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +44 -5
  631. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  632. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +5 -5
  633. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +51 -26
  634. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  635. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  636. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +129 -48
  637. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  638. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +55 -22
  639. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  640. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  641. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  642. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  643. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  644. data/third_party/upb/upb/decode.c +467 -504
  645. data/third_party/upb/upb/encode.c +163 -121
  646. data/third_party/upb/upb/msg.c +130 -64
  647. data/third_party/upb/upb/msg.h +418 -14
  648. data/third_party/upb/upb/port_def.inc +35 -6
  649. data/third_party/upb/upb/port_undef.inc +8 -1
  650. data/third_party/upb/upb/table.c +53 -75
  651. data/third_party/upb/upb/table.int.h +11 -43
  652. data/third_party/upb/upb/upb.c +148 -124
  653. data/third_party/upb/upb/upb.h +65 -147
  654. data/third_party/upb/upb/upb.hpp +86 -0
  655. metadata +122 -41
  656. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1908
  657. data/src/core/lib/gprpp/string_view.h +0 -60
  658. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  659. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
  660. data/third_party/upb/upb/generated_util.h +0 -105
@@ -22,98 +22,90 @@
22
22
 
23
23
  #include <inttypes.h>
24
24
 
25
+ #include <vector>
26
+
27
+ #include "absl/strings/str_format.h"
28
+ #include "absl/strings/str_join.h"
29
+
25
30
  #include <grpc/support/alloc.h>
26
31
  #include <grpc/support/string_util.h>
27
32
  #include "src/core/lib/gpr/string.h"
28
33
  #include "src/core/lib/slice/slice_string_helpers.h"
29
34
 
30
- static void add_metadata(gpr_strvec* b, const grpc_metadata* md, size_t count) {
31
- size_t i;
35
+ static void add_metadata(const grpc_metadata* md, size_t count,
36
+ std::vector<std::string>* b) {
32
37
  if (md == nullptr) {
33
- gpr_strvec_add(b, gpr_strdup("(nil)"));
38
+ b->push_back("(nil)");
34
39
  return;
35
40
  }
36
- for (i = 0; i < count; i++) {
37
- gpr_strvec_add(b, gpr_strdup("\nkey="));
38
- gpr_strvec_add(b, grpc_slice_to_c_string(md[i].key));
39
-
40
- gpr_strvec_add(b, gpr_strdup(" value="));
41
- gpr_strvec_add(b,
42
- grpc_dump_slice(md[i].value, GPR_DUMP_HEX | GPR_DUMP_ASCII));
41
+ for (size_t i = 0; i < count; i++) {
42
+ b->push_back("\nkey=");
43
+ b->push_back(std::string(grpc_core::StringViewFromSlice(md[i].key)));
44
+ b->push_back(" value=");
45
+ char* dump = grpc_dump_slice(md[i].value, GPR_DUMP_HEX | GPR_DUMP_ASCII);
46
+ b->push_back(dump);
47
+ gpr_free(dump);
43
48
  }
44
49
  }
45
50
 
46
- char* grpc_op_string(const grpc_op* op) {
47
- char* tmp;
48
- char* out;
49
-
50
- gpr_strvec b;
51
- gpr_strvec_init(&b);
52
-
51
+ static std::string grpc_op_string(const grpc_op* op) {
52
+ std::vector<std::string> parts;
53
53
  switch (op->op) {
54
54
  case GRPC_OP_SEND_INITIAL_METADATA:
55
- gpr_strvec_add(&b, gpr_strdup("SEND_INITIAL_METADATA"));
56
- add_metadata(&b, op->data.send_initial_metadata.metadata,
57
- op->data.send_initial_metadata.count);
55
+ parts.push_back("SEND_INITIAL_METADATA");
56
+ add_metadata(op->data.send_initial_metadata.metadata,
57
+ op->data.send_initial_metadata.count, &parts);
58
58
  break;
59
59
  case GRPC_OP_SEND_MESSAGE:
60
- gpr_asprintf(&tmp, "SEND_MESSAGE ptr=%p",
61
- op->data.send_message.send_message);
62
- gpr_strvec_add(&b, tmp);
60
+ parts.push_back(absl::StrFormat("SEND_MESSAGE ptr=%p",
61
+ op->data.send_message.send_message));
63
62
  break;
64
63
  case GRPC_OP_SEND_CLOSE_FROM_CLIENT:
65
- gpr_strvec_add(&b, gpr_strdup("SEND_CLOSE_FROM_CLIENT"));
64
+ parts.push_back("SEND_CLOSE_FROM_CLIENT");
66
65
  break;
67
66
  case GRPC_OP_SEND_STATUS_FROM_SERVER:
68
- gpr_asprintf(&tmp, "SEND_STATUS_FROM_SERVER status=%d details=",
69
- op->data.send_status_from_server.status);
70
- gpr_strvec_add(&b, tmp);
67
+ parts.push_back(
68
+ absl::StrFormat("SEND_STATUS_FROM_SERVER status=%d details=",
69
+ op->data.send_status_from_server.status));
71
70
  if (op->data.send_status_from_server.status_details != nullptr) {
72
- gpr_strvec_add(&b, grpc_dump_slice(
73
- *op->data.send_status_from_server.status_details,
74
- GPR_DUMP_ASCII));
71
+ char* dump = grpc_dump_slice(
72
+ *op->data.send_status_from_server.status_details, GPR_DUMP_ASCII);
73
+ parts.push_back(dump);
74
+ gpr_free(dump);
75
75
  } else {
76
- gpr_strvec_add(&b, gpr_strdup("(null)"));
76
+ parts.push_back("(null)");
77
77
  }
78
- add_metadata(&b, op->data.send_status_from_server.trailing_metadata,
79
- op->data.send_status_from_server.trailing_metadata_count);
78
+ add_metadata(op->data.send_status_from_server.trailing_metadata,
79
+ op->data.send_status_from_server.trailing_metadata_count,
80
+ &parts);
80
81
  break;
81
82
  case GRPC_OP_RECV_INITIAL_METADATA:
82
- gpr_asprintf(&tmp, "RECV_INITIAL_METADATA ptr=%p",
83
- op->data.recv_initial_metadata.recv_initial_metadata);
84
- gpr_strvec_add(&b, tmp);
83
+ parts.push_back(absl::StrFormat(
84
+ "RECV_INITIAL_METADATA ptr=%p",
85
+ op->data.recv_initial_metadata.recv_initial_metadata));
85
86
  break;
86
87
  case GRPC_OP_RECV_MESSAGE:
87
- gpr_asprintf(&tmp, "RECV_MESSAGE ptr=%p",
88
- op->data.recv_message.recv_message);
89
- gpr_strvec_add(&b, tmp);
88
+ parts.push_back(absl::StrFormat("RECV_MESSAGE ptr=%p",
89
+ op->data.recv_message.recv_message));
90
90
  break;
91
91
  case GRPC_OP_RECV_STATUS_ON_CLIENT:
92
- gpr_asprintf(&tmp,
93
- "RECV_STATUS_ON_CLIENT metadata=%p status=%p details=%p",
94
- op->data.recv_status_on_client.trailing_metadata,
95
- op->data.recv_status_on_client.status,
96
- op->data.recv_status_on_client.status_details);
97
- gpr_strvec_add(&b, tmp);
92
+ parts.push_back(absl::StrFormat(
93
+ "RECV_STATUS_ON_CLIENT metadata=%p status=%p details=%p",
94
+ op->data.recv_status_on_client.trailing_metadata,
95
+ op->data.recv_status_on_client.status,
96
+ op->data.recv_status_on_client.status_details));
98
97
  break;
99
98
  case GRPC_OP_RECV_CLOSE_ON_SERVER:
100
- gpr_asprintf(&tmp, "RECV_CLOSE_ON_SERVER cancelled=%p",
101
- op->data.recv_close_on_server.cancelled);
102
- gpr_strvec_add(&b, tmp);
99
+ parts.push_back(absl::StrFormat("RECV_CLOSE_ON_SERVER cancelled=%p",
100
+ op->data.recv_close_on_server.cancelled));
103
101
  }
104
- out = gpr_strvec_flatten(&b, nullptr);
105
- gpr_strvec_destroy(&b);
106
-
107
- return out;
102
+ return absl::StrJoin(parts, "");
108
103
  }
109
104
 
110
105
  void grpc_call_log_batch(const char* file, int line, gpr_log_severity severity,
111
106
  const grpc_op* ops, size_t nops) {
112
- char* tmp;
113
- size_t i;
114
- for (i = 0; i < nops; i++) {
115
- tmp = grpc_op_string(&ops[i]);
116
- gpr_log(file, line, severity, "ops[%" PRIuPTR "]: %s", i, tmp);
117
- gpr_free(tmp);
107
+ for (size_t i = 0; i < nops; i++) {
108
+ gpr_log(file, line, severity, "ops[%" PRIuPTR "]: %s", i,
109
+ grpc_op_string(&ops[i]).c_str());
118
110
  }
119
111
  }
@@ -54,12 +54,6 @@
54
54
  * (OK, Cancelled, Unknown). */
55
55
  #define NUM_CACHED_STATUS_ELEMS 3
56
56
 
57
- typedef struct registered_call {
58
- grpc_mdelem path;
59
- grpc_mdelem authority;
60
- struct registered_call* next;
61
- } registered_call;
62
-
63
57
  static void destroy_channel(void* arg, grpc_error* error);
64
58
 
65
59
  grpc_channel* grpc_channel_create_with_builder(
@@ -90,8 +84,7 @@ grpc_channel* grpc_channel_create_with_builder(
90
84
  channel->target = target;
91
85
  channel->resource_user = resource_user;
92
86
  channel->is_client = grpc_channel_stack_type_is_client(channel_stack_type);
93
- gpr_mu_init(&channel->registered_call_mu);
94
- channel->registered_calls = nullptr;
87
+ channel->registration_table.Init();
95
88
 
96
89
  gpr_atm_no_barrier_store(
97
90
  &channel->call_size_estimate,
@@ -336,6 +329,7 @@ char* grpc_channel_get_target(grpc_channel* channel) {
336
329
 
337
330
  void grpc_channel_get_info(grpc_channel* channel,
338
331
  const grpc_channel_info* channel_info) {
332
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
339
333
  grpc_core::ExecCtx exec_ctx;
340
334
  grpc_channel_element* elem =
341
335
  grpc_channel_stack_element(CHANNEL_STACK_FROM_CHANNEL(channel), 0);
@@ -343,6 +337,7 @@ void grpc_channel_get_info(grpc_channel* channel,
343
337
  }
344
338
 
345
339
  void grpc_channel_reset_connect_backoff(grpc_channel* channel) {
340
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
346
341
  grpc_core::ExecCtx exec_ctx;
347
342
  GRPC_API_TRACE("grpc_channel_reset_connect_backoff(channel=%p)", 1,
348
343
  (channel));
@@ -393,6 +388,7 @@ grpc_call* grpc_channel_create_call(grpc_channel* channel,
393
388
  grpc_slice method, const grpc_slice* host,
394
389
  gpr_timespec deadline, void* reserved) {
395
390
  GPR_ASSERT(!reserved);
391
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
396
392
  grpc_core::ExecCtx exec_ctx;
397
393
  grpc_call* call = grpc_channel_create_call_internal(
398
394
  channel, parent_call, propagation_mask, cq, nullptr,
@@ -417,35 +413,66 @@ grpc_call* grpc_channel_create_pollset_set_call(
417
413
  deadline);
418
414
  }
419
415
 
416
+ namespace grpc_core {
417
+
418
+ RegisteredCall::RegisteredCall(const char* method, const char* host) {
419
+ path = grpc_mdelem_from_slices(GRPC_MDSTR_PATH,
420
+ grpc_core::ExternallyManagedSlice(method));
421
+ authority =
422
+ host ? grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY,
423
+ grpc_core::ExternallyManagedSlice(host))
424
+ : GRPC_MDNULL;
425
+ }
426
+
427
+ // TODO(vjpai): Delete copy-constructor when allowed by all supported compilers.
428
+ RegisteredCall::RegisteredCall(const RegisteredCall& other) {
429
+ path = other.path;
430
+ authority = other.authority;
431
+ GRPC_MDELEM_REF(path);
432
+ GRPC_MDELEM_REF(authority);
433
+ }
434
+
435
+ RegisteredCall::RegisteredCall(RegisteredCall&& other) noexcept {
436
+ path = other.path;
437
+ authority = other.authority;
438
+ other.path = GRPC_MDNULL;
439
+ other.authority = GRPC_MDNULL;
440
+ }
441
+
442
+ RegisteredCall::~RegisteredCall() {
443
+ GRPC_MDELEM_UNREF(path);
444
+ GRPC_MDELEM_UNREF(authority);
445
+ }
446
+
447
+ } // namespace grpc_core
448
+
420
449
  void* grpc_channel_register_call(grpc_channel* channel, const char* method,
421
450
  const char* host, void* reserved) {
422
- registered_call* rc =
423
- static_cast<registered_call*>(gpr_malloc(sizeof(registered_call)));
424
451
  GRPC_API_TRACE(
425
452
  "grpc_channel_register_call(channel=%p, method=%s, host=%s, reserved=%p)",
426
453
  4, (channel, method, host, reserved));
427
454
  GPR_ASSERT(!reserved);
455
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
428
456
  grpc_core::ExecCtx exec_ctx;
429
457
 
430
- rc->path = grpc_mdelem_from_slices(GRPC_MDSTR_PATH,
431
- grpc_core::ExternallyManagedSlice(method));
432
- rc->authority =
433
- host ? grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY,
434
- grpc_core::ExternallyManagedSlice(host))
435
- : GRPC_MDNULL;
436
- gpr_mu_lock(&channel->registered_call_mu);
437
- rc->next = channel->registered_calls;
438
- channel->registered_calls = rc;
439
- gpr_mu_unlock(&channel->registered_call_mu);
440
-
441
- return rc;
458
+ grpc_core::MutexLock lock(&channel->registration_table->mu);
459
+ channel->registration_table->method_registration_attempts++;
460
+ auto key = std::make_pair(host, method);
461
+ auto rc_posn = channel->registration_table->map.find(key);
462
+ if (rc_posn != channel->registration_table->map.end()) {
463
+ return &rc_posn->second;
464
+ }
465
+ auto insertion_result = channel->registration_table->map.insert(
466
+ {key, grpc_core::RegisteredCall(method, host)});
467
+ return &insertion_result.first->second;
442
468
  }
443
469
 
444
470
  grpc_call* grpc_channel_create_registered_call(
445
471
  grpc_channel* channel, grpc_call* parent_call, uint32_t propagation_mask,
446
472
  grpc_completion_queue* completion_queue, void* registered_call_handle,
447
473
  gpr_timespec deadline, void* reserved) {
448
- registered_call* rc = static_cast<registered_call*>(registered_call_handle);
474
+ grpc_core::RegisteredCall* rc =
475
+ static_cast<grpc_core::RegisteredCall*>(registered_call_handle);
449
476
  GRPC_API_TRACE(
450
477
  "grpc_channel_create_registered_call("
451
478
  "channel=%p, parent_call=%p, propagation_mask=%x, completion_queue=%p, "
@@ -458,6 +485,7 @@ grpc_call* grpc_channel_create_registered_call(
458
485
  registered_call_handle, deadline.tv_sec, deadline.tv_nsec,
459
486
  (int)deadline.clock_type, reserved));
460
487
  GPR_ASSERT(!reserved);
488
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
461
489
  grpc_core::ExecCtx exec_ctx;
462
490
  grpc_call* call = grpc_channel_create_call_internal(
463
491
  channel, parent_call, propagation_mask, completion_queue, nullptr,
@@ -486,18 +514,11 @@ static void destroy_channel(void* arg, grpc_error* /*error*/) {
486
514
  channel->channelz_node.reset();
487
515
  }
488
516
  grpc_channel_stack_destroy(CHANNEL_STACK_FROM_CHANNEL(channel));
489
- while (channel->registered_calls) {
490
- registered_call* rc = channel->registered_calls;
491
- channel->registered_calls = rc->next;
492
- GRPC_MDELEM_UNREF(rc->path);
493
- GRPC_MDELEM_UNREF(rc->authority);
494
- gpr_free(rc);
495
- }
517
+ channel->registration_table.Destroy();
496
518
  if (channel->resource_user != nullptr) {
497
519
  grpc_resource_user_free(channel->resource_user,
498
520
  GRPC_RESOURCE_QUOTA_CHANNEL_SIZE);
499
521
  }
500
- gpr_mu_destroy(&channel->registered_call_mu);
501
522
  gpr_free(channel->target);
502
523
  gpr_free(channel);
503
524
  // See comment in grpc_channel_create() for why we do this.
@@ -516,6 +537,7 @@ void grpc_channel_destroy_internal(grpc_channel* channel) {
516
537
  }
517
538
 
518
539
  void grpc_channel_destroy(grpc_channel* channel) {
540
+ grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
519
541
  grpc_core::ExecCtx exec_ctx;
520
542
  grpc_channel_destroy_internal(channel);
521
543
  }
@@ -21,10 +21,14 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <map>
25
+
24
26
  #include "src/core/lib/channel/channel_stack.h"
25
27
  #include "src/core/lib/channel/channel_stack_builder.h"
26
28
  #include "src/core/lib/channel/channelz.h"
29
+ #include "src/core/lib/gprpp/manual_constructor.h"
27
30
  #include "src/core/lib/surface/channel_stack_type.h"
31
+ #include "src/core/lib/transport/metadata.h"
28
32
 
29
33
  grpc_channel* grpc_channel_create(const char* target,
30
34
  const grpc_channel_args* args,
@@ -62,7 +66,30 @@ grpc_core::channelz::ChannelNode* grpc_channel_get_channelz_node(
62
66
  size_t grpc_channel_get_call_size_estimate(grpc_channel* channel);
63
67
  void grpc_channel_update_call_size_estimate(grpc_channel* channel, size_t size);
64
68
 
65
- struct registered_call;
69
+ namespace grpc_core {
70
+
71
+ struct RegisteredCall {
72
+ grpc_mdelem path;
73
+ grpc_mdelem authority;
74
+
75
+ explicit RegisteredCall(const char* method, const char* host);
76
+ // TODO(vjpai): delete copy constructor once all supported compilers allow
77
+ // std::map value_type to be MoveConstructible.
78
+ RegisteredCall(const RegisteredCall& other);
79
+ RegisteredCall(RegisteredCall&& other) noexcept;
80
+
81
+ ~RegisteredCall();
82
+ };
83
+
84
+ struct CallRegistrationTable {
85
+ grpc_core::Mutex mu;
86
+ std::map<std::pair<const char*, const char*>, RegisteredCall>
87
+ map /* GUARDED_BY(mu) */;
88
+ int method_registration_attempts /* GUARDED_BY(mu) */ = 0;
89
+ };
90
+
91
+ } // namespace grpc_core
92
+
66
93
  struct grpc_channel {
67
94
  int is_client;
68
95
  grpc_compression_options compression_options;
@@ -70,9 +97,13 @@ struct grpc_channel {
70
97
  gpr_atm call_size_estimate;
71
98
  grpc_resource_user* resource_user;
72
99
 
73
- gpr_mu registered_call_mu;
74
- registered_call* registered_calls;
75
-
100
+ // TODO(vjpai): Once the grpc_channel is allocated via new rather than malloc,
101
+ // expand the members of the CallRegistrationTable directly into
102
+ // the grpc_channel. For now it is kept separate so that all the
103
+ // manual constructing can be done with a single call rather than
104
+ // a separate manual construction for each field.
105
+ grpc_core::ManualConstructor<grpc_core::CallRegistrationTable>
106
+ registration_table;
76
107
  grpc_core::RefCountedPtr<grpc_core::channelz::ChannelNode> channelz_node;
77
108
 
78
109
  char* target;
@@ -28,13 +28,12 @@
28
28
  #include "src/core/lib/surface/api_trace.h"
29
29
  #include "src/core/lib/surface/completion_queue.h"
30
30
 
31
- typedef struct {
31
+ struct ping_result {
32
32
  grpc_closure closure;
33
33
  void* tag;
34
34
  grpc_completion_queue* cq;
35
35
  grpc_cq_completion completion_storage;
36
- } ping_result;
37
-
36
+ };
38
37
  static void ping_destroy(void* arg, grpc_cq_completion* /*storage*/) {
39
38
  gpr_free(arg);
40
39
  }
@@ -23,6 +23,11 @@
23
23
  #include <stdio.h>
24
24
  #include <string.h>
25
25
 
26
+ #include <vector>
27
+
28
+ #include "absl/strings/str_format.h"
29
+ #include "absl/strings/str_join.h"
30
+
26
31
  #include <grpc/support/alloc.h>
27
32
  #include <grpc/support/atm.h>
28
33
  #include <grpc/support/log.h>
@@ -34,6 +39,7 @@
34
39
  #include "src/core/lib/gpr/string.h"
35
40
  #include "src/core/lib/gpr/tls.h"
36
41
  #include "src/core/lib/gprpp/atomic.h"
42
+ #include "src/core/lib/iomgr/closure.h"
37
43
  #include "src/core/lib/iomgr/executor.h"
38
44
  #include "src/core/lib/iomgr/pollset.h"
39
45
  #include "src/core/lib/iomgr/timer.h"
@@ -56,12 +62,11 @@ namespace {
56
62
  GPR_TLS_DECL(g_cached_event);
57
63
  GPR_TLS_DECL(g_cached_cq);
58
64
 
59
- typedef struct {
65
+ struct plucker {
60
66
  grpc_pollset_worker** worker;
61
67
  void* tag;
62
- } plucker;
63
-
64
- typedef struct {
68
+ };
69
+ struct cq_poller_vtable {
65
70
  bool can_get_pollset;
66
71
  bool can_listen;
67
72
  size_t (*size)(void);
@@ -72,8 +77,7 @@ typedef struct {
72
77
  grpc_millis deadline);
73
78
  void (*shutdown)(grpc_pollset* pollset, grpc_closure* closure);
74
79
  void (*destroy)(grpc_pollset* pollset);
75
- } cq_poller_vtable;
76
-
80
+ };
77
81
  typedef struct non_polling_worker {
78
82
  gpr_cv cv;
79
83
  bool kicked;
@@ -81,13 +85,12 @@ typedef struct non_polling_worker {
81
85
  struct non_polling_worker* prev;
82
86
  } non_polling_worker;
83
87
 
84
- typedef struct {
88
+ struct non_polling_poller {
85
89
  gpr_mu mu;
86
90
  bool kicked_without_poller;
87
91
  non_polling_worker* root;
88
92
  grpc_closure* shutdown;
89
- } non_polling_poller;
90
-
93
+ };
91
94
  size_t non_polling_poller_size(void) { return sizeof(non_polling_poller); }
92
95
 
93
96
  void non_polling_poller_init(grpc_pollset* pollset, gpr_mu** mu) {
@@ -206,6 +209,9 @@ struct cq_vtable {
206
209
  void* reserved);
207
210
  grpc_event (*pluck)(grpc_completion_queue* cq, void* tag,
208
211
  gpr_timespec deadline, void* reserved);
212
+ // TODO(vjpai): Remove proxy_pollset once callback_alternative no longer
213
+ // needed.
214
+ grpc_pollset* (*proxy_pollset)(grpc_completion_queue* cq);
209
215
  };
210
216
 
211
217
  namespace {
@@ -307,7 +313,7 @@ struct cq_pluck_data {
307
313
  };
308
314
 
309
315
  struct cq_callback_data {
310
- cq_callback_data(
316
+ explicit cq_callback_data(
311
317
  grpc_experimental_completion_queue_functor* shutdown_callback)
312
318
  : shutdown_callback(shutdown_callback) {}
313
319
 
@@ -325,17 +331,88 @@ struct cq_callback_data {
325
331
  Initial count is dropped by grpc_completion_queue_shutdown. */
326
332
  grpc_core::Atomic<intptr_t> pending_events{1};
327
333
 
328
- /** Counter of how many things have ever been queued on this completion queue
329
- useful for avoiding locks to check the queue */
330
- grpc_core::Atomic<intptr_t> things_queued_ever{0};
334
+ /** 0 initially. 1 once we initiated shutdown */
335
+ bool shutdown_called = false;
336
+
337
+ /** A callback that gets invoked when the CQ completes shutdown */
338
+ grpc_experimental_completion_queue_functor* shutdown_callback;
339
+ };
340
+
341
+ // TODO(vjpai): Remove all callback_alternative variants when event manager is
342
+ // the only supported poller.
343
+ struct cq_callback_alternative_data {
344
+ explicit cq_callback_alternative_data(
345
+ grpc_experimental_completion_queue_functor* shutdown_callback)
346
+ : implementation(SharedNextableCQ()),
347
+ shutdown_callback(shutdown_callback) {}
348
+
349
+ /* This just points to a single shared nextable CQ */
350
+ grpc_completion_queue* const implementation;
351
+
352
+ /** Number of outstanding events (+1 if not shut down)
353
+ Initial count is dropped by grpc_completion_queue_shutdown */
354
+ grpc_core::Atomic<intptr_t> pending_events{1};
331
355
 
332
356
  /** 0 initially. 1 once we initiated shutdown */
333
357
  bool shutdown_called = false;
334
358
 
335
359
  /** A callback that gets invoked when the CQ completes shutdown */
336
360
  grpc_experimental_completion_queue_functor* shutdown_callback;
361
+
362
+ static grpc_completion_queue* SharedNextableCQ() {
363
+ grpc_core::MutexLock lock(&*shared_cq_next_mu);
364
+
365
+ if (shared_cq_next == nullptr) {
366
+ shared_cq_next = grpc_completion_queue_create_for_next(nullptr);
367
+ int num_nexting_threads = GPR_CLAMP(gpr_cpu_num_cores(), 1, 32);
368
+ threads_remaining.Store(num_nexting_threads,
369
+ grpc_core::MemoryOrder::RELEASE);
370
+ for (int i = 0; i < num_nexting_threads; i++) {
371
+ grpc_core::Executor::Run(
372
+ GRPC_CLOSURE_CREATE(
373
+ [](void* arg, grpc_error* /*error*/) {
374
+ grpc_completion_queue* cq =
375
+ static_cast<grpc_completion_queue*>(arg);
376
+ while (true) {
377
+ grpc_event event = grpc_completion_queue_next(
378
+ cq, gpr_inf_future(GPR_CLOCK_REALTIME), nullptr);
379
+ if (event.type == GRPC_QUEUE_SHUTDOWN) {
380
+ break;
381
+ }
382
+ GPR_DEBUG_ASSERT(event.type == GRPC_OP_COMPLETE);
383
+ // We can always execute the callback inline rather than
384
+ // pushing it to another Executor thread because this
385
+ // thread is definitely running on an executor, does not
386
+ // hold any application locks before executing the callback,
387
+ // and cannot be entered recursively.
388
+ auto* functor = static_cast<
389
+ grpc_experimental_completion_queue_functor*>(event.tag);
390
+ functor->functor_run(functor, event.success);
391
+ }
392
+ if (threads_remaining.FetchSub(
393
+ 1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
394
+ grpc_completion_queue_destroy(cq);
395
+ }
396
+ },
397
+ shared_cq_next, nullptr),
398
+ GRPC_ERROR_NONE, grpc_core::ExecutorType::DEFAULT,
399
+ grpc_core::ExecutorJobType::LONG);
400
+ }
401
+ }
402
+ return shared_cq_next;
403
+ }
404
+ // Use manually-constructed Mutex to avoid static construction issues
405
+ static grpc_core::ManualConstructor<grpc_core::Mutex> shared_cq_next_mu;
406
+ static grpc_completion_queue*
407
+ shared_cq_next; // GUARDED_BY(shared_cq_next_mu)
408
+ static grpc_core::Atomic<int> threads_remaining;
337
409
  };
338
410
 
411
+ grpc_core::ManualConstructor<grpc_core::Mutex>
412
+ cq_callback_alternative_data::shared_cq_next_mu;
413
+ grpc_completion_queue* cq_callback_alternative_data::shared_cq_next = nullptr;
414
+ grpc_core::Atomic<int> cq_callback_alternative_data::threads_remaining{0};
415
+
339
416
  } // namespace
340
417
 
341
418
  /* Completion queue structure */
@@ -348,6 +425,12 @@ struct grpc_completion_queue {
348
425
  const cq_vtable* vtable;
349
426
  const cq_poller_vtable* poller_vtable;
350
427
 
428
+ // The pollset entry is allowed to enable proxy CQs like the
429
+ // callback_alternative.
430
+ // TODO(vjpai): Consider removing pollset and reverting to previous
431
+ // calculation of pollset once callback_alternative is no longer needed.
432
+ grpc_pollset* pollset;
433
+
351
434
  #ifndef NDEBUG
352
435
  void** outstanding_tags;
353
436
  size_t outstanding_tag_count;
@@ -362,13 +445,17 @@ struct grpc_completion_queue {
362
445
  static void cq_finish_shutdown_next(grpc_completion_queue* cq);
363
446
  static void cq_finish_shutdown_pluck(grpc_completion_queue* cq);
364
447
  static void cq_finish_shutdown_callback(grpc_completion_queue* cq);
448
+ static void cq_finish_shutdown_callback_alternative(grpc_completion_queue* cq);
365
449
  static void cq_shutdown_next(grpc_completion_queue* cq);
366
450
  static void cq_shutdown_pluck(grpc_completion_queue* cq);
367
451
  static void cq_shutdown_callback(grpc_completion_queue* cq);
452
+ static void cq_shutdown_callback_alternative(grpc_completion_queue* cq);
368
453
 
369
454
  static bool cq_begin_op_for_next(grpc_completion_queue* cq, void* tag);
370
455
  static bool cq_begin_op_for_pluck(grpc_completion_queue* cq, void* tag);
371
456
  static bool cq_begin_op_for_callback(grpc_completion_queue* cq, void* tag);
457
+ static bool cq_begin_op_for_callback_alternative(grpc_completion_queue* cq,
458
+ void* tag);
372
459
 
373
460
  // A cq_end_op function is called when an operation on a given CQ with
374
461
  // a given tag has completed. The storage argument is a reference to the
@@ -391,12 +478,20 @@ static void cq_end_op_for_callback(
391
478
  void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
392
479
  grpc_cq_completion* storage, bool internal);
393
480
 
481
+ static void cq_end_op_for_callback_alternative(
482
+ grpc_completion_queue* cq, void* tag, grpc_error* error,
483
+ void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
484
+ grpc_cq_completion* storage, bool internal);
485
+
394
486
  static grpc_event cq_next(grpc_completion_queue* cq, gpr_timespec deadline,
395
487
  void* reserved);
396
488
 
397
489
  static grpc_event cq_pluck(grpc_completion_queue* cq, void* tag,
398
490
  gpr_timespec deadline, void* reserved);
399
491
 
492
+ static grpc_pollset* cq_proxy_pollset_for_callback_alternative(
493
+ grpc_completion_queue* cq);
494
+
400
495
  // Note that cq_init_next and cq_init_pluck do not use the shutdown_callback
401
496
  static void cq_init_next(
402
497
  void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
@@ -404,41 +499,50 @@ static void cq_init_pluck(
404
499
  void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
405
500
  static void cq_init_callback(
406
501
  void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
502
+ // poller becomes only option.
503
+ static void cq_init_callback_alternative(
504
+ void* data, grpc_experimental_completion_queue_functor* shutdown_callback);
407
505
  static void cq_destroy_next(void* data);
408
506
  static void cq_destroy_pluck(void* data);
409
507
  static void cq_destroy_callback(void* data);
508
+ static void cq_destroy_callback_alternative(void* data);
410
509
 
411
510
  /* Completion queue vtables based on the completion-type */
412
- static const cq_vtable g_cq_vtable[] = {
511
+ // TODO(vjpai): Make this const again once we stop needing callback_alternative
512
+ static cq_vtable g_polling_cq_vtable[] = {
413
513
  /* GRPC_CQ_NEXT */
414
514
  {GRPC_CQ_NEXT, sizeof(cq_next_data), cq_init_next, cq_shutdown_next,
415
515
  cq_destroy_next, cq_begin_op_for_next, cq_end_op_for_next, cq_next,
416
- nullptr},
516
+ nullptr, nullptr},
417
517
  /* GRPC_CQ_PLUCK */
418
518
  {GRPC_CQ_PLUCK, sizeof(cq_pluck_data), cq_init_pluck, cq_shutdown_pluck,
419
519
  cq_destroy_pluck, cq_begin_op_for_pluck, cq_end_op_for_pluck, nullptr,
420
- cq_pluck},
520
+ cq_pluck, nullptr},
421
521
  /* GRPC_CQ_CALLBACK */
422
522
  {GRPC_CQ_CALLBACK, sizeof(cq_callback_data), cq_init_callback,
423
523
  cq_shutdown_callback, cq_destroy_callback, cq_begin_op_for_callback,
424
- cq_end_op_for_callback, nullptr, nullptr},
524
+ cq_end_op_for_callback, nullptr, nullptr, nullptr},
425
525
  };
426
526
 
527
+ // Separate vtable for non-polling cqs, assign at init
528
+ static cq_vtable g_nonpolling_cq_vtable[sizeof(g_polling_cq_vtable) /
529
+ sizeof(g_polling_cq_vtable[0])];
530
+
427
531
  #define DATA_FROM_CQ(cq) ((void*)(cq + 1))
428
- #define POLLSET_FROM_CQ(cq) \
532
+ #define INLINE_POLLSET_FROM_CQ(cq) \
429
533
  ((grpc_pollset*)(cq->vtable->data_size + (char*)DATA_FROM_CQ(cq)))
534
+ #define POLLSET_FROM_CQ(cq) (cq->pollset)
430
535
 
431
536
  grpc_core::TraceFlag grpc_cq_pluck_trace(false, "queue_pluck");
432
537
 
433
- #define GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, event) \
434
- do { \
435
- if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) && \
436
- (GRPC_TRACE_FLAG_ENABLED(grpc_cq_pluck_trace) || \
437
- (event)->type != GRPC_QUEUE_TIMEOUT)) { \
438
- char* _ev = grpc_event_string(event); \
439
- gpr_log(GPR_INFO, "RETURN_EVENT[%p]: %s", cq, _ev); \
440
- gpr_free(_ev); \
441
- } \
538
+ #define GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, event) \
539
+ do { \
540
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) && \
541
+ (GRPC_TRACE_FLAG_ENABLED(grpc_cq_pluck_trace) || \
542
+ (event)->type != GRPC_QUEUE_TIMEOUT)) { \
543
+ gpr_log(GPR_INFO, "RETURN_EVENT[%p]: %s", cq, \
544
+ grpc_event_string(event).c_str()); \
545
+ } \
442
546
  } while (0)
443
547
 
444
548
  static void on_pollset_shutdown_done(void* cq, grpc_error* error);
@@ -446,6 +550,46 @@ static void on_pollset_shutdown_done(void* cq, grpc_error* error);
446
550
  void grpc_cq_global_init() {
447
551
  gpr_tls_init(&g_cached_event);
448
552
  gpr_tls_init(&g_cached_cq);
553
+ g_nonpolling_cq_vtable[GRPC_CQ_NEXT] = g_polling_cq_vtable[GRPC_CQ_NEXT];
554
+ g_nonpolling_cq_vtable[GRPC_CQ_PLUCK] = g_polling_cq_vtable[GRPC_CQ_PLUCK];
555
+ g_nonpolling_cq_vtable[GRPC_CQ_CALLBACK] =
556
+ g_polling_cq_vtable[GRPC_CQ_CALLBACK];
557
+ }
558
+
559
+ // TODO(vjpai): Remove when callback_alternative is no longer needed
560
+ void grpc_cq_init() {
561
+ // If the iomgr runs in the background, we can use the preferred callback CQ.
562
+ // If the iomgr is non-polling, we cannot use the alternative callback CQ.
563
+ if (!grpc_iomgr_run_in_background() && !grpc_iomgr_non_polling()) {
564
+ cq_callback_alternative_data::shared_cq_next_mu.Init();
565
+ g_polling_cq_vtable[GRPC_CQ_CALLBACK] = {
566
+ GRPC_CQ_CALLBACK,
567
+ sizeof(cq_callback_alternative_data),
568
+ cq_init_callback_alternative,
569
+ cq_shutdown_callback_alternative,
570
+ cq_destroy_callback_alternative,
571
+ cq_begin_op_for_callback_alternative,
572
+ cq_end_op_for_callback_alternative,
573
+ nullptr,
574
+ nullptr,
575
+ cq_proxy_pollset_for_callback_alternative};
576
+ }
577
+ }
578
+
579
+ // TODO(vjpai): Remove when callback_alternative is no longer needed
580
+ void grpc_cq_shutdown() {
581
+ if (!grpc_iomgr_run_in_background() && !grpc_iomgr_non_polling()) {
582
+ {
583
+ grpc_core::MutexLock lock(
584
+ &*cq_callback_alternative_data::shared_cq_next_mu);
585
+ if (cq_callback_alternative_data::shared_cq_next != nullptr) {
586
+ grpc_completion_queue_shutdown(
587
+ cq_callback_alternative_data::shared_cq_next);
588
+ }
589
+ cq_callback_alternative_data::shared_cq_next = nullptr;
590
+ }
591
+ cq_callback_alternative_data::shared_cq_next_mu.Destroy();
592
+ }
449
593
  }
450
594
 
451
595
  void grpc_completion_queue_thread_local_cache_init(grpc_completion_queue* cq) {
@@ -524,7 +668,9 @@ grpc_completion_queue* grpc_completion_queue_create_internal(
524
668
  "polling_type=%d)",
525
669
  2, (completion_type, polling_type));
526
670
 
527
- const cq_vtable* vtable = &g_cq_vtable[completion_type];
671
+ const cq_vtable* vtable = (polling_type == GRPC_CQ_NON_POLLING)
672
+ ? &g_nonpolling_cq_vtable[completion_type]
673
+ : &g_polling_cq_vtable[completion_type];
528
674
  const cq_poller_vtable* poller_vtable =
529
675
  &g_poller_vtable_by_poller_type[polling_type];
530
676
 
@@ -541,9 +687,18 @@ grpc_completion_queue* grpc_completion_queue_create_internal(
541
687
  /* One for destroy(), one for pollset_shutdown */
542
688
  new (&cq->owning_refs) grpc_core::RefCount(2);
543
689
 
544
- poller_vtable->init(POLLSET_FROM_CQ(cq), &cq->mu);
545
690
  vtable->init(DATA_FROM_CQ(cq), shutdown_callback);
546
691
 
692
+ // TODO(vjpai): When callback_alternative is no longer needed, cq->pollset can
693
+ // be removed and the nullptr proxy_pollset value below can be the definition
694
+ // of POLLSET_FROM_CQ.
695
+ cq->pollset = cq->vtable->proxy_pollset == nullptr
696
+ ? INLINE_POLLSET_FROM_CQ(cq)
697
+ : cq->vtable->proxy_pollset(cq);
698
+ // Init the inline pollset. If a proxy CQ is used, the proxy pollset will be
699
+ // init'ed in its CQ init.
700
+ cq->poller_vtable->init(INLINE_POLLSET_FROM_CQ(cq), &cq->mu);
701
+
547
702
  GRPC_CLOSURE_INIT(&cq->pollset_shutdown_done, on_pollset_shutdown_done, cq,
548
703
  grpc_schedule_on_exec_ctx);
549
704
  return cq;
@@ -581,6 +736,17 @@ static void cq_destroy_callback(void* data) {
581
736
  cqd->~cq_callback_data();
582
737
  }
583
738
 
739
+ static void cq_init_callback_alternative(
740
+ void* data, grpc_experimental_completion_queue_functor* shutdown_callback) {
741
+ new (data) cq_callback_alternative_data(shutdown_callback);
742
+ }
743
+
744
+ static void cq_destroy_callback_alternative(void* data) {
745
+ cq_callback_alternative_data* cqd =
746
+ static_cast<cq_callback_alternative_data*>(data);
747
+ cqd->~cq_callback_alternative_data();
748
+ }
749
+
584
750
  grpc_cq_completion_type grpc_get_cq_completion_type(grpc_completion_queue* cq) {
585
751
  return cq->vtable->cq_completion_type;
586
752
  }
@@ -621,7 +787,9 @@ void grpc_cq_internal_unref(grpc_completion_queue* cq) {
621
787
  #endif
622
788
  if (GPR_UNLIKELY(cq->owning_refs.Unref(debug_location, reason))) {
623
789
  cq->vtable->destroy(DATA_FROM_CQ(cq));
624
- cq->poller_vtable->destroy(POLLSET_FROM_CQ(cq));
790
+ // Only destroy the inlined pollset. If a proxy CQ is used, the proxy
791
+ // pollset will be destroyed by the proxy CQ.
792
+ cq->poller_vtable->destroy(INLINE_POLLSET_FROM_CQ(cq));
625
793
  #ifndef NDEBUG
626
794
  gpr_free(cq->outstanding_tags);
627
795
  #endif
@@ -672,6 +840,14 @@ static bool cq_begin_op_for_callback(grpc_completion_queue* cq, void* /*tag*/) {
672
840
  return cqd->pending_events.IncrementIfNonzero();
673
841
  }
674
842
 
843
+ static bool cq_begin_op_for_callback_alternative(grpc_completion_queue* cq,
844
+ void* tag) {
845
+ cq_callback_alternative_data* cqd =
846
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
847
+ return grpc_cq_begin_op(cqd->implementation, tag) &&
848
+ cqd->pending_events.IncrementIfNonzero();
849
+ }
850
+
675
851
  bool grpc_cq_begin_op(grpc_completion_queue* cq, void* tag) {
676
852
  #ifndef NDEBUG
677
853
  gpr_mu_lock(cq->mu);
@@ -835,7 +1011,7 @@ static void cq_end_op_for_pluck(
835
1011
  GRPC_ERROR_UNREF(error);
836
1012
  }
837
1013
 
838
- static void functor_callback(void* arg, grpc_error* error) {
1014
+ void functor_callback(void* arg, grpc_error* error) {
839
1015
  auto* functor = static_cast<grpc_experimental_completion_queue_functor*>(arg);
840
1016
  functor->functor_run(functor, error == GRPC_ERROR_NONE);
841
1017
  }
@@ -869,13 +1045,19 @@ static void cq_end_op_for_callback(
869
1045
 
870
1046
  cq_check_tag(cq, tag, true); /* Used in debug builds only */
871
1047
 
872
- cqd->things_queued_ever.FetchAdd(1, grpc_core::MemoryOrder::RELAXED);
873
1048
  if (cqd->pending_events.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
874
1049
  cq_finish_shutdown_callback(cq);
875
1050
  }
876
1051
 
1052
+ // If possible, schedule the callback onto an existing thread-local
1053
+ // ApplicationCallbackExecCtx, which is a work queue. This is possible for:
1054
+ // 1. The callback is internally-generated and there is an ACEC available
1055
+ // 2. The callback is marked inlineable and there is an ACEC available
1056
+ // 3. We are already running in a background poller thread (which always has
1057
+ // an ACEC available at the base of the stack).
877
1058
  auto* functor = static_cast<grpc_experimental_completion_queue_functor*>(tag);
878
- if (internal || functor->inlineable ||
1059
+ if (((internal || functor->inlineable) &&
1060
+ grpc_core::ApplicationCallbackExecCtx::Available()) ||
879
1061
  grpc_iomgr_is_any_background_poller_thread()) {
880
1062
  grpc_core::ApplicationCallbackExecCtx::Enqueue(functor,
881
1063
  (error == GRPC_ERROR_NONE));
@@ -889,6 +1071,40 @@ static void cq_end_op_for_callback(
889
1071
  GRPC_CLOSURE_CREATE(functor_callback, functor, nullptr), error);
890
1072
  }
891
1073
 
1074
+ static void cq_end_op_for_callback_alternative(
1075
+ grpc_completion_queue* cq, void* tag, grpc_error* error,
1076
+ void (*done)(void* done_arg, grpc_cq_completion* storage), void* done_arg,
1077
+ grpc_cq_completion* storage, bool internal) {
1078
+ GPR_TIMER_SCOPE("cq_end_op_for_callback_alternative", 0);
1079
+
1080
+ cq_callback_alternative_data* cqd =
1081
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
1082
+
1083
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_api_trace) ||
1084
+ (GRPC_TRACE_FLAG_ENABLED(grpc_trace_operation_failures) &&
1085
+ error != GRPC_ERROR_NONE)) {
1086
+ const char* errmsg = grpc_error_string(error);
1087
+ GRPC_API_TRACE(
1088
+ "cq_end_op_for_callback_alternative(cq=%p, tag=%p, error=%s, "
1089
+ "done=%p, done_arg=%p, storage=%p)",
1090
+ 6, (cq, tag, errmsg, done, done_arg, storage));
1091
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_operation_failures) &&
1092
+ error != GRPC_ERROR_NONE) {
1093
+ gpr_log(GPR_ERROR, "Operation failed: tag=%p, error=%s", tag, errmsg);
1094
+ }
1095
+ }
1096
+
1097
+ // Pass through the actual work to the internal nextable CQ
1098
+ grpc_cq_end_op(cqd->implementation, tag, error, done, done_arg, storage,
1099
+ internal);
1100
+
1101
+ cq_check_tag(cq, tag, true); /* Used in debug builds only */
1102
+
1103
+ if (cqd->pending_events.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
1104
+ cq_finish_shutdown_callback_alternative(cq);
1105
+ }
1106
+ }
1107
+
892
1108
  void grpc_cq_end_op(grpc_completion_queue* cq, void* tag, grpc_error* error,
893
1109
  void (*done)(void* done_arg, grpc_cq_completion* storage),
894
1110
  void* done_arg, grpc_cq_completion* storage,
@@ -896,15 +1112,21 @@ void grpc_cq_end_op(grpc_completion_queue* cq, void* tag, grpc_error* error,
896
1112
  cq->vtable->end_op(cq, tag, error, done, done_arg, storage, internal);
897
1113
  }
898
1114
 
899
- typedef struct {
1115
+ static grpc_pollset* cq_proxy_pollset_for_callback_alternative(
1116
+ grpc_completion_queue* cq) {
1117
+ cq_callback_alternative_data* cqd =
1118
+ static_cast<cq_callback_alternative_data*>(DATA_FROM_CQ(cq));
1119
+ return POLLSET_FROM_CQ(cqd->implementation);
1120
+ }
1121
+
1122
+ struct cq_is_finished_arg {
900
1123
  gpr_atm last_seen_things_queued_ever;
901
1124
  grpc_completion_queue* cq;
902
1125
  grpc_millis deadline;
903
1126
  grpc_cq_completion* stolen_completion;
904
1127
  void* tag; /* for pluck */
905
1128
  bool first_loop;
906
- } cq_is_finished_arg;
907
-
1129
+ };
908
1130
  class ExecCtxNext : public grpc_core::ExecCtx {
909
1131
  public:
910
1132
  ExecCtxNext(void* arg) : ExecCtx(0), check_ready_to_finish_arg_(arg) {}
@@ -944,21 +1166,14 @@ class ExecCtxNext : public grpc_core::ExecCtx {
944
1166
  #ifndef NDEBUG
945
1167
  static void dump_pending_tags(grpc_completion_queue* cq) {
946
1168
  if (!GRPC_TRACE_FLAG_ENABLED(grpc_trace_pending_tags)) return;
947
-
948
- gpr_strvec v;
949
- gpr_strvec_init(&v);
950
- gpr_strvec_add(&v, gpr_strdup("PENDING TAGS:"));
1169
+ std::vector<std::string> parts;
1170
+ parts.push_back("PENDING TAGS:");
951
1171
  gpr_mu_lock(cq->mu);
952
1172
  for (size_t i = 0; i < cq->outstanding_tag_count; i++) {
953
- char* s;
954
- gpr_asprintf(&s, " %p", cq->outstanding_tags[i]);
955
- gpr_strvec_add(&v, s);
1173
+ parts.push_back(absl::StrFormat(" %p", cq->outstanding_tags[i]));
956
1174
  }
957
1175
  gpr_mu_unlock(cq->mu);
958
- char* out = gpr_strvec_flatten(&v, nullptr);
959
- gpr_strvec_destroy(&v);
960
- gpr_log(GPR_DEBUG, "%s", out);
961
- gpr_free(out);
1176
+ gpr_log(GPR_DEBUG, "%s", absl::StrJoin(parts, "").c_str());
962
1177
  }
963
1178
  #else
964
1179
  static void dump_pending_tags(grpc_completion_queue* /*cq*/) {}
@@ -1384,6 +1599,21 @@ static void cq_finish_shutdown_callback(grpc_completion_queue* cq) {
1384
1599
  GRPC_ERROR_NONE);
1385
1600
  }
1386
1601
 
1602
+ static void cq_finish_shutdown_callback_alternative(grpc_completion_queue* cq) {
1603
+ cq_callback_alternative_data* cqd =
1604
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
1605
+ auto* callback = cqd->shutdown_callback;
1606
+
1607
+ GPR_ASSERT(cqd->shutdown_called);
1608
+
1609
+ // Shutdown the non-proxy pollset
1610
+ cq->poller_vtable->shutdown(INLINE_POLLSET_FROM_CQ(cq),
1611
+ &cq->pollset_shutdown_done);
1612
+ grpc_core::Executor::Run(
1613
+ GRPC_CLOSURE_CREATE(functor_callback, callback, nullptr),
1614
+ GRPC_ERROR_NONE);
1615
+ }
1616
+
1387
1617
  static void cq_shutdown_callback(grpc_completion_queue* cq) {
1388
1618
  cq_callback_data* cqd = static_cast<cq_callback_data*> DATA_FROM_CQ(cq);
1389
1619
 
@@ -1410,6 +1640,33 @@ static void cq_shutdown_callback(grpc_completion_queue* cq) {
1410
1640
  GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (callback cq)");
1411
1641
  }
1412
1642
 
1643
+ static void cq_shutdown_callback_alternative(grpc_completion_queue* cq) {
1644
+ cq_callback_alternative_data* cqd =
1645
+ static_cast<cq_callback_alternative_data*> DATA_FROM_CQ(cq);
1646
+
1647
+ /* Need an extra ref for cq here because:
1648
+ * We call cq_finish_shutdown_callback() below, which calls pollset shutdown.
1649
+ * Pollset shutdown decrements the cq ref count which can potentially destroy
1650
+ * the cq (if that happens to be the last ref).
1651
+ * Creating an extra ref here prevents the cq from getting destroyed while
1652
+ * this function is still active */
1653
+ GRPC_CQ_INTERNAL_REF(cq, "shutting_down (callback cq)");
1654
+ gpr_mu_lock(cq->mu);
1655
+ if (cqd->shutdown_called) {
1656
+ gpr_mu_unlock(cq->mu);
1657
+ GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (callback cq)");
1658
+ return;
1659
+ }
1660
+ cqd->shutdown_called = true;
1661
+ if (cqd->pending_events.FetchSub(1, grpc_core::MemoryOrder::ACQ_REL) == 1) {
1662
+ gpr_mu_unlock(cq->mu);
1663
+ cq_finish_shutdown_callback_alternative(cq);
1664
+ } else {
1665
+ gpr_mu_unlock(cq->mu);
1666
+ }
1667
+ GRPC_CQ_INTERNAL_UNREF(cq, "shutting_down (callback cq)");
1668
+ }
1669
+
1413
1670
  /* Shutdown simply drops a ref that we reserved at creation time; if we drop
1414
1671
  to zero here, then enter shutdown mode and wake up any waiters */
1415
1672
  void grpc_completion_queue_shutdown(grpc_completion_queue* cq) {