grpc 1.24.0 → 1.25.0

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

Potentially problematic release.


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

Files changed (505) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +306 -243
  3. data/etc/roots.pem +0 -100
  4. data/include/grpc/grpc_security.h +44 -18
  5. data/include/grpc/impl/codegen/grpc_types.h +15 -0
  6. data/include/grpc/impl/codegen/port_platform.h +27 -11
  7. data/include/grpc/impl/codegen/sync_generic.h +1 -1
  8. data/src/boringssl/err_data.c +695 -650
  9. data/src/core/ext/filters/client_channel/client_channel.cc +257 -179
  10. data/src/core/ext/filters/client_channel/client_channel.h +24 -0
  11. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -3
  12. data/src/core/ext/filters/client_channel/client_channel_factory.h +1 -5
  13. data/src/core/ext/filters/client_channel/health/health_check_client.cc +18 -45
  14. data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -13
  15. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -3
  17. data/src/core/ext/filters/client_channel/lb_policy.h +65 -55
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -14
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +113 -36
  20. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +14 -19
  21. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +36 -13
  22. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +3 -10
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +814 -1589
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +2 -5
  25. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -6
  26. data/src/core/ext/filters/client_channel/resolver.cc +1 -2
  27. data/src/core/ext/filters/client_channel/resolver.h +8 -16
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +25 -8
  29. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +46 -12
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +10 -17
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +7 -8
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +111 -44
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +22 -14
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  37. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +29 -10
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +27 -36
  39. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +7 -10
  40. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +60 -16
  41. data/src/core/ext/filters/client_channel/resolver_factory.h +4 -8
  42. data/src/core/ext/filters/client_channel/resolver_registry.cc +1 -1
  43. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -10
  45. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +1 -1
  47. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -5
  48. data/src/core/ext/filters/client_channel/retry_throttle.h +1 -4
  49. data/src/core/ext/filters/client_channel/service_config.h +8 -8
  50. data/src/core/ext/filters/client_channel/subchannel.cc +53 -86
  51. data/src/core/ext/filters/client_channel/subchannel.h +7 -9
  52. data/src/core/ext/filters/client_channel/subchannel_interface.h +9 -13
  53. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -6
  54. data/src/core/ext/filters/client_channel/{lb_policy/xds/xds_load_balancer_api.cc → xds/xds_api.cc} +169 -52
  55. data/src/core/ext/filters/client_channel/xds/xds_api.h +171 -0
  56. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +450 -0
  57. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +99 -0
  58. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel.h +8 -6
  59. data/src/core/ext/filters/client_channel/xds/xds_channel_args.h +26 -0
  60. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel_secure.cc +28 -11
  61. data/src/core/ext/filters/client_channel/xds/xds_client.cc +1413 -0
  62. data/src/core/ext/filters/client_channel/xds/xds_client.h +221 -0
  63. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.cc +1 -5
  64. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.h +3 -4
  65. data/src/core/ext/filters/deadline/deadline_filter.cc +20 -20
  66. data/src/core/ext/filters/http/client/http_client_filter.cc +15 -15
  67. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  68. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +12 -12
  69. data/src/core/ext/filters/max_age/max_age_filter.cc +59 -50
  70. data/src/core/ext/filters/message_size/message_size_filter.cc +18 -18
  71. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +15 -14
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +233 -175
  73. data/src/core/ext/transport/chttp2/transport/flow_control.h +21 -24
  74. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +253 -163
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +24 -12
  76. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -3
  77. data/src/core/ext/transport/chttp2/transport/internal.h +13 -15
  78. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -0
  79. data/src/core/ext/transport/inproc/inproc_transport.cc +20 -13
  80. data/src/core/lib/channel/channel_args.cc +16 -0
  81. data/src/core/lib/channel/channel_args.h +22 -0
  82. data/src/core/lib/channel/channelz.cc +5 -6
  83. data/src/core/lib/channel/channelz.h +1 -1
  84. data/src/core/lib/channel/connected_channel.cc +20 -20
  85. data/src/core/lib/channel/handshaker.h +3 -4
  86. data/src/core/lib/channel/handshaker_factory.h +1 -3
  87. data/src/core/lib/debug/trace.h +3 -2
  88. data/src/core/lib/gprpp/arena.cc +3 -3
  89. data/src/core/lib/gprpp/arena.h +2 -3
  90. data/src/core/lib/gprpp/inlined_vector.h +9 -0
  91. data/src/core/lib/gprpp/map.h +3 -501
  92. data/src/core/lib/gprpp/memory.h +45 -41
  93. data/src/core/lib/gprpp/mpscq.cc +108 -0
  94. data/src/core/lib/gprpp/mpscq.h +98 -0
  95. data/src/core/lib/gprpp/orphanable.h +6 -11
  96. data/src/core/lib/gprpp/ref_counted.h +25 -19
  97. data/src/core/lib/gprpp/set.h +33 -0
  98. data/src/core/lib/gprpp/thd.h +2 -4
  99. data/src/core/lib/http/httpcli.cc +1 -1
  100. data/src/core/lib/http/httpcli_security_connector.cc +15 -11
  101. data/src/core/lib/http/parser.cc +1 -1
  102. data/src/core/lib/iomgr/buffer_list.cc +4 -5
  103. data/src/core/lib/iomgr/buffer_list.h +5 -6
  104. data/src/core/lib/iomgr/call_combiner.cc +4 -5
  105. data/src/core/lib/iomgr/call_combiner.h +2 -2
  106. data/src/core/lib/iomgr/cfstream_handle.h +3 -5
  107. data/src/core/lib/iomgr/closure.h +8 -3
  108. data/src/core/lib/iomgr/combiner.cc +45 -82
  109. data/src/core/lib/iomgr/combiner.h +32 -8
  110. data/src/core/lib/iomgr/endpoint_cfstream.cc +5 -3
  111. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -15
  112. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -1
  113. data/src/core/lib/iomgr/exec_ctx.h +4 -3
  114. data/src/core/lib/iomgr/executor.cc +4 -2
  115. data/src/core/lib/iomgr/executor.h +3 -0
  116. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -6
  117. data/src/core/lib/iomgr/executor/threadpool.cc +1 -2
  118. data/src/core/lib/iomgr/executor/threadpool.h +7 -11
  119. data/src/core/lib/iomgr/resource_quota.cc +55 -51
  120. data/src/core/lib/iomgr/resource_quota.h +13 -9
  121. data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -0
  122. data/src/core/lib/iomgr/socket_utils_posix.h +4 -0
  123. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -11
  124. data/src/core/lib/iomgr/tcp_custom.cc +9 -7
  125. data/src/core/lib/iomgr/tcp_posix.cc +20 -16
  126. data/src/core/lib/iomgr/tcp_server.h +1 -4
  127. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  128. data/src/core/lib/iomgr/tcp_server_posix.cc +1 -1
  129. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -11
  130. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  131. data/src/core/lib/iomgr/udp_server.cc +3 -2
  132. data/src/core/lib/iomgr/udp_server.h +6 -12
  133. data/src/core/lib/json/json.h +1 -1
  134. data/src/core/lib/json/json_string.cc +2 -2
  135. data/src/core/lib/profiling/basic_timers.cc +2 -2
  136. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -2
  137. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
  138. data/src/core/lib/security/credentials/credentials.h +4 -20
  139. data/src/core/lib/security/credentials/fake/fake_credentials.cc +4 -4
  140. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -3
  141. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +64 -0
  142. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +4 -4
  143. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -7
  144. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -0
  145. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
  146. data/src/core/lib/security/security_connector/security_connector.cc +1 -0
  147. data/src/core/lib/security/security_connector/security_connector.h +19 -17
  148. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +8 -5
  149. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  150. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  151. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +14 -6
  152. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -2
  153. data/src/core/lib/security/transport/client_auth_filter.cc +17 -17
  154. data/src/core/lib/security/transport/security_handshaker.cc +29 -13
  155. data/src/core/lib/security/transport/security_handshaker.h +4 -2
  156. data/src/core/lib/security/transport/server_auth_filter.cc +14 -14
  157. data/src/core/lib/slice/slice.cc +2 -10
  158. data/src/core/lib/slice/slice_hash_table.h +4 -6
  159. data/src/core/lib/slice/slice_intern.cc +42 -39
  160. data/src/core/lib/slice/slice_internal.h +3 -3
  161. data/src/core/lib/slice/slice_utils.h +21 -4
  162. data/src/core/lib/slice/slice_weak_hash_table.h +4 -6
  163. data/src/core/lib/surface/call.cc +3 -3
  164. data/src/core/lib/surface/channel.cc +7 -0
  165. data/src/core/lib/surface/completion_queue.cc +12 -11
  166. data/src/core/lib/surface/completion_queue.h +4 -2
  167. data/src/core/lib/surface/init.cc +1 -0
  168. data/src/core/lib/surface/lame_client.cc +33 -18
  169. data/src/core/lib/surface/server.cc +77 -76
  170. data/src/core/lib/surface/version.cc +1 -1
  171. data/src/core/lib/transport/byte_stream.h +3 -7
  172. data/src/core/lib/transport/connectivity_state.cc +112 -98
  173. data/src/core/lib/transport/connectivity_state.h +100 -50
  174. data/src/core/lib/transport/static_metadata.cc +276 -288
  175. data/src/core/lib/transport/static_metadata.h +73 -76
  176. data/src/core/lib/transport/status_conversion.cc +1 -1
  177. data/src/core/lib/transport/status_metadata.cc +1 -1
  178. data/src/core/lib/transport/transport.cc +2 -2
  179. data/src/core/lib/transport/transport.h +12 -4
  180. data/src/core/lib/transport/transport_op_string.cc +14 -11
  181. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
  182. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
  183. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +5 -5
  184. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
  185. data/src/core/tsi/fake_transport_security.cc +7 -5
  186. data/src/core/tsi/grpc_shadow_boringssl.h +2918 -2627
  187. data/src/core/tsi/local_transport_security.cc +8 -6
  188. data/src/core/tsi/ssl/session_cache/ssl_session.h +1 -3
  189. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -2
  190. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +7 -5
  191. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -6
  192. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -2
  193. data/src/core/tsi/ssl_transport_security.cc +12 -12
  194. data/src/core/tsi/ssl_transport_security.h +2 -2
  195. data/src/core/tsi/transport_security_grpc.cc +7 -0
  196. data/src/core/tsi/transport_security_grpc.h +6 -0
  197. data/src/ruby/ext/grpc/extconf.rb +1 -0
  198. data/src/ruby/ext/grpc/rb_call.c +1 -1
  199. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  200. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  201. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  202. data/src/ruby/lib/grpc/version.rb +1 -1
  203. data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
  204. data/third_party/boringssl/crypto/asn1/a_bool.c +18 -5
  205. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +17 -221
  206. data/third_party/boringssl/crypto/asn1/a_dup.c +0 -24
  207. data/third_party/boringssl/crypto/asn1/a_enum.c +2 -2
  208. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +10 -72
  209. data/third_party/boringssl/crypto/asn1/a_int.c +12 -71
  210. data/third_party/boringssl/crypto/asn1/a_mbstr.c +110 -216
  211. data/third_party/boringssl/crypto/asn1/a_object.c +16 -5
  212. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  213. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -1
  214. data/third_party/boringssl/crypto/asn1/tasn_enc.c +3 -1
  215. data/third_party/boringssl/crypto/base64/base64.c +2 -2
  216. data/third_party/boringssl/crypto/bio/bio.c +73 -9
  217. data/third_party/boringssl/crypto/bio/connect.c +4 -0
  218. data/third_party/boringssl/crypto/bio/fd.c +4 -0
  219. data/third_party/boringssl/crypto/bio/file.c +5 -2
  220. data/third_party/boringssl/crypto/bio/socket.c +4 -0
  221. data/third_party/boringssl/crypto/bio/socket_helper.c +4 -0
  222. data/third_party/boringssl/crypto/bn_extra/convert.c +11 -7
  223. data/third_party/boringssl/crypto/bytestring/ber.c +8 -4
  224. data/third_party/boringssl/crypto/bytestring/cbb.c +19 -7
  225. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -15
  226. data/third_party/boringssl/crypto/bytestring/internal.h +28 -7
  227. data/third_party/boringssl/crypto/bytestring/unicode.c +155 -0
  228. data/third_party/boringssl/crypto/chacha/chacha.c +36 -19
  229. data/third_party/boringssl/crypto/chacha/internal.h +45 -0
  230. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +29 -0
  231. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +269 -25
  232. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +16 -14
  233. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +54 -38
  234. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +133 -41
  235. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +23 -15
  236. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +24 -15
  237. data/third_party/boringssl/crypto/cmac/cmac.c +62 -25
  238. data/third_party/boringssl/crypto/conf/conf.c +7 -0
  239. data/third_party/boringssl/crypto/cpu-arm-linux.c +4 -148
  240. data/third_party/boringssl/crypto/cpu-arm-linux.h +201 -0
  241. data/third_party/boringssl/crypto/cpu-intel.c +45 -51
  242. data/third_party/boringssl/crypto/crypto.c +39 -22
  243. data/third_party/boringssl/crypto/curve25519/spake25519.c +1 -1
  244. data/third_party/boringssl/crypto/dsa/dsa.c +77 -53
  245. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +20 -8
  246. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +96 -0
  247. data/third_party/boringssl/crypto/{ecdh/ecdh.c → ecdh_extra/ecdh_extra.c} +20 -58
  248. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +1 -9
  249. data/third_party/boringssl/crypto/engine/engine.c +2 -1
  250. data/third_party/boringssl/crypto/err/err.c +2 -0
  251. data/third_party/boringssl/crypto/err/internal.h +2 -2
  252. data/third_party/boringssl/crypto/evp/evp.c +89 -8
  253. data/third_party/boringssl/crypto/evp/evp_asn1.c +56 -5
  254. data/third_party/boringssl/crypto/evp/evp_ctx.c +52 -14
  255. data/third_party/boringssl/crypto/evp/internal.h +18 -1
  256. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +5 -0
  257. data/third_party/boringssl/crypto/evp/p_ec.c +51 -3
  258. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +6 -7
  259. data/third_party/boringssl/crypto/evp/p_ed25519.c +36 -3
  260. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +76 -45
  261. data/third_party/boringssl/crypto/evp/p_rsa.c +3 -1
  262. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +5 -0
  263. data/third_party/boringssl/crypto/evp/p_x25519.c +110 -0
  264. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +249 -0
  265. data/third_party/boringssl/crypto/evp/scrypt.c +6 -2
  266. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +34 -274
  267. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +161 -21
  268. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +111 -13
  269. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +17 -21
  270. data/third_party/boringssl/crypto/fipsmodule/bcm.c +119 -7
  271. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +19 -2
  272. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +2 -2
  273. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +93 -160
  274. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +48 -57
  275. data/third_party/boringssl/crypto/fipsmodule/bn/div_extra.c +87 -0
  276. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +143 -211
  277. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -305
  278. data/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.c +325 -0
  279. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +168 -50
  280. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +68 -92
  281. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +7 -6
  282. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +11 -14
  283. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +358 -443
  284. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +25 -35
  285. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +20 -25
  286. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +76 -5
  287. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +14 -14
  288. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +7 -2
  289. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +383 -516
  290. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +4 -0
  291. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +3 -4
  292. data/third_party/boringssl/crypto/fipsmodule/delocate.h +3 -2
  293. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +32 -17
  294. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +3 -3
  295. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +228 -122
  296. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +34 -8
  297. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +311 -98
  298. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +82 -0
  299. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +263 -97
  300. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +22 -59
  301. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +317 -234
  302. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9473 -9475
  303. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +313 -109
  304. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +36 -0
  305. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +96 -0
  306. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +126 -792
  307. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +84 -0
  308. data/third_party/boringssl/crypto/fipsmodule/ec/util.c +163 -12
  309. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +84 -211
  310. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  311. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +60 -205
  312. data/third_party/boringssl/crypto/fipsmodule/fips_shared_support.c +32 -0
  313. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +2 -0
  314. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +3 -1
  315. data/third_party/boringssl/crypto/fipsmodule/md5/internal.h +37 -0
  316. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +11 -8
  317. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +35 -79
  318. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +7 -39
  319. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +7 -27
  320. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +123 -309
  321. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +189 -126
  322. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +3 -2
  323. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +2 -2
  324. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +35 -0
  325. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +24 -19
  326. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +256 -77
  327. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +10 -7
  328. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +5 -1
  329. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +131 -14
  330. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +83 -10
  331. data/third_party/boringssl/crypto/fipsmodule/sha/internal.h +53 -0
  332. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +9 -13
  333. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +18 -12
  334. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +95 -168
  335. data/third_party/boringssl/crypto/hrss/hrss.c +2201 -0
  336. data/third_party/boringssl/crypto/hrss/internal.h +62 -0
  337. data/third_party/boringssl/crypto/internal.h +95 -20
  338. data/third_party/boringssl/crypto/lhash/lhash.c +45 -33
  339. data/third_party/boringssl/crypto/mem.c +39 -2
  340. data/third_party/boringssl/crypto/obj/obj.c +4 -4
  341. data/third_party/boringssl/crypto/obj/obj_dat.h +6181 -875
  342. data/third_party/boringssl/crypto/pem/pem_all.c +2 -3
  343. data/third_party/boringssl/crypto/pem/pem_info.c +144 -162
  344. data/third_party/boringssl/crypto/pem/pem_lib.c +53 -52
  345. data/third_party/boringssl/crypto/pem/pem_pkey.c +13 -21
  346. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +15 -22
  347. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +168 -16
  348. data/third_party/boringssl/crypto/pkcs8/internal.h +11 -0
  349. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +24 -15
  350. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +42 -25
  351. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +559 -43
  352. data/third_party/boringssl/crypto/pool/internal.h +1 -1
  353. data/third_party/boringssl/crypto/pool/pool.c +21 -0
  354. data/third_party/boringssl/crypto/rand_extra/deterministic.c +8 -0
  355. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +1 -14
  356. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  357. data/third_party/boringssl/crypto/rsa_extra/rsa_print.c +22 -0
  358. data/third_party/boringssl/crypto/siphash/siphash.c +80 -0
  359. data/third_party/boringssl/crypto/stack/stack.c +83 -32
  360. data/third_party/boringssl/crypto/thread_none.c +2 -2
  361. data/third_party/boringssl/crypto/thread_pthread.c +2 -2
  362. data/third_party/boringssl/crypto/thread_win.c +38 -19
  363. data/third_party/boringssl/crypto/x509/a_strex.c +22 -2
  364. data/third_party/boringssl/crypto/x509/asn1_gen.c +2 -1
  365. data/third_party/boringssl/crypto/x509/by_dir.c +7 -0
  366. data/third_party/boringssl/crypto/x509/by_file.c +12 -10
  367. data/third_party/boringssl/crypto/x509/t_crl.c +5 -8
  368. data/third_party/boringssl/crypto/x509/t_req.c +1 -3
  369. data/third_party/boringssl/crypto/x509/t_x509.c +5 -8
  370. data/third_party/boringssl/crypto/x509/x509_cmp.c +1 -1
  371. data/third_party/boringssl/crypto/x509/x509_def.c +1 -1
  372. data/third_party/boringssl/crypto/x509/x509_lu.c +114 -5
  373. data/third_party/boringssl/crypto/x509/x509_req.c +20 -0
  374. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  375. data/third_party/boringssl/crypto/x509/x509_trs.c +1 -0
  376. data/third_party/boringssl/crypto/x509/x509_txt.c +4 -5
  377. data/third_party/boringssl/crypto/x509/x509_vfy.c +145 -138
  378. data/third_party/boringssl/crypto/x509/x509_vpm.c +2 -0
  379. data/third_party/boringssl/crypto/x509/x509cset.c +40 -0
  380. data/third_party/boringssl/crypto/x509/x509name.c +2 -3
  381. data/third_party/boringssl/crypto/x509/x_all.c +109 -210
  382. data/third_party/boringssl/crypto/x509/x_x509.c +6 -0
  383. data/third_party/boringssl/crypto/x509v3/ext_dat.h +1 -3
  384. data/third_party/boringssl/crypto/x509v3/internal.h +56 -0
  385. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -0
  386. data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -0
  387. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +4 -2
  388. data/third_party/boringssl/crypto/x509v3/v3_akey.c +5 -2
  389. data/third_party/boringssl/crypto/x509v3/v3_alt.c +19 -13
  390. data/third_party/boringssl/crypto/x509v3/v3_conf.c +2 -1
  391. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +3 -2
  392. data/third_party/boringssl/crypto/x509v3/v3_genn.c +1 -6
  393. data/third_party/boringssl/crypto/x509v3/v3_lib.c +1 -0
  394. data/third_party/boringssl/crypto/x509v3/v3_ocsp.c +68 -0
  395. data/third_party/boringssl/crypto/x509v3/v3_pci.c +2 -1
  396. data/third_party/boringssl/crypto/x509v3/v3_purp.c +47 -69
  397. data/third_party/boringssl/crypto/x509v3/v3_skey.c +5 -2
  398. data/third_party/boringssl/crypto/x509v3/v3_utl.c +69 -25
  399. data/third_party/boringssl/include/openssl/aead.h +45 -19
  400. data/third_party/boringssl/include/openssl/aes.h +32 -7
  401. data/third_party/boringssl/include/openssl/asn1.h +7 -77
  402. data/third_party/boringssl/include/openssl/base.h +120 -6
  403. data/third_party/boringssl/include/openssl/base64.h +4 -1
  404. data/third_party/boringssl/include/openssl/bio.h +112 -81
  405. data/third_party/boringssl/include/openssl/blowfish.h +3 -3
  406. data/third_party/boringssl/include/openssl/bn.h +55 -29
  407. data/third_party/boringssl/include/openssl/buf.h +2 -2
  408. data/third_party/boringssl/include/openssl/bytestring.h +54 -32
  409. data/third_party/boringssl/include/openssl/cast.h +2 -2
  410. data/third_party/boringssl/include/openssl/cipher.h +46 -16
  411. data/third_party/boringssl/include/openssl/cmac.h +6 -2
  412. data/third_party/boringssl/include/openssl/conf.h +3 -6
  413. data/third_party/boringssl/include/openssl/cpu.h +25 -9
  414. data/third_party/boringssl/include/openssl/crypto.h +32 -10
  415. data/third_party/boringssl/include/openssl/curve25519.h +4 -4
  416. data/third_party/boringssl/include/openssl/dh.h +3 -2
  417. data/third_party/boringssl/include/openssl/digest.h +21 -7
  418. data/third_party/boringssl/include/openssl/dsa.h +8 -2
  419. data/third_party/boringssl/include/openssl/e_os2.h +18 -0
  420. data/third_party/boringssl/include/openssl/ec.h +25 -21
  421. data/third_party/boringssl/include/openssl/ec_key.h +36 -8
  422. data/third_party/boringssl/include/openssl/ecdh.h +17 -0
  423. data/third_party/boringssl/include/openssl/ecdsa.h +3 -3
  424. data/third_party/boringssl/include/openssl/engine.h +4 -4
  425. data/third_party/boringssl/include/openssl/err.h +3 -0
  426. data/third_party/boringssl/include/openssl/evp.h +199 -42
  427. data/third_party/boringssl/include/openssl/hmac.h +4 -4
  428. data/third_party/boringssl/include/openssl/hrss.h +100 -0
  429. data/third_party/boringssl/include/openssl/lhash.h +131 -23
  430. data/third_party/boringssl/include/openssl/md4.h +6 -4
  431. data/third_party/boringssl/include/openssl/md5.h +6 -4
  432. data/third_party/boringssl/include/openssl/mem.h +6 -2
  433. data/third_party/boringssl/include/openssl/nid.h +3 -0
  434. data/third_party/boringssl/include/openssl/obj.h +3 -0
  435. data/third_party/boringssl/include/openssl/pem.h +102 -64
  436. data/third_party/boringssl/include/openssl/pkcs7.h +136 -3
  437. data/third_party/boringssl/include/openssl/pkcs8.h +42 -3
  438. data/third_party/boringssl/include/openssl/pool.h +13 -2
  439. data/third_party/boringssl/include/openssl/ripemd.h +5 -4
  440. data/third_party/boringssl/include/openssl/rsa.h +46 -15
  441. data/third_party/boringssl/include/openssl/sha.h +40 -28
  442. data/third_party/boringssl/include/openssl/siphash.h +37 -0
  443. data/third_party/boringssl/include/openssl/span.h +17 -9
  444. data/third_party/boringssl/include/openssl/ssl.h +766 -393
  445. data/third_party/boringssl/include/openssl/ssl3.h +4 -3
  446. data/third_party/boringssl/include/openssl/stack.h +134 -77
  447. data/third_party/boringssl/include/openssl/thread.h +1 -1
  448. data/third_party/boringssl/include/openssl/tls1.h +25 -9
  449. data/third_party/boringssl/include/openssl/type_check.h +14 -15
  450. data/third_party/boringssl/include/openssl/x509.h +28 -3
  451. data/third_party/boringssl/include/openssl/x509_vfy.h +98 -32
  452. data/third_party/boringssl/include/openssl/x509v3.h +17 -13
  453. data/third_party/boringssl/ssl/d1_both.cc +9 -18
  454. data/third_party/boringssl/ssl/d1_lib.cc +4 -3
  455. data/third_party/boringssl/ssl/d1_pkt.cc +4 -4
  456. data/third_party/boringssl/ssl/d1_srtp.cc +15 -15
  457. data/third_party/boringssl/ssl/dtls_method.cc +0 -1
  458. data/third_party/boringssl/ssl/dtls_record.cc +28 -28
  459. data/third_party/boringssl/ssl/handoff.cc +295 -91
  460. data/third_party/boringssl/ssl/handshake.cc +133 -72
  461. data/third_party/boringssl/ssl/handshake_client.cc +218 -189
  462. data/third_party/boringssl/ssl/handshake_server.cc +399 -272
  463. data/third_party/boringssl/ssl/internal.h +1413 -928
  464. data/third_party/boringssl/ssl/s3_both.cc +175 -36
  465. data/third_party/boringssl/ssl/s3_lib.cc +9 -13
  466. data/third_party/boringssl/ssl/s3_pkt.cc +63 -29
  467. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +55 -35
  468. data/third_party/boringssl/ssl/ssl_asn1.cc +57 -73
  469. data/third_party/boringssl/ssl/ssl_buffer.cc +13 -12
  470. data/third_party/boringssl/ssl/ssl_cert.cc +313 -210
  471. data/third_party/boringssl/ssl/ssl_cipher.cc +159 -221
  472. data/third_party/boringssl/ssl/ssl_file.cc +2 -0
  473. data/third_party/boringssl/ssl/ssl_key_share.cc +164 -19
  474. data/third_party/boringssl/ssl/ssl_lib.cc +847 -555
  475. data/third_party/boringssl/ssl/ssl_privkey.cc +441 -111
  476. data/third_party/boringssl/ssl/ssl_session.cc +230 -178
  477. data/third_party/boringssl/ssl/ssl_transcript.cc +21 -142
  478. data/third_party/boringssl/ssl/ssl_versions.cc +88 -93
  479. data/third_party/boringssl/ssl/ssl_x509.cc +279 -218
  480. data/third_party/boringssl/ssl/t1_enc.cc +5 -96
  481. data/third_party/boringssl/ssl/t1_lib.cc +931 -678
  482. data/third_party/boringssl/ssl/tls13_both.cc +251 -121
  483. data/third_party/boringssl/ssl/tls13_client.cc +129 -73
  484. data/third_party/boringssl/ssl/tls13_enc.cc +350 -282
  485. data/third_party/boringssl/ssl/tls13_server.cc +259 -192
  486. data/third_party/boringssl/ssl/tls_method.cc +26 -21
  487. data/third_party/boringssl/ssl/tls_record.cc +42 -47
  488. data/third_party/boringssl/third_party/fiat/curve25519.c +261 -1324
  489. data/third_party/boringssl/third_party/fiat/curve25519_32.h +911 -0
  490. data/third_party/boringssl/third_party/fiat/curve25519_64.h +559 -0
  491. data/third_party/boringssl/third_party/fiat/p256.c +238 -999
  492. data/third_party/boringssl/third_party/fiat/p256_32.h +3226 -0
  493. data/third_party/boringssl/third_party/fiat/p256_64.h +1217 -0
  494. data/third_party/upb/upb/port_def.inc +1 -1
  495. data/third_party/upb/upb/table.c +2 -1
  496. metadata +72 -44
  497. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -127
  498. data/src/core/lib/gpr/mpscq.cc +0 -117
  499. data/src/core/lib/gpr/mpscq.h +0 -88
  500. data/src/core/lib/gprpp/abstract.h +0 -47
  501. data/src/core/lib/gprpp/pair.h +0 -38
  502. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
  503. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
  504. data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
  505. data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
@@ -53,6 +53,7 @@
53
53
  #include "src/core/lib/gprpp/inlined_vector.h"
54
54
  #include "src/core/lib/gprpp/manual_constructor.h"
55
55
  #include "src/core/lib/gprpp/map.h"
56
+ #include "src/core/lib/gprpp/set.h"
56
57
  #include "src/core/lib/gprpp/sync.h"
57
58
  #include "src/core/lib/iomgr/combiner.h"
58
59
  #include "src/core/lib/iomgr/iomgr.h"
@@ -152,43 +153,49 @@ class ChannelData {
152
153
  SubchannelInterface* subchannel) const;
153
154
 
154
155
  grpc_connectivity_state CheckConnectivityState(bool try_to_connect);
156
+
155
157
  void AddExternalConnectivityWatcher(grpc_polling_entity pollent,
156
158
  grpc_connectivity_state* state,
157
159
  grpc_closure* on_complete,
158
160
  grpc_closure* watcher_timer_init) {
159
- // Will delete itself.
160
- New<ExternalConnectivityWatcher>(this, pollent, state, on_complete,
161
- watcher_timer_init);
161
+ MutexLock lock(&external_watchers_mu_);
162
+ // Will be deleted when the watch is complete.
163
+ GPR_ASSERT(external_watchers_[on_complete] == nullptr);
164
+ external_watchers_[on_complete] = New<ExternalConnectivityWatcher>(
165
+ this, pollent, state, on_complete, watcher_timer_init);
166
+ }
167
+
168
+ void RemoveExternalConnectivityWatcher(grpc_closure* on_complete,
169
+ bool cancel) {
170
+ MutexLock lock(&external_watchers_mu_);
171
+ auto it = external_watchers_.find(on_complete);
172
+ if (it != external_watchers_.end()) {
173
+ if (cancel) it->second->Cancel();
174
+ external_watchers_.erase(it);
175
+ }
162
176
  }
177
+
163
178
  int NumExternalConnectivityWatchers() const {
164
- return external_connectivity_watcher_list_.size();
179
+ MutexLock lock(&external_watchers_mu_);
180
+ return static_cast<int>(external_watchers_.size());
165
181
  }
166
182
 
183
+ void AddConnectivityWatcher(
184
+ grpc_connectivity_state initial_state,
185
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher);
186
+ void RemoveConnectivityWatcher(
187
+ AsyncConnectivityStateWatcherInterface* watcher);
188
+
167
189
  private:
168
190
  class SubchannelWrapper;
169
191
  class ClientChannelControlHelper;
192
+ class ConnectivityWatcherAdder;
193
+ class ConnectivityWatcherRemover;
170
194
 
171
- class ExternalConnectivityWatcher {
195
+ // Represents a pending connectivity callback from an external caller
196
+ // via grpc_client_channel_watch_connectivity_state().
197
+ class ExternalConnectivityWatcher : public ConnectivityStateWatcherInterface {
172
198
  public:
173
- class WatcherList {
174
- public:
175
- WatcherList() { gpr_mu_init(&mu_); }
176
- ~WatcherList() { gpr_mu_destroy(&mu_); }
177
-
178
- int size() const;
179
- ExternalConnectivityWatcher* Lookup(grpc_closure* on_complete) const;
180
- void Add(ExternalConnectivityWatcher* watcher);
181
- void Remove(const ExternalConnectivityWatcher* watcher);
182
-
183
- private:
184
- // head_ is guarded by a mutex, since the size() method needs to
185
- // iterate over the list, and it's called from the C-core API
186
- // function grpc_channel_num_external_connectivity_watchers(), which
187
- // is synchronous and therefore cannot run in the combiner.
188
- mutable gpr_mu mu_;
189
- ExternalConnectivityWatcher* head_ = nullptr;
190
- };
191
-
192
199
  ExternalConnectivityWatcher(ChannelData* chand, grpc_polling_entity pollent,
193
200
  grpc_connectivity_state* state,
194
201
  grpc_closure* on_complete,
@@ -196,17 +203,23 @@ class ChannelData {
196
203
 
197
204
  ~ExternalConnectivityWatcher();
198
205
 
206
+ void Notify(grpc_connectivity_state state) override;
207
+
208
+ void Cancel();
209
+
199
210
  private:
200
- static void OnWatchCompleteLocked(void* arg, grpc_error* error);
201
- static void WatchConnectivityStateLocked(void* arg, grpc_error* ignored);
211
+ static void AddWatcherLocked(void* arg, grpc_error* ignored);
212
+ static void RemoveWatcherLocked(void* arg, grpc_error* ignored);
202
213
 
203
214
  ChannelData* chand_;
204
215
  grpc_polling_entity pollent_;
216
+ grpc_connectivity_state initial_state_;
205
217
  grpc_connectivity_state* state_;
206
218
  grpc_closure* on_complete_;
207
219
  grpc_closure* watcher_timer_init_;
208
- grpc_closure my_closure_;
209
- ExternalConnectivityWatcher* next_ = nullptr;
220
+ grpc_closure add_closure_;
221
+ grpc_closure remove_closure_;
222
+ Atomic<bool> done_{false};
210
223
  };
211
224
 
212
225
  ChannelData(grpc_channel_element_args* args, grpc_error** error);
@@ -269,12 +282,11 @@ class ChannelData {
269
282
  //
270
283
  // Fields used in the control plane. Guarded by combiner.
271
284
  //
272
- grpc_combiner* combiner_;
285
+ Combiner* combiner_;
273
286
  grpc_pollset_set* interested_parties_;
274
287
  RefCountedPtr<SubchannelPoolInterface> subchannel_pool_;
275
288
  OrphanablePtr<ResolvingLoadBalancingPolicy> resolving_lb_policy_;
276
- grpc_connectivity_state_tracker state_tracker_;
277
- ExternalConnectivityWatcher::WatcherList external_connectivity_watcher_list_;
289
+ ConnectivityStateTracker state_tracker_;
278
290
  UniquePtr<char> health_check_service_name_;
279
291
  RefCountedPtr<ServiceConfig> saved_service_config_;
280
292
  bool received_first_resolver_result_ = false;
@@ -283,9 +295,7 @@ class ChannelData {
283
295
  // The set of SubchannelWrappers that currently exist.
284
296
  // No need to hold a ref, since the map is updated in the control-plane
285
297
  // combiner when the SubchannelWrappers are created and destroyed.
286
- // TODO(roth): We really want to use a set here, not a map. Since we don't
287
- // currently have a set implementation, we use a map and ignore the value.
288
- Map<SubchannelWrapper*, bool> subchannel_wrappers_;
298
+ Set<SubchannelWrapper*> subchannel_wrappers_;
289
299
  // Pending ConnectedSubchannel updates for each SubchannelWrapper.
290
300
  // Updates are queued here in the control plane combiner and then applied
291
301
  // in the data plane mutex when the picker is updated.
@@ -305,6 +315,13 @@ class ChannelData {
305
315
  gpr_mu info_mu_;
306
316
  UniquePtr<char> info_lb_policy_name_;
307
317
  UniquePtr<char> info_service_config_json_;
318
+
319
+ //
320
+ // Fields guarded by a mutex, since they need to be accessed
321
+ // synchronously via grpc_channel_num_external_connectivity_watchers().
322
+ //
323
+ mutable Mutex external_watchers_mu_;
324
+ Map<grpc_closure*, ExternalConnectivityWatcher*> external_watchers_;
308
325
  };
309
326
 
310
327
  //
@@ -357,35 +374,39 @@ class CallData {
357
374
  GRPC_ERROR_NONE);
358
375
  }
359
376
 
360
- Iterator Begin() const override {
361
- static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(Iterator),
377
+ iterator begin() const override {
378
+ static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
362
379
  "iterator size too large");
363
- return reinterpret_cast<Iterator>(batch_->list.head);
380
+ return iterator(this, reinterpret_cast<intptr_t>(batch_->list.head));
364
381
  }
365
- bool IsEnd(Iterator it) const override {
366
- return reinterpret_cast<grpc_linked_mdelem*>(it) == nullptr;
367
- }
368
- void Next(Iterator* it) const override {
369
- *it = reinterpret_cast<Iterator>(
370
- reinterpret_cast<grpc_linked_mdelem*>(*it)->next);
371
- }
372
- StringView Key(Iterator it) const override {
373
- return StringView(
374
- GRPC_MDKEY(reinterpret_cast<grpc_linked_mdelem*>(it)->md));
375
- }
376
- StringView Value(Iterator it) const override {
377
- return StringView(
378
- GRPC_MDVALUE(reinterpret_cast<grpc_linked_mdelem*>(it)->md));
382
+ iterator end() const override {
383
+ static_assert(sizeof(grpc_linked_mdelem*) <= sizeof(intptr_t),
384
+ "iterator size too large");
385
+ return iterator(this, 0);
379
386
  }
380
387
 
381
- void Erase(Iterator* it) override {
388
+ iterator erase(iterator it) override {
382
389
  grpc_linked_mdelem* linked_mdelem =
383
- reinterpret_cast<grpc_linked_mdelem*>(*it);
384
- *it = reinterpret_cast<Iterator>(linked_mdelem->next);
390
+ reinterpret_cast<grpc_linked_mdelem*>(GetIteratorHandle(it));
391
+ intptr_t handle = reinterpret_cast<intptr_t>(linked_mdelem->next);
385
392
  grpc_metadata_batch_remove(batch_, linked_mdelem);
393
+ return iterator(this, handle);
386
394
  }
387
395
 
388
396
  private:
397
+ intptr_t IteratorHandleNext(intptr_t handle) const override {
398
+ grpc_linked_mdelem* linked_mdelem =
399
+ reinterpret_cast<grpc_linked_mdelem*>(handle);
400
+ return reinterpret_cast<intptr_t>(linked_mdelem->next);
401
+ }
402
+ std::pair<StringView, StringView> IteratorHandleGet(
403
+ intptr_t handle) const override {
404
+ grpc_linked_mdelem* linked_mdelem =
405
+ reinterpret_cast<grpc_linked_mdelem*>(handle);
406
+ return std::make_pair(StringView(GRPC_MDKEY(linked_mdelem->md)),
407
+ StringView(GRPC_MDVALUE(linked_mdelem->md)));
408
+ }
409
+
389
410
  CallData* calld_;
390
411
  grpc_metadata_batch* batch_;
391
412
  };
@@ -743,11 +764,9 @@ class CallData {
743
764
  LbCallState lb_call_state_;
744
765
  const LoadBalancingPolicy::BackendMetricData* backend_metric_data_ = nullptr;
745
766
  RefCountedPtr<ConnectedSubchannel> connected_subchannel_;
746
- void (*lb_recv_trailing_metadata_ready_)(
747
- void* user_data, grpc_error* error,
748
- LoadBalancingPolicy::MetadataInterface* recv_trailing_metadata,
749
- LoadBalancingPolicy::CallState* call_state) = nullptr;
750
- void* lb_recv_trailing_metadata_ready_user_data_ = nullptr;
767
+ std::function<void(grpc_error*, LoadBalancingPolicy::MetadataInterface*,
768
+ LoadBalancingPolicy::CallState*)>
769
+ lb_recv_trailing_metadata_ready_;
751
770
  grpc_closure pick_closure_;
752
771
 
753
772
  // For intercepting recv_trailing_metadata_ready for the LB policy.
@@ -842,7 +861,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
842
861
  }
843
862
  ++it->second;
844
863
  }
845
- chand_->subchannel_wrappers_[this] = true;
864
+ chand_->subchannel_wrappers_.insert(this);
846
865
  }
847
866
 
848
867
  ~SubchannelWrapper() {
@@ -994,8 +1013,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
994
1013
  "subchannel %p (connected_subchannel=%p state=%s); "
995
1014
  "hopping into combiner",
996
1015
  parent_->chand_, parent_.get(), parent_->subchannel_,
997
- connected_subchannel.get(),
998
- grpc_connectivity_state_name(new_state));
1016
+ connected_subchannel.get(), ConnectivityStateName(new_state));
999
1017
  }
1000
1018
  // Will delete itself.
1001
1019
  New<Updater>(Ref(), new_state, std::move(connected_subchannel));
@@ -1026,10 +1044,10 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
1026
1044
  : parent_(std::move(parent)),
1027
1045
  state_(new_state),
1028
1046
  connected_subchannel_(std::move(connected_subchannel)) {
1029
- GRPC_CLOSURE_INIT(
1030
- &closure_, ApplyUpdateInControlPlaneCombiner, this,
1031
- grpc_combiner_scheduler(parent_->parent_->chand_->combiner_));
1032
- GRPC_CLOSURE_SCHED(&closure_, GRPC_ERROR_NONE);
1047
+ parent_->parent_->chand_->combiner_->Run(
1048
+ GRPC_CLOSURE_INIT(&closure_, ApplyUpdateInControlPlaneCombiner,
1049
+ this, nullptr),
1050
+ GRPC_ERROR_NONE);
1033
1051
  }
1034
1052
 
1035
1053
  private:
@@ -1044,7 +1062,7 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
1044
1062
  self->parent_->parent_->chand_, self->parent_->parent_.get(),
1045
1063
  self->parent_->parent_->subchannel_,
1046
1064
  self->connected_subchannel_.get(),
1047
- grpc_connectivity_state_name(self->state_),
1065
+ ConnectivityStateName(self->state_),
1048
1066
  self->parent_->watcher_.get());
1049
1067
  }
1050
1068
  // Ignore update if the parent WatcherWrapper has been replaced
@@ -1105,55 +1123,6 @@ class ChannelData::SubchannelWrapper : public SubchannelInterface {
1105
1123
  RefCountedPtr<ConnectedSubchannel> connected_subchannel_in_data_plane_;
1106
1124
  };
1107
1125
 
1108
- //
1109
- // ChannelData::ExternalConnectivityWatcher::WatcherList
1110
- //
1111
-
1112
- int ChannelData::ExternalConnectivityWatcher::WatcherList::size() const {
1113
- MutexLock lock(&mu_);
1114
- int count = 0;
1115
- for (ExternalConnectivityWatcher* w = head_; w != nullptr; w = w->next_) {
1116
- ++count;
1117
- }
1118
- return count;
1119
- }
1120
-
1121
- ChannelData::ExternalConnectivityWatcher*
1122
- ChannelData::ExternalConnectivityWatcher::WatcherList::Lookup(
1123
- grpc_closure* on_complete) const {
1124
- MutexLock lock(&mu_);
1125
- ExternalConnectivityWatcher* w = head_;
1126
- while (w != nullptr && w->on_complete_ != on_complete) {
1127
- w = w->next_;
1128
- }
1129
- return w;
1130
- }
1131
-
1132
- void ChannelData::ExternalConnectivityWatcher::WatcherList::Add(
1133
- ExternalConnectivityWatcher* watcher) {
1134
- GPR_ASSERT(Lookup(watcher->on_complete_) == nullptr);
1135
- MutexLock lock(&mu_);
1136
- GPR_ASSERT(watcher->next_ == nullptr);
1137
- watcher->next_ = head_;
1138
- head_ = watcher;
1139
- }
1140
-
1141
- void ChannelData::ExternalConnectivityWatcher::WatcherList::Remove(
1142
- const ExternalConnectivityWatcher* watcher) {
1143
- MutexLock lock(&mu_);
1144
- if (watcher == head_) {
1145
- head_ = watcher->next_;
1146
- return;
1147
- }
1148
- for (ExternalConnectivityWatcher* w = head_; w != nullptr; w = w->next_) {
1149
- if (w->next_ == watcher) {
1150
- w->next_ = w->next_->next_;
1151
- return;
1152
- }
1153
- }
1154
- GPR_UNREACHABLE_CODE(return );
1155
- }
1156
-
1157
1126
  //
1158
1127
  // ChannelData::ExternalConnectivityWatcher
1159
1128
  //
@@ -1164,15 +1133,15 @@ ChannelData::ExternalConnectivityWatcher::ExternalConnectivityWatcher(
1164
1133
  grpc_closure* watcher_timer_init)
1165
1134
  : chand_(chand),
1166
1135
  pollent_(pollent),
1136
+ initial_state_(*state),
1167
1137
  state_(state),
1168
1138
  on_complete_(on_complete),
1169
1139
  watcher_timer_init_(watcher_timer_init) {
1170
1140
  grpc_polling_entity_add_to_pollset_set(&pollent_,
1171
1141
  chand_->interested_parties_);
1172
1142
  GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ExternalConnectivityWatcher");
1173
- GRPC_CLOSURE_SCHED(
1174
- GRPC_CLOSURE_INIT(&my_closure_, WatchConnectivityStateLocked, this,
1175
- grpc_combiner_scheduler(chand_->combiner_)),
1143
+ chand_->combiner_->Run(
1144
+ GRPC_CLOSURE_INIT(&add_closure_, AddWatcherLocked, this, nullptr),
1176
1145
  GRPC_ERROR_NONE);
1177
1146
  }
1178
1147
 
@@ -1183,43 +1152,129 @@ ChannelData::ExternalConnectivityWatcher::~ExternalConnectivityWatcher() {
1183
1152
  "ExternalConnectivityWatcher");
1184
1153
  }
1185
1154
 
1186
- void ChannelData::ExternalConnectivityWatcher::OnWatchCompleteLocked(
1187
- void* arg, grpc_error* error) {
1155
+ void ChannelData::ExternalConnectivityWatcher::Notify(
1156
+ grpc_connectivity_state state) {
1157
+ bool done = false;
1158
+ if (!done_.CompareExchangeStrong(&done, true, MemoryOrder::RELAXED,
1159
+ MemoryOrder::RELAXED)) {
1160
+ return; // Already done.
1161
+ }
1162
+ // Remove external watcher.
1163
+ chand_->RemoveExternalConnectivityWatcher(on_complete_, /*cancel=*/false);
1164
+ // Report new state to the user.
1165
+ *state_ = state;
1166
+ GRPC_CLOSURE_SCHED(on_complete_, GRPC_ERROR_NONE);
1167
+ // Hop back into the combiner to clean up.
1168
+ // Not needed in state SHUTDOWN, because the tracker will
1169
+ // automatically remove all watchers in that case.
1170
+ if (state != GRPC_CHANNEL_SHUTDOWN) {
1171
+ chand_->combiner_->Run(
1172
+ GRPC_CLOSURE_INIT(&remove_closure_, RemoveWatcherLocked, this, nullptr),
1173
+ GRPC_ERROR_NONE);
1174
+ }
1175
+ }
1176
+
1177
+ void ChannelData::ExternalConnectivityWatcher::Cancel() {
1178
+ bool done = false;
1179
+ if (!done_.CompareExchangeStrong(&done, true, MemoryOrder::RELAXED,
1180
+ MemoryOrder::RELAXED)) {
1181
+ return; // Already done.
1182
+ }
1183
+ GRPC_CLOSURE_SCHED(on_complete_, GRPC_ERROR_CANCELLED);
1184
+ // Hop back into the combiner to clean up.
1185
+ chand_->combiner_->Run(
1186
+ GRPC_CLOSURE_INIT(&remove_closure_, RemoveWatcherLocked, this, nullptr),
1187
+ GRPC_ERROR_NONE);
1188
+ }
1189
+
1190
+ void ChannelData::ExternalConnectivityWatcher::AddWatcherLocked(
1191
+ void* arg, grpc_error* ignored) {
1188
1192
  ExternalConnectivityWatcher* self =
1189
1193
  static_cast<ExternalConnectivityWatcher*>(arg);
1190
- grpc_closure* on_complete = self->on_complete_;
1191
- self->chand_->external_connectivity_watcher_list_.Remove(self);
1192
- Delete(self);
1193
- GRPC_CLOSURE_SCHED(on_complete, GRPC_ERROR_REF(error));
1194
+ // This assumes that the closure is scheduled on the ExecCtx scheduler
1195
+ // and that GRPC_CLOSURE_RUN() will run the closure immediately.
1196
+ GRPC_CLOSURE_RUN(self->watcher_timer_init_, GRPC_ERROR_NONE);
1197
+ // Add new watcher.
1198
+ self->chand_->state_tracker_.AddWatcher(
1199
+ self->initial_state_,
1200
+ OrphanablePtr<ConnectivityStateWatcherInterface>(self));
1194
1201
  }
1195
1202
 
1196
- void ChannelData::ExternalConnectivityWatcher::WatchConnectivityStateLocked(
1203
+ void ChannelData::ExternalConnectivityWatcher::RemoveWatcherLocked(
1197
1204
  void* arg, grpc_error* ignored) {
1198
1205
  ExternalConnectivityWatcher* self =
1199
1206
  static_cast<ExternalConnectivityWatcher*>(arg);
1200
- if (self->state_ == nullptr) {
1201
- // Handle cancellation.
1202
- GPR_ASSERT(self->watcher_timer_init_ == nullptr);
1203
- ExternalConnectivityWatcher* found =
1204
- self->chand_->external_connectivity_watcher_list_.Lookup(
1205
- self->on_complete_);
1206
- if (found != nullptr) {
1207
- grpc_connectivity_state_notify_on_state_change(
1208
- &found->chand_->state_tracker_, nullptr, &found->my_closure_);
1209
- }
1207
+ self->chand_->state_tracker_.RemoveWatcher(self);
1208
+ }
1209
+
1210
+ //
1211
+ // ChannelData::ConnectivityWatcherAdder
1212
+ //
1213
+
1214
+ class ChannelData::ConnectivityWatcherAdder {
1215
+ public:
1216
+ ConnectivityWatcherAdder(
1217
+ ChannelData* chand, grpc_connectivity_state initial_state,
1218
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher)
1219
+ : chand_(chand),
1220
+ initial_state_(initial_state),
1221
+ watcher_(std::move(watcher)) {
1222
+ GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherAdder");
1223
+ chand_->combiner_->Run(
1224
+ GRPC_CLOSURE_INIT(&closure_,
1225
+ &ConnectivityWatcherAdder::AddWatcherLocked, this,
1226
+ nullptr),
1227
+ GRPC_ERROR_NONE);
1228
+ }
1229
+
1230
+ private:
1231
+ static void AddWatcherLocked(void* arg, grpc_error* error) {
1232
+ ConnectivityWatcherAdder* self =
1233
+ static_cast<ConnectivityWatcherAdder*>(arg);
1234
+ self->chand_->state_tracker_.AddWatcher(self->initial_state_,
1235
+ std::move(self->watcher_));
1236
+ GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
1237
+ "ConnectivityWatcherAdder");
1210
1238
  Delete(self);
1211
- return;
1212
1239
  }
1213
- // New watcher.
1214
- self->chand_->external_connectivity_watcher_list_.Add(self);
1215
- // This assumes that the closure is scheduled on the ExecCtx scheduler
1216
- // and that GRPC_CLOSURE_RUN would run the closure immediately.
1217
- GRPC_CLOSURE_RUN(self->watcher_timer_init_, GRPC_ERROR_NONE);
1218
- GRPC_CLOSURE_INIT(&self->my_closure_, OnWatchCompleteLocked, self,
1219
- grpc_combiner_scheduler(self->chand_->combiner_));
1220
- grpc_connectivity_state_notify_on_state_change(
1221
- &self->chand_->state_tracker_, self->state_, &self->my_closure_);
1222
- }
1240
+
1241
+ ChannelData* chand_;
1242
+ grpc_connectivity_state initial_state_;
1243
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher_;
1244
+ grpc_closure closure_;
1245
+ };
1246
+
1247
+ //
1248
+ // ChannelData::ConnectivityWatcherRemover
1249
+ //
1250
+
1251
+ class ChannelData::ConnectivityWatcherRemover {
1252
+ public:
1253
+ ConnectivityWatcherRemover(ChannelData* chand,
1254
+ AsyncConnectivityStateWatcherInterface* watcher)
1255
+ : chand_(chand), watcher_(watcher) {
1256
+ GRPC_CHANNEL_STACK_REF(chand_->owning_stack_, "ConnectivityWatcherRemover");
1257
+ chand_->combiner_->Run(
1258
+ GRPC_CLOSURE_INIT(&closure_,
1259
+ &ConnectivityWatcherRemover::RemoveWatcherLocked,
1260
+ this, nullptr),
1261
+ GRPC_ERROR_NONE);
1262
+ }
1263
+
1264
+ private:
1265
+ static void RemoveWatcherLocked(void* arg, grpc_error* error) {
1266
+ ConnectivityWatcherRemover* self =
1267
+ static_cast<ConnectivityWatcherRemover*>(arg);
1268
+ self->chand_->state_tracker_.RemoveWatcher(self->watcher_);
1269
+ GRPC_CHANNEL_STACK_UNREF(self->chand_->owning_stack_,
1270
+ "ConnectivityWatcherRemover");
1271
+ Delete(self);
1272
+ }
1273
+
1274
+ ChannelData* chand_;
1275
+ AsyncConnectivityStateWatcherInterface* watcher_;
1276
+ grpc_closure closure_;
1277
+ };
1223
1278
 
1224
1279
  //
1225
1280
  // ChannelData::ClientChannelControlHelper
@@ -1271,7 +1326,7 @@ class ChannelData::ClientChannelControlHelper
1271
1326
  ? ""
1272
1327
  : " (ignoring -- channel shutting down)";
1273
1328
  gpr_log(GPR_INFO, "chand=%p: update: state=%s picker=%p%s", chand_,
1274
- grpc_connectivity_state_name(state), picker.get(), extra);
1329
+ ConnectivityStateName(state), picker.get(), extra);
1275
1330
  }
1276
1331
  // Do update only if not shutting down.
1277
1332
  if (disconnect_error == GRPC_ERROR_NONE) {
@@ -1362,14 +1417,13 @@ ChannelData::ChannelData(grpc_channel_element_args* args, grpc_error** error)
1362
1417
  combiner_(grpc_combiner_create()),
1363
1418
  interested_parties_(grpc_pollset_set_create()),
1364
1419
  subchannel_pool_(GetSubchannelPool(args->channel_args)),
1420
+ state_tracker_("client_channel", GRPC_CHANNEL_IDLE),
1365
1421
  disconnect_error_(GRPC_ERROR_NONE) {
1366
1422
  if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_routing_trace)) {
1367
1423
  gpr_log(GPR_INFO, "chand=%p: creating client_channel for channel stack %p",
1368
1424
  this, owning_stack_);
1369
1425
  }
1370
1426
  // Initialize data members.
1371
- grpc_connectivity_state_init(&state_tracker_, GRPC_CHANNEL_IDLE,
1372
- "client_channel");
1373
1427
  gpr_mu_init(&info_mu_);
1374
1428
  // Start backup polling.
1375
1429
  grpc_client_channel_start_backup_polling(interested_parties_);
@@ -1433,7 +1487,6 @@ ChannelData::~ChannelData() {
1433
1487
  grpc_pollset_set_destroy(interested_parties_);
1434
1488
  GRPC_COMBINER_UNREF(combiner_, "client_channel");
1435
1489
  GRPC_ERROR_UNREF(disconnect_error_.Load(MemoryOrder::RELAXED));
1436
- grpc_connectivity_state_destroy(&state_tracker_);
1437
1490
  gpr_mu_destroy(&info_mu_);
1438
1491
  }
1439
1492
 
@@ -1447,7 +1500,7 @@ void ChannelData::UpdateStateAndPickerLocked(
1447
1500
  received_first_resolver_result_ = false;
1448
1501
  }
1449
1502
  // Update connectivity state.
1450
- grpc_connectivity_state_set(&state_tracker_, state, reason);
1503
+ state_tracker_.SetState(state, reason);
1451
1504
  if (channelz_node_ != nullptr) {
1452
1505
  channelz_node_->SetConnectivityState(state);
1453
1506
  channelz_node_->AddTraceEvent(
@@ -1537,9 +1590,7 @@ void ChannelData::CreateResolvingLoadBalancingPolicyLocked() {
1537
1590
  // Instantiate resolving LB policy.
1538
1591
  LoadBalancingPolicy::Args lb_args;
1539
1592
  lb_args.combiner = combiner_;
1540
- lb_args.channel_control_helper =
1541
- UniquePtr<LoadBalancingPolicy::ChannelControlHelper>(
1542
- New<ClientChannelControlHelper>(this));
1593
+ lb_args.channel_control_helper = MakeUnique<ClientChannelControlHelper>(this);
1543
1594
  lb_args.args = channel_args_;
1544
1595
  UniquePtr<char> target_uri(gpr_strdup(target_uri_.get()));
1545
1596
  resolving_lb_policy_.reset(New<ResolvingLoadBalancingPolicy>(
@@ -1692,8 +1743,8 @@ bool ChannelData::ProcessResolverResultLocked(
1692
1743
  chand->health_check_service_name_.reset();
1693
1744
  }
1694
1745
  // Update health check service name used by existing subchannel wrappers.
1695
- for (const auto& p : chand->subchannel_wrappers_) {
1696
- p.first->UpdateHealthCheckServiceName(
1746
+ for (auto* subchannel_wrapper : chand->subchannel_wrappers_) {
1747
+ subchannel_wrapper->UpdateHealthCheckServiceName(
1697
1748
  UniquePtr<char>(gpr_strdup(chand->health_check_service_name_.get())));
1698
1749
  }
1699
1750
  // Save service config.
@@ -1736,7 +1787,7 @@ bool ChannelData::ProcessResolverResultLocked(
1736
1787
  }
1737
1788
 
1738
1789
  grpc_error* ChannelData::DoPingLocked(grpc_transport_op* op) {
1739
- if (grpc_connectivity_state_check(&state_tracker_) != GRPC_CHANNEL_READY) {
1790
+ if (state_tracker_.state() != GRPC_CHANNEL_READY) {
1740
1791
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("channel not connected");
1741
1792
  }
1742
1793
  LoadBalancingPolicy::PickResult result =
@@ -1764,12 +1815,12 @@ void ChannelData::StartTransportOpLocked(void* arg, grpc_error* ignored) {
1764
1815
  static_cast<grpc_channel_element*>(op->handler_private.extra_arg);
1765
1816
  ChannelData* chand = static_cast<ChannelData*>(elem->channel_data);
1766
1817
  // Connectivity watch.
1767
- if (op->on_connectivity_state_change != nullptr) {
1768
- grpc_connectivity_state_notify_on_state_change(
1769
- &chand->state_tracker_, op->connectivity_state,
1770
- op->on_connectivity_state_change);
1771
- op->on_connectivity_state_change = nullptr;
1772
- op->connectivity_state = nullptr;
1818
+ if (op->start_connectivity_watch != nullptr) {
1819
+ chand->state_tracker_.AddWatcher(op->start_connectivity_watch_state,
1820
+ std::move(op->start_connectivity_watch));
1821
+ }
1822
+ if (op->stop_connectivity_watch != nullptr) {
1823
+ chand->state_tracker_.RemoveWatcher(op->stop_connectivity_watch);
1773
1824
  }
1774
1825
  // Ping.
1775
1826
  if (op->send_ping.on_initiate != nullptr || op->send_ping.on_ack != nullptr) {
@@ -1813,9 +1864,8 @@ void ChannelData::StartTransportOpLocked(void* arg, grpc_error* ignored) {
1813
1864
  MemoryOrder::RELEASE);
1814
1865
  chand->UpdateStateAndPickerLocked(
1815
1866
  GRPC_CHANNEL_SHUTDOWN, "shutdown from API",
1816
- UniquePtr<LoadBalancingPolicy::SubchannelPicker>(
1817
- New<LoadBalancingPolicy::TransientFailurePicker>(
1818
- GRPC_ERROR_REF(op->disconnect_with_error))));
1867
+ MakeUnique<LoadBalancingPolicy::TransientFailurePicker>(
1868
+ GRPC_ERROR_REF(op->disconnect_with_error)));
1819
1869
  }
1820
1870
  }
1821
1871
  GRPC_CHANNEL_STACK_UNREF(chand->owning_stack_, "start_transport_op");
@@ -1833,10 +1883,9 @@ void ChannelData::StartTransportOp(grpc_channel_element* elem,
1833
1883
  // Pop into control plane combiner for remaining ops.
1834
1884
  op->handler_private.extra_arg = elem;
1835
1885
  GRPC_CHANNEL_STACK_REF(chand->owning_stack_, "start_transport_op");
1836
- GRPC_CLOSURE_SCHED(
1886
+ chand->combiner_->Run(
1837
1887
  GRPC_CLOSURE_INIT(&op->handler_private.closure,
1838
- ChannelData::StartTransportOpLocked, op,
1839
- grpc_combiner_scheduler(chand->combiner_)),
1888
+ ChannelData::StartTransportOpLocked, op, nullptr),
1840
1889
  GRPC_ERROR_NONE);
1841
1890
  }
1842
1891
 
@@ -1900,16 +1949,26 @@ void ChannelData::TryToConnectLocked(void* arg, grpc_error* error_ignored) {
1900
1949
 
1901
1950
  grpc_connectivity_state ChannelData::CheckConnectivityState(
1902
1951
  bool try_to_connect) {
1903
- grpc_connectivity_state out = grpc_connectivity_state_check(&state_tracker_);
1952
+ grpc_connectivity_state out = state_tracker_.state();
1904
1953
  if (out == GRPC_CHANNEL_IDLE && try_to_connect) {
1905
1954
  GRPC_CHANNEL_STACK_REF(owning_stack_, "TryToConnect");
1906
- GRPC_CLOSURE_SCHED(GRPC_CLOSURE_CREATE(TryToConnectLocked, this,
1907
- grpc_combiner_scheduler(combiner_)),
1908
- GRPC_ERROR_NONE);
1955
+ combiner_->Run(GRPC_CLOSURE_CREATE(TryToConnectLocked, this, nullptr),
1956
+ GRPC_ERROR_NONE);
1909
1957
  }
1910
1958
  return out;
1911
1959
  }
1912
1960
 
1961
+ void ChannelData::AddConnectivityWatcher(
1962
+ grpc_connectivity_state initial_state,
1963
+ OrphanablePtr<AsyncConnectivityStateWatcherInterface> watcher) {
1964
+ New<ConnectivityWatcherAdder>(this, initial_state, std::move(watcher));
1965
+ }
1966
+
1967
+ void ChannelData::RemoveConnectivityWatcher(
1968
+ AsyncConnectivityStateWatcherInterface* watcher) {
1969
+ New<ConnectivityWatcherRemover>(this, watcher);
1970
+ }
1971
+
1913
1972
  //
1914
1973
  // CallData implementation
1915
1974
  //
@@ -2201,9 +2260,8 @@ void CallData::RecvTrailingMetadataReadyForLoadBalancingPolicy(
2201
2260
  CallData* calld = static_cast<CallData*>(arg);
2202
2261
  // Invoke callback to LB policy.
2203
2262
  Metadata trailing_metadata(calld, calld->recv_trailing_metadata_);
2204
- calld->lb_recv_trailing_metadata_ready_(
2205
- calld->lb_recv_trailing_metadata_ready_user_data_, error,
2206
- &trailing_metadata, &calld->lb_call_state_);
2263
+ calld->lb_recv_trailing_metadata_ready_(error, &trailing_metadata,
2264
+ &calld->lb_call_state_);
2207
2265
  // Chain to original callback.
2208
2266
  GRPC_CLOSURE_RUN(calld->original_recv_trailing_metadata_ready_,
2209
2267
  GRPC_ERROR_REF(error));
@@ -3902,8 +3960,6 @@ bool CallData::PickSubchannelLocked(grpc_call_element* elem,
3902
3960
  GPR_ASSERT(connected_subchannel_ != nullptr);
3903
3961
  }
3904
3962
  lb_recv_trailing_metadata_ready_ = result.recv_trailing_metadata_ready;
3905
- lb_recv_trailing_metadata_ready_user_data_ =
3906
- result.recv_trailing_metadata_ready_user_data;
3907
3963
  *error = result.error;
3908
3964
  return true;
3909
3965
  }
@@ -3950,10 +4006,32 @@ void grpc_client_channel_watch_connectivity_state(
3950
4006
  grpc_connectivity_state* state, grpc_closure* closure,
3951
4007
  grpc_closure* watcher_timer_init) {
3952
4008
  auto* chand = static_cast<ChannelData*>(elem->channel_data);
4009
+ if (state == nullptr) {
4010
+ // Handle cancellation.
4011
+ GPR_ASSERT(watcher_timer_init == nullptr);
4012
+ chand->RemoveExternalConnectivityWatcher(closure, /*cancel=*/true);
4013
+ return;
4014
+ }
4015
+ // Handle addition.
3953
4016
  return chand->AddExternalConnectivityWatcher(pollent, state, closure,
3954
4017
  watcher_timer_init);
3955
4018
  }
3956
4019
 
4020
+ void grpc_client_channel_start_connectivity_watch(
4021
+ grpc_channel_element* elem, grpc_connectivity_state initial_state,
4022
+ grpc_core::OrphanablePtr<grpc_core::AsyncConnectivityStateWatcherInterface>
4023
+ watcher) {
4024
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
4025
+ chand->AddConnectivityWatcher(initial_state, std::move(watcher));
4026
+ }
4027
+
4028
+ void grpc_client_channel_stop_connectivity_watch(
4029
+ grpc_channel_element* elem,
4030
+ grpc_core::AsyncConnectivityStateWatcherInterface* watcher) {
4031
+ auto* chand = static_cast<ChannelData*>(elem->channel_data);
4032
+ chand->RemoveConnectivityWatcher(watcher);
4033
+ }
4034
+
3957
4035
  grpc_core::RefCountedPtr<grpc_core::SubchannelCall>
3958
4036
  grpc_client_channel_get_subchannel_call(grpc_call_element* elem) {
3959
4037
  auto* calld = static_cast<CallData*>(elem->call_data);