grpc 1.8.7 → 1.9.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 (488) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +549 -325
  3. data/include/grpc/impl/codegen/grpc_types.h +1 -2
  4. data/include/grpc/impl/codegen/port_platform.h +46 -5
  5. data/include/grpc/impl/codegen/slice.h +1 -2
  6. data/include/grpc/module.modulemap +0 -2
  7. data/include/grpc/slice_buffer.h +1 -2
  8. data/include/grpc/support/log.h +4 -2
  9. data/include/grpc/support/thd.h +4 -1
  10. data/include/grpc/support/tls.h +6 -0
  11. data/include/grpc/support/tls_gcc.h +5 -40
  12. data/include/grpc/support/tls_msvc.h +9 -0
  13. data/include/grpc/support/tls_pthread.h +9 -0
  14. data/src/core/ext/filters/client_channel/backup_poller.cc +32 -29
  15. data/src/core/ext/filters/client_channel/backup_poller.h +2 -2
  16. data/src/core/ext/filters/client_channel/channel_connectivity.cc +26 -32
  17. data/src/core/ext/filters/client_channel/client_channel.cc +325 -356
  18. data/src/core/ext/filters/client_channel/client_channel.h +4 -12
  19. data/src/core/ext/filters/client_channel/client_channel_factory.cc +9 -14
  20. data/src/core/ext/filters/client_channel/client_channel_factory.h +7 -20
  21. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +7 -10
  22. data/src/core/ext/filters/client_channel/connector.cc +6 -7
  23. data/src/core/ext/filters/client_channel/connector.h +6 -16
  24. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +38 -50
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +0 -8
  26. data/src/core/ext/filters/client_channel/http_proxy.cc +9 -13
  27. data/src/core/ext/filters/client_channel/http_proxy.h +0 -8
  28. data/src/core/ext/filters/client_channel/lb_policy.cc +72 -94
  29. data/src/core/ext/filters/client_channel/lb_policy.h +83 -92
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -19
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +0 -8
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +474 -591
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -8
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +2 -10
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +6 -6
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +0 -8
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +0 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +0 -9
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +3 -4
  40. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +9 -12
  41. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +160 -182
  42. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -221
  43. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +24 -35
  44. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +9 -20
  45. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +6 -9
  46. data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -15
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -3
  48. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -9
  49. data/src/core/ext/filters/client_channel/parse_address.cc +1 -1
  50. data/src/core/ext/filters/client_channel/parse_address.h +0 -8
  51. data/src/core/ext/filters/client_channel/proxy_mapper.cc +6 -8
  52. data/src/core/ext/filters/client_channel/proxy_mapper.h +6 -16
  53. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +13 -17
  54. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +2 -12
  55. data/src/core/ext/filters/client_channel/resolver.cc +11 -13
  56. data/src/core/ext/filters/client_channel/resolver.h +14 -25
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +57 -70
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -12
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +23 -31
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +27 -45
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -15
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +9 -11
  63. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +53 -66
  64. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +25 -33
  65. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -9
  66. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +26 -35
  67. data/src/core/ext/filters/client_channel/resolver_factory.cc +2 -3
  68. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -12
  69. data/src/core/ext/filters/client_channel/resolver_registry.cc +12 -15
  70. data/src/core/ext/filters/client_channel/resolver_registry.h +3 -12
  71. data/src/core/ext/filters/client_channel/retry_throttle.h +0 -8
  72. data/src/core/ext/filters/client_channel/subchannel.cc +289 -301
  73. data/src/core/ext/filters/client_channel/subchannel.h +57 -84
  74. data/src/core/ext/filters/client_channel/subchannel_index.cc +30 -33
  75. data/src/core/ext/filters/client_channel/subchannel_index.h +4 -16
  76. data/src/core/ext/filters/client_channel/uri_parser.cc +13 -17
  77. data/src/core/ext/filters/client_channel/uri_parser.h +1 -10
  78. data/src/core/ext/filters/deadline/deadline_filter.cc +49 -67
  79. data/src/core/ext/filters/deadline/deadline_filter.h +4 -14
  80. data/src/core/ext/filters/http/client/http_client_filter.cc +60 -77
  81. data/src/core/ext/filters/http/client/http_client_filter.h +0 -8
  82. data/src/core/ext/filters/http/http_filters_plugin.cc +4 -6
  83. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +63 -79
  84. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -8
  85. data/src/core/ext/filters/http/server/http_server_filter.cc +57 -71
  86. data/src/core/ext/filters/http/server/http_server_filter.h +0 -8
  87. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +19 -24
  88. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +0 -8
  89. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +3 -3
  90. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -8
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +49 -62
  92. data/src/core/ext/filters/max_age/max_age_filter.h +0 -8
  93. data/src/core/ext/filters/message_size/message_size_filter.cc +23 -29
  94. data/src/core/ext/filters/message_size/message_size_filter.h +0 -8
  95. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +15 -18
  96. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +0 -8
  97. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -8
  98. data/src/core/ext/transport/chttp2/alpn/alpn.h +0 -8
  99. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +33 -40
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -8
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +15 -17
  102. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +8 -8
  103. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +23 -28
  104. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +50 -57
  105. data/src/core/ext/transport/chttp2/server/chttp2_server.h +1 -10
  106. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -3
  107. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +7 -10
  108. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +5 -6
  109. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +7 -9
  110. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -11
  111. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -9
  112. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +10 -2
  113. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +516 -636
  114. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +4 -11
  115. data/src/core/ext/transport/chttp2/transport/flow_control.cc +29 -13
  116. data/src/core/ext/transport/chttp2/transport/flow_control.h +196 -53
  117. data/src/core/ext/transport/chttp2/transport/frame.h +0 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_data.cc +31 -33
  119. data/src/core/ext/transport/chttp2/transport/frame_data.h +3 -12
  120. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -3
  121. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +1 -10
  122. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -9
  124. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  125. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +1 -10
  126. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +8 -3
  127. data/src/core/ext/transport/chttp2/transport/frame_settings.h +1 -10
  128. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +8 -8
  129. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -11
  130. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +63 -81
  131. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -12
  132. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +230 -318
  133. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +6 -19
  134. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +14 -20
  135. data/src/core/ext/transport/chttp2/transport/hpack_table.h +5 -16
  136. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -7
  137. data/src/core/ext/transport/chttp2/transport/huffsyms.h +0 -8
  138. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +8 -11
  139. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +4 -13
  140. data/src/core/ext/transport/chttp2/transport/internal.h +51 -75
  141. data/src/core/ext/transport/chttp2/transport/parsing.cc +83 -109
  142. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -0
  143. data/src/core/ext/transport/chttp2/transport/stream_map.h +0 -8
  144. data/src/core/ext/transport/chttp2/transport/varint.h +0 -8
  145. data/src/core/ext/transport/chttp2/transport/writing.cc +61 -65
  146. data/src/core/ext/transport/inproc/inproc_plugin.cc +2 -4
  147. data/src/core/ext/transport/inproc/inproc_transport.cc +177 -188
  148. data/src/core/ext/transport/inproc/inproc_transport.h +0 -8
  149. data/src/core/lib/backoff/backoff.cc +39 -44
  150. data/src/core/lib/backoff/backoff.h +61 -57
  151. data/src/core/lib/channel/channel_args.cc +8 -10
  152. data/src/core/lib/channel/channel_args.h +4 -13
  153. data/src/core/lib/channel/channel_stack.cc +19 -27
  154. data/src/core/lib/channel/channel_stack.h +27 -47
  155. data/src/core/lib/channel/channel_stack_builder.cc +11 -14
  156. data/src/core/lib/channel/channel_stack_builder.h +4 -15
  157. data/src/core/lib/channel/connected_channel.cc +23 -36
  158. data/src/core/lib/channel/connected_channel.h +1 -10
  159. data/src/core/lib/channel/handshaker.cc +31 -40
  160. data/src/core/lib/channel/handshaker.h +14 -25
  161. data/src/core/lib/channel/handshaker_factory.cc +6 -6
  162. data/src/core/lib/channel/handshaker_factory.h +5 -15
  163. data/src/core/lib/channel/handshaker_registry.cc +9 -13
  164. data/src/core/lib/channel/handshaker_registry.h +2 -11
  165. data/src/core/lib/compression/algorithm_metadata.h +0 -8
  166. data/src/core/lib/compression/message_compress.cc +19 -23
  167. data/src/core/lib/compression/message_compress.h +2 -12
  168. data/src/core/lib/compression/stream_compression.cc +1 -1
  169. data/src/core/lib/compression/stream_compression.h +0 -8
  170. data/src/core/lib/compression/stream_compression_gzip.cc +12 -11
  171. data/src/core/lib/compression/stream_compression_gzip.h +0 -8
  172. data/src/core/lib/compression/stream_compression_identity.h +0 -8
  173. data/src/core/lib/debug/stats.cc +4 -4
  174. data/src/core/lib/debug/stats.h +9 -19
  175. data/src/core/lib/debug/stats_data.cc +85 -116
  176. data/src/core/lib/debug/stats_data.h +236 -312
  177. data/src/core/lib/debug/trace.cc +1 -1
  178. data/src/core/lib/debug/trace.h +0 -12
  179. data/src/core/lib/{support → gpr++}/abstract.h +8 -3
  180. data/src/core/lib/{support → gpr++}/atomic.h +5 -5
  181. data/src/core/lib/{support → gpr++}/atomic_with_atm.h +3 -3
  182. data/src/core/lib/{support → gpr++}/atomic_with_std.h +3 -3
  183. data/src/core/lib/gpr++/debug_location.h +52 -0
  184. data/src/core/lib/gpr++/inlined_vector.h +112 -0
  185. data/src/core/lib/{support → gpr++}/manual_constructor.h +2 -2
  186. data/src/core/lib/{support → gpr++}/memory.h +3 -3
  187. data/src/core/lib/gpr++/orphanable.h +171 -0
  188. data/src/core/lib/gpr++/ref_counted.h +133 -0
  189. data/src/core/lib/gpr++/ref_counted_ptr.h +99 -0
  190. data/src/core/lib/{support → gpr}/alloc.cc +0 -0
  191. data/src/core/lib/{support → gpr}/arena.cc +1 -1
  192. data/src/core/lib/{support → gpr}/arena.h +3 -11
  193. data/src/core/lib/{support → gpr}/atm.cc +0 -0
  194. data/src/core/lib/{support → gpr}/avl.cc +0 -0
  195. data/src/core/lib/{support → gpr}/cmdline.cc +1 -1
  196. data/src/core/lib/{support → gpr}/cpu_iphone.cc +0 -0
  197. data/src/core/lib/{support → gpr}/cpu_linux.cc +0 -0
  198. data/src/core/lib/{support → gpr}/cpu_posix.cc +0 -0
  199. data/src/core/lib/{support → gpr}/cpu_windows.cc +0 -0
  200. data/src/core/lib/{support → gpr}/env.h +3 -11
  201. data/src/core/lib/{support → gpr}/env_linux.cc +2 -2
  202. data/src/core/lib/{support → gpr}/env_posix.cc +4 -4
  203. data/src/core/lib/{support → gpr}/env_windows.cc +3 -3
  204. data/src/core/lib/{support → gpr}/fork.cc +3 -3
  205. data/src/core/lib/{support → gpr}/fork.h +3 -3
  206. data/src/core/lib/{support → gpr}/host_port.cc +1 -1
  207. data/src/core/lib/{support → gpr}/log.cc +3 -3
  208. data/src/core/lib/{support → gpr}/log_android.cc +3 -3
  209. data/src/core/lib/{support → gpr}/log_linux.cc +1 -1
  210. data/src/core/lib/{support → gpr}/log_posix.cc +5 -5
  211. data/src/core/lib/{support → gpr}/log_windows.cc +3 -3
  212. data/src/core/lib/{support → gpr}/mpscq.cc +1 -1
  213. data/src/core/lib/{support → gpr}/mpscq.h +3 -10
  214. data/src/core/lib/{support → gpr}/murmur_hash.cc +1 -1
  215. data/src/core/lib/{support → gpr}/murmur_hash.h +3 -11
  216. data/src/core/lib/{support → gpr}/spinlock.h +3 -3
  217. data/src/core/lib/{support → gpr}/string.cc +1 -1
  218. data/src/core/lib/{support → gpr}/string.h +3 -10
  219. data/src/core/lib/{support → gpr}/string_posix.cc +0 -0
  220. data/src/core/lib/{support → gpr}/string_util_windows.cc +2 -2
  221. data/src/core/lib/{support → gpr}/string_windows.cc +1 -1
  222. data/src/core/lib/{support → gpr}/string_windows.h +3 -11
  223. data/src/core/lib/{support → gpr}/subprocess_posix.cc +0 -0
  224. data/src/core/lib/{support → gpr}/subprocess_windows.cc +2 -2
  225. data/src/core/lib/{support → gpr}/sync.cc +0 -0
  226. data/src/core/lib/{support → gpr}/sync_posix.cc +10 -1
  227. data/src/core/lib/{support → gpr}/sync_windows.cc +0 -0
  228. data/src/core/lib/{support → gpr}/thd.cc +0 -0
  229. data/src/core/lib/{support → gpr}/thd_internal.h +3 -3
  230. data/src/core/lib/{support → gpr}/thd_posix.cc +18 -2
  231. data/src/core/lib/{support → gpr}/thd_windows.cc +2 -1
  232. data/src/core/lib/{support → gpr}/time.cc +0 -0
  233. data/src/core/lib/{support → gpr}/time_posix.cc +2 -4
  234. data/src/core/lib/{support → gpr}/time_precise.cc +1 -1
  235. data/src/core/lib/{support → gpr}/time_precise.h +3 -11
  236. data/src/core/lib/{support → gpr}/time_windows.cc +1 -3
  237. data/src/core/lib/{support → gpr}/tls_pthread.cc +0 -0
  238. data/src/core/lib/{support → gpr}/tmpfile.h +3 -11
  239. data/src/core/lib/{support → gpr}/tmpfile_msys.cc +2 -2
  240. data/src/core/lib/{support → gpr}/tmpfile_posix.cc +2 -2
  241. data/src/core/lib/{support → gpr}/tmpfile_windows.cc +2 -2
  242. data/src/core/lib/{support → gpr}/wrap_memcpy.cc +0 -0
  243. data/src/core/lib/http/format_request.cc +1 -1
  244. data/src/core/lib/http/format_request.h +0 -8
  245. data/src/core/lib/http/httpcli.cc +55 -74
  246. data/src/core/lib/http/httpcli.h +13 -22
  247. data/src/core/lib/http/httpcli_security_connector.cc +27 -33
  248. data/src/core/lib/http/parser.h +0 -8
  249. data/src/core/lib/iomgr/block_annotate.h +10 -17
  250. data/src/core/lib/iomgr/call_combiner.cc +14 -17
  251. data/src/core/lib/iomgr/call_combiner.h +16 -34
  252. data/src/core/lib/iomgr/closure.h +24 -37
  253. data/src/core/lib/iomgr/combiner.cc +62 -66
  254. data/src/core/lib/iomgr/combiner.h +6 -16
  255. data/src/core/lib/iomgr/endpoint.cc +15 -21
  256. data/src/core/lib/iomgr/endpoint.h +16 -33
  257. data/src/core/lib/iomgr/endpoint_pair.h +0 -8
  258. data/src/core/lib/iomgr/endpoint_pair_posix.cc +4 -5
  259. data/src/core/lib/iomgr/endpoint_pair_windows.cc +4 -6
  260. data/src/core/lib/iomgr/error.cc +2 -6
  261. data/src/core/lib/iomgr/error.h +4 -9
  262. data/src/core/lib/iomgr/error_internal.h +0 -8
  263. data/src/core/lib/iomgr/ev_epoll1_linux.cc +110 -117
  264. data/src/core/lib/iomgr/ev_epoll1_linux.h +0 -8
  265. data/src/core/lib/iomgr/ev_epollex_linux.cc +111 -141
  266. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -8
  267. data/src/core/lib/iomgr/ev_epollsig_linux.cc +83 -109
  268. data/src/core/lib/iomgr/ev_epollsig_linux.h +2 -10
  269. data/src/core/lib/iomgr/ev_poll_posix.cc +103 -125
  270. data/src/core/lib/iomgr/ev_poll_posix.h +0 -8
  271. data/src/core/lib/iomgr/ev_posix.cc +35 -50
  272. data/src/core/lib/iomgr/ev_posix.h +27 -53
  273. data/src/core/lib/iomgr/exec_ctx.cc +46 -78
  274. data/src/core/lib/iomgr/exec_ctx.h +127 -60
  275. data/src/core/lib/iomgr/executor.cc +34 -38
  276. data/src/core/lib/iomgr/executor.h +3 -11
  277. data/src/core/lib/iomgr/fork_posix.cc +13 -12
  278. data/src/core/lib/iomgr/gethostname.h +0 -8
  279. data/src/core/lib/iomgr/gethostname_sysconf.cc +1 -1
  280. data/src/core/lib/iomgr/iocp_windows.cc +14 -16
  281. data/src/core/lib/iomgr/iocp_windows.h +1 -10
  282. data/src/core/lib/iomgr/iomgr.cc +60 -59
  283. data/src/core/lib/iomgr/iomgr.h +3 -12
  284. data/src/core/lib/iomgr/iomgr_internal.h +0 -8
  285. data/src/core/lib/iomgr/iomgr_uv.cc +2 -3
  286. data/src/core/lib/iomgr/iomgr_uv.h +0 -8
  287. data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -1
  288. data/src/core/lib/iomgr/load_file.cc +1 -1
  289. data/src/core/lib/iomgr/load_file.h +0 -8
  290. data/src/core/lib/iomgr/lockfree_event.cc +7 -8
  291. data/src/core/lib/iomgr/lockfree_event.h +3 -3
  292. data/src/core/lib/iomgr/polling_entity.cc +6 -10
  293. data/src/core/lib/iomgr/polling_entity.h +2 -11
  294. data/src/core/lib/iomgr/pollset.h +4 -13
  295. data/src/core/lib/iomgr/pollset_set.h +5 -18
  296. data/src/core/lib/iomgr/pollset_set_uv.cc +5 -10
  297. data/src/core/lib/iomgr/pollset_set_windows.cc +5 -10
  298. data/src/core/lib/iomgr/pollset_uv.cc +8 -9
  299. data/src/core/lib/iomgr/pollset_uv.h +0 -8
  300. data/src/core/lib/iomgr/pollset_windows.cc +14 -15
  301. data/src/core/lib/iomgr/pollset_windows.h +0 -8
  302. data/src/core/lib/iomgr/port.h +6 -1
  303. data/src/core/lib/iomgr/resolve_address.h +1 -10
  304. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -12
  305. data/src/core/lib/iomgr/resolve_address_uv.cc +7 -8
  306. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -9
  307. data/src/core/lib/iomgr/resource_quota.cc +77 -107
  308. data/src/core/lib/iomgr/resource_quota.h +8 -25
  309. data/src/core/lib/iomgr/sockaddr_utils.cc +1 -1
  310. data/src/core/lib/iomgr/sockaddr_utils.h +0 -8
  311. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  312. data/src/core/lib/iomgr/socket_factory_posix.h +0 -8
  313. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  314. data/src/core/lib/iomgr/socket_mutator.h +1 -9
  315. data/src/core/lib/iomgr/socket_utils.h +0 -8
  316. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -1
  317. data/src/core/lib/iomgr/socket_utils_posix.h +0 -8
  318. data/src/core/lib/iomgr/socket_windows.cc +8 -11
  319. data/src/core/lib/iomgr/socket_windows.h +3 -14
  320. data/src/core/lib/iomgr/tcp_client.h +1 -10
  321. data/src/core/lib/iomgr/tcp_client_posix.cc +94 -78
  322. data/src/core/lib/iomgr/tcp_client_posix.h +36 -8
  323. data/src/core/lib/iomgr/tcp_client_uv.cc +16 -23
  324. data/src/core/lib/iomgr/tcp_client_windows.cc +22 -25
  325. data/src/core/lib/iomgr/tcp_posix.cc +131 -153
  326. data/src/core/lib/iomgr/tcp_posix.h +3 -12
  327. data/src/core/lib/iomgr/tcp_server.h +6 -17
  328. data/src/core/lib/iomgr/tcp_server_posix.cc +31 -35
  329. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -8
  330. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -1
  331. data/src/core/lib/iomgr/tcp_server_uv.cc +23 -34
  332. data/src/core/lib/iomgr/tcp_server_windows.cc +24 -34
  333. data/src/core/lib/iomgr/tcp_uv.cc +42 -56
  334. data/src/core/lib/iomgr/tcp_uv.h +0 -8
  335. data/src/core/lib/iomgr/tcp_windows.cc +43 -50
  336. data/src/core/lib/iomgr/tcp_windows.h +1 -9
  337. data/src/core/lib/iomgr/time_averaged_stats.h +0 -8
  338. data/src/core/lib/iomgr/timer.h +6 -15
  339. data/src/core/lib/iomgr/timer_generic.cc +22 -27
  340. data/src/core/lib/iomgr/timer_heap.h +0 -8
  341. data/src/core/lib/iomgr/timer_manager.cc +17 -19
  342. data/src/core/lib/iomgr/timer_manager.h +0 -8
  343. data/src/core/lib/iomgr/timer_uv.cc +12 -14
  344. data/src/core/lib/iomgr/udp_server.cc +148 -54
  345. data/src/core/lib/iomgr/udp_server.h +16 -21
  346. data/src/core/lib/iomgr/unix_sockets_posix.h +0 -8
  347. data/src/core/lib/iomgr/wakeup_fd_cv.cc +4 -4
  348. data/src/core/lib/iomgr/wakeup_fd_cv.h +12 -20
  349. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +1 -1
  350. data/src/core/lib/iomgr/wakeup_fd_pipe.h +0 -8
  351. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -8
  352. data/src/core/lib/json/json.h +0 -8
  353. data/src/core/lib/json/json_reader.h +0 -8
  354. data/src/core/lib/json/json_writer.h +0 -8
  355. data/src/core/lib/profiling/basic_timers.cc +3 -2
  356. data/src/core/lib/profiling/timers.h +0 -8
  357. data/src/core/lib/security/context/security_context.cc +9 -10
  358. data/src/core/lib/security/context/security_context.h +0 -8
  359. data/src/core/lib/security/credentials/composite/composite_credentials.cc +23 -28
  360. data/src/core/lib/security/credentials/composite/composite_credentials.h +0 -8
  361. data/src/core/lib/security/credentials/credentials.cc +33 -42
  362. data/src/core/lib/security/credentials/credentials.h +24 -43
  363. data/src/core/lib/security/credentials/credentials_metadata.cc +2 -2
  364. data/src/core/lib/security/credentials/fake/fake_credentials.cc +16 -22
  365. data/src/core/lib/security/credentials/fake/fake_credentials.h +0 -8
  366. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +3 -3
  367. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +28 -34
  368. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +0 -8
  369. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -13
  370. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  371. data/src/core/lib/security/credentials/jwt/json_token.h +0 -8
  372. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +14 -20
  373. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +1 -10
  374. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +56 -72
  375. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +5 -17
  376. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +47 -55
  377. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +3 -12
  378. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +23 -28
  379. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +8 -13
  380. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +0 -8
  381. data/src/core/lib/security/transport/auth_filters.h +0 -8
  382. data/src/core/lib/security/transport/client_auth_filter.cc +45 -54
  383. data/src/core/lib/security/transport/lb_targets_info.cc +2 -2
  384. data/src/core/lib/security/transport/lb_targets_info.h +0 -8
  385. data/src/core/lib/security/transport/secure_endpoint.cc +54 -68
  386. data/src/core/lib/security/transport/secure_endpoint.h +0 -8
  387. data/src/core/lib/security/transport/security_connector.cc +62 -86
  388. data/src/core/lib/security/transport/security_connector.h +22 -39
  389. data/src/core/lib/security/transport/security_handshaker.cc +83 -106
  390. data/src/core/lib/security/transport/security_handshaker.h +1 -10
  391. data/src/core/lib/security/transport/server_auth_filter.cc +31 -38
  392. data/src/core/lib/security/transport/tsi_error.h +0 -8
  393. data/src/core/lib/security/util/json_util.h +0 -8
  394. data/src/core/lib/slice/b64.cc +5 -6
  395. data/src/core/lib/slice/b64.h +3 -12
  396. data/src/core/lib/slice/percent_encoding.h +0 -8
  397. data/src/core/lib/slice/slice.cc +8 -9
  398. data/src/core/lib/slice/slice_buffer.cc +11 -16
  399. data/src/core/lib/slice/slice_hash_table.cc +5 -7
  400. data/src/core/lib/slice/slice_hash_table.h +2 -12
  401. data/src/core/lib/slice/slice_intern.cc +4 -5
  402. data/src/core/lib/slice/slice_internal.h +4 -15
  403. data/src/core/lib/slice/slice_string_helpers.cc +1 -1
  404. data/src/core/lib/slice/slice_string_helpers.h +1 -9
  405. data/src/core/lib/surface/alarm.cc +11 -14
  406. data/src/core/lib/surface/alarm_internal.h +0 -8
  407. data/src/core/lib/surface/byte_buffer.cc +2 -3
  408. data/src/core/lib/surface/byte_buffer_reader.cc +7 -9
  409. data/src/core/lib/surface/call.cc +198 -241
  410. data/src/core/lib/surface/call.h +9 -23
  411. data/src/core/lib/surface/call_details.cc +3 -4
  412. data/src/core/lib/surface/call_log_batch.cc +1 -1
  413. data/src/core/lib/surface/call_test_only.h +0 -8
  414. data/src/core/lib/surface/channel.cc +53 -64
  415. data/src/core/lib/surface/channel.h +12 -23
  416. data/src/core/lib/surface/channel_init.cc +2 -3
  417. data/src/core/lib/surface/channel_init.h +2 -12
  418. data/src/core/lib/surface/channel_ping.cc +7 -9
  419. data/src/core/lib/surface/channel_stack_type.h +0 -8
  420. data/src/core/lib/surface/completion_queue.cc +158 -176
  421. data/src/core/lib/surface/completion_queue.h +9 -20
  422. data/src/core/lib/surface/completion_queue_factory.h +0 -8
  423. data/src/core/lib/surface/event_string.cc +1 -1
  424. data/src/core/lib/surface/event_string.h +0 -8
  425. data/src/core/lib/surface/init.cc +27 -25
  426. data/src/core/lib/surface/init.h +0 -8
  427. data/src/core/lib/surface/init_secure.cc +2 -2
  428. data/src/core/lib/surface/lame_client.cc +30 -33
  429. data/src/core/lib/surface/lame_client.h +0 -8
  430. data/src/core/lib/surface/server.cc +151 -203
  431. data/src/core/lib/surface/server.h +7 -16
  432. data/src/core/lib/surface/validate_metadata.h +0 -8
  433. data/src/core/lib/surface/version.cc +2 -2
  434. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  435. data/src/core/lib/transport/bdp_estimator.h +1 -1
  436. data/src/core/lib/transport/byte_stream.cc +24 -38
  437. data/src/core/lib/transport/byte_stream.h +10 -25
  438. data/src/core/lib/transport/connectivity_state.cc +9 -13
  439. data/src/core/lib/transport/connectivity_state.h +4 -14
  440. data/src/core/lib/transport/error_utils.cc +6 -6
  441. data/src/core/lib/transport/error_utils.h +2 -11
  442. data/src/core/lib/transport/metadata.cc +21 -23
  443. data/src/core/lib/transport/metadata.h +8 -20
  444. data/src/core/lib/transport/metadata_batch.cc +34 -45
  445. data/src/core/lib/transport/metadata_batch.h +18 -32
  446. data/src/core/lib/transport/service_config.cc +11 -15
  447. data/src/core/lib/transport/service_config.h +3 -13
  448. data/src/core/lib/transport/static_metadata.cc +1 -1
  449. data/src/core/lib/transport/static_metadata.h +1 -7
  450. data/src/core/lib/transport/status_conversion.cc +2 -3
  451. data/src/core/lib/transport/status_conversion.h +1 -10
  452. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  453. data/src/core/lib/transport/timeout_encoding.h +1 -9
  454. data/src/core/lib/transport/transport.cc +36 -50
  455. data/src/core/lib/transport/transport.h +28 -30
  456. data/src/core/lib/transport/transport_impl.h +12 -23
  457. data/src/core/lib/transport/transport_op_string.cc +2 -2
  458. data/src/core/plugin_registry/grpc_plugin_registry.cc +34 -34
  459. data/src/core/tsi/fake_transport_security.cc +7 -10
  460. data/src/core/tsi/fake_transport_security.h +0 -8
  461. data/src/core/tsi/gts_transport_security.cc +2 -2
  462. data/src/core/tsi/gts_transport_security.h +0 -8
  463. data/src/core/tsi/ssl_transport_security.cc +3 -0
  464. data/src/core/tsi/ssl_transport_security.h +0 -8
  465. data/src/core/tsi/ssl_types.h +0 -8
  466. data/src/core/tsi/transport_security.h +1 -9
  467. data/src/core/tsi/transport_security_adapter.h +0 -8
  468. data/src/core/tsi/transport_security_grpc.cc +11 -18
  469. data/src/core/tsi/transport_security_grpc.h +9 -21
  470. data/src/core/tsi/transport_security_interface.h +0 -8
  471. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -30
  472. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +2 -48
  473. data/src/ruby/lib/grpc/version.rb +1 -1
  474. data/src/ruby/spec/channel_connection_spec.rb +2 -1
  475. data/src/ruby/spec/client_auth_spec.rb +1 -1
  476. data/src/ruby/spec/client_server_spec.rb +2 -2
  477. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  478. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  479. data/src/ruby/spec/generic/interceptor_registry_spec.rb +1 -1
  480. data/src/ruby/spec/generic/rpc_server_spec.rb +12 -12
  481. data/src/ruby/spec/google_rpc_status_utils_spec.rb +3 -2
  482. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  483. data/src/ruby/spec/server_spec.rb +9 -9
  484. data/src/ruby/spec/support/helpers.rb +35 -1
  485. metadata +68 -66
  486. data/include/grpc/impl/codegen/exec_ctx_fwd.h +0 -26
  487. data/include/grpc/support/histogram.h +0 -64
  488. data/src/core/lib/support/histogram.cc +0 -227
