grpc 1.24.0 → 1.25.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 (504) 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/exec_ctx.h +4 -3
  113. data/src/core/lib/iomgr/executor.cc +4 -2
  114. data/src/core/lib/iomgr/executor.h +3 -0
  115. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -6
  116. data/src/core/lib/iomgr/executor/threadpool.cc +1 -2
  117. data/src/core/lib/iomgr/executor/threadpool.h +7 -11
  118. data/src/core/lib/iomgr/resource_quota.cc +55 -51
  119. data/src/core/lib/iomgr/resource_quota.h +13 -9
  120. data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -0
  121. data/src/core/lib/iomgr/socket_utils_posix.h +4 -0
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -11
  123. data/src/core/lib/iomgr/tcp_custom.cc +9 -7
  124. data/src/core/lib/iomgr/tcp_posix.cc +20 -16
  125. data/src/core/lib/iomgr/tcp_server.h +1 -4
  126. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  127. data/src/core/lib/iomgr/tcp_server_posix.cc +1 -1
  128. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -11
  129. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  130. data/src/core/lib/iomgr/udp_server.cc +3 -2
  131. data/src/core/lib/iomgr/udp_server.h +6 -12
  132. data/src/core/lib/json/json.h +1 -1
  133. data/src/core/lib/json/json_string.cc +2 -2
  134. data/src/core/lib/profiling/basic_timers.cc +2 -2
  135. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -2
  136. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
  137. data/src/core/lib/security/credentials/credentials.h +4 -20
  138. data/src/core/lib/security/credentials/fake/fake_credentials.cc +4 -4
  139. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -3
  140. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +64 -0
  141. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +4 -4
  142. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -7
  143. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -0
  144. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
  145. data/src/core/lib/security/security_connector/security_connector.cc +1 -0
  146. data/src/core/lib/security/security_connector/security_connector.h +19 -17
  147. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +8 -5
  148. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  149. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  150. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +14 -6
  151. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -2
  152. data/src/core/lib/security/transport/client_auth_filter.cc +17 -17
  153. data/src/core/lib/security/transport/security_handshaker.cc +29 -13
  154. data/src/core/lib/security/transport/security_handshaker.h +4 -2
  155. data/src/core/lib/security/transport/server_auth_filter.cc +14 -14
  156. data/src/core/lib/slice/slice.cc +2 -10
  157. data/src/core/lib/slice/slice_hash_table.h +4 -6
  158. data/src/core/lib/slice/slice_intern.cc +42 -39
  159. data/src/core/lib/slice/slice_internal.h +3 -3
  160. data/src/core/lib/slice/slice_utils.h +21 -4
  161. data/src/core/lib/slice/slice_weak_hash_table.h +4 -6
  162. data/src/core/lib/surface/call.cc +3 -3
  163. data/src/core/lib/surface/channel.cc +7 -0
  164. data/src/core/lib/surface/completion_queue.cc +12 -11
  165. data/src/core/lib/surface/completion_queue.h +4 -2
  166. data/src/core/lib/surface/init.cc +1 -0
  167. data/src/core/lib/surface/lame_client.cc +33 -18
  168. data/src/core/lib/surface/server.cc +77 -76
  169. data/src/core/lib/surface/version.cc +1 -1
  170. data/src/core/lib/transport/byte_stream.h +3 -7
  171. data/src/core/lib/transport/connectivity_state.cc +112 -98
  172. data/src/core/lib/transport/connectivity_state.h +100 -50
  173. data/src/core/lib/transport/static_metadata.cc +276 -288
  174. data/src/core/lib/transport/static_metadata.h +73 -76
  175. data/src/core/lib/transport/status_conversion.cc +1 -1
  176. data/src/core/lib/transport/status_metadata.cc +1 -1
  177. data/src/core/lib/transport/transport.cc +2 -2
  178. data/src/core/lib/transport/transport.h +12 -4
  179. data/src/core/lib/transport/transport_op_string.cc +14 -11
  180. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
  181. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
  182. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +5 -5
  183. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
  184. data/src/core/tsi/fake_transport_security.cc +7 -5
  185. data/src/core/tsi/grpc_shadow_boringssl.h +2918 -2627
  186. data/src/core/tsi/local_transport_security.cc +8 -6
  187. data/src/core/tsi/ssl/session_cache/ssl_session.h +1 -3
  188. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -2
  189. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +7 -5
  190. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -6
  191. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -2
  192. data/src/core/tsi/ssl_transport_security.cc +12 -12
  193. data/src/core/tsi/ssl_transport_security.h +2 -2
  194. data/src/core/tsi/transport_security_grpc.cc +7 -0
  195. data/src/core/tsi/transport_security_grpc.h +6 -0
  196. data/src/ruby/ext/grpc/extconf.rb +1 -0
  197. data/src/ruby/ext/grpc/rb_call.c +1 -1
  198. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  199. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  200. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  201. data/src/ruby/lib/grpc/version.rb +1 -1
  202. data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
  203. data/third_party/boringssl/crypto/asn1/a_bool.c +18 -5
  204. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +17 -221
  205. data/third_party/boringssl/crypto/asn1/a_dup.c +0 -24
  206. data/third_party/boringssl/crypto/asn1/a_enum.c +2 -2
  207. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +10 -72
  208. data/third_party/boringssl/crypto/asn1/a_int.c +12 -71
  209. data/third_party/boringssl/crypto/asn1/a_mbstr.c +110 -216
  210. data/third_party/boringssl/crypto/asn1/a_object.c +16 -5
  211. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  212. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -1
  213. data/third_party/boringssl/crypto/asn1/tasn_enc.c +3 -1
  214. data/third_party/boringssl/crypto/base64/base64.c +2 -2
  215. data/third_party/boringssl/crypto/bio/bio.c +73 -9
  216. data/third_party/boringssl/crypto/bio/connect.c +4 -0
  217. data/third_party/boringssl/crypto/bio/fd.c +4 -0
  218. data/third_party/boringssl/crypto/bio/file.c +5 -2
  219. data/third_party/boringssl/crypto/bio/socket.c +4 -0
  220. data/third_party/boringssl/crypto/bio/socket_helper.c +4 -0
  221. data/third_party/boringssl/crypto/bn_extra/convert.c +11 -7
  222. data/third_party/boringssl/crypto/bytestring/ber.c +8 -4
  223. data/third_party/boringssl/crypto/bytestring/cbb.c +19 -7
  224. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -15
  225. data/third_party/boringssl/crypto/bytestring/internal.h +28 -7
  226. data/third_party/boringssl/crypto/bytestring/unicode.c +155 -0
  227. data/third_party/boringssl/crypto/chacha/chacha.c +36 -19
  228. data/third_party/boringssl/crypto/chacha/internal.h +45 -0
  229. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +29 -0
  230. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +269 -25
  231. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +16 -14
  232. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +54 -38
  233. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +133 -41
  234. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +23 -15
  235. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +24 -15
  236. data/third_party/boringssl/crypto/cmac/cmac.c +62 -25
  237. data/third_party/boringssl/crypto/conf/conf.c +7 -0
  238. data/third_party/boringssl/crypto/cpu-arm-linux.c +4 -148
  239. data/third_party/boringssl/crypto/cpu-arm-linux.h +201 -0
  240. data/third_party/boringssl/crypto/cpu-intel.c +45 -51
  241. data/third_party/boringssl/crypto/crypto.c +39 -22
  242. data/third_party/boringssl/crypto/curve25519/spake25519.c +1 -1
  243. data/third_party/boringssl/crypto/dsa/dsa.c +77 -53
  244. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +20 -8
  245. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +96 -0
  246. data/third_party/boringssl/crypto/{ecdh/ecdh.c → ecdh_extra/ecdh_extra.c} +20 -58
  247. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +1 -9
  248. data/third_party/boringssl/crypto/engine/engine.c +2 -1
  249. data/third_party/boringssl/crypto/err/err.c +2 -0
  250. data/third_party/boringssl/crypto/err/internal.h +2 -2
  251. data/third_party/boringssl/crypto/evp/evp.c +89 -8
  252. data/third_party/boringssl/crypto/evp/evp_asn1.c +56 -5
  253. data/third_party/boringssl/crypto/evp/evp_ctx.c +52 -14
  254. data/third_party/boringssl/crypto/evp/internal.h +18 -1
  255. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +5 -0
  256. data/third_party/boringssl/crypto/evp/p_ec.c +51 -3
  257. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +6 -7
  258. data/third_party/boringssl/crypto/evp/p_ed25519.c +36 -3
  259. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +76 -45
  260. data/third_party/boringssl/crypto/evp/p_rsa.c +3 -1
  261. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +5 -0
  262. data/third_party/boringssl/crypto/evp/p_x25519.c +110 -0
  263. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +249 -0
  264. data/third_party/boringssl/crypto/evp/scrypt.c +6 -2
  265. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +34 -274
  266. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +161 -21
  267. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +111 -13
  268. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +17 -21
  269. data/third_party/boringssl/crypto/fipsmodule/bcm.c +119 -7
  270. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +19 -2
  271. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +2 -2
  272. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +93 -160
  273. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +48 -57
  274. data/third_party/boringssl/crypto/fipsmodule/bn/div_extra.c +87 -0
  275. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +143 -211
  276. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -305
  277. data/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.c +325 -0
  278. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +168 -50
  279. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +68 -92
  280. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +7 -6
  281. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +11 -14
  282. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +358 -443
  283. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +25 -35
  284. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +20 -25
  285. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +76 -5
  286. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +14 -14
  287. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +7 -2
  288. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +383 -516
  289. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +4 -0
  290. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +3 -4
  291. data/third_party/boringssl/crypto/fipsmodule/delocate.h +3 -2
  292. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +32 -17
  293. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +3 -3
  294. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +228 -122
  295. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +34 -8
  296. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +311 -98
  297. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +82 -0
  298. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +263 -97
  299. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +22 -59
  300. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +317 -234
  301. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9473 -9475
  302. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +313 -109
  303. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +36 -0
  304. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +96 -0
  305. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +126 -792
  306. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +84 -0
  307. data/third_party/boringssl/crypto/fipsmodule/ec/util.c +163 -12
  308. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +84 -211
  309. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  310. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +60 -205
  311. data/third_party/boringssl/crypto/fipsmodule/fips_shared_support.c +32 -0
  312. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +2 -0
  313. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +3 -1
  314. data/third_party/boringssl/crypto/fipsmodule/md5/internal.h +37 -0
  315. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +11 -8
  316. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +35 -79
  317. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +7 -39
  318. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +7 -27
  319. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +123 -309
  320. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +189 -126
  321. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +3 -2
  322. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +2 -2
  323. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +35 -0
  324. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +24 -19
  325. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +256 -77
  326. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +10 -7
  327. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +5 -1
  328. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +131 -14
  329. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +83 -10
  330. data/third_party/boringssl/crypto/fipsmodule/sha/internal.h +53 -0
  331. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +9 -13
  332. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +18 -12
  333. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +95 -168
  334. data/third_party/boringssl/crypto/hrss/hrss.c +2201 -0
  335. data/third_party/boringssl/crypto/hrss/internal.h +62 -0
  336. data/third_party/boringssl/crypto/internal.h +95 -20
  337. data/third_party/boringssl/crypto/lhash/lhash.c +45 -33
  338. data/third_party/boringssl/crypto/mem.c +39 -2
  339. data/third_party/boringssl/crypto/obj/obj.c +4 -4
  340. data/third_party/boringssl/crypto/obj/obj_dat.h +6181 -875
  341. data/third_party/boringssl/crypto/pem/pem_all.c +2 -3
  342. data/third_party/boringssl/crypto/pem/pem_info.c +144 -162
  343. data/third_party/boringssl/crypto/pem/pem_lib.c +53 -52
  344. data/third_party/boringssl/crypto/pem/pem_pkey.c +13 -21
  345. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +15 -22
  346. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +168 -16
  347. data/third_party/boringssl/crypto/pkcs8/internal.h +11 -0
  348. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +24 -15
  349. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +42 -25
  350. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +559 -43
  351. data/third_party/boringssl/crypto/pool/internal.h +1 -1
  352. data/third_party/boringssl/crypto/pool/pool.c +21 -0
  353. data/third_party/boringssl/crypto/rand_extra/deterministic.c +8 -0
  354. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +1 -14
  355. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  356. data/third_party/boringssl/crypto/rsa_extra/rsa_print.c +22 -0
  357. data/third_party/boringssl/crypto/siphash/siphash.c +80 -0
  358. data/third_party/boringssl/crypto/stack/stack.c +83 -32
  359. data/third_party/boringssl/crypto/thread_none.c +2 -2
  360. data/third_party/boringssl/crypto/thread_pthread.c +2 -2
  361. data/third_party/boringssl/crypto/thread_win.c +38 -19
  362. data/third_party/boringssl/crypto/x509/a_strex.c +22 -2
  363. data/third_party/boringssl/crypto/x509/asn1_gen.c +2 -1
  364. data/third_party/boringssl/crypto/x509/by_dir.c +7 -0
  365. data/third_party/boringssl/crypto/x509/by_file.c +12 -10
  366. data/third_party/boringssl/crypto/x509/t_crl.c +5 -8
  367. data/third_party/boringssl/crypto/x509/t_req.c +1 -3
  368. data/third_party/boringssl/crypto/x509/t_x509.c +5 -8
  369. data/third_party/boringssl/crypto/x509/x509_cmp.c +1 -1
  370. data/third_party/boringssl/crypto/x509/x509_def.c +1 -1
  371. data/third_party/boringssl/crypto/x509/x509_lu.c +114 -5
  372. data/third_party/boringssl/crypto/x509/x509_req.c +20 -0
  373. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  374. data/third_party/boringssl/crypto/x509/x509_trs.c +1 -0
  375. data/third_party/boringssl/crypto/x509/x509_txt.c +4 -5
  376. data/third_party/boringssl/crypto/x509/x509_vfy.c +145 -138
  377. data/third_party/boringssl/crypto/x509/x509_vpm.c +2 -0
  378. data/third_party/boringssl/crypto/x509/x509cset.c +40 -0
  379. data/third_party/boringssl/crypto/x509/x509name.c +2 -3
  380. data/third_party/boringssl/crypto/x509/x_all.c +109 -210
  381. data/third_party/boringssl/crypto/x509/x_x509.c +6 -0
  382. data/third_party/boringssl/crypto/x509v3/ext_dat.h +1 -3
  383. data/third_party/boringssl/crypto/x509v3/internal.h +56 -0
  384. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -0
  385. data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -0
  386. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +4 -2
  387. data/third_party/boringssl/crypto/x509v3/v3_akey.c +5 -2
  388. data/third_party/boringssl/crypto/x509v3/v3_alt.c +19 -13
  389. data/third_party/boringssl/crypto/x509v3/v3_conf.c +2 -1
  390. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +3 -2
  391. data/third_party/boringssl/crypto/x509v3/v3_genn.c +1 -6
  392. data/third_party/boringssl/crypto/x509v3/v3_lib.c +1 -0
  393. data/third_party/boringssl/crypto/x509v3/v3_ocsp.c +68 -0
  394. data/third_party/boringssl/crypto/x509v3/v3_pci.c +2 -1
  395. data/third_party/boringssl/crypto/x509v3/v3_purp.c +47 -69
  396. data/third_party/boringssl/crypto/x509v3/v3_skey.c +5 -2
  397. data/third_party/boringssl/crypto/x509v3/v3_utl.c +69 -25
  398. data/third_party/boringssl/include/openssl/aead.h +45 -19
  399. data/third_party/boringssl/include/openssl/aes.h +32 -7
  400. data/third_party/boringssl/include/openssl/asn1.h +7 -77
  401. data/third_party/boringssl/include/openssl/base.h +120 -6
  402. data/third_party/boringssl/include/openssl/base64.h +4 -1
  403. data/third_party/boringssl/include/openssl/bio.h +112 -81
  404. data/third_party/boringssl/include/openssl/blowfish.h +3 -3
  405. data/third_party/boringssl/include/openssl/bn.h +55 -29
  406. data/third_party/boringssl/include/openssl/buf.h +2 -2
  407. data/third_party/boringssl/include/openssl/bytestring.h +54 -32
  408. data/third_party/boringssl/include/openssl/cast.h +2 -2
  409. data/third_party/boringssl/include/openssl/cipher.h +46 -16
  410. data/third_party/boringssl/include/openssl/cmac.h +6 -2
  411. data/third_party/boringssl/include/openssl/conf.h +3 -6
  412. data/third_party/boringssl/include/openssl/cpu.h +25 -9
  413. data/third_party/boringssl/include/openssl/crypto.h +32 -10
  414. data/third_party/boringssl/include/openssl/curve25519.h +4 -4
  415. data/third_party/boringssl/include/openssl/dh.h +3 -2
  416. data/third_party/boringssl/include/openssl/digest.h +21 -7
  417. data/third_party/boringssl/include/openssl/dsa.h +8 -2
  418. data/third_party/boringssl/include/openssl/e_os2.h +18 -0
  419. data/third_party/boringssl/include/openssl/ec.h +25 -21
  420. data/third_party/boringssl/include/openssl/ec_key.h +36 -8
  421. data/third_party/boringssl/include/openssl/ecdh.h +17 -0
  422. data/third_party/boringssl/include/openssl/ecdsa.h +3 -3
  423. data/third_party/boringssl/include/openssl/engine.h +4 -4
  424. data/third_party/boringssl/include/openssl/err.h +3 -0
  425. data/third_party/boringssl/include/openssl/evp.h +199 -42
  426. data/third_party/boringssl/include/openssl/hmac.h +4 -4
  427. data/third_party/boringssl/include/openssl/hrss.h +100 -0
  428. data/third_party/boringssl/include/openssl/lhash.h +131 -23
  429. data/third_party/boringssl/include/openssl/md4.h +6 -4
  430. data/third_party/boringssl/include/openssl/md5.h +6 -4
  431. data/third_party/boringssl/include/openssl/mem.h +6 -2
  432. data/third_party/boringssl/include/openssl/nid.h +3 -0
  433. data/third_party/boringssl/include/openssl/obj.h +3 -0
  434. data/third_party/boringssl/include/openssl/pem.h +102 -64
  435. data/third_party/boringssl/include/openssl/pkcs7.h +136 -3
  436. data/third_party/boringssl/include/openssl/pkcs8.h +42 -3
  437. data/third_party/boringssl/include/openssl/pool.h +13 -2
  438. data/third_party/boringssl/include/openssl/ripemd.h +5 -4
  439. data/third_party/boringssl/include/openssl/rsa.h +46 -15
  440. data/third_party/boringssl/include/openssl/sha.h +40 -28
  441. data/third_party/boringssl/include/openssl/siphash.h +37 -0
  442. data/third_party/boringssl/include/openssl/span.h +17 -9
  443. data/third_party/boringssl/include/openssl/ssl.h +766 -393
  444. data/third_party/boringssl/include/openssl/ssl3.h +4 -3
  445. data/third_party/boringssl/include/openssl/stack.h +134 -77
  446. data/third_party/boringssl/include/openssl/thread.h +1 -1
  447. data/third_party/boringssl/include/openssl/tls1.h +25 -9
  448. data/third_party/boringssl/include/openssl/type_check.h +14 -15
  449. data/third_party/boringssl/include/openssl/x509.h +28 -3
  450. data/third_party/boringssl/include/openssl/x509_vfy.h +98 -32
  451. data/third_party/boringssl/include/openssl/x509v3.h +17 -13
  452. data/third_party/boringssl/ssl/d1_both.cc +9 -18
  453. data/third_party/boringssl/ssl/d1_lib.cc +4 -3
  454. data/third_party/boringssl/ssl/d1_pkt.cc +4 -4
  455. data/third_party/boringssl/ssl/d1_srtp.cc +15 -15
  456. data/third_party/boringssl/ssl/dtls_method.cc +0 -1
  457. data/third_party/boringssl/ssl/dtls_record.cc +28 -28
  458. data/third_party/boringssl/ssl/handoff.cc +295 -91
  459. data/third_party/boringssl/ssl/handshake.cc +133 -72
  460. data/third_party/boringssl/ssl/handshake_client.cc +218 -189
  461. data/third_party/boringssl/ssl/handshake_server.cc +399 -272
  462. data/third_party/boringssl/ssl/internal.h +1413 -928
  463. data/third_party/boringssl/ssl/s3_both.cc +175 -36
  464. data/third_party/boringssl/ssl/s3_lib.cc +9 -13
  465. data/third_party/boringssl/ssl/s3_pkt.cc +63 -29
  466. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +55 -35
  467. data/third_party/boringssl/ssl/ssl_asn1.cc +57 -73
  468. data/third_party/boringssl/ssl/ssl_buffer.cc +13 -12
  469. data/third_party/boringssl/ssl/ssl_cert.cc +313 -210
  470. data/third_party/boringssl/ssl/ssl_cipher.cc +159 -221
  471. data/third_party/boringssl/ssl/ssl_file.cc +2 -0
  472. data/third_party/boringssl/ssl/ssl_key_share.cc +164 -19
  473. data/third_party/boringssl/ssl/ssl_lib.cc +847 -555
  474. data/third_party/boringssl/ssl/ssl_privkey.cc +441 -111
  475. data/third_party/boringssl/ssl/ssl_session.cc +230 -178
  476. data/third_party/boringssl/ssl/ssl_transcript.cc +21 -142
  477. data/third_party/boringssl/ssl/ssl_versions.cc +88 -93
  478. data/third_party/boringssl/ssl/ssl_x509.cc +279 -218
  479. data/third_party/boringssl/ssl/t1_enc.cc +5 -96
  480. data/third_party/boringssl/ssl/t1_lib.cc +931 -678
  481. data/third_party/boringssl/ssl/tls13_both.cc +251 -121
  482. data/third_party/boringssl/ssl/tls13_client.cc +129 -73
  483. data/third_party/boringssl/ssl/tls13_enc.cc +350 -282
  484. data/third_party/boringssl/ssl/tls13_server.cc +259 -192
  485. data/third_party/boringssl/ssl/tls_method.cc +26 -21
  486. data/third_party/boringssl/ssl/tls_record.cc +42 -47
  487. data/third_party/boringssl/third_party/fiat/curve25519.c +261 -1324
  488. data/third_party/boringssl/third_party/fiat/curve25519_32.h +911 -0
  489. data/third_party/boringssl/third_party/fiat/curve25519_64.h +559 -0
  490. data/third_party/boringssl/third_party/fiat/p256.c +238 -999
  491. data/third_party/boringssl/third_party/fiat/p256_32.h +3226 -0
  492. data/third_party/boringssl/third_party/fiat/p256_64.h +1217 -0
  493. data/third_party/upb/upb/port_def.inc +1 -1
  494. data/third_party/upb/upb/table.c +2 -1
  495. metadata +71 -43
  496. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -127
  497. data/src/core/lib/gpr/mpscq.cc +0 -117
  498. data/src/core/lib/gpr/mpscq.h +0 -88
  499. data/src/core/lib/gprpp/abstract.h +0 -47
  500. data/src/core/lib/gprpp/pair.h +0 -38
  501. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
  502. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
  503. data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
  504. data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
@@ -34,9 +34,9 @@
34
34
  #include "src/core/lib/channel/channelz.h"
35
35
  #include "src/core/lib/channel/connected_channel.h"
36
36
  #include "src/core/lib/debug/stats.h"
37
- #include "src/core/lib/gpr/mpscq.h"
38
37
  #include "src/core/lib/gpr/spinlock.h"
39
38
  #include "src/core/lib/gpr/string.h"
39
+ #include "src/core/lib/gprpp/mpscq.h"
40
40
  #include "src/core/lib/iomgr/executor.h"
41
41
  #include "src/core/lib/iomgr/iomgr.h"
42
42
  #include "src/core/lib/slice/slice_internal.h"
@@ -50,6 +50,8 @@
50
50
 
51
51
  grpc_core::TraceFlag grpc_server_channel_trace(false, "server_channel");
52
52
 
53
+ using grpc_core::LockedMultiProducerSingleConsumerQueue;
54
+
53
55
  static void server_on_recv_initial_metadata(void* ptr, grpc_error* error);
54
56
  static void server_recv_trailing_metadata_ready(void* user_data,
55
57
  grpc_error* error);
@@ -70,7 +72,9 @@ enum requested_call_type { BATCH_CALL, REGISTERED_CALL };
70
72
  struct registered_method;
71
73
 
72
74
  struct requested_call {
73
- gpr_mpscq_node request_link; /* must be first */
75
+ grpc_core::ManualConstructor<
76
+ grpc_core::MultiProducerSingleConsumerQueue::Node>
77
+ mpscq_node;
74
78
  requested_call_type type;
75
79
  size_t cq_idx;
76
80
  void* tag;
@@ -95,13 +99,12 @@ struct channel_registered_method {
95
99
  registered_method* server_registered_method;
96
100
  uint32_t flags;
97
101
  bool has_host;
98
- grpc_slice method;
99
- grpc_slice host;
102
+ grpc_core::ExternallyManagedSlice method;
103
+ grpc_core::ExternallyManagedSlice host;
100
104
  };
101
105
 
102
106
  struct channel_data {
103
107
  grpc_server* server;
104
- grpc_connectivity_state connectivity_state;
105
108
  grpc_channel* channel;
106
109
  size_t cq_idx;
107
110
  /* linked list of all channels on a server */
@@ -111,7 +114,6 @@ struct channel_data {
111
114
  uint32_t registered_method_slots;
112
115
  uint32_t registered_method_max_probes;
113
116
  grpc_closure finish_destroy_channel_closure;
114
- grpc_closure channel_connectivity_changed;
115
117
  intptr_t channelz_socket_uuid;
116
118
  };
117
119
 
@@ -198,7 +200,7 @@ struct request_matcher {
198
200
  grpc_server* server;
199
201
  call_data* pending_head;
200
202
  call_data* pending_tail;
201
- gpr_locked_mpscq* requests_per_cq;
203
+ LockedMultiProducerSingleConsumerQueue* requests_per_cq;
202
204
  };
203
205
 
204
206
  struct registered_method {
@@ -350,17 +352,17 @@ static void channel_broadcaster_shutdown(channel_broadcaster* cb,
350
352
  static void request_matcher_init(request_matcher* rm, grpc_server* server) {
351
353
  rm->server = server;
352
354
  rm->pending_head = rm->pending_tail = nullptr;
353
- rm->requests_per_cq = static_cast<gpr_locked_mpscq*>(
355
+ rm->requests_per_cq = static_cast<LockedMultiProducerSingleConsumerQueue*>(
354
356
  gpr_malloc(sizeof(*rm->requests_per_cq) * server->cq_count));
355
357
  for (size_t i = 0; i < server->cq_count; i++) {
356
- gpr_locked_mpscq_init(&rm->requests_per_cq[i]);
358
+ new (&rm->requests_per_cq[i]) LockedMultiProducerSingleConsumerQueue();
357
359
  }
358
360
  }
359
361
 
360
362
  static void request_matcher_destroy(request_matcher* rm) {
361
363
  for (size_t i = 0; i < rm->server->cq_count; i++) {
362
- GPR_ASSERT(gpr_locked_mpscq_pop(&rm->requests_per_cq[i]) == nullptr);
363
- gpr_locked_mpscq_destroy(&rm->requests_per_cq[i]);
364
+ GPR_ASSERT(rm->requests_per_cq[i].Pop() == nullptr);
365
+ rm->requests_per_cq[i].~LockedMultiProducerSingleConsumerQueue();
364
366
  }
365
367
  gpr_free(rm->requests_per_cq);
366
368
  }
@@ -389,7 +391,7 @@ static void request_matcher_kill_requests(grpc_server* server,
389
391
  requested_call* rc;
390
392
  for (size_t i = 0; i < server->cq_count; i++) {
391
393
  while ((rc = reinterpret_cast<requested_call*>(
392
- gpr_locked_mpscq_pop(&rm->requests_per_cq[i]))) != nullptr) {
394
+ rm->requests_per_cq[i].Pop())) != nullptr) {
393
395
  fail_call(server, i, rc, GRPC_ERROR_REF(error));
394
396
  }
395
397
  }
@@ -454,7 +456,7 @@ static void finish_destroy_channel(void* cd, grpc_error* error) {
454
456
  server_unref(server);
455
457
  }
456
458
 
457
- static void destroy_channel(channel_data* chand, grpc_error* error) {
459
+ static void destroy_channel(channel_data* chand) {
458
460
  if (is_channel_orphaned(chand)) return;
459
461
  GPR_ASSERT(chand->server != nullptr);
460
462
  orphan_channel(chand);
@@ -463,12 +465,9 @@ static void destroy_channel(channel_data* chand, grpc_error* error) {
463
465
  GRPC_CLOSURE_INIT(&chand->finish_destroy_channel_closure,
464
466
  finish_destroy_channel, chand, grpc_schedule_on_exec_ctx);
465
467
 
466
- if (GRPC_TRACE_FLAG_ENABLED(grpc_server_channel_trace) &&
467
- error != GRPC_ERROR_NONE) {
468
- const char* msg = grpc_error_string(error);
469
- gpr_log(GPR_INFO, "Disconnected client: %s", msg);
468
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_server_channel_trace)) {
469
+ gpr_log(GPR_INFO, "Disconnected client");
470
470
  }
471
- GRPC_ERROR_UNREF(error);
472
471
 
473
472
  grpc_transport_op* op =
474
473
  grpc_make_transport_op(&chand->finish_destroy_channel_closure);
@@ -534,8 +533,8 @@ static void publish_new_rpc(void* arg, grpc_error* error) {
534
533
 
535
534
  for (size_t i = 0; i < server->cq_count; i++) {
536
535
  size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
537
- requested_call* rc = reinterpret_cast<requested_call*>(
538
- gpr_locked_mpscq_try_pop(&rm->requests_per_cq[cq_idx]));
536
+ requested_call* rc =
537
+ reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].TryPop());
539
538
  if (rc == nullptr) {
540
539
  continue;
541
540
  } else {
@@ -556,8 +555,8 @@ static void publish_new_rpc(void* arg, grpc_error* error) {
556
555
  // added to the pending list.
557
556
  for (size_t i = 0; i < server->cq_count; i++) {
558
557
  size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
559
- requested_call* rc = reinterpret_cast<requested_call*>(
560
- gpr_locked_mpscq_pop(&rm->requests_per_cq[cq_idx]));
558
+ requested_call* rc =
559
+ reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].Pop());
561
560
  if (rc == nullptr) {
562
561
  continue;
563
562
  } else {
@@ -631,8 +630,8 @@ static void start_new_rpc(grpc_call_element* elem) {
631
630
  chand->registered_method_slots];
632
631
  if (rm->server_registered_method == nullptr) break;
633
632
  if (!rm->has_host) continue;
634
- if (!grpc_slice_eq(rm->host, calld->host)) continue;
635
- if (!grpc_slice_eq(rm->method, calld->path)) continue;
633
+ if (rm->host != calld->host) continue;
634
+ if (rm->method != calld->path) continue;
636
635
  if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
637
636
  0 == (calld->recv_initial_metadata_flags &
638
637
  GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
@@ -649,7 +648,7 @@ static void start_new_rpc(grpc_call_element* elem) {
649
648
  chand->registered_method_slots];
650
649
  if (rm->server_registered_method == nullptr) break;
651
650
  if (rm->has_host) continue;
652
- if (!grpc_slice_eq(rm->method, calld->path)) continue;
651
+ if (rm->method != calld->path) continue;
653
652
  if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
654
653
  0 == (calld->recv_initial_metadata_flags &
655
654
  GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
@@ -887,43 +886,25 @@ static void accept_stream(void* cd, grpc_transport* transport,
887
886
  grpc_call_start_batch_and_execute(call, &op, 1, &calld->got_initial_metadata);
888
887
  }
889
888
 
890
- static void channel_connectivity_changed(void* cd, grpc_error* error) {
891
- channel_data* chand = static_cast<channel_data*>(cd);
892
- grpc_server* server = chand->server;
893
- if (chand->connectivity_state != GRPC_CHANNEL_SHUTDOWN) {
894
- grpc_transport_op* op = grpc_make_transport_op(nullptr);
895
- op->on_connectivity_state_change = &chand->channel_connectivity_changed;
896
- op->connectivity_state = &chand->connectivity_state;
897
- grpc_channel_next_op(grpc_channel_stack_element(
898
- grpc_channel_get_channel_stack(chand->channel), 0),
899
- op);
900
- } else {
901
- gpr_mu_lock(&server->mu_global);
902
- destroy_channel(chand, GRPC_ERROR_REF(error));
903
- gpr_mu_unlock(&server->mu_global);
904
- GRPC_CHANNEL_INTERNAL_UNREF(chand->channel, "connectivity");
905
- }
906
- }
907
-
908
- static grpc_error* init_call_elem(grpc_call_element* elem,
909
- const grpc_call_element_args* args) {
889
+ static grpc_error* server_init_call_elem(grpc_call_element* elem,
890
+ const grpc_call_element_args* args) {
910
891
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
911
892
  server_ref(chand->server);
912
893
  new (elem->call_data) call_data(elem, *args);
913
894
  return GRPC_ERROR_NONE;
914
895
  }
915
896
 
916
- static void destroy_call_elem(grpc_call_element* elem,
917
- const grpc_call_final_info* final_info,
918
- grpc_closure* ignored) {
897
+ static void server_destroy_call_elem(grpc_call_element* elem,
898
+ const grpc_call_final_info* final_info,
899
+ grpc_closure* ignored) {
919
900
  call_data* calld = static_cast<call_data*>(elem->call_data);
920
901
  calld->~call_data();
921
902
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
922
903
  server_unref(chand->server);
923
904
  }
924
905
 
925
- static grpc_error* init_channel_elem(grpc_channel_element* elem,
926
- grpc_channel_element_args* args) {
906
+ static grpc_error* server_init_channel_elem(grpc_channel_element* elem,
907
+ grpc_channel_element_args* args) {
927
908
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
928
909
  GPR_ASSERT(args->is_first);
929
910
  GPR_ASSERT(!args->is_last);
@@ -931,21 +912,23 @@ static grpc_error* init_channel_elem(grpc_channel_element* elem,
931
912
  chand->channel = nullptr;
932
913
  chand->next = chand->prev = chand;
933
914
  chand->registered_methods = nullptr;
934
- chand->connectivity_state = GRPC_CHANNEL_IDLE;
935
- GRPC_CLOSURE_INIT(&chand->channel_connectivity_changed,
936
- channel_connectivity_changed, chand,
937
- grpc_schedule_on_exec_ctx);
938
915
  return GRPC_ERROR_NONE;
939
916
  }
940
917
 
941
- static void destroy_channel_elem(grpc_channel_element* elem) {
918
+ static void server_destroy_channel_elem(grpc_channel_element* elem) {
942
919
  size_t i;
943
920
  channel_data* chand = static_cast<channel_data*>(elem->channel_data);
944
921
  if (chand->registered_methods) {
945
922
  for (i = 0; i < chand->registered_method_slots; i++) {
946
923
  grpc_slice_unref_internal(chand->registered_methods[i].method);
924
+ GPR_DEBUG_ASSERT(chand->registered_methods[i].method.refcount ==
925
+ &grpc_core::kNoopRefcount ||
926
+ chand->registered_methods[i].method.refcount == nullptr);
947
927
  if (chand->registered_methods[i].has_host) {
948
928
  grpc_slice_unref_internal(chand->registered_methods[i].host);
929
+ GPR_DEBUG_ASSERT(chand->registered_methods[i].host.refcount ==
930
+ &grpc_core::kNoopRefcount ||
931
+ chand->registered_methods[i].host.refcount == nullptr);
949
932
  }
950
933
  }
951
934
  gpr_free(chand->registered_methods);
@@ -970,12 +953,12 @@ const grpc_channel_filter grpc_server_top_filter = {
970
953
  server_start_transport_stream_op_batch,
971
954
  grpc_channel_next_op,
972
955
  sizeof(call_data),
973
- init_call_elem,
956
+ server_init_call_elem,
974
957
  grpc_call_stack_ignore_set_pollset_or_pollset_set,
975
- destroy_call_elem,
958
+ server_destroy_call_elem,
976
959
  sizeof(channel_data),
977
- init_channel_elem,
978
- destroy_channel_elem,
960
+ server_init_channel_elem,
961
+ server_destroy_channel_elem,
979
962
  grpc_channel_next_get_info,
980
963
  "server",
981
964
  };
@@ -1145,6 +1128,31 @@ void grpc_server_get_pollsets(grpc_server* server, grpc_pollset*** pollsets,
1145
1128
  *pollsets = server->pollsets;
1146
1129
  }
1147
1130
 
1131
+ class ConnectivityWatcher
1132
+ : public grpc_core::AsyncConnectivityStateWatcherInterface {
1133
+ public:
1134
+ explicit ConnectivityWatcher(channel_data* chand) : chand_(chand) {
1135
+ GRPC_CHANNEL_INTERNAL_REF(chand_->channel, "connectivity");
1136
+ }
1137
+
1138
+ ~ConnectivityWatcher() {
1139
+ GRPC_CHANNEL_INTERNAL_UNREF(chand_->channel, "connectivity");
1140
+ }
1141
+
1142
+ private:
1143
+ void OnConnectivityStateChange(grpc_connectivity_state new_state) override {
1144
+ // Don't do anything until we are being shut down.
1145
+ if (new_state != GRPC_CHANNEL_SHUTDOWN) return;
1146
+ // Shut down channel.
1147
+ grpc_server* server = chand_->server;
1148
+ gpr_mu_lock(&server->mu_global);
1149
+ destroy_channel(chand_);
1150
+ gpr_mu_unlock(&server->mu_global);
1151
+ }
1152
+
1153
+ channel_data* chand_;
1154
+ };
1155
+
1148
1156
  void grpc_server_setup_transport(
1149
1157
  grpc_server* s, grpc_transport* transport, grpc_pollset* accepting_pollset,
1150
1158
  const grpc_channel_args* args,
@@ -1200,18 +1208,13 @@ void grpc_server_setup_transport(
1200
1208
  chand->registered_methods =
1201
1209
  static_cast<channel_registered_method*>(gpr_zalloc(alloc));
1202
1210
  for (rm = s->registered_methods; rm; rm = rm->next) {
1203
- grpc_slice host;
1204
- bool has_host;
1205
- grpc_slice method;
1206
- if (rm->host != nullptr) {
1207
- host = grpc_slice_from_static_string(rm->host);
1208
- has_host = true;
1209
- } else {
1210
- has_host = false;
1211
+ grpc_core::ExternallyManagedSlice host;
1212
+ grpc_core::ExternallyManagedSlice method(rm->method);
1213
+ const bool has_host = rm->host != nullptr;
1214
+ if (has_host) {
1215
+ host = grpc_core::ExternallyManagedSlice(rm->host);
1211
1216
  }
1212
- method = grpc_slice_from_static_string(rm->method);
1213
- hash = GRPC_MDSTR_KV_HASH(has_host ? grpc_slice_hash_internal(host) : 0,
1214
- grpc_slice_hash_internal(method));
1217
+ hash = GRPC_MDSTR_KV_HASH(has_host ? host.Hash() : 0, method.Hash());
1215
1218
  for (probes = 0; chand->registered_methods[(hash + probes) % slots]
1216
1219
  .server_registered_method != nullptr;
1217
1220
  probes++)
@@ -1237,13 +1240,12 @@ void grpc_server_setup_transport(
1237
1240
  chand->next->prev = chand->prev->next = chand;
1238
1241
  gpr_mu_unlock(&s->mu_global);
1239
1242
 
1240
- GRPC_CHANNEL_INTERNAL_REF(channel, "connectivity");
1241
1243
  op = grpc_make_transport_op(nullptr);
1242
1244
  op->set_accept_stream = true;
1243
1245
  op->set_accept_stream_fn = accept_stream;
1244
1246
  op->set_accept_stream_user_data = chand;
1245
- op->on_connectivity_state_change = &chand->channel_connectivity_changed;
1246
- op->connectivity_state = &chand->connectivity_state;
1247
+ op->start_connectivity_watch.reset(
1248
+ grpc_core::New<ConnectivityWatcher>(chand));
1247
1249
  if (gpr_atm_acq_load(&s->shutdown_flag) != 0) {
1248
1250
  op->disconnect_with_error =
1249
1251
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
@@ -1430,13 +1432,12 @@ static grpc_call_error queue_call_request(grpc_server* server, size_t cq_idx,
1430
1432
  rm = &rc->data.registered.method->matcher;
1431
1433
  break;
1432
1434
  }
1433
- if (gpr_locked_mpscq_push(&rm->requests_per_cq[cq_idx], &rc->request_link)) {
1435
+ if (rm->requests_per_cq[cq_idx].Push(rc->mpscq_node.get())) {
1434
1436
  /* this was the first queued request: we need to lock and start
1435
1437
  matching calls */
1436
1438
  gpr_mu_lock(&server->mu_call);
1437
1439
  while ((calld = rm->pending_head) != nullptr) {
1438
- rc = reinterpret_cast<requested_call*>(
1439
- gpr_locked_mpscq_pop(&rm->requests_per_cq[cq_idx]));
1440
+ rc = reinterpret_cast<requested_call*>(rm->requests_per_cq[cq_idx].Pop());
1440
1441
  if (rc == nullptr) break;
1441
1442
  rm->pending_head = calld->pending_next;
1442
1443
  gpr_mu_unlock(&server->mu_call);
@@ -25,4 +25,4 @@
25
25
 
26
26
  const char* grpc_version_string(void) { return "8.0.0"; }
27
27
 
28
- const char* grpc_g_stands_for(void) { return "ganges"; }
28
+ const char* grpc_g_stands_for(void) { return "game"; }
@@ -22,7 +22,6 @@
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
24
  #include <grpc/slice_buffer.h>
25
- #include "src/core/lib/gprpp/abstract.h"
26
25
  #include "src/core/lib/gprpp/orphanable.h"
27
26
  #include "src/core/lib/iomgr/closure.h"
28
27
 
@@ -45,14 +44,13 @@ class ByteStream : public Orphanable {
45
44
  //
46
45
  // max_size_hint can be set as a hint as to the maximum number
47
46
  // of bytes that would be acceptable to read.
48
- virtual bool Next(size_t max_size_hint,
49
- grpc_closure* on_complete) GRPC_ABSTRACT;
47
+ virtual bool Next(size_t max_size_hint, grpc_closure* on_complete) = 0;
50
48
 
51
49
  // Returns the next slice in the byte stream when it is available, as
52
50
  // indicated by Next().
53
51
  //
54
52
  // Once a slice is returned into *slice, it is owned by the caller.
55
- virtual grpc_error* Pull(grpc_slice* slice) GRPC_ABSTRACT;
53
+ virtual grpc_error* Pull(grpc_slice* slice) = 0;
56
54
 
57
55
  // Shuts down the byte stream.
58
56
  //
@@ -61,15 +59,13 @@ class ByteStream : public Orphanable {
61
59
  //
62
60
  // The next call to Pull() (if any) will return the error passed to
63
61
  // Shutdown().
64
- virtual void Shutdown(grpc_error* error) GRPC_ABSTRACT;
62
+ virtual void Shutdown(grpc_error* error) = 0;
65
63
 
66
64
  uint32_t length() const { return length_; }
67
65
  uint32_t flags() const { return flags_; }
68
66
 
69
67
  void set_flags(uint32_t flags) { flags_ = flags; }
70
68
 
71
- GRPC_ABSTRACT_BASE_CLASS
72
-
73
69
  protected:
74
70
  ByteStream(uint32_t length, uint32_t flags)
75
71
  : length_(length), flags_(flags) {}
@@ -26,9 +26,14 @@
26
26
  #include <grpc/support/log.h>
27
27
  #include <grpc/support/string_util.h>
28
28
 
29
- grpc_core::TraceFlag grpc_connectivity_state_trace(false, "connectivity_state");
29
+ #include "src/core/lib/iomgr/combiner.h"
30
+ #include "src/core/lib/iomgr/exec_ctx.h"
30
31
 
31
- const char* grpc_connectivity_state_name(grpc_connectivity_state state) {
32
+ namespace grpc_core {
33
+
34
+ TraceFlag grpc_connectivity_state_trace(false, "connectivity_state");
35
+
36
+ const char* ConnectivityStateName(grpc_connectivity_state state) {
32
37
  switch (state) {
33
38
  case GRPC_CHANNEL_IDLE:
34
39
  return "IDLE";
@@ -44,122 +49,131 @@ const char* grpc_connectivity_state_name(grpc_connectivity_state state) {
44
49
  GPR_UNREACHABLE_CODE(return "UNKNOWN");
45
50
  }
46
51
 
47
- void grpc_connectivity_state_init(grpc_connectivity_state_tracker* tracker,
48
- grpc_connectivity_state init_state,
49
- const char* name) {
50
- gpr_atm_no_barrier_store(&tracker->current_state_atm, init_state);
51
- tracker->watchers = nullptr;
52
- tracker->name = gpr_strdup(name);
53
- }
54
-
55
- void grpc_connectivity_state_destroy(grpc_connectivity_state_tracker* tracker) {
56
- grpc_error* error;
57
- grpc_connectivity_state_watcher* w;
58
- while ((w = tracker->watchers)) {
59
- tracker->watchers = w->next;
52
+ //
53
+ // AsyncConnectivityStateWatcherInterface
54
+ //
60
55
 
61
- if (GRPC_CHANNEL_SHUTDOWN != *w->current) {
62
- *w->current = GRPC_CHANNEL_SHUTDOWN;
63
- error = GRPC_ERROR_NONE;
56
+ // A fire-and-forget class to asynchronously deliver a connectivity
57
+ // state notification to a watcher.
58
+ class AsyncConnectivityStateWatcherInterface::Notifier {
59
+ public:
60
+ Notifier(RefCountedPtr<AsyncConnectivityStateWatcherInterface> watcher,
61
+ grpc_connectivity_state state, Combiner* combiner)
62
+ : watcher_(std::move(watcher)), state_(state) {
63
+ if (combiner != nullptr) {
64
+ combiner->Run(
65
+ GRPC_CLOSURE_INIT(&closure_, SendNotification, this, nullptr),
66
+ GRPC_ERROR_NONE);
64
67
  } else {
65
- error =
66
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Shutdown connectivity owner");
68
+ GRPC_CLOSURE_INIT(&closure_, SendNotification, this,
69
+ grpc_schedule_on_exec_ctx);
70
+ GRPC_CLOSURE_SCHED(&closure_, GRPC_ERROR_NONE);
67
71
  }
68
- GRPC_CLOSURE_SCHED(w->notify, error);
69
- gpr_free(w);
70
72
  }
71
- gpr_free(tracker->name);
72
- }
73
73
 
74
- grpc_connectivity_state grpc_connectivity_state_check(
75
- grpc_connectivity_state_tracker* tracker) {
76
- grpc_connectivity_state cur = static_cast<grpc_connectivity_state>(
77
- gpr_atm_no_barrier_load(&tracker->current_state_atm));
78
- if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
79
- gpr_log(GPR_INFO, "CONWATCH: %p %s: get %s", tracker, tracker->name,
80
- grpc_connectivity_state_name(cur));
74
+ private:
75
+ static void SendNotification(void* arg, grpc_error* ignored) {
76
+ Notifier* self = static_cast<Notifier*>(arg);
77
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
78
+ gpr_log(GPR_INFO, "watcher %p: delivering async notification for %s",
79
+ self->watcher_.get(), ConnectivityStateName(self->state_));
80
+ }
81
+ self->watcher_->OnConnectivityStateChange(self->state_);
82
+ Delete(self);
81
83
  }
82
- return cur;
84
+
85
+ RefCountedPtr<AsyncConnectivityStateWatcherInterface> watcher_;
86
+ const grpc_connectivity_state state_;
87
+ grpc_closure closure_;
88
+ };
89
+
90
+ void AsyncConnectivityStateWatcherInterface::Notify(
91
+ grpc_connectivity_state state) {
92
+ New<Notifier>(Ref(), state, combiner_); // Deletes itself when done.
83
93
  }
84
94
 
85
- bool grpc_connectivity_state_has_watchers(
86
- grpc_connectivity_state_tracker* connectivity_state) {
87
- return connectivity_state->watchers != nullptr;
95
+ //
96
+ // ConnectivityStateTracker
97
+ //
98
+
99
+ ConnectivityStateTracker::~ConnectivityStateTracker() {
100
+ grpc_connectivity_state current_state = state_.Load(MemoryOrder::RELAXED);
101
+ if (current_state == GRPC_CHANNEL_SHUTDOWN) return;
102
+ for (const auto& p : watchers_) {
103
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
104
+ gpr_log(GPR_INFO,
105
+ "ConnectivityStateTracker %s[%p]: notifying watcher %p: %s -> %s",
106
+ name_, this, p.first, ConnectivityStateName(current_state),
107
+ ConnectivityStateName(GRPC_CHANNEL_SHUTDOWN));
108
+ }
109
+ p.second->Notify(GRPC_CHANNEL_SHUTDOWN);
110
+ }
88
111
  }
89
112
 
90
- bool grpc_connectivity_state_notify_on_state_change(
91
- grpc_connectivity_state_tracker* tracker, grpc_connectivity_state* current,
92
- grpc_closure* notify) {
93
- grpc_connectivity_state cur = static_cast<grpc_connectivity_state>(
94
- gpr_atm_no_barrier_load(&tracker->current_state_atm));
113
+ void ConnectivityStateTracker::AddWatcher(
114
+ grpc_connectivity_state initial_state,
115
+ OrphanablePtr<ConnectivityStateWatcherInterface> watcher) {
95
116
  if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
96
- if (current == nullptr) {
97
- gpr_log(GPR_INFO, "CONWATCH: %p %s: unsubscribe notify=%p", tracker,
98
- tracker->name, notify);
99
- } else {
100
- gpr_log(GPR_INFO, "CONWATCH: %p %s: from %s [cur=%s] notify=%p", tracker,
101
- tracker->name, grpc_connectivity_state_name(*current),
102
- grpc_connectivity_state_name(cur), notify);
103
- }
117
+ gpr_log(GPR_INFO, "ConnectivityStateTracker %s[%p]: add watcher %p", name_,
118
+ this, watcher.get());
104
119
  }
105
- if (current == nullptr) {
106
- grpc_connectivity_state_watcher* w = tracker->watchers;
107
- if (w != nullptr && w->notify == notify) {
108
- GRPC_CLOSURE_SCHED(notify, GRPC_ERROR_CANCELLED);
109
- tracker->watchers = w->next;
110
- gpr_free(w);
111
- return false;
112
- }
113
- while (w != nullptr) {
114
- grpc_connectivity_state_watcher* rm_candidate = w->next;
115
- if (rm_candidate != nullptr && rm_candidate->notify == notify) {
116
- GRPC_CLOSURE_SCHED(notify, GRPC_ERROR_CANCELLED);
117
- w->next = w->next->next;
118
- gpr_free(rm_candidate);
119
- return false;
120
- }
121
- w = w->next;
122
- }
123
- return false;
124
- } else {
125
- if (cur != *current) {
126
- *current = cur;
127
- GRPC_CLOSURE_SCHED(notify, GRPC_ERROR_NONE);
128
- } else {
129
- grpc_connectivity_state_watcher* w =
130
- static_cast<grpc_connectivity_state_watcher*>(gpr_malloc(sizeof(*w)));
131
- w->current = current;
132
- w->notify = notify;
133
- w->next = tracker->watchers;
134
- tracker->watchers = w;
120
+ grpc_connectivity_state current_state = state_.Load(MemoryOrder::RELAXED);
121
+ if (initial_state != current_state) {
122
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
123
+ gpr_log(GPR_INFO,
124
+ "ConnectivityStateTracker %s[%p]: notifying watcher %p: %s -> %s",
125
+ name_, this, watcher.get(), ConnectivityStateName(initial_state),
126
+ ConnectivityStateName(current_state));
135
127
  }
136
- return cur == GRPC_CHANNEL_IDLE;
128
+ watcher->Notify(current_state);
129
+ }
130
+ // If we're in state SHUTDOWN, don't add the watcher, so that it will
131
+ // be orphaned immediately.
132
+ if (current_state != GRPC_CHANNEL_SHUTDOWN) {
133
+ watchers_.insert(std::make_pair(watcher.get(), std::move(watcher)));
137
134
  }
138
135
  }
139
136
 
140
- void grpc_connectivity_state_set(grpc_connectivity_state_tracker* tracker,
141
- grpc_connectivity_state state,
142
- const char* reason) {
143
- grpc_connectivity_state cur = static_cast<grpc_connectivity_state>(
144
- gpr_atm_no_barrier_load(&tracker->current_state_atm));
145
- grpc_connectivity_state_watcher* w;
137
+ void ConnectivityStateTracker::RemoveWatcher(
138
+ ConnectivityStateWatcherInterface* watcher) {
146
139
  if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
147
- gpr_log(GPR_INFO, "SET: %p %s: %s --> %s [%s]", tracker, tracker->name,
148
- grpc_connectivity_state_name(cur),
149
- grpc_connectivity_state_name(state), reason);
140
+ gpr_log(GPR_INFO, "ConnectivityStateTracker %s[%p]: remove watcher %p",
141
+ name_, this, watcher);
150
142
  }
151
- if (cur == state) {
152
- return;
143
+ watchers_.erase(watcher);
144
+ }
145
+
146
+ void ConnectivityStateTracker::SetState(grpc_connectivity_state state,
147
+ const char* reason) {
148
+ grpc_connectivity_state current_state = state_.Load(MemoryOrder::RELAXED);
149
+ if (state == current_state) return;
150
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
151
+ gpr_log(GPR_INFO, "ConnectivityStateTracker %s[%p]: %s -> %s (%s)", name_,
152
+ this, ConnectivityStateName(current_state),
153
+ ConnectivityStateName(state), reason);
153
154
  }
154
- GPR_ASSERT(cur != GRPC_CHANNEL_SHUTDOWN);
155
- gpr_atm_no_barrier_store(&tracker->current_state_atm, state);
156
- while ((w = tracker->watchers) != nullptr) {
157
- *w->current = state;
158
- tracker->watchers = w->next;
155
+ state_.Store(state, MemoryOrder::RELAXED);
156
+ for (const auto& p : watchers_) {
159
157
  if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
160
- gpr_log(GPR_INFO, "NOTIFY: %p %s: %p", tracker, tracker->name, w->notify);
158
+ gpr_log(GPR_INFO,
159
+ "ConnectivityStateTracker %s[%p]: notifying watcher %p: %s -> %s",
160
+ name_, this, p.first, ConnectivityStateName(current_state),
161
+ ConnectivityStateName(state));
161
162
  }
162
- GRPC_CLOSURE_SCHED(w->notify, GRPC_ERROR_NONE);
163
- gpr_free(w);
163
+ p.second->Notify(state);
164
164
  }
165
+ // If the new state is SHUTDOWN, orphan all of the watchers. This
166
+ // avoids the need for the callers to explicitly cancel them.
167
+ if (state == GRPC_CHANNEL_SHUTDOWN) watchers_.clear();
165
168
  }
169
+
170
+ grpc_connectivity_state ConnectivityStateTracker::state() const {
171
+ grpc_connectivity_state state = state_.Load(MemoryOrder::RELAXED);
172
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_connectivity_state_trace)) {
173
+ gpr_log(GPR_INFO, "ConnectivityStateTracker %s[%p]: get current state: %s",
174
+ name_, this, ConnectivityStateName(state));
175
+ }
176
+ return state;
177
+ }
178
+
179
+ } // namespace grpc_core