@@ -21,17 +21,9 @@
21
21
 
22
22
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
23
23
 
24
- #ifdef __cplusplus
25
- extern "C" {
26
- #endif
27
-
28
24
  /** Returns a load balancing factory for the glb policy, which tries to connect
29
25
  * to a load balancing server to decide the next successfully connected
30
26
  * subchannel to pick. */
31
27
  grpc_lb_policy_factory* grpc_glb_lb_factory_create();
32
28
 
33
- #ifdef __cplusplus
34
- }
35
- #endif
36
-
37
29
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_H */
@@ -23,10 +23,6 @@
23
23
  #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
24
24
  #include "src/core/lib/slice/slice_hash_table.h"
25
25
 
26
- #ifdef __cplusplus
27
- extern "C" {
28
- #endif
29
-
30
26
  /** Create the channel used for communicating with an LB service.
31
27
  * Note that an LB *service* may be comprised of several LB *servers*.
32
28
  *
@@ -35,18 +31,14 @@ extern "C" {
35
31
  * \a client_channel_factory will be used for the creation of the LB channel,
36
32
  * alongside the channel args passed in \a args. */
37
33
  grpc_channel* grpc_lb_policy_grpclb_create_lb_channel(
38
- grpc_exec_ctx* exec_ctx, const char* lb_service_target_addresses,
34
+ const char* lb_service_target_addresses,
39
35
  grpc_client_channel_factory* client_channel_factory,
40
36
  grpc_channel_args* args);
41
37
 
42
38
  grpc_channel_args* grpc_lb_policy_grpclb_build_lb_channel_args(
43
- grpc_exec_ctx* exec_ctx, grpc_slice_hash_table* targets_info,
39
+ grpc_slice_hash_table* targets_info,
44
40
  grpc_fake_resolver_response_generator* response_generator,
45
41
  const grpc_channel_args* args);
46
42
 
47
- #ifdef __cplusplus
48
- }
49
- #endif
50
-
51
43
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CHANNEL_H \
52
44
  */
@@ -22,14 +22,14 @@
22
22
  #include "src/core/ext/filters/client_channel/client_channel.h"
23
23
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h"
24
24
  #include "src/core/lib/channel/channel_args.h"
25
+ #include "src/core/lib/gpr/string.h"
25
26
  #include "src/core/lib/iomgr/sockaddr_utils.h"
26
27
  #include "src/core/lib/security/credentials/credentials.h"
27
28
  #include "src/core/lib/security/transport/lb_targets_info.h"
28
29
  #include "src/core/lib/slice/slice_internal.h"
29
- #include "src/core/lib/support/string.h"
30
30
 
31
31
  grpc_channel* grpc_lb_policy_grpclb_create_lb_channel(
32
- grpc_exec_ctx* exec_ctx, const char* lb_service_target_addresses,
32
+ const char* lb_service_target_addresses,
33
33
  grpc_client_channel_factory* client_channel_factory,
34
34
  grpc_channel_args* args) {
35
35
  grpc_channel_args* new_args = args;
@@ -50,19 +50,19 @@ grpc_channel* grpc_lb_policy_grpclb_create_lb_channel(
50
50
  new_args = grpc_channel_args_copy_and_add_and_remove(
51
51
  args, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), args_to_add,
52
52
  GPR_ARRAY_SIZE(args_to_add));
53
- grpc_channel_credentials_unref(exec_ctx, creds_sans_call_creds);
53
+ grpc_channel_credentials_unref(creds_sans_call_creds);
54
54
  }
55
55
  grpc_channel* lb_channel = grpc_client_channel_factory_create_channel(
56
- exec_ctx, client_channel_factory, lb_service_target_addresses,
56
+ client_channel_factory, lb_service_target_addresses,
57
57
  GRPC_CLIENT_CHANNEL_TYPE_LOAD_BALANCING, new_args);
58
58
  if (channel_credentials != nullptr) {
59
- grpc_channel_args_destroy(exec_ctx, new_args);
59
+ grpc_channel_args_destroy(new_args);
60
60
  }
61
61
  return lb_channel;
62
62
  }
63
63
 
64
64
  grpc_channel_args* grpc_lb_policy_grpclb_build_lb_channel_args(
65
- grpc_exec_ctx* exec_ctx, grpc_slice_hash_table* targets_info,
65
+ grpc_slice_hash_table* targets_info,
66
66
  grpc_fake_resolver_response_generator* response_generator,
67
67
  const grpc_channel_args* args) {
68
68
  const grpc_arg to_add[] = {
@@ -23,10 +23,6 @@
23
23
 
24
24
  #include <grpc/impl/codegen/grpc_types.h>
25
25
 
26
- #ifdef __cplusplus
27
- extern "C" {
28
- #endif
29
-
30
26
  typedef struct grpc_grpclb_client_stats grpc_grpclb_client_stats;
31
27
 
32
28
  typedef struct {
@@ -65,9 +61,5 @@ void grpc_grpclb_client_stats_get_locked(
65
61
  void grpc_grpclb_dropped_call_counts_destroy(
66
62
  grpc_grpclb_dropped_call_counts* drop_entries);
67
63
 
68
- #ifdef __cplusplus
69
- }
70
- #endif
71
-
72
64
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H \
73
65
  */
@@ -215,9 +215,6 @@ grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
215
215
  return nullptr;
216
216
  }
217
217
  }
218
- if (res.server_list.has_expiration_interval) {
219
- sl->expiration_interval = res.server_list.expiration_interval;
220
- }
221
218
  return sl;
222
219
  }
223
220
 
@@ -237,8 +234,6 @@ grpc_grpclb_serverlist* grpc_grpclb_serverlist_copy(
237
234
  grpc_grpclb_serverlist* copy =
238
235
  (grpc_grpclb_serverlist*)gpr_zalloc(sizeof(grpc_grpclb_serverlist));
239
236
  copy->num_servers = sl->num_servers;
240
- memcpy(&copy->expiration_interval, &sl->expiration_interval,
241
- sizeof(grpc_grpclb_duration));
242
237
  copy->servers = (grpc_grpclb_server**)gpr_malloc(sizeof(grpc_grpclb_server*) *
243
238
  sl->num_servers);
244
239
  for (size_t i = 0; i < sl->num_servers; i++) {
@@ -257,10 +252,6 @@ bool grpc_grpclb_serverlist_equals(const grpc_grpclb_serverlist* lhs,
257
252
  if (lhs->num_servers != rhs->num_servers) {
258
253
  return false;
259
254
  }
260
- if (grpc_grpclb_duration_compare(&lhs->expiration_interval,
261
- &rhs->expiration_interval) != 0) {
262
- return false;
263
- }
264
255
  for (size_t i = 0; i < lhs->num_servers; i++) {
265
256
  if (!grpc_grpclb_server_equals(lhs->servers[i], rhs->servers[i])) {
266
257
  return false;
@@ -25,10 +25,6 @@
25
25
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
26
26
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
27
27
 
28
- #ifdef __cplusplus
29
- extern "C" {
30
- #endif
31
-
32
28
  #define GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH 128
33
29
 
34
30
  typedef grpc_lb_v1_Server_ip_address_t grpc_grpclb_ip_address;
@@ -39,7 +35,6 @@ typedef grpc_lb_v1_Duration grpc_grpclb_duration;
39
35
  typedef struct {
40
36
  grpc_grpclb_server** servers;
41
37
  size_t num_servers;
42
- grpc_grpclb_duration expiration_interval;
43
38
  } grpc_grpclb_serverlist;
44
39
 
45
40
  /** Create a request for a gRPC LB service under \a lb_service_name */
@@ -87,9 +82,5 @@ grpc_millis grpc_grpclb_duration_to_millis(grpc_grpclb_duration* duration_pb);
87
82
  void grpc_grpclb_initial_response_destroy(
88
83
  grpc_grpclb_initial_response* response);
89
84
 
90
- #ifdef __cplusplus
91
- }
92
- #endif
93
-
94
85
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_LOAD_BALANCER_API_H \
95
86
  */
@@ -61,9 +61,8 @@ const pb_field_t grpc_lb_v1_InitialLoadBalanceResponse_fields[3] = {
61
61
  PB_LAST_FIELD
62
62
  };
63
63
 
64
- const pb_field_t grpc_lb_v1_ServerList_fields[3] = {
64
+ const pb_field_t grpc_lb_v1_ServerList_fields[2] = {
65
65
  PB_FIELD( 1, MESSAGE , REPEATED, CALLBACK, FIRST, grpc_lb_v1_ServerList, servers, servers, &grpc_lb_v1_Server_fields),
66
- PB_FIELD( 3, MESSAGE , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ServerList, expiration_interval, servers, &grpc_lb_v1_Duration_fields),
67
66
  PB_LAST_FIELD
68
67
  };
69
68
 
@@ -85,7 +84,7 @@ const pb_field_t grpc_lb_v1_Server_fields[5] = {
85
84
  * numbers or field sizes that are larger than what can fit in 8 or 16 bit
86
85
  * field descriptors.
87
86
  */
88
- PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, calls_finished_with_drop) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v1_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStatsPerToken_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
87
+ PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, calls_finished_with_drop) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v1_ServerList, servers) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStatsPerToken_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
89
88
  #endif
90
89
 
91
90
  #if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
@@ -96,7 +95,7 @@ PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request)
96
95
  * numbers or field sizes that are larger than what can fit in the default
97
96
  * 8 bit descriptors.
98
97
  */
99
- PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 256 && pb_membersize(grpc_lb_v1_ClientStats, calls_finished_with_drop) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v1_ServerList, servers) < 256 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStatsPerToken_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
98
+ PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 256 && pb_membersize(grpc_lb_v1_ClientStats, calls_finished_with_drop) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v1_ServerList, servers) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStatsPerToken_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
100
99
  #endif
101
100
 
102
101
 
@@ -14,6 +14,11 @@ extern "C" {
14
14
  #endif
15
15
 
16
16
  /* Struct definitions */
17
+ typedef struct _grpc_lb_v1_ServerList {
18
+ pb_callback_t servers;
19
+ /* @@protoc_insertion_point(struct:grpc_lb_v1_ServerList) */
20
+ } grpc_lb_v1_ServerList;
21
+
17
22
  typedef struct _grpc_lb_v1_ClientStatsPerToken {
18
23
  pb_callback_t load_balance_token;
19
24
  bool has_num_calls;
@@ -79,13 +84,6 @@ typedef struct _grpc_lb_v1_InitialLoadBalanceResponse {
79
84
  /* @@protoc_insertion_point(struct:grpc_lb_v1_InitialLoadBalanceResponse) */
80
85
  } grpc_lb_v1_InitialLoadBalanceResponse;
81
86
 
82
- typedef struct _grpc_lb_v1_ServerList {
83
- pb_callback_t servers;
84
- bool has_expiration_interval;
85
- grpc_lb_v1_Duration expiration_interval;
86
- /* @@protoc_insertion_point(struct:grpc_lb_v1_ServerList) */
87
- } grpc_lb_v1_ServerList;
88
-
89
87
  typedef struct _grpc_lb_v1_LoadBalanceRequest {
90
88
  bool has_initial_request;
91
89
  grpc_lb_v1_InitialLoadBalanceRequest initial_request;
@@ -113,7 +111,7 @@ typedef struct _grpc_lb_v1_LoadBalanceResponse {
113
111
  #define grpc_lb_v1_ClientStats_init_default {false, grpc_lb_v1_Timestamp_init_default, false, 0, false, 0, false, 0, false, 0, {{NULL}, NULL}}
114
112
  #define grpc_lb_v1_LoadBalanceResponse_init_default {false, grpc_lb_v1_InitialLoadBalanceResponse_init_default, false, grpc_lb_v1_ServerList_init_default}
115
113
  #define grpc_lb_v1_InitialLoadBalanceResponse_init_default {false, "", false, grpc_lb_v1_Duration_init_default}
116
- #define grpc_lb_v1_ServerList_init_default {{{NULL}, NULL}, false, grpc_lb_v1_Duration_init_default}
114
+ #define grpc_lb_v1_ServerList_init_default {{{NULL}, NULL}}
117
115
  #define grpc_lb_v1_Server_init_default {false, {0, {0}}, false, 0, false, "", false, 0}
118
116
  #define grpc_lb_v1_Duration_init_zero {false, 0, false, 0}
119
117
  #define grpc_lb_v1_Timestamp_init_zero {false, 0, false, 0}
@@ -123,10 +121,11 @@ typedef struct _grpc_lb_v1_LoadBalanceResponse {
123
121
  #define grpc_lb_v1_ClientStats_init_zero {false, grpc_lb_v1_Timestamp_init_zero, false, 0, false, 0, false, 0, false, 0, {{NULL}, NULL}}
124
122
  #define grpc_lb_v1_LoadBalanceResponse_init_zero {false, grpc_lb_v1_InitialLoadBalanceResponse_init_zero, false, grpc_lb_v1_ServerList_init_zero}
125
123
  #define grpc_lb_v1_InitialLoadBalanceResponse_init_zero {false, "", false, grpc_lb_v1_Duration_init_zero}
126
- #define grpc_lb_v1_ServerList_init_zero {{{NULL}, NULL}, false, grpc_lb_v1_Duration_init_zero}
124
+ #define grpc_lb_v1_ServerList_init_zero {{{NULL}, NULL}}
127
125
  #define grpc_lb_v1_Server_init_zero {false, {0, {0}}, false, 0, false, "", false, 0}
128
126
 
129
127
  /* Field tags (for use in manual encoding/decoding) */
128
+ #define grpc_lb_v1_ServerList_servers_tag 1
130
129
  #define grpc_lb_v1_ClientStatsPerToken_load_balance_token_tag 1
131
130
  #define grpc_lb_v1_ClientStatsPerToken_num_calls_tag 2
132
131
  #define grpc_lb_v1_Duration_seconds_tag 1
@@ -146,8 +145,6 @@ typedef struct _grpc_lb_v1_LoadBalanceResponse {
146
145
  #define grpc_lb_v1_ClientStats_calls_finished_with_drop_tag 8
147
146
  #define grpc_lb_v1_InitialLoadBalanceResponse_load_balancer_delegate_tag 1
148
147
  #define grpc_lb_v1_InitialLoadBalanceResponse_client_stats_report_interval_tag 2
149
- #define grpc_lb_v1_ServerList_servers_tag 1
150
- #define grpc_lb_v1_ServerList_expiration_interval_tag 3
151
148
  #define grpc_lb_v1_LoadBalanceRequest_initial_request_tag 1
152
149
  #define grpc_lb_v1_LoadBalanceRequest_client_stats_tag 2
153
150
  #define grpc_lb_v1_LoadBalanceResponse_initial_response_tag 1
@@ -162,7 +159,7 @@ extern const pb_field_t grpc_lb_v1_ClientStatsPerToken_fields[3];
162
159
  extern const pb_field_t grpc_lb_v1_ClientStats_fields[7];
163
160
  extern const pb_field_t grpc_lb_v1_LoadBalanceResponse_fields[3];
164
161
  extern const pb_field_t grpc_lb_v1_InitialLoadBalanceResponse_fields[3];
165
- extern const pb_field_t grpc_lb_v1_ServerList_fields[3];
162
+ extern const pb_field_t grpc_lb_v1_ServerList_fields[2];
166
163
  extern const pb_field_t grpc_lb_v1_Server_fields[5];
167
164
 
168
165
  /* Maximum encoded size of messages (where known) */
@@ -31,13 +31,6 @@
31
31
 
32
32
  grpc_core::TraceFlag grpc_lb_pick_first_trace(false, "pick_first");
33
33
 
34
- typedef struct pending_pick {
35
- struct pending_pick* next;
36
- uint32_t initial_metadata_flags;
37
- grpc_connected_subchannel** target;
38
- grpc_closure* on_complete;
39
- } pending_pick;
40
-
41
34
  typedef struct {
42
35
  /** base policy: must be first */
43
36
  grpc_lb_policy base;
@@ -52,17 +45,17 @@ typedef struct {
52
45
  /** are we shut down? */
53
46
  bool shutdown;
54
47
  /** list of picks that are waiting on connectivity */
55
- pending_pick* pending_picks;
48
+ grpc_lb_policy_pick_state* pending_picks;
56
49
  /** our connectivity state tracker */
57
50
  grpc_connectivity_state_tracker state_tracker;
58
51
  } pick_first_lb_policy;
59
52
 
60
- static void pf_destroy(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol) {
53
+ static void pf_destroy(grpc_lb_policy* pol) {
61
54
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
62
55
  GPR_ASSERT(p->subchannel_list == nullptr);
63
56
  GPR_ASSERT(p->latest_pending_subchannel_list == nullptr);
64
57
  GPR_ASSERT(p->pending_picks == nullptr);
65
- grpc_connectivity_state_destroy(exec_ctx, &p->state_tracker);
58
+ grpc_connectivity_state_destroy(&p->state_tracker);
66
59
  gpr_free(p);
67
60
  grpc_subchannel_index_unref();
68
61
  if (grpc_lb_pick_first_trace.enabled()) {
@@ -70,54 +63,58 @@ static void pf_destroy(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol) {
70
63
  }
71
64
  }
72
65
 
73
- static void shutdown_locked(grpc_exec_ctx* exec_ctx, pick_first_lb_policy* p,
74
- grpc_error* error) {
66
+ static void pf_shutdown_locked(grpc_lb_policy* pol,
67
+ grpc_lb_policy* new_policy) {
68
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
69
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel shutdown");
75
70
  if (grpc_lb_pick_first_trace.enabled()) {
76
71
  gpr_log(GPR_DEBUG, "Pick First %p Shutting down", p);
77
72
  }
78
73
  p->shutdown = true;
79
- pending_pick* pp;
80
- while ((pp = p->pending_picks) != nullptr) {
81
- p->pending_picks = pp->next;
82
- *pp->target = nullptr;
83
- GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete, GRPC_ERROR_REF(error));
84
- gpr_free(pp);
74
+ grpc_lb_policy_pick_state* pick;
75
+ while ((pick = p->pending_picks) != nullptr) {
76
+ p->pending_picks = pick->next;
77
+ if (new_policy != nullptr) {
78
+ // Hand off to new LB policy.
79
+ if (grpc_lb_policy_pick_locked(new_policy, pick)) {
80
+ // Synchronous return, schedule closure.
81
+ GRPC_CLOSURE_SCHED(pick->on_complete, GRPC_ERROR_NONE);
82
+ }
83
+ } else {
84
+ pick->connected_subchannel.reset();
85
+ GRPC_CLOSURE_SCHED(pick->on_complete, GRPC_ERROR_REF(error));
86
+ }
85
87
  }
86
- grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
87
- GRPC_CHANNEL_SHUTDOWN, GRPC_ERROR_REF(error),
88
- "shutdown");
88
+ grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_SHUTDOWN,
89
+ GRPC_ERROR_REF(error), "shutdown");
89
90
  if (p->subchannel_list != nullptr) {
90
- grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
91
+ grpc_lb_subchannel_list_shutdown_and_unref(p->subchannel_list,
91
92
  "pf_shutdown");
92
93
  p->subchannel_list = nullptr;
93
94
  }
94
95
  if (p->latest_pending_subchannel_list != nullptr) {
95
96
  grpc_lb_subchannel_list_shutdown_and_unref(
96
- exec_ctx, p->latest_pending_subchannel_list, "pf_shutdown");
97
+ p->latest_pending_subchannel_list, "pf_shutdown");
97
98
  p->latest_pending_subchannel_list = nullptr;
98
99
  }
100
+ grpc_lb_policy_try_reresolve(&p->base, &grpc_lb_pick_first_trace,
101
+ GRPC_ERROR_CANCELLED);
99
102
  GRPC_ERROR_UNREF(error);
100
103
  }
101
104
 
102
- static void pf_shutdown_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol) {
103
- shutdown_locked(exec_ctx, (pick_first_lb_policy*)pol,
104
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel shutdown"));
105
- }
106
-
107
- static void pf_cancel_pick_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol,
108
- grpc_connected_subchannel** target,
105
+ static void pf_cancel_pick_locked(grpc_lb_policy* pol,
106
+ grpc_lb_policy_pick_state* pick,
109
107
  grpc_error* error) {
110
108
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
111
- pending_pick* pp = p->pending_picks;
109
+ grpc_lb_policy_pick_state* pp = p->pending_picks;
112
110
  p->pending_picks = nullptr;
113
111
  while (pp != nullptr) {
114
- pending_pick* next = pp->next;
115
- if (pp->target == target) {
116
- *target = nullptr;
117
- GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete,
112
+ grpc_lb_policy_pick_state* next = pp->next;
113
+ if (pp == pick) {
114
+ pick->connected_subchannel.reset();
115
+ GRPC_CLOSURE_SCHED(pick->on_complete,
118
116
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
119
117
  "Pick Cancelled", &error, 1));
120
- gpr_free(pp);
121
118
  } else {
122
119
  pp->next = p->pending_picks;
123
120
  p->pending_picks = pp;
@@ -127,117 +124,110 @@ static void pf_cancel_pick_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol,
127
124
  GRPC_ERROR_UNREF(error);
128
125
  }
129
126
 
130
- static void pf_cancel_picks_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol,
127
+ static void pf_cancel_picks_locked(grpc_lb_policy* pol,
131
128
  uint32_t initial_metadata_flags_mask,
132
129
  uint32_t initial_metadata_flags_eq,
133
130
  grpc_error* error) {
134
131
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
135
- pending_pick* pp = p->pending_picks;
132
+ grpc_lb_policy_pick_state* pick = p->pending_picks;
136
133
  p->pending_picks = nullptr;
137
- while (pp != nullptr) {
138
- pending_pick* next = pp->next;
139
- if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
134
+ while (pick != nullptr) {
135
+ grpc_lb_policy_pick_state* next = pick->next;
136
+ if ((pick->initial_metadata_flags & initial_metadata_flags_mask) ==
140
137
  initial_metadata_flags_eq) {
141
- GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete,
138
+ GRPC_CLOSURE_SCHED(pick->on_complete,
142
139
  GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
143
140
  "Pick Cancelled", &error, 1));
144
- gpr_free(pp);
145
141
  } else {
146
- pp->next = p->pending_picks;
147
- p->pending_picks = pp;
142
+ pick->next = p->pending_picks;
143
+ p->pending_picks = pick;
148
144
  }
149
- pp = next;
145
+ pick = next;
150
146
  }
151
147
  GRPC_ERROR_UNREF(error);
152
148
  }
153
149
 
154
- static void start_picking_locked(grpc_exec_ctx* exec_ctx,
155
- pick_first_lb_policy* p) {
150
+ static void start_picking_locked(pick_first_lb_policy* p) {
156
151
  p->started_picking = true;
157
152
  if (p->subchannel_list != nullptr &&
158
153
  p->subchannel_list->num_subchannels > 0) {
159
154
  p->subchannel_list->checking_subchannel = 0;
160
- grpc_lb_subchannel_list_ref_for_connectivity_watch(
161
- p->subchannel_list, "connectivity_watch+start_picking");
162
- grpc_lb_subchannel_data_start_connectivity_watch(
163
- exec_ctx, &p->subchannel_list->subchannels[0]);
155
+ for (size_t i = 0; i < p->subchannel_list->num_subchannels; ++i) {
156
+ if (p->subchannel_list->subchannels[i].subchannel != nullptr) {
157
+ grpc_lb_subchannel_list_ref_for_connectivity_watch(
158
+ p->subchannel_list, "connectivity_watch+start_picking");
159
+ grpc_lb_subchannel_data_start_connectivity_watch(
160
+ &p->subchannel_list->subchannels[i]);
161
+ break;
162
+ }
163
+ }
164
164
  }
165
165
  }
166
166
 
167
- static void pf_exit_idle_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol) {
167
+ static void pf_exit_idle_locked(grpc_lb_policy* pol) {
168
168
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
169
169
  if (!p->started_picking) {
170
- start_picking_locked(exec_ctx, p);
170
+ start_picking_locked(p);
171
171
  }
172
172
  }
173
173
 
174
- static int pf_pick_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol,
175
- const grpc_lb_policy_pick_args* pick_args,
176
- grpc_connected_subchannel** target,
177
- grpc_call_context_element* context, void** user_data,
178
- grpc_closure* on_complete) {
174
+ static int pf_pick_locked(grpc_lb_policy* pol,
175
+ grpc_lb_policy_pick_state* pick) {
179
176
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
180
177
  // If we have a selected subchannel already, return synchronously.
181
178
  if (p->selected != nullptr) {
182
- *target = GRPC_CONNECTED_SUBCHANNEL_REF(p->selected->connected_subchannel,
183
- "picked");
179
+ pick->connected_subchannel = p->selected->connected_subchannel;
184
180
  return 1;
185
181
  }
186
182
  // No subchannel selected yet, so handle asynchronously.
187
183
  if (!p->started_picking) {
188
- start_picking_locked(exec_ctx, p);
184
+ start_picking_locked(p);
189
185
  }
190
- pending_pick* pp = (pending_pick*)gpr_malloc(sizeof(*pp));
191
- pp->next = p->pending_picks;
192
- pp->target = target;
193
- pp->initial_metadata_flags = pick_args->initial_metadata_flags;
194
- pp->on_complete = on_complete;
195
- p->pending_picks = pp;
186
+ pick->next = p->pending_picks;
187
+ p->pending_picks = pick;
196
188
  return 0;
197
189
  }
198
190
 
199
- static void destroy_unselected_subchannels_locked(grpc_exec_ctx* exec_ctx,
200
- pick_first_lb_policy* p) {
191
+ static void destroy_unselected_subchannels_locked(pick_first_lb_policy* p) {
201
192
  for (size_t i = 0; i < p->subchannel_list->num_subchannels; ++i) {
202
193
  grpc_lb_subchannel_data* sd = &p->subchannel_list->subchannels[i];
203
194
  if (p->selected != sd) {
204
- grpc_lb_subchannel_data_unref_subchannel(exec_ctx, sd,
195
+ grpc_lb_subchannel_data_unref_subchannel(sd,
205
196
  "selected_different_subchannel");
206
197
  }
207
198
  }
208
199
  }
209
200
 
210
201
  static grpc_connectivity_state pf_check_connectivity_locked(
211
- grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol, grpc_error** error) {
202
+ grpc_lb_policy* pol, grpc_error** error) {
212
203
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
213
204
  return grpc_connectivity_state_get(&p->state_tracker, error);
214
205
  }
215
206
 
216
- static void pf_notify_on_state_change_locked(grpc_exec_ctx* exec_ctx,
217
- grpc_lb_policy* pol,
207
+ static void pf_notify_on_state_change_locked(grpc_lb_policy* pol,
218
208
  grpc_connectivity_state* current,
219
209
  grpc_closure* notify) {
220
210
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
221
- grpc_connectivity_state_notify_on_state_change(exec_ctx, &p->state_tracker,
222
- current, notify);
211
+ grpc_connectivity_state_notify_on_state_change(&p->state_tracker, current,
212
+ notify);
223
213
  }
224
214
 
225
- static void pf_ping_one_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol,
226
- grpc_closure* closure) {
215
+ static void pf_ping_one_locked(grpc_lb_policy* pol, grpc_closure* on_initiate,
216
+ grpc_closure* on_ack) {
227
217
  pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
228
218
  if (p->selected) {
229
- grpc_connected_subchannel_ping(exec_ctx, p->selected->connected_subchannel,
230
- closure);
219
+ p->selected->connected_subchannel->Ping(on_initiate, on_ack);
231
220
  } else {
232
- GRPC_CLOSURE_SCHED(exec_ctx, closure,
221
+ GRPC_CLOSURE_SCHED(on_initiate,
222
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Not connected"));
223
+ GRPC_CLOSURE_SCHED(on_ack,
233
224
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Not connected"));
234
225
  }
235
226
  }
236
227
 
237
- static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
238
- grpc_error* error);
228
+ static void pf_connectivity_changed_locked(void* arg, grpc_error* error);
239
229
 
240
- static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
230
+ static void pf_update_locked(grpc_lb_policy* policy,
241
231
  const grpc_lb_policy_args* args) {
242
232
  pick_first_lb_policy* p = (pick_first_lb_policy*)policy;
243
233
  const grpc_arg* arg =
@@ -246,7 +236,7 @@ static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
246
236
  if (p->subchannel_list == nullptr) {
247
237
  // If we don't have a current subchannel list, go into TRANSIENT FAILURE.
248
238
  grpc_connectivity_state_set(
249
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
239
+ &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
250
240
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing update in args"),
251
241
  "pf_update_missing");
252
242
  } else {
@@ -265,17 +255,17 @@ static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
265
255
  (void*)p, (unsigned long)addresses->num_addresses);
266
256
  }
267
257
  grpc_lb_subchannel_list* subchannel_list = grpc_lb_subchannel_list_create(
268
- exec_ctx, &p->base, &grpc_lb_pick_first_trace, addresses, args,
258
+ &p->base, &grpc_lb_pick_first_trace, addresses, args,
269
259
  pf_connectivity_changed_locked);
270
260
  if (subchannel_list->num_subchannels == 0) {
271
261
  // Empty update or no valid subchannels. Unsubscribe from all current
272
262
  // subchannels and put the channel in TRANSIENT_FAILURE.
273
263
  grpc_connectivity_state_set(
274
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
264
+ &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
275
265
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
276
266
  "pf_update_empty");
277
267
  if (p->subchannel_list != nullptr) {
278
- grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
268
+ grpc_lb_subchannel_list_shutdown_and_unref(p->subchannel_list,
279
269
  "sl_shutdown_empty_update");
280
270
  }
281
271
  p->subchannel_list = subchannel_list; // Empty list.
@@ -286,7 +276,7 @@ static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
286
276
  // We don't yet have a selected subchannel, so replace the current
287
277
  // subchannel list immediately.
288
278
  if (p->subchannel_list != nullptr) {
289
- grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
279
+ grpc_lb_subchannel_list_shutdown_and_unref(p->subchannel_list,
290
280
  "pf_update_before_selected");
291
281
  }
292
282
  p->subchannel_list = subchannel_list;
@@ -305,25 +295,24 @@ static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
305
295
  subchannel_list->num_subchannels);
306
296
  }
307
297
  if (p->selected->connected_subchannel != nullptr) {
308
- sd->connected_subchannel = GRPC_CONNECTED_SUBCHANNEL_REF(
309
- p->selected->connected_subchannel, "pf_update_includes_selected");
298
+ sd->connected_subchannel = p->selected->connected_subchannel;
310
299
  }
311
300
  p->selected = sd;
312
301
  if (p->subchannel_list != nullptr) {
313
302
  grpc_lb_subchannel_list_shutdown_and_unref(
314
- exec_ctx, p->subchannel_list, "pf_update_includes_selected");
303
+ p->subchannel_list, "pf_update_includes_selected");
315
304
  }
316
305
  p->subchannel_list = subchannel_list;
317
- destroy_unselected_subchannels_locked(exec_ctx, p);
306
+ destroy_unselected_subchannels_locked(p);
318
307
  grpc_lb_subchannel_list_ref_for_connectivity_watch(
319
308
  subchannel_list, "connectivity_watch+replace_selected");
320
- grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
309
+ grpc_lb_subchannel_data_start_connectivity_watch(sd);
321
310
  // If there was a previously pending update (which may or may
322
311
  // not have contained the currently selected subchannel), drop
323
312
  // it, so that it doesn't override what we've done here.
324
313
  if (p->latest_pending_subchannel_list != nullptr) {
325
314
  grpc_lb_subchannel_list_shutdown_and_unref(
326
- exec_ctx, p->latest_pending_subchannel_list,
315
+ p->latest_pending_subchannel_list,
327
316
  "pf_update_includes_selected+outdated");
328
317
  p->latest_pending_subchannel_list = nullptr;
329
318
  }
@@ -343,8 +332,7 @@ static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
343
332
  (void*)subchannel_list);
344
333
  }
345
334
  grpc_lb_subchannel_list_shutdown_and_unref(
346
- exec_ctx, p->latest_pending_subchannel_list,
347
- "sl_outdated_dont_smash");
335
+ p->latest_pending_subchannel_list, "sl_outdated_dont_smash");
348
336
  }
349
337
  p->latest_pending_subchannel_list = subchannel_list;
350
338
  }
@@ -354,12 +342,11 @@ static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
354
342
  grpc_lb_subchannel_list_ref_for_connectivity_watch(
355
343
  subchannel_list, "connectivity_watch+update");
356
344
  grpc_lb_subchannel_data_start_connectivity_watch(
357
- exec_ctx, &subchannel_list->subchannels[0]);
345
+ &subchannel_list->subchannels[0]);
358
346
  }
359
347
  }
360
348
 
361
- static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
362
- grpc_error* error) {
349
+ static void pf_connectivity_changed_locked(void* arg, grpc_error* error) {
363
350
  grpc_lb_subchannel_data* sd = (grpc_lb_subchannel_data*)arg;
364
351
  pick_first_lb_policy* p = (pick_first_lb_policy*)sd->subchannel_list->policy;
365
352
  if (grpc_lb_pick_first_trace.enabled()) {
@@ -377,18 +364,18 @@ static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
377
364
  }
378
365
  // If the policy is shutting down, unref and return.
379
366
  if (p->shutdown) {
380
- grpc_lb_subchannel_data_stop_connectivity_watch(exec_ctx, sd);
381
- grpc_lb_subchannel_data_unref_subchannel(exec_ctx, sd, "pf_shutdown");
382
- grpc_lb_subchannel_list_unref_for_connectivity_watch(
383
- exec_ctx, sd->subchannel_list, "pf_shutdown");
367
+ grpc_lb_subchannel_data_stop_connectivity_watch(sd);
368
+ grpc_lb_subchannel_data_unref_subchannel(sd, "pf_shutdown");
369
+ grpc_lb_subchannel_list_unref_for_connectivity_watch(sd->subchannel_list,
370
+ "pf_shutdown");
384
371
  return;
385
372
  }
386
373
  // If the subchannel list is shutting down, stop watching.
387
374
  if (sd->subchannel_list->shutting_down || error == GRPC_ERROR_CANCELLED) {
388
- grpc_lb_subchannel_data_stop_connectivity_watch(exec_ctx, sd);
389
- grpc_lb_subchannel_data_unref_subchannel(exec_ctx, sd, "pf_sl_shutdown");
390
- grpc_lb_subchannel_list_unref_for_connectivity_watch(
391
- exec_ctx, sd->subchannel_list, "pf_sl_shutdown");
375
+ grpc_lb_subchannel_data_stop_connectivity_watch(sd);
376
+ grpc_lb_subchannel_data_unref_subchannel(sd, "pf_sl_shutdown");
377
+ grpc_lb_subchannel_list_unref_for_connectivity_watch(sd->subchannel_list,
378
+ "pf_sl_shutdown");
392
379
  return;
393
380
  }
394
381
  // If we're still here, the notification must be for a subchannel in
@@ -404,29 +391,44 @@ static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
404
391
  if (sd->curr_connectivity_state != GRPC_CHANNEL_READY &&
405
392
  p->latest_pending_subchannel_list != nullptr) {
406
393
  p->selected = nullptr;
394
+ grpc_lb_subchannel_data_stop_connectivity_watch(sd);
395
+ grpc_lb_subchannel_list_unref_for_connectivity_watch(
396
+ sd->subchannel_list, "selected_not_ready+switch_to_update");
407
397
  grpc_lb_subchannel_list_shutdown_and_unref(
408
- exec_ctx, p->subchannel_list, "selected_not_ready+switch_to_update");
398
+ p->subchannel_list, "selected_not_ready+switch_to_update");
409
399
  p->subchannel_list = p->latest_pending_subchannel_list;
410
400
  p->latest_pending_subchannel_list = nullptr;
411
401
  grpc_connectivity_state_set(
412
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
402
+ &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
413
403
  GRPC_ERROR_REF(error), "selected_not_ready+switch_to_update");
414
404
  } else {
405
+ // TODO(juanlishen): we re-resolve when the selected subchannel goes to
406
+ // TRANSIENT_FAILURE because we used to shut down in this case before
407
+ // re-resolution is introduced. But we need to investigate whether we
408
+ // really want to take any action instead of waiting for the selected
409
+ // subchannel reconnecting.
410
+ GPR_ASSERT(sd->curr_connectivity_state != GRPC_CHANNEL_SHUTDOWN);
415
411
  if (sd->curr_connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
416
- /* if the selected channel goes bad, we're done */
417
- sd->curr_connectivity_state = GRPC_CHANNEL_SHUTDOWN;
418
- }
419
- grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
420
- sd->curr_connectivity_state,
421
- GRPC_ERROR_REF(error), "selected_changed");
422
- if (sd->curr_connectivity_state != GRPC_CHANNEL_SHUTDOWN) {
423
- // Renew notification.
424
- grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
425
- } else {
426
- grpc_lb_subchannel_data_stop_connectivity_watch(exec_ctx, sd);
412
+ // If the selected channel goes bad, request a re-resolution.
413
+ grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_IDLE,
414
+ GRPC_ERROR_NONE,
415
+ "selected_changed+reresolve");
416
+ p->started_picking = false;
417
+ grpc_lb_policy_try_reresolve(&p->base, &grpc_lb_pick_first_trace,
418
+ GRPC_ERROR_NONE);
419
+ // in transient failure. Rely on re-resolution to recover.
420
+ p->selected = nullptr;
421
+ grpc_lb_subchannel_data_stop_connectivity_watch(sd);
427
422
  grpc_lb_subchannel_list_unref_for_connectivity_watch(
428
- exec_ctx, sd->subchannel_list, "pf_selected_shutdown");
429
- shutdown_locked(exec_ctx, p, GRPC_ERROR_REF(error));
423
+ sd->subchannel_list, "pf_selected_shutdown");
424
+ grpc_lb_subchannel_data_unref_subchannel(
425
+ sd, "pf_selected_shutdown"); // Unrefs connected subchannel
426
+ } else {
427
+ grpc_connectivity_state_set(&p->state_tracker,
428
+ sd->curr_connectivity_state,
429
+ GRPC_ERROR_REF(error), "selected_changed");
430
+ // Renew notification.
431
+ grpc_lb_subchannel_data_start_connectivity_watch(sd);
430
432
  }
431
433
  }
432
434
  return;
@@ -444,47 +446,43 @@ static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
444
446
  case GRPC_CHANNEL_READY: {
445
447
  // Case 2. Promote p->latest_pending_subchannel_list to
446
448
  // p->subchannel_list.
449
+ sd->connected_subchannel =
450
+ grpc_subchannel_get_connected_subchannel(sd->subchannel);
447
451
  if (sd->subchannel_list == p->latest_pending_subchannel_list) {
448
452
  GPR_ASSERT(p->subchannel_list != nullptr);
449
- grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
453
+ grpc_lb_subchannel_list_shutdown_and_unref(p->subchannel_list,
450
454
  "finish_update");
451
455
  p->subchannel_list = p->latest_pending_subchannel_list;
452
456
  p->latest_pending_subchannel_list = nullptr;
453
457
  }
454
458
  // Cases 1 and 2.
455
- grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
456
- GRPC_CHANNEL_READY, GRPC_ERROR_NONE,
457
- "connecting_ready");
458
- sd->connected_subchannel = GRPC_CONNECTED_SUBCHANNEL_REF(
459
- grpc_subchannel_get_connected_subchannel(sd->subchannel),
460
- "connected");
459
+ grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_READY,
460
+ GRPC_ERROR_NONE, "connecting_ready");
461
461
  p->selected = sd;
462
462
  if (grpc_lb_pick_first_trace.enabled()) {
463
463
  gpr_log(GPR_INFO, "Pick First %p selected subchannel %p", (void*)p,
464
464
  (void*)sd->subchannel);
465
465
  }
466
466
  // Drop all other subchannels, since we are now connected.
467
- destroy_unselected_subchannels_locked(exec_ctx, p);
467
+ destroy_unselected_subchannels_locked(p);
468
468
  // Update any calls that were waiting for a pick.
469
- pending_pick* pp;
470
- while ((pp = p->pending_picks)) {
471
- p->pending_picks = pp->next;
472
- *pp->target = GRPC_CONNECTED_SUBCHANNEL_REF(
473
- p->selected->connected_subchannel, "picked");
469
+ grpc_lb_policy_pick_state* pick;
470
+ while ((pick = p->pending_picks)) {
471
+ p->pending_picks = pick->next;
472
+ pick->connected_subchannel = p->selected->connected_subchannel;
474
473
  if (grpc_lb_pick_first_trace.enabled()) {
475
474
  gpr_log(GPR_INFO,
476
475
  "Servicing pending pick with selected subchannel %p",
477
476
  (void*)p->selected);
478
477
  }
479
- GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
480
- gpr_free(pp);
478
+ GRPC_CLOSURE_SCHED(pick->on_complete, GRPC_ERROR_NONE);
481
479
  }
482
480
  // Renew notification.
483
- grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
481
+ grpc_lb_subchannel_data_start_connectivity_watch(sd);
484
482
  break;
485
483
  }
486
484
  case GRPC_CHANNEL_TRANSIENT_FAILURE: {
487
- grpc_lb_subchannel_data_stop_connectivity_watch(exec_ctx, sd);
485
+ grpc_lb_subchannel_data_stop_connectivity_watch(sd);
488
486
  do {
489
487
  sd->subchannel_list->checking_subchannel =
490
488
  (sd->subchannel_list->checking_subchannel + 1) %
@@ -497,58 +495,38 @@ static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
497
495
  if (sd->subchannel_list->checking_subchannel == 0 &&
498
496
  sd->subchannel_list == p->subchannel_list) {
499
497
  grpc_connectivity_state_set(
500
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
498
+ &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
501
499
  GRPC_ERROR_REF(error), "connecting_transient_failure");
502
500
  }
503
501
  // Reuses the connectivity refs from the previous watch.
504
- grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
502
+ grpc_lb_subchannel_data_start_connectivity_watch(sd);
505
503
  break;
506
504
  }
507
505
  case GRPC_CHANNEL_CONNECTING:
508
506
  case GRPC_CHANNEL_IDLE: {
509
507
  // Only update connectivity state in case 1.
510
508
  if (sd->subchannel_list == p->subchannel_list) {
511
- grpc_connectivity_state_set(
512
- exec_ctx, &p->state_tracker, GRPC_CHANNEL_CONNECTING,
513
- GRPC_ERROR_REF(error), "connecting_changed");
509
+ grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_CONNECTING,
510
+ GRPC_ERROR_REF(error),
511
+ "connecting_changed");
514
512
  }
515
513
  // Renew notification.
516
- grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
517
- break;
518
- }
519
- case GRPC_CHANNEL_SHUTDOWN: {
520
- grpc_lb_subchannel_data_stop_connectivity_watch(exec_ctx, sd);
521
- grpc_lb_subchannel_data_unref_subchannel(exec_ctx, sd,
522
- "pf_candidate_shutdown");
523
- // Advance to next subchannel and check its state.
524
- grpc_lb_subchannel_data* original_sd = sd;
525
- do {
526
- sd->subchannel_list->checking_subchannel =
527
- (sd->subchannel_list->checking_subchannel + 1) %
528
- sd->subchannel_list->num_subchannels;
529
- sd = &sd->subchannel_list
530
- ->subchannels[sd->subchannel_list->checking_subchannel];
531
- } while (sd->subchannel == nullptr && sd != original_sd);
532
- if (sd == original_sd) {
533
- grpc_lb_subchannel_list_unref_for_connectivity_watch(
534
- exec_ctx, sd->subchannel_list, "pf_candidate_shutdown");
535
- shutdown_locked(exec_ctx, p,
536
- GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
537
- "Pick first exhausted channels", &error, 1));
538
- break;
539
- }
540
- if (sd->subchannel_list == p->subchannel_list) {
541
- grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
542
- GRPC_CHANNEL_TRANSIENT_FAILURE,
543
- GRPC_ERROR_REF(error), "subchannel_failed");
544
- }
545
- // Reuses the connectivity refs from the previous watch.
546
- grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
514
+ grpc_lb_subchannel_data_start_connectivity_watch(sd);
547
515
  break;
548
516
  }
517
+ case GRPC_CHANNEL_SHUTDOWN:
518
+ GPR_UNREACHABLE_CODE(break);
549
519
  }
550
520
  }
551
521
 
522
+ static void pf_set_reresolve_closure_locked(
523
+ grpc_lb_policy* policy, grpc_closure* request_reresolution) {
524
+ pick_first_lb_policy* p = (pick_first_lb_policy*)policy;
525
+ GPR_ASSERT(!p->shutdown);
526
+ GPR_ASSERT(policy->request_reresolution == nullptr);
527
+ policy->request_reresolution = request_reresolution;
528
+ }
529
+
552
530
  static const grpc_lb_policy_vtable pick_first_lb_policy_vtable = {
553
531
  pf_destroy,
554
532
  pf_shutdown_locked,
@@ -559,21 +537,21 @@ static const grpc_lb_policy_vtable pick_first_lb_policy_vtable = {
559
537
  pf_exit_idle_locked,
560
538
  pf_check_connectivity_locked,
561
539
  pf_notify_on_state_change_locked,
562
- pf_update_locked};
540
+ pf_update_locked,
541
+ pf_set_reresolve_closure_locked};
563
542
 
564
543
  static void pick_first_factory_ref(grpc_lb_policy_factory* factory) {}
565
544
 
566
545
  static void pick_first_factory_unref(grpc_lb_policy_factory* factory) {}
567
546
 
568
- static grpc_lb_policy* create_pick_first(grpc_exec_ctx* exec_ctx,
569
- grpc_lb_policy_factory* factory,
547
+ static grpc_lb_policy* create_pick_first(grpc_lb_policy_factory* factory,
570
548
  grpc_lb_policy_args* args) {
571
549
  GPR_ASSERT(args->client_channel_factory != nullptr);
572
550
  pick_first_lb_policy* p = (pick_first_lb_policy*)gpr_zalloc(sizeof(*p));
573
551
  if (grpc_lb_pick_first_trace.enabled()) {
574
552
  gpr_log(GPR_DEBUG, "Pick First %p created.", (void*)p);
575
553
  }
576
- pf_update_locked(exec_ctx, &p->base, args);
554
+ pf_update_locked(&p->base, args);
577
555
  grpc_lb_policy_init(&p->base, &pick_first_lb_policy_vtable, args->combiner);
578
556
  grpc_subchannel_index_ref();
579
557
  return &p->base;
@@ -592,8 +570,8 @@ static grpc_lb_policy_factory* pick_first_lb_factory_create() {
592
570
 
593
571
  /* Plugin registration */
594
572
 
595
- extern "C" void grpc_lb_policy_pick_first_init() {
573
+ void grpc_lb_policy_pick_first_init() {
596
574
  grpc_register_lb_policy(pick_first_lb_factory_create());
597
575
  }
598
576
 
599
- extern "C" void grpc_lb_policy_pick_first_shutdown() {}
577
+ void grpc_lb_policy_pick_first_shutdown() {}