grpc 1.7.3 → 1.8.0

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

Potentially problematic release.


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

Files changed (616) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +2106 -2116
  3. data/include/grpc/census.h +1 -432
  4. data/include/grpc/compression.h +9 -9
  5. data/include/grpc/grpc.h +115 -98
  6. data/include/grpc/grpc_cronet.h +3 -3
  7. data/include/grpc/grpc_posix.h +4 -4
  8. data/include/grpc/grpc_security.h +160 -88
  9. data/include/grpc/grpc_security_constants.h +7 -0
  10. data/include/grpc/impl/codegen/atm.h +9 -1
  11. data/include/grpc/impl/codegen/atm_gcc_atomic.h +13 -4
  12. data/include/grpc/impl/codegen/atm_gcc_sync.h +6 -5
  13. data/include/grpc/impl/codegen/atm_windows.h +23 -22
  14. data/include/grpc/impl/codegen/byte_buffer.h +14 -14
  15. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -2
  16. data/include/grpc/impl/codegen/connectivity_state.h +0 -2
  17. data/include/grpc/impl/codegen/grpc_types.h +32 -28
  18. data/include/grpc/impl/codegen/port_platform.h +48 -0
  19. data/include/grpc/impl/codegen/slice.h +10 -10
  20. data/include/grpc/impl/codegen/sync_generic.h +9 -3
  21. data/include/grpc/slice.h +16 -17
  22. data/include/grpc/slice_buffer.h +22 -22
  23. data/include/grpc/support/alloc.h +11 -11
  24. data/include/grpc/support/avl.h +28 -20
  25. data/include/grpc/support/cmdline.h +13 -13
  26. data/include/grpc/support/histogram.h +17 -17
  27. data/include/grpc/support/host_port.h +2 -2
  28. data/include/grpc/support/log.h +9 -9
  29. data/include/grpc/support/log_windows.h +1 -1
  30. data/include/grpc/support/string_util.h +2 -2
  31. data/include/grpc/support/subprocess.h +5 -5
  32. data/include/grpc/support/sync.h +43 -27
  33. data/include/grpc/support/thd.h +6 -6
  34. data/include/grpc/support/tls_gcc.h +1 -1
  35. data/include/grpc/support/tls_pthread.h +1 -1
  36. data/src/core/ext/census/{grpc_context.c → grpc_context.cc} +5 -8
  37. data/src/core/ext/filters/client_channel/backup_poller.cc +165 -0
  38. data/src/core/ext/{census/grpc_filter.h → filters/client_channel/backup_poller.h} +12 -7
  39. data/src/core/ext/filters/client_channel/{channel_connectivity.c → channel_connectivity.cc} +45 -42
  40. data/src/core/ext/filters/client_channel/{client_channel.c → client_channel.cc} +452 -417
  41. data/src/core/ext/filters/client_channel/client_channel.h +16 -8
  42. data/src/core/ext/filters/client_channel/{client_channel_factory.c → client_channel_factory.cc} +0 -0
  43. data/src/core/ext/filters/client_channel/client_channel_factory.h +29 -21
  44. data/src/core/ext/filters/client_channel/{client_channel_plugin.c → client_channel_plugin.cc} +15 -19
  45. data/src/core/ext/filters/client_channel/{connector.c → connector.cc} +0 -0
  46. data/src/core/ext/filters/client_channel/connector.h +29 -21
  47. data/src/core/ext/filters/client_channel/{http_connect_handshaker.c → http_connect_handshaker.cc} +10 -10
  48. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +8 -0
  49. data/src/core/ext/filters/client_channel/{http_proxy.c → http_proxy.cc} +14 -14
  50. data/src/core/ext/filters/client_channel/http_proxy.h +8 -0
  51. data/src/core/ext/filters/client_channel/{lb_policy.c → lb_policy.cc} +47 -48
  52. data/src/core/ext/filters/client_channel/lb_policy.h +76 -70
  53. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{client_load_reporting_filter.c → client_load_reporting_filter.cc} +28 -29
  54. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +9 -1
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb.c → grpclb.cc} +554 -563
  56. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +9 -1
  57. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +17 -9
  58. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb_channel_secure.c → grpclb_channel_secure.cc} +17 -17
  59. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb_client_stats.c → grpclb_client_stats.cc} +3 -3
  60. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +9 -1
  61. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{load_balancer_api.c → load_balancer_api.cc} +64 -67
  62. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +20 -21
  63. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +599 -0
  64. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +695 -0
  65. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +270 -0
  66. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +153 -0
  67. data/src/core/ext/filters/client_channel/{lb_policy_factory.c → lb_policy_factory.cc} +10 -10
  68. data/src/core/ext/filters/client_channel/lb_policy_factory.h +48 -40
  69. data/src/core/ext/filters/client_channel/{lb_policy_registry.c → lb_policy_registry.cc} +9 -9
  70. data/src/core/ext/filters/client_channel/lb_policy_registry.h +11 -3
  71. data/src/core/ext/filters/client_channel/{parse_address.c → parse_address.cc} +24 -24
  72. data/src/core/ext/filters/client_channel/parse_address.h +14 -6
  73. data/src/core/ext/filters/client_channel/{proxy_mapper.c → proxy_mapper.cc} +0 -0
  74. data/src/core/ext/filters/client_channel/proxy_mapper.h +8 -0
  75. data/src/core/ext/filters/client_channel/{proxy_mapper_registry.c → proxy_mapper_registry.cc} +0 -0
  76. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -0
  77. data/src/core/ext/filters/client_channel/{resolver.c → resolver.cc} +21 -23
  78. data/src/core/ext/filters/client_channel/resolver.h +33 -27
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{dns_resolver_ares.c → dns_resolver_ares.cc} +133 -133
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +18 -9
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{grpc_ares_ev_driver_posix.c → grpc_ares_ev_driver_posix.cc} +58 -56
  82. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{grpc_ares_wrapper.c → grpc_ares_wrapper.cc} +118 -115
  83. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +23 -15
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +60 -0
  85. data/src/core/ext/filters/client_channel/resolver/dns/native/{dns_resolver.c → dns_resolver.cc} +100 -94
  86. data/src/core/ext/filters/client_channel/resolver/fake/{fake_resolver.c → fake_resolver.cc} +14 -14
  87. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +9 -1
  88. data/src/core/ext/filters/client_channel/resolver/sockaddr/{sockaddr_resolver.c → sockaddr_resolver.cc} +60 -60
  89. data/src/core/ext/filters/client_channel/{resolver_factory.c → resolver_factory.cc} +2 -2
  90. data/src/core/ext/filters/client_channel/resolver_factory.h +27 -19
  91. data/src/core/ext/filters/client_channel/{resolver_registry.c → resolver_registry.cc} +35 -35
  92. data/src/core/ext/filters/client_channel/resolver_registry.h +18 -10
  93. data/src/core/ext/filters/client_channel/{retry_throttle.c → retry_throttle.cc} +10 -10
  94. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -0
  95. data/src/core/ext/filters/client_channel/{subchannel.c → subchannel.cc} +210 -213
  96. data/src/core/ext/filters/client_channel/subchannel.h +68 -60
  97. data/src/core/ext/filters/client_channel/{subchannel_index.c → subchannel_index.cc} +52 -52
  98. data/src/core/ext/filters/client_channel/subchannel_index.h +22 -14
  99. data/src/core/ext/filters/client_channel/{uri_parser.c → uri_parser.cc} +29 -27
  100. data/src/core/ext/filters/client_channel/uri_parser.h +18 -10
  101. data/src/core/ext/filters/deadline/{deadline_filter.c → deadline_filter.cc} +12 -15
  102. data/src/core/ext/filters/deadline/deadline_filter.h +11 -2
  103. data/src/core/ext/filters/http/client/{http_client_filter.c → http_client_filter.cc} +83 -83
  104. data/src/core/ext/filters/http/client/http_client_filter.h +8 -0
  105. data/src/core/ext/filters/http/{http_filters_plugin.c → http_filters_plugin.cc} +20 -21
  106. data/src/core/ext/filters/http/message_compress/{message_compress_filter.c → message_compress_filter.cc} +84 -83
  107. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +9 -1
  108. data/src/core/ext/filters/http/server/{http_server_filter.c → http_server_filter.cc} +80 -78
  109. data/src/core/ext/filters/http/server/http_server_filter.h +8 -0
  110. data/src/core/ext/filters/load_reporting/{server_load_reporting_filter.c → server_load_reporting_filter.cc} +29 -29
  111. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +9 -1
  112. data/src/core/ext/filters/load_reporting/{server_load_reporting_plugin.c → server_load_reporting_plugin.cc} +11 -11
  113. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +13 -5
  114. data/src/core/ext/filters/max_age/{max_age_filter.c → max_age_filter.cc} +46 -56
  115. data/src/core/ext/filters/max_age/max_age_filter.h +8 -0
  116. data/src/core/ext/filters/message_size/{message_size_filter.c → message_size_filter.cc} +62 -40
  117. data/src/core/ext/filters/message_size/message_size_filter.h +8 -0
  118. data/src/core/ext/filters/workarounds/{workaround_cronet_compression_filter.c → workaround_cronet_compression_filter.cc} +11 -11
  119. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +8 -0
  120. data/src/core/ext/filters/workarounds/{workaround_utils.c → workaround_utils.cc} +7 -7
  121. data/src/core/ext/filters/workarounds/workaround_utils.h +9 -1
  122. data/src/core/ext/transport/chttp2/alpn/{alpn.c → alpn.cc} +3 -3
  123. data/src/core/ext/transport/chttp2/alpn/alpn.h +10 -2
  124. data/src/core/ext/transport/chttp2/client/{chttp2_connector.c → chttp2_connector.cc} +49 -45
  125. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +8 -0
  126. data/src/core/ext/transport/chttp2/client/insecure/{channel_create.c → channel_create.cc} +28 -27
  127. data/src/core/ext/transport/chttp2/client/insecure/{channel_create_posix.c → channel_create_posix.cc} +14 -13
  128. data/src/core/ext/transport/chttp2/client/secure/{secure_channel_create.c → secure_channel_create.cc} +68 -66
  129. data/src/core/ext/transport/chttp2/server/{chttp2_server.c → chttp2_server.cc} +76 -77
  130. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -3
  131. data/src/core/ext/transport/chttp2/server/insecure/{server_chttp2.c → server_chttp2.cc} +3 -3
  132. data/src/core/ext/transport/chttp2/server/insecure/{server_chttp2_posix.c → server_chttp2_posix.cc} +13 -12
  133. data/src/core/ext/transport/chttp2/server/secure/{server_secure_chttp2.c → server_secure_chttp2.cc} +12 -10
  134. data/src/core/ext/transport/chttp2/transport/{bin_decoder.c → bin_decoder.cc} +7 -7
  135. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +15 -7
  136. data/src/core/ext/transport/chttp2/transport/{bin_encoder.c → bin_encoder.cc} +11 -11
  137. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -0
  138. data/src/core/ext/transport/chttp2/transport/{chttp2_plugin.c → chttp2_plugin.cc} +2 -9
  139. data/src/core/ext/transport/chttp2/transport/{chttp2_transport.c → chttp2_transport.cc} +778 -778
  140. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +14 -10
  141. data/src/core/ext/transport/chttp2/transport/flow_control.cc +385 -0
  142. data/src/core/ext/transport/chttp2/transport/flow_control.h +337 -0
  143. data/src/core/ext/transport/chttp2/transport/frame.h +8 -0
  144. data/src/core/ext/transport/chttp2/transport/{frame_data.c → frame_data.cc} +34 -34
  145. data/src/core/ext/transport/chttp2/transport/frame_data.h +25 -17
  146. data/src/core/ext/transport/chttp2/transport/{frame_goaway.c → frame_goaway.cc} +18 -18
  147. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -10
  148. data/src/core/ext/transport/chttp2/transport/{frame_ping.c → frame_ping.cc} +18 -19
  149. data/src/core/ext/transport/chttp2/transport/frame_ping.h +12 -4
  150. data/src/core/ext/transport/chttp2/transport/{frame_rst_stream.c → frame_rst_stream.cc} +16 -16
  151. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +16 -8
  152. data/src/core/ext/transport/chttp2/transport/{frame_settings.c → frame_settings.cc} +23 -24
  153. data/src/core/ext/transport/chttp2/transport/frame_settings.h +17 -9
  154. data/src/core/ext/transport/chttp2/transport/{frame_window_update.c → frame_window_update.cc} +22 -24
  155. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +14 -6
  156. data/src/core/ext/transport/chttp2/transport/{hpack_encoder.c → hpack_encoder.cc} +206 -161
  157. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +23 -13
  158. data/src/core/ext/transport/chttp2/transport/{hpack_parser.c → hpack_parser.cc} +340 -334
  159. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +30 -22
  160. data/src/core/ext/transport/chttp2/transport/{hpack_table.c → hpack_table.cc} +25 -25
  161. data/src/core/ext/transport/chttp2/transport/hpack_table.h +19 -11
  162. data/src/core/ext/transport/chttp2/transport/{http2_settings.c → http2_settings.cc} +1 -1
  163. data/src/core/ext/transport/chttp2/transport/http2_settings.h +10 -2
  164. data/src/core/ext/transport/chttp2/transport/{huffsyms.c → huffsyms.cc} +0 -0
  165. data/src/core/ext/transport/chttp2/transport/huffsyms.h +8 -0
  166. data/src/core/ext/transport/chttp2/transport/{incoming_metadata.c → incoming_metadata.cc} +14 -13
  167. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +18 -10
  168. data/src/core/ext/transport/chttp2/transport/internal.h +214 -340
  169. data/src/core/ext/transport/chttp2/transport/{parsing.c → parsing.cc} +152 -141
  170. data/src/core/ext/transport/chttp2/transport/{stream_lists.c → stream_lists.cc} +53 -53
  171. data/src/core/ext/transport/chttp2/transport/{stream_map.c → stream_map.cc} +35 -34
  172. data/src/core/ext/transport/chttp2/transport/stream_map.h +22 -14
  173. data/src/core/ext/transport/chttp2/transport/{varint.c → varint.cc} +0 -0
  174. data/src/core/ext/transport/chttp2/transport/varint.h +8 -0
  175. data/src/core/ext/transport/chttp2/transport/writing.cc +636 -0
  176. data/src/core/ext/transport/inproc/{inproc_plugin.c → inproc_plugin.cc} +5 -6
  177. data/src/core/ext/transport/inproc/{inproc_transport.c → inproc_transport.cc} +479 -544
  178. data/src/core/ext/transport/inproc/inproc_transport.h +4 -4
  179. data/src/core/lib/backoff/backoff.cc +80 -0
  180. data/src/core/lib/backoff/backoff.h +83 -0
  181. data/src/core/lib/channel/{channel_args.c → channel_args.cc} +92 -92
  182. data/src/core/lib/channel/channel_args.h +45 -37
  183. data/src/core/lib/channel/{channel_stack.c → channel_stack.cc} +67 -68
  184. data/src/core/lib/channel/channel_stack.h +76 -75
  185. data/src/core/lib/channel/{channel_stack_builder.c → channel_stack_builder.cc} +91 -91
  186. data/src/core/lib/channel/channel_stack_builder.h +45 -45
  187. data/src/core/lib/channel/{connected_channel.c → connected_channel.cc} +70 -70
  188. data/src/core/lib/channel/connected_channel.h +12 -4
  189. data/src/core/lib/channel/context.h +2 -2
  190. data/src/core/lib/channel/{handshaker.c → handshaker.cc} +7 -9
  191. data/src/core/lib/channel/handshaker.h +9 -1
  192. data/src/core/lib/channel/{handshaker_factory.c → handshaker_factory.cc} +7 -7
  193. data/src/core/lib/channel/handshaker_factory.h +18 -10
  194. data/src/core/lib/channel/{handshaker_registry.c → handshaker_registry.cc} +0 -0
  195. data/src/core/lib/channel/handshaker_registry.h +8 -0
  196. data/src/core/lib/compression/algorithm_metadata.h +8 -0
  197. data/src/core/lib/compression/{compression.c → compression.cc} +9 -9
  198. data/src/core/lib/compression/{message_compress.c → message_compress.cc} +0 -0
  199. data/src/core/lib/compression/message_compress.h +8 -0
  200. data/src/core/lib/compression/{stream_compression.c → stream_compression.cc} +12 -12
  201. data/src/core/lib/compression/stream_compression.h +27 -19
  202. data/src/core/lib/compression/{stream_compression_gzip.c → stream_compression_gzip.cc} +35 -36
  203. data/src/core/lib/compression/stream_compression_gzip.h +8 -0
  204. data/src/core/lib/compression/{stream_compression_identity.c → stream_compression_identity.cc} +19 -20
  205. data/src/core/lib/compression/stream_compression_identity.h +8 -0
  206. data/src/core/lib/debug/{stats.c → stats.cc} +19 -19
  207. data/src/core/lib/debug/stats.h +17 -9
  208. data/src/core/lib/debug/{stats_data.c → stats_data.cc} +45 -22
  209. data/src/core/lib/debug/stats_data.h +58 -19
  210. data/src/core/lib/debug/trace.cc +142 -0
  211. data/src/core/lib/debug/trace.h +74 -14
  212. data/src/core/lib/http/{format_request.c → format_request.cc} +10 -10
  213. data/src/core/lib/http/format_request.h +12 -4
  214. data/src/core/lib/http/{httpcli.c → httpcli.cc} +80 -80
  215. data/src/core/lib/http/httpcli.h +41 -33
  216. data/src/core/lib/http/{httpcli_security_connector.c → httpcli_security_connector.cc} +69 -55
  217. data/src/core/lib/http/{parser.c → parser.cc} +42 -42
  218. data/src/core/lib/http/parser.h +28 -20
  219. data/src/core/lib/{support → iomgr}/block_annotate.h +17 -8
  220. data/src/core/lib/iomgr/{call_combiner.c → call_combiner.cc} +29 -17
  221. data/src/core/lib/iomgr/call_combiner.h +9 -1
  222. data/src/core/lib/iomgr/closure.h +220 -62
  223. data/src/core/lib/iomgr/{combiner.c → combiner.cc} +63 -62
  224. data/src/core/lib/iomgr/combiner.h +16 -8
  225. data/src/core/lib/iomgr/{endpoint.c → endpoint.cc} +6 -0
  226. data/src/core/lib/iomgr/endpoint.h +47 -32
  227. data/src/core/lib/iomgr/endpoint_pair.h +12 -4
  228. data/src/core/lib/iomgr/{endpoint_pair_posix.c → endpoint_pair_posix.cc} +3 -3
  229. data/src/core/lib/iomgr/{endpoint_pair_uv.c → endpoint_pair_uv.cc} +2 -2
  230. data/src/core/lib/iomgr/{endpoint_pair_windows.c → endpoint_pair_windows.cc} +6 -6
  231. data/src/core/lib/iomgr/{error.c → error.cc} +125 -124
  232. data/src/core/lib/iomgr/error.h +32 -27
  233. data/src/core/lib/iomgr/error_internal.h +11 -2
  234. data/src/core/lib/iomgr/{ev_epoll1_linux.c → ev_epoll1_linux.cc} +214 -215
  235. data/src/core/lib/iomgr/ev_epoll1_linux.h +9 -1
  236. data/src/core/lib/iomgr/ev_epollex_linux.cc +1488 -0
  237. data/src/core/lib/iomgr/ev_epollex_linux.h +9 -1
  238. data/src/core/lib/iomgr/{ev_epollsig_linux.c → ev_epollsig_linux.cc} +304 -305
  239. data/src/core/lib/iomgr/ev_epollsig_linux.h +12 -4
  240. data/src/core/lib/iomgr/{ev_poll_posix.c → ev_poll_posix.cc} +272 -283
  241. data/src/core/lib/iomgr/ev_poll_posix.h +10 -2
  242. data/src/core/lib/iomgr/ev_posix.cc +288 -0
  243. data/src/core/lib/iomgr/ev_posix.h +75 -67
  244. data/src/core/lib/iomgr/{ev_windows.c → ev_windows.cc} +2 -2
  245. data/src/core/lib/iomgr/exec_ctx.cc +177 -0
  246. data/src/core/lib/iomgr/exec_ctx.h +35 -13
  247. data/src/core/lib/iomgr/{executor.c → executor.cc} +34 -35
  248. data/src/core/lib/iomgr/executor.h +12 -4
  249. data/src/core/lib/iomgr/{fork_posix.c → fork_posix.cc} +0 -0
  250. data/src/core/lib/iomgr/{fork_windows.c → fork_windows.cc} +0 -0
  251. data/src/core/lib/iomgr/gethostname.h +9 -1
  252. data/src/core/lib/iomgr/{gethostname_fallback.c → gethostname_fallback.cc} +2 -1
  253. data/src/core/lib/iomgr/{gethostname_host_name_max.c → gethostname_host_name_max.cc} +4 -3
  254. data/src/core/lib/iomgr/{gethostname_sysconf.c → gethostname_sysconf.cc} +3 -2
  255. data/src/core/lib/iomgr/{iocp_windows.c → iocp_windows.cc} +23 -25
  256. data/src/core/lib/iomgr/iocp_windows.h +17 -3
  257. data/src/core/lib/iomgr/{iomgr.c → iomgr.cc} +25 -19
  258. data/src/core/lib/iomgr/iomgr.h +11 -3
  259. data/src/core/lib/iomgr/iomgr_internal.h +13 -5
  260. data/src/core/lib/iomgr/{iomgr_posix.c → iomgr_posix.cc} +0 -1
  261. data/src/core/lib/iomgr/{iomgr_uv.c → iomgr_uv.cc} +1 -1
  262. data/src/core/lib/iomgr/iomgr_uv.h +8 -0
  263. data/src/core/lib/iomgr/{iomgr_windows.c → iomgr_windows.cc} +0 -0
  264. data/src/core/lib/iomgr/{is_epollexclusive_available.c → is_epollexclusive_available.cc} +1 -1
  265. data/src/core/lib/iomgr/is_epollexclusive_available.h +8 -0
  266. data/src/core/lib/iomgr/{load_file.c → load_file.cc} +12 -12
  267. data/src/core/lib/iomgr/load_file.h +2 -2
  268. data/src/core/lib/iomgr/{lockfree_event.c → lockfree_event.cc} +76 -68
  269. data/src/core/lib/iomgr/lockfree_event.h +30 -11
  270. data/src/core/lib/iomgr/{network_status_tracker.c → network_status_tracker.cc} +3 -2
  271. data/src/core/lib/iomgr/network_status_tracker.h +2 -2
  272. data/src/core/lib/iomgr/{polling_entity.c → polling_entity.cc} +18 -18
  273. data/src/core/lib/iomgr/polling_entity.h +21 -13
  274. data/src/core/lib/iomgr/pollset.h +17 -11
  275. data/src/core/lib/iomgr/pollset_set.h +23 -15
  276. data/src/core/lib/iomgr/{pollset_set_uv.c → pollset_set_uv.cc} +0 -0
  277. data/src/core/lib/iomgr/{pollset_set_windows.c → pollset_set_windows.cc} +0 -0
  278. data/src/core/lib/iomgr/{pollset_uv.c → pollset_uv.cc} +31 -29
  279. data/src/core/lib/iomgr/pollset_uv.h +8 -0
  280. data/src/core/lib/iomgr/{pollset_windows.c → pollset_windows.cc} +24 -24
  281. data/src/core/lib/iomgr/pollset_windows.h +17 -4
  282. data/src/core/lib/iomgr/port.h +10 -0
  283. data/src/core/lib/iomgr/resolve_address.h +18 -10
  284. data/src/core/lib/iomgr/{resolve_address_posix.c → resolve_address_posix.cc} +40 -40
  285. data/src/core/lib/iomgr/{resolve_address_uv.c → resolve_address_uv.cc} +61 -56
  286. data/src/core/lib/iomgr/{resolve_address_windows.c → resolve_address_windows.cc} +36 -34
  287. data/src/core/lib/iomgr/{resource_quota.c → resource_quota.cc} +209 -180
  288. data/src/core/lib/iomgr/resource_quota.h +45 -37
  289. data/src/core/lib/iomgr/{sockaddr_utils.c → sockaddr_utils.cc} +61 -61
  290. data/src/core/lib/iomgr/sockaddr_utils.h +23 -15
  291. data/src/core/lib/iomgr/sockaddr_windows.h +6 -0
  292. data/src/core/lib/iomgr/{socket_factory_posix.c → socket_factory_posix.cc} +20 -20
  293. data/src/core/lib/iomgr/socket_factory_posix.h +15 -15
  294. data/src/core/lib/iomgr/{socket_mutator.c → socket_mutator.cc} +18 -18
  295. data/src/core/lib/iomgr/socket_mutator.h +11 -11
  296. data/src/core/lib/iomgr/socket_utils.h +9 -1
  297. data/src/core/lib/iomgr/{socket_utils_common_posix.c → socket_utils_common_posix.cc} +28 -28
  298. data/src/core/lib/iomgr/{socket_utils_linux.c → socket_utils_linux.cc} +3 -3
  299. data/src/core/lib/iomgr/{socket_utils_posix.c → socket_utils_posix.cc} +3 -3
  300. data/src/core/lib/iomgr/socket_utils_posix.h +26 -18
  301. data/src/core/lib/iomgr/{socket_utils_uv.c → socket_utils_uv.cc} +1 -1
  302. data/src/core/lib/iomgr/{socket_utils_windows.c → socket_utils_windows.cc} +2 -2
  303. data/src/core/lib/iomgr/{socket_windows.c → socket_windows.cc} +18 -18
  304. data/src/core/lib/iomgr/socket_windows.h +26 -13
  305. data/src/core/lib/iomgr/tcp_client.h +14 -6
  306. data/src/core/lib/iomgr/{tcp_client_posix.c → tcp_client_posix.cc} +69 -70
  307. data/src/core/lib/iomgr/tcp_client_posix.h +11 -3
  308. data/src/core/lib/iomgr/{tcp_client_uv.c → tcp_client_uv.cc} +47 -48
  309. data/src/core/lib/iomgr/{tcp_client_windows.c → tcp_client_windows.cc} +46 -44
  310. data/src/core/lib/iomgr/{tcp_posix.c → tcp_posix.cc} +198 -175
  311. data/src/core/lib/iomgr/tcp_posix.h +15 -7
  312. data/src/core/lib/iomgr/tcp_server.h +31 -23
  313. data/src/core/lib/iomgr/{tcp_server_posix.c → tcp_server_posix.cc} +78 -77
  314. data/src/core/lib/iomgr/tcp_server_utils_posix.h +27 -19
  315. data/src/core/lib/iomgr/{tcp_server_utils_posix_common.c → tcp_server_utils_posix_common.cc} +27 -27
  316. data/src/core/lib/iomgr/{tcp_server_utils_posix_ifaddrs.c → tcp_server_utils_posix_ifaddrs.cc} +25 -25
  317. data/src/core/lib/iomgr/{tcp_server_utils_posix_noifaddrs.c → tcp_server_utils_posix_noifaddrs.cc} +2 -2
  318. data/src/core/lib/iomgr/{tcp_server_uv.c → tcp_server_uv.cc} +133 -105
  319. data/src/core/lib/iomgr/{tcp_server_windows.c → tcp_server_windows.cc} +81 -77
  320. data/src/core/lib/iomgr/tcp_uv.cc +420 -0
  321. data/src/core/lib/iomgr/tcp_uv.h +18 -4
  322. data/src/core/lib/iomgr/{tcp_windows.c → tcp_windows.cc} +90 -79
  323. data/src/core/lib/iomgr/tcp_windows.h +17 -4
  324. data/src/core/lib/iomgr/{time_averaged_stats.c → time_averaged_stats.cc} +0 -0
  325. data/src/core/lib/iomgr/time_averaged_stats.h +8 -0
  326. data/src/core/lib/iomgr/timer.h +16 -9
  327. data/src/core/lib/iomgr/{timer_generic.c → timer_generic.cc} +130 -171
  328. data/src/core/lib/iomgr/timer_generic.h +4 -4
  329. data/src/core/lib/iomgr/{timer_heap.c → timer_heap.cc} +20 -21
  330. data/src/core/lib/iomgr/timer_heap.h +16 -8
  331. data/src/core/lib/iomgr/{timer_manager.c → timer_manager.cc} +54 -52
  332. data/src/core/lib/iomgr/timer_manager.h +8 -0
  333. data/src/core/lib/iomgr/{timer_uv.c → timer_uv.cc} +22 -24
  334. data/src/core/lib/iomgr/timer_uv.h +2 -2
  335. data/src/core/lib/iomgr/{udp_server.c → udp_server.cc} +75 -75
  336. data/src/core/lib/iomgr/udp_server.h +25 -17
  337. data/src/core/lib/iomgr/{unix_sockets_posix.c → unix_sockets_posix.cc} +22 -21
  338. data/src/core/lib/iomgr/unix_sockets_posix.h +14 -6
  339. data/src/core/lib/iomgr/{unix_sockets_posix_noop.c → unix_sockets_posix_noop.cc} +5 -5
  340. data/src/core/lib/iomgr/{wakeup_fd_cv.c → wakeup_fd_cv.cc} +2 -2
  341. data/src/core/lib/iomgr/wakeup_fd_cv.h +10 -0
  342. data/src/core/lib/iomgr/{wakeup_fd_eventfd.c → wakeup_fd_eventfd.cc} +0 -0
  343. data/src/core/lib/iomgr/{wakeup_fd_nospecial.c → wakeup_fd_nospecial.cc} +0 -0
  344. data/src/core/lib/iomgr/{wakeup_fd_pipe.c → wakeup_fd_pipe.cc} +1 -0
  345. data/src/core/lib/iomgr/wakeup_fd_pipe.h +9 -1
  346. data/src/core/lib/iomgr/{wakeup_fd_posix.c → wakeup_fd_posix.cc} +6 -7
  347. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -0
  348. data/src/core/lib/json/{json.c → json.cc} +0 -0
  349. data/src/core/lib/json/json.h +8 -0
  350. data/src/core/lib/json/{json_reader.c → json_reader.cc} +18 -18
  351. data/src/core/lib/json/json_reader.h +26 -18
  352. data/src/core/lib/json/{json_string.c → json_string.cc} +57 -57
  353. data/src/core/lib/json/{json_writer.c → json_writer.cc} +20 -20
  354. data/src/core/lib/json/json_writer.h +23 -15
  355. data/src/core/lib/profiling/{basic_timers.c → basic_timers.cc} +34 -34
  356. data/src/core/lib/profiling/{stap_timers.c → stap_timers.cc} +5 -5
  357. data/src/core/lib/profiling/timers.h +6 -6
  358. data/src/core/lib/security/context/{security_context.c → security_context.cc} +98 -95
  359. data/src/core/lib/security/context/security_context.h +27 -29
  360. data/src/core/lib/security/credentials/composite/{composite_credentials.c → composite_credentials.cc} +79 -73
  361. data/src/core/lib/security/credentials/composite/composite_credentials.h +17 -9
  362. data/src/core/lib/security/credentials/{credentials.c → credentials.cc} +97 -92
  363. data/src/core/lib/security/credentials/credentials.h +83 -75
  364. data/src/core/lib/security/credentials/{credentials_metadata.c → credentials_metadata.cc} +7 -6
  365. data/src/core/lib/security/credentials/fake/{fake_credentials.c → fake_credentials.cc} +39 -36
  366. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -5
  367. data/src/core/lib/security/credentials/google_default/{credentials_generic.c → credentials_generic.cc} +5 -5
  368. data/src/core/lib/security/credentials/google_default/{google_default_credentials.c → google_default_credentials.cc} +55 -55
  369. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +9 -1
  370. data/src/core/lib/security/credentials/iam/{iam_credentials.c → iam_credentials.cc} +19 -18
  371. data/src/core/lib/security/credentials/jwt/{json_token.c → json_token.cc} +80 -75
  372. data/src/core/lib/security/credentials/jwt/json_token.h +23 -15
  373. data/src/core/lib/security/credentials/jwt/{jwt_credentials.c → jwt_credentials.cc} +45 -41
  374. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
  375. data/src/core/lib/security/credentials/jwt/{jwt_verifier.c → jwt_verifier.cc} +262 -252
  376. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +38 -30
  377. data/src/core/lib/security/credentials/oauth2/{oauth2_credentials.c → oauth2_credentials.cc} +138 -141
  378. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +30 -22
  379. data/src/core/lib/security/credentials/plugin/{plugin_credentials.c → plugin_credentials.cc} +52 -53
  380. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +7 -7
  381. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +344 -0
  382. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +27 -0
  383. data/src/core/lib/security/transport/auth_filters.h +16 -0
  384. data/src/core/lib/security/transport/{client_auth_filter.c → client_auth_filter.cc} +127 -115
  385. data/src/core/lib/security/transport/{lb_targets_info.c → lb_targets_info.cc} +16 -13
  386. data/src/core/lib/security/transport/lb_targets_info.h +11 -3
  387. data/src/core/lib/security/transport/{secure_endpoint.c → secure_endpoint.cc} +84 -76
  388. data/src/core/lib/security/transport/secure_endpoint.h +13 -5
  389. data/src/core/lib/security/transport/security_connector.cc +1121 -0
  390. data/src/core/lib/security/transport/security_connector.h +97 -79
  391. data/src/core/lib/security/transport/{security_handshaker.c → security_handshaker.cc} +139 -132
  392. data/src/core/lib/security/transport/security_handshaker.h +11 -3
  393. data/src/core/lib/security/transport/{server_auth_filter.c → server_auth_filter.cc} +68 -68
  394. data/src/core/lib/security/transport/{tsi_error.c → tsi_error.cc} +1 -1
  395. data/src/core/lib/security/transport/tsi_error.h +9 -1
  396. data/src/core/lib/security/util/{json_util.c → json_util.cc} +11 -11
  397. data/src/core/lib/security/util/json_util.h +12 -4
  398. data/src/core/lib/slice/{b64.c → b64.cc} +15 -15
  399. data/src/core/lib/slice/b64.h +12 -4
  400. data/src/core/lib/slice/{percent_encoding.c → percent_encoding.cc} +15 -15
  401. data/src/core/lib/slice/percent_encoding.h +11 -3
  402. data/src/core/lib/slice/{slice.c → slice.cc} +64 -64
  403. data/src/core/lib/slice/{slice_buffer.c → slice_buffer.cc} +38 -38
  404. data/src/core/lib/slice/{slice_hash_table.c → slice_hash_table.cc} +7 -7
  405. data/src/core/lib/slice/slice_hash_table.h +19 -11
  406. data/src/core/lib/slice/{slice_intern.c → slice_intern.cc} +35 -34
  407. data/src/core/lib/slice/slice_internal.h +17 -6
  408. data/src/core/lib/slice/{slice_string_helpers.c → slice_string_helpers.cc} +9 -9
  409. data/src/core/lib/slice/slice_string_helpers.h +3 -3
  410. data/src/core/lib/support/abstract.h +29 -0
  411. data/src/core/lib/support/{alloc.c → alloc.cc} +22 -22
  412. data/src/core/lib/support/{arena.c → arena.cc} +12 -12
  413. data/src/core/lib/support/arena.h +11 -3
  414. data/src/core/lib/support/{atm.c → atm.cc} +1 -1
  415. data/src/core/lib/support/{avl.c → avl.cc} +71 -70
  416. data/src/core/lib/support/{cmdline.c → cmdline.cc} +62 -62
  417. data/src/core/lib/support/{cpu_iphone.c → cpu_iphone.cc} +2 -0
  418. data/src/core/lib/support/{cpu_linux.c → cpu_linux.cc} +10 -0
  419. data/src/core/lib/support/{cpu_posix.c → cpu_posix.cc} +27 -4
  420. data/src/core/lib/support/{cpu_windows.c → cpu_windows.cc} +1 -0
  421. data/src/core/lib/support/env.h +3 -3
  422. data/src/core/lib/support/{env_linux.c → env_linux.cc} +11 -11
  423. data/src/core/lib/support/{env_posix.c → env_posix.cc} +4 -4
  424. data/src/core/lib/support/{env_windows.c → env_windows.cc} +5 -5
  425. data/src/core/lib/support/{fork.c → fork.cc} +2 -2
  426. data/src/core/lib/support/{histogram.c → histogram.cc} +25 -26
  427. data/src/core/lib/support/{host_port.c → host_port.cc} +16 -16
  428. data/src/core/lib/support/{log.c → log.cc} +8 -8
  429. data/src/core/lib/support/{log_android.c → log_android.cc} +7 -7
  430. data/src/core/lib/support/{log_linux.c → log_linux.cc} +8 -8
  431. data/src/core/lib/support/{log_posix.c → log_posix.cc} +9 -10
  432. data/src/core/lib/support/{log_windows.c → log_windows.cc} +7 -7
  433. data/src/core/lib/support/manual_constructor.h +211 -0
  434. data/src/core/lib/support/memory.h +41 -0
  435. data/src/core/lib/support/mpscq.cc +114 -0
  436. data/src/core/lib/support/mpscq.h +45 -7
  437. data/src/core/lib/support/{murmur_hash.c → murmur_hash.cc} +9 -12
  438. data/src/core/lib/support/murmur_hash.h +9 -1
  439. data/src/core/lib/support/spinlock.h +8 -1
  440. data/src/core/lib/support/{string.c → string.cc} +56 -55
  441. data/src/core/lib/support/string.h +21 -21
  442. data/src/core/lib/support/{string_posix.c → string_posix.cc} +5 -4
  443. data/src/core/lib/support/{string_util_windows.c → string_util_windows.cc} +9 -6
  444. data/src/core/lib/support/{string_windows.c → string_windows.cc} +3 -2
  445. data/src/core/lib/support/string_windows.h +8 -0
  446. data/src/core/lib/support/{subprocess_posix.c → subprocess_posix.cc} +13 -13
  447. data/src/core/lib/support/{subprocess_windows.c → subprocess_windows.cc} +9 -9
  448. data/src/core/lib/support/{sync.c → sync.cc} +22 -22
  449. data/src/core/lib/support/{sync_posix.c → sync_posix.cc} +6 -2
  450. data/src/core/lib/support/{sync_windows.c → sync_windows.cc} +14 -14
  451. data/src/core/lib/support/{thd.c → thd.cc} +0 -0
  452. data/src/core/lib/support/{thd_posix.c → thd_posix.cc} +10 -10
  453. data/src/core/lib/support/{thd_windows.c → thd_windows.cc} +10 -10
  454. data/src/core/lib/support/{time.c → time.cc} +0 -0
  455. data/src/core/lib/support/{time_posix.c → time_posix.cc} +5 -6
  456. data/src/core/lib/support/{time_precise.c → time_precise.cc} +6 -4
  457. data/src/core/lib/support/time_precise.h +9 -1
  458. data/src/core/lib/support/{time_windows.c → time_windows.cc} +2 -3
  459. data/src/core/lib/support/{tls_pthread.c → tls_pthread.cc} +2 -2
  460. data/src/core/lib/support/tmpfile.h +1 -1
  461. data/src/core/lib/support/{tmpfile_msys.c → tmpfile_msys.cc} +2 -2
  462. data/src/core/lib/support/{tmpfile_posix.c → tmpfile_posix.cc} +7 -7
  463. data/src/core/lib/support/{tmpfile_windows.c → tmpfile_windows.cc} +2 -2
  464. data/src/core/lib/support/{wrap_memcpy.c → wrap_memcpy.cc} +4 -2
  465. data/src/core/lib/surface/{alarm.c → alarm.cc} +32 -31
  466. data/src/core/lib/surface/alarm_internal.h +10 -2
  467. data/src/core/lib/surface/{api_trace.c → api_trace.cc} +1 -1
  468. data/src/core/lib/surface/api_trace.h +2 -2
  469. data/src/core/lib/surface/{byte_buffer.c → byte_buffer.cc} +13 -13
  470. data/src/core/lib/surface/{byte_buffer_reader.c → byte_buffer_reader.cc} +9 -9
  471. data/src/core/lib/surface/{call.c → call.cc} +379 -372
  472. data/src/core/lib/surface/call.h +37 -38
  473. data/src/core/lib/surface/{call_details.c → call_details.cc} +0 -0
  474. data/src/core/lib/surface/{call_log_batch.c → call_log_batch.cc} +13 -11
  475. data/src/core/lib/surface/call_test_only.h +5 -5
  476. data/src/core/lib/surface/{channel.c → channel.cc} +94 -95
  477. data/src/core/lib/surface/channel.h +29 -21
  478. data/src/core/lib/surface/{channel_init.c → channel_init.cc} +13 -13
  479. data/src/core/lib/surface/channel_init.h +6 -6
  480. data/src/core/lib/surface/{channel_ping.c → channel_ping.cc} +12 -12
  481. data/src/core/lib/surface/{channel_stack_type.c → channel_stack_type.cc} +1 -1
  482. data/src/core/lib/surface/channel_stack_type.h +9 -1
  483. data/src/core/lib/surface/{completion_queue.c → completion_queue.cc} +416 -379
  484. data/src/core/lib/surface/completion_queue.h +29 -29
  485. data/src/core/lib/surface/{completion_queue_factory.c → completion_queue_factory.cc} +1 -1
  486. data/src/core/lib/surface/completion_queue_factory.h +8 -0
  487. data/src/core/lib/surface/{event_string.c → event_string.cc} +9 -9
  488. data/src/core/lib/surface/event_string.h +9 -1
  489. data/src/core/lib/surface/{init.c → init.cc} +16 -39
  490. data/src/core/lib/surface/init.h +8 -0
  491. data/src/core/lib/surface/{init_secure.c → init_secure.cc} +12 -25
  492. data/src/core/lib/surface/lame_client.cc +38 -40
  493. data/src/core/lib/surface/lame_client.h +8 -0
  494. data/src/core/lib/surface/{metadata_array.c → metadata_array.cc} +0 -0
  495. data/src/core/lib/surface/{server.c → server.cc} +340 -404
  496. data/src/core/lib/surface/server.h +22 -14
  497. data/src/core/lib/surface/{validate_metadata.c → validate_metadata.cc} +10 -9
  498. data/src/core/lib/surface/validate_metadata.h +10 -2
  499. data/src/core/lib/surface/{version.c → version.cc} +2 -2
  500. data/src/core/lib/transport/bdp_estimator.cc +84 -0
  501. data/src/core/lib/transport/bdp_estimator.h +67 -42
  502. data/src/core/lib/transport/{byte_stream.c → byte_stream.cc} +51 -51
  503. data/src/core/lib/transport/byte_stream.h +41 -33
  504. data/src/core/lib/transport/{connectivity_state.c → connectivity_state.cc} +36 -40
  505. data/src/core/lib/transport/connectivity_state.h +29 -21
  506. data/src/core/lib/transport/{error_utils.c → error_utils.cc} +26 -22
  507. data/src/core/lib/transport/error_utils.h +18 -6
  508. data/src/core/lib/transport/{metadata.c → metadata.cc} +92 -88
  509. data/src/core/lib/transport/metadata.h +22 -20
  510. data/src/core/lib/transport/{metadata_batch.c → metadata_batch.cc} +78 -79
  511. data/src/core/lib/transport/metadata_batch.h +46 -45
  512. data/src/core/lib/transport/pid_controller.cc +48 -0
  513. data/src/core/lib/transport/pid_controller.h +84 -32
  514. data/src/core/lib/transport/{service_config.c → service_config.cc} +66 -48
  515. data/src/core/lib/transport/service_config.h +11 -2
  516. data/src/core/lib/transport/{static_metadata.c → static_metadata.cc} +2 -2
  517. data/src/core/lib/transport/static_metadata.h +30 -23
  518. data/src/core/lib/transport/{status_conversion.c → status_conversion.cc} +4 -3
  519. data/src/core/lib/transport/status_conversion.h +12 -2
  520. data/src/core/lib/transport/{timeout_encoding.c → timeout_encoding.cc} +28 -61
  521. data/src/core/lib/transport/timeout_encoding.h +11 -2
  522. data/src/core/lib/transport/{transport.c → transport.cc} +79 -79
  523. data/src/core/lib/transport/transport.h +78 -80
  524. data/src/core/lib/transport/transport_impl.h +27 -19
  525. data/src/core/lib/transport/{transport_op_string.c → transport_op_string.cc} +32 -30
  526. data/src/core/plugin_registry/{grpc_plugin_registry.c → grpc_plugin_registry.cc} +34 -38
  527. data/src/core/tsi/{fake_transport_security.c → fake_transport_security.cc} +141 -132
  528. data/src/core/tsi/fake_transport_security.h +5 -5
  529. data/src/core/tsi/{gts_transport_security.c → gts_transport_security.cc} +4 -4
  530. data/src/core/tsi/gts_transport_security.h +11 -3
  531. data/src/core/tsi/{ssl_transport_security.c → ssl_transport_security.cc} +309 -300
  532. data/src/core/tsi/ssl_transport_security.h +25 -25
  533. data/src/core/tsi/ssl_types.h +8 -0
  534. data/src/core/tsi/{transport_security.c → transport_security.cc} +94 -87
  535. data/src/core/tsi/transport_security.h +55 -55
  536. data/src/core/tsi/{transport_security_adapter.c → transport_security_adapter.cc} +58 -55
  537. data/src/core/tsi/transport_security_adapter.h +2 -2
  538. data/src/core/tsi/{transport_security_grpc.c → transport_security_grpc.cc} +21 -21
  539. data/src/core/tsi/transport_security_grpc.h +19 -19
  540. data/src/core/tsi/transport_security_interface.h +41 -41
  541. data/src/ruby/ext/grpc/extconf.rb +4 -2
  542. data/src/ruby/ext/grpc/rb_byte_buffer.c +5 -5
  543. data/src/ruby/ext/grpc/rb_byte_buffer.h +2 -2
  544. data/src/ruby/ext/grpc/rb_call.c +41 -42
  545. data/src/ruby/ext/grpc/rb_call.h +6 -6
  546. data/src/ruby/ext/grpc/rb_call_credentials.c +30 -30
  547. data/src/ruby/ext/grpc/rb_channel.c +87 -87
  548. data/src/ruby/ext/grpc/rb_channel_credentials.c +23 -23
  549. data/src/ruby/ext/grpc/rb_completion_queue.c +11 -11
  550. data/src/ruby/ext/grpc/rb_completion_queue.h +3 -3
  551. data/src/ruby/ext/grpc/rb_compression_options.c +20 -20
  552. data/src/ruby/ext/grpc/rb_event_thread.c +14 -14
  553. data/src/ruby/ext/grpc/rb_event_thread.h +1 -1
  554. data/src/ruby/ext/grpc/rb_grpc.c +8 -8
  555. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +16 -58
  556. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +242 -306
  557. data/src/ruby/ext/grpc/rb_server.c +23 -23
  558. data/src/ruby/ext/grpc/rb_server_credentials.c +13 -13
  559. data/src/ruby/lib/grpc/generic/rpc_server.rb +25 -12
  560. data/src/ruby/lib/grpc/version.rb +1 -1
  561. data/src/ruby/pb/grpc/health/checker.rb +14 -0
  562. data/src/ruby/spec/pb/health/checker_spec.rb +29 -0
  563. data/third_party/cares/config_freebsd/ares_config.h +502 -0
  564. data/third_party/cares/config_openbsd/ares_config.h +502 -0
  565. metadata +302 -328
  566. data/src/core/ext/census/aggregation.h +0 -51
  567. data/src/core/ext/census/base_resources.c +0 -56
  568. data/src/core/ext/census/base_resources.h +0 -24
  569. data/src/core/ext/census/census_interface.h +0 -61
  570. data/src/core/ext/census/census_rpc_stats.h +0 -86
  571. data/src/core/ext/census/context.c +0 -496
  572. data/src/core/ext/census/gen/census.pb.c +0 -161
  573. data/src/core/ext/census/gen/census.pb.h +0 -280
  574. data/src/core/ext/census/gen/trace_context.pb.c +0 -39
  575. data/src/core/ext/census/gen/trace_context.pb.h +0 -78
  576. data/src/core/ext/census/grpc_filter.c +0 -196
  577. data/src/core/ext/census/grpc_plugin.c +0 -70
  578. data/src/core/ext/census/initialize.c +0 -51
  579. data/src/core/ext/census/intrusive_hash_map.c +0 -305
  580. data/src/core/ext/census/intrusive_hash_map.h +0 -152
  581. data/src/core/ext/census/intrusive_hash_map_internal.h +0 -48
  582. data/src/core/ext/census/mlog.c +0 -586
  583. data/src/core/ext/census/mlog.h +0 -80
  584. data/src/core/ext/census/operation.c +0 -48
  585. data/src/core/ext/census/placeholders.c +0 -49
  586. data/src/core/ext/census/resource.c +0 -303
  587. data/src/core/ext/census/resource.h +0 -48
  588. data/src/core/ext/census/rpc_metric_id.h +0 -36
  589. data/src/core/ext/census/trace_context.c +0 -71
  590. data/src/core/ext/census/trace_context.h +0 -56
  591. data/src/core/ext/census/trace_label.h +0 -46
  592. data/src/core/ext/census/trace_propagation.h +0 -48
  593. data/src/core/ext/census/trace_status.h +0 -30
  594. data/src/core/ext/census/trace_string.h +0 -35
  595. data/src/core/ext/census/tracing.c +0 -55
  596. data/src/core/ext/census/tracing.h +0 -109
  597. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +0 -714
  598. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +0 -924
  599. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c +0 -60
  600. data/src/core/ext/transport/chttp2/transport/flow_control.c +0 -502
  601. data/src/core/ext/transport/chttp2/transport/writing.c +0 -534
  602. data/src/core/lib/debug/trace.c +0 -146
  603. data/src/core/lib/iomgr/closure.c +0 -219
  604. data/src/core/lib/iomgr/ev_epollex_linux.c +0 -1461
  605. data/src/core/lib/iomgr/ev_posix.c +0 -266
  606. data/src/core/lib/iomgr/exec_ctx.c +0 -113
  607. data/src/core/lib/iomgr/tcp_uv.c +0 -381
  608. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +0 -194
  609. data/src/core/lib/security/transport/security_connector.c +0 -914
  610. data/src/core/lib/support/backoff.c +0 -72
  611. data/src/core/lib/support/backoff.h +0 -56
  612. data/src/core/lib/support/mpscq.c +0 -79
  613. data/src/core/lib/support/stack_lockfree.c +0 -137
  614. data/src/core/lib/support/stack_lockfree.h +0 -38
  615. data/src/core/lib/transport/bdp_estimator.c +0 -110
  616. data/src/core/lib/transport/pid_controller.c +0 -63
@@ -37,60 +37,59 @@ typedef grpc_lb_v1_InitialLoadBalanceResponse grpc_grpclb_initial_response;
37
37
  typedef grpc_lb_v1_Server grpc_grpclb_server;
38
38
  typedef grpc_lb_v1_Duration grpc_grpclb_duration;
39
39
  typedef struct {
40
- grpc_grpclb_server **servers;
40
+ grpc_grpclb_server** servers;
41
41
  size_t num_servers;
42
42
  grpc_grpclb_duration expiration_interval;
43
43
  } grpc_grpclb_serverlist;
44
44
 
45
45
  /** Create a request for a gRPC LB service under \a lb_service_name */
46
- grpc_grpclb_request *grpc_grpclb_request_create(const char *lb_service_name);
47
- grpc_grpclb_request *grpc_grpclb_load_report_request_create_locked(
48
- grpc_grpclb_client_stats *client_stats);
46
+ grpc_grpclb_request* grpc_grpclb_request_create(const char* lb_service_name);
47
+ grpc_grpclb_request* grpc_grpclb_load_report_request_create_locked(
48
+ grpc_grpclb_client_stats* client_stats);
49
49
 
50
50
  /** Protocol Buffers v3-encode \a request */
51
- grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request *request);
51
+ grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request* request);
52
52
 
53
53
  /** Destroy \a request */
54
- void grpc_grpclb_request_destroy(grpc_grpclb_request *request);
54
+ void grpc_grpclb_request_destroy(grpc_grpclb_request* request);
55
55
 
56
56
  /** Parse (ie, decode) the bytes in \a encoded_grpc_grpclb_response as a \a
57
57
  * grpc_grpclb_initial_response */
58
- grpc_grpclb_initial_response *grpc_grpclb_initial_response_parse(
58
+ grpc_grpclb_initial_response* grpc_grpclb_initial_response_parse(
59
59
  grpc_slice encoded_grpc_grpclb_response);
60
60
 
61
61
  /** Parse the list of servers from an encoded \a grpc_grpclb_response */
62
- grpc_grpclb_serverlist *grpc_grpclb_response_parse_serverlist(
62
+ grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
63
63
  grpc_slice encoded_grpc_grpclb_response);
64
64
 
65
65
  /** Return a copy of \a sl. The caller is responsible for calling \a
66
66
  * grpc_grpclb_destroy_serverlist on the returned copy. */
67
- grpc_grpclb_serverlist *grpc_grpclb_serverlist_copy(
68
- const grpc_grpclb_serverlist *sl);
67
+ grpc_grpclb_serverlist* grpc_grpclb_serverlist_copy(
68
+ const grpc_grpclb_serverlist* sl);
69
69
 
70
- bool grpc_grpclb_serverlist_equals(const grpc_grpclb_serverlist *lhs,
71
- const grpc_grpclb_serverlist *rhs);
70
+ bool grpc_grpclb_serverlist_equals(const grpc_grpclb_serverlist* lhs,
71
+ const grpc_grpclb_serverlist* rhs);
72
72
 
73
- bool grpc_grpclb_server_equals(const grpc_grpclb_server *lhs,
74
- const grpc_grpclb_server *rhs);
73
+ bool grpc_grpclb_server_equals(const grpc_grpclb_server* lhs,
74
+ const grpc_grpclb_server* rhs);
75
75
 
76
76
  /** Destroy \a serverlist */
77
- void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist *serverlist);
77
+ void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist* serverlist);
78
78
 
79
79
  /** Compare \a lhs against \a rhs and return 0 if \a lhs and \a rhs are equal,
80
80
  * < 0 if \a lhs represents a duration shorter than \a rhs and > 0 otherwise */
81
- int grpc_grpclb_duration_compare(const grpc_grpclb_duration *lhs,
82
- const grpc_grpclb_duration *rhs);
81
+ int grpc_grpclb_duration_compare(const grpc_grpclb_duration* lhs,
82
+ const grpc_grpclb_duration* rhs);
83
83
 
84
- gpr_timespec grpc_grpclb_duration_to_timespec(
85
- grpc_grpclb_duration *duration_pb);
84
+ grpc_millis grpc_grpclb_duration_to_millis(grpc_grpclb_duration* duration_pb);
86
85
 
87
86
  /** Destroy \a initial_response */
88
87
  void grpc_grpclb_initial_response_destroy(
89
- grpc_grpclb_initial_response *response);
88
+ grpc_grpclb_initial_response* response);
90
89
 
91
90
  #ifdef __cplusplus
92
91
  }
93
92
  #endif
94
93
 
95
94
  #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_LOAD_BALANCER_API_H \
96
- */
95
+ */
@@ -0,0 +1,599 @@
1
+ /*
2
+ *
3
+ * Copyright 2015 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <string.h>
20
+
21
+ #include <grpc/support/alloc.h>
22
+
23
+ #include "src/core/ext/filters/client_channel/lb_policy/subchannel_list.h"
24
+ #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
25
+ #include "src/core/ext/filters/client_channel/subchannel.h"
26
+ #include "src/core/ext/filters/client_channel/subchannel_index.h"
27
+ #include "src/core/lib/channel/channel_args.h"
28
+ #include "src/core/lib/iomgr/combiner.h"
29
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
30
+ #include "src/core/lib/transport/connectivity_state.h"
31
+
32
+ grpc_core::TraceFlag grpc_lb_pick_first_trace(false, "pick_first");
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
+ typedef struct {
42
+ /** base policy: must be first */
43
+ grpc_lb_policy base;
44
+ /** all our subchannels */
45
+ grpc_lb_subchannel_list* subchannel_list;
46
+ /** latest pending subchannel list */
47
+ grpc_lb_subchannel_list* latest_pending_subchannel_list;
48
+ /** selected subchannel in \a subchannel_list */
49
+ grpc_lb_subchannel_data* selected;
50
+ /** have we started picking? */
51
+ bool started_picking;
52
+ /** are we shut down? */
53
+ bool shutdown;
54
+ /** list of picks that are waiting on connectivity */
55
+ pending_pick* pending_picks;
56
+ /** our connectivity state tracker */
57
+ grpc_connectivity_state_tracker state_tracker;
58
+ } pick_first_lb_policy;
59
+
60
+ static void pf_destroy(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol) {
61
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
62
+ GPR_ASSERT(p->subchannel_list == nullptr);
63
+ GPR_ASSERT(p->latest_pending_subchannel_list == nullptr);
64
+ GPR_ASSERT(p->pending_picks == nullptr);
65
+ grpc_connectivity_state_destroy(exec_ctx, &p->state_tracker);
66
+ gpr_free(p);
67
+ grpc_subchannel_index_unref();
68
+ if (grpc_lb_pick_first_trace.enabled()) {
69
+ gpr_log(GPR_DEBUG, "Pick First %p destroyed.", (void*)p);
70
+ }
71
+ }
72
+
73
+ static void shutdown_locked(grpc_exec_ctx* exec_ctx, pick_first_lb_policy* p,
74
+ grpc_error* error) {
75
+ if (grpc_lb_pick_first_trace.enabled()) {
76
+ gpr_log(GPR_DEBUG, "Pick First %p Shutting down", p);
77
+ }
78
+ 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);
85
+ }
86
+ grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
87
+ GRPC_CHANNEL_SHUTDOWN, GRPC_ERROR_REF(error),
88
+ "shutdown");
89
+ if (p->subchannel_list != nullptr) {
90
+ grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
91
+ "pf_shutdown");
92
+ p->subchannel_list = nullptr;
93
+ }
94
+ if (p->latest_pending_subchannel_list != nullptr) {
95
+ grpc_lb_subchannel_list_shutdown_and_unref(
96
+ exec_ctx, p->latest_pending_subchannel_list, "pf_shutdown");
97
+ p->latest_pending_subchannel_list = nullptr;
98
+ }
99
+ GRPC_ERROR_UNREF(error);
100
+ }
101
+
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,
109
+ grpc_error* error) {
110
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
111
+ pending_pick* pp = p->pending_picks;
112
+ p->pending_picks = nullptr;
113
+ 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,
118
+ GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
119
+ "Pick Cancelled", &error, 1));
120
+ gpr_free(pp);
121
+ } else {
122
+ pp->next = p->pending_picks;
123
+ p->pending_picks = pp;
124
+ }
125
+ pp = next;
126
+ }
127
+ GRPC_ERROR_UNREF(error);
128
+ }
129
+
130
+ static void pf_cancel_picks_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol,
131
+ uint32_t initial_metadata_flags_mask,
132
+ uint32_t initial_metadata_flags_eq,
133
+ grpc_error* error) {
134
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
135
+ pending_pick* pp = p->pending_picks;
136
+ p->pending_picks = nullptr;
137
+ while (pp != nullptr) {
138
+ pending_pick* next = pp->next;
139
+ if ((pp->initial_metadata_flags & initial_metadata_flags_mask) ==
140
+ initial_metadata_flags_eq) {
141
+ GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete,
142
+ GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
143
+ "Pick Cancelled", &error, 1));
144
+ gpr_free(pp);
145
+ } else {
146
+ pp->next = p->pending_picks;
147
+ p->pending_picks = pp;
148
+ }
149
+ pp = next;
150
+ }
151
+ GRPC_ERROR_UNREF(error);
152
+ }
153
+
154
+ static void start_picking_locked(grpc_exec_ctx* exec_ctx,
155
+ pick_first_lb_policy* p) {
156
+ p->started_picking = true;
157
+ if (p->subchannel_list != nullptr &&
158
+ p->subchannel_list->num_subchannels > 0) {
159
+ 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]);
164
+ }
165
+ }
166
+
167
+ static void pf_exit_idle_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol) {
168
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
169
+ if (!p->started_picking) {
170
+ start_picking_locked(exec_ctx, p);
171
+ }
172
+ }
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) {
179
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
180
+ // If we have a selected subchannel already, return synchronously.
181
+ if (p->selected != nullptr) {
182
+ *target = GRPC_CONNECTED_SUBCHANNEL_REF(p->selected->connected_subchannel,
183
+ "picked");
184
+ return 1;
185
+ }
186
+ // No subchannel selected yet, so handle asynchronously.
187
+ if (!p->started_picking) {
188
+ start_picking_locked(exec_ctx, p);
189
+ }
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;
196
+ return 0;
197
+ }
198
+
199
+ static void destroy_unselected_subchannels_locked(grpc_exec_ctx* exec_ctx,
200
+ pick_first_lb_policy* p) {
201
+ for (size_t i = 0; i < p->subchannel_list->num_subchannels; ++i) {
202
+ grpc_lb_subchannel_data* sd = &p->subchannel_list->subchannels[i];
203
+ if (p->selected != sd) {
204
+ grpc_lb_subchannel_data_unref_subchannel(exec_ctx, sd,
205
+ "selected_different_subchannel");
206
+ }
207
+ }
208
+ }
209
+
210
+ static grpc_connectivity_state pf_check_connectivity_locked(
211
+ grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol, grpc_error** error) {
212
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
213
+ return grpc_connectivity_state_get(&p->state_tracker, error);
214
+ }
215
+
216
+ static void pf_notify_on_state_change_locked(grpc_exec_ctx* exec_ctx,
217
+ grpc_lb_policy* pol,
218
+ grpc_connectivity_state* current,
219
+ grpc_closure* notify) {
220
+ 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);
223
+ }
224
+
225
+ static void pf_ping_one_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* pol,
226
+ grpc_closure* closure) {
227
+ pick_first_lb_policy* p = (pick_first_lb_policy*)pol;
228
+ if (p->selected) {
229
+ grpc_connected_subchannel_ping(exec_ctx, p->selected->connected_subchannel,
230
+ closure);
231
+ } else {
232
+ GRPC_CLOSURE_SCHED(exec_ctx, closure,
233
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Not connected"));
234
+ }
235
+ }
236
+
237
+ static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
238
+ grpc_error* error);
239
+
240
+ static void pf_update_locked(grpc_exec_ctx* exec_ctx, grpc_lb_policy* policy,
241
+ const grpc_lb_policy_args* args) {
242
+ pick_first_lb_policy* p = (pick_first_lb_policy*)policy;
243
+ const grpc_arg* arg =
244
+ grpc_channel_args_find(args->args, GRPC_ARG_LB_ADDRESSES);
245
+ if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
246
+ if (p->subchannel_list == nullptr) {
247
+ // If we don't have a current subchannel list, go into TRANSIENT FAILURE.
248
+ grpc_connectivity_state_set(
249
+ exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
250
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing update in args"),
251
+ "pf_update_missing");
252
+ } else {
253
+ // otherwise, keep using the current subchannel list (ignore this update).
254
+ gpr_log(GPR_ERROR,
255
+ "No valid LB addresses channel arg for Pick First %p update, "
256
+ "ignoring.",
257
+ (void*)p);
258
+ }
259
+ return;
260
+ }
261
+ const grpc_lb_addresses* addresses =
262
+ (const grpc_lb_addresses*)arg->value.pointer.p;
263
+ if (grpc_lb_pick_first_trace.enabled()) {
264
+ gpr_log(GPR_INFO, "Pick First %p received update with %lu addresses",
265
+ (void*)p, (unsigned long)addresses->num_addresses);
266
+ }
267
+ grpc_lb_subchannel_list* subchannel_list = grpc_lb_subchannel_list_create(
268
+ exec_ctx, &p->base, &grpc_lb_pick_first_trace, addresses, args,
269
+ pf_connectivity_changed_locked);
270
+ if (subchannel_list->num_subchannels == 0) {
271
+ // Empty update or no valid subchannels. Unsubscribe from all current
272
+ // subchannels and put the channel in TRANSIENT_FAILURE.
273
+ grpc_connectivity_state_set(
274
+ exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
275
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Empty update"),
276
+ "pf_update_empty");
277
+ if (p->subchannel_list != nullptr) {
278
+ grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
279
+ "sl_shutdown_empty_update");
280
+ }
281
+ p->subchannel_list = subchannel_list; // Empty list.
282
+ p->selected = nullptr;
283
+ return;
284
+ }
285
+ if (p->selected == nullptr) {
286
+ // We don't yet have a selected subchannel, so replace the current
287
+ // subchannel list immediately.
288
+ if (p->subchannel_list != nullptr) {
289
+ grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
290
+ "pf_update_before_selected");
291
+ }
292
+ p->subchannel_list = subchannel_list;
293
+ } else {
294
+ // We do have a selected subchannel.
295
+ // Check if it's present in the new list. If so, we're done.
296
+ for (size_t i = 0; i < subchannel_list->num_subchannels; ++i) {
297
+ grpc_lb_subchannel_data* sd = &subchannel_list->subchannels[i];
298
+ if (sd->subchannel == p->selected->subchannel) {
299
+ // The currently selected subchannel is in the update: we are done.
300
+ if (grpc_lb_pick_first_trace.enabled()) {
301
+ gpr_log(GPR_INFO,
302
+ "Pick First %p found already selected subchannel %p "
303
+ "at update index %" PRIuPTR " of %" PRIuPTR "; update done",
304
+ p, p->selected->subchannel, i,
305
+ subchannel_list->num_subchannels);
306
+ }
307
+ if (p->selected->connected_subchannel != nullptr) {
308
+ sd->connected_subchannel = GRPC_CONNECTED_SUBCHANNEL_REF(
309
+ p->selected->connected_subchannel, "pf_update_includes_selected");
310
+ }
311
+ p->selected = sd;
312
+ if (p->subchannel_list != nullptr) {
313
+ grpc_lb_subchannel_list_shutdown_and_unref(
314
+ exec_ctx, p->subchannel_list, "pf_update_includes_selected");
315
+ }
316
+ p->subchannel_list = subchannel_list;
317
+ destroy_unselected_subchannels_locked(exec_ctx, p);
318
+ grpc_lb_subchannel_list_ref_for_connectivity_watch(
319
+ subchannel_list, "connectivity_watch+replace_selected");
320
+ grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
321
+ // If there was a previously pending update (which may or may
322
+ // not have contained the currently selected subchannel), drop
323
+ // it, so that it doesn't override what we've done here.
324
+ if (p->latest_pending_subchannel_list != nullptr) {
325
+ grpc_lb_subchannel_list_shutdown_and_unref(
326
+ exec_ctx, p->latest_pending_subchannel_list,
327
+ "pf_update_includes_selected+outdated");
328
+ p->latest_pending_subchannel_list = nullptr;
329
+ }
330
+ return;
331
+ }
332
+ }
333
+ // Not keeping the previous selected subchannel, so set the latest
334
+ // pending subchannel list to the new subchannel list. We will wait
335
+ // for it to report READY before swapping it into the current
336
+ // subchannel list.
337
+ if (p->latest_pending_subchannel_list != nullptr) {
338
+ if (grpc_lb_pick_first_trace.enabled()) {
339
+ gpr_log(GPR_DEBUG,
340
+ "Pick First %p Shutting down latest pending subchannel list "
341
+ "%p, about to be replaced by newer latest %p",
342
+ (void*)p, (void*)p->latest_pending_subchannel_list,
343
+ (void*)subchannel_list);
344
+ }
345
+ grpc_lb_subchannel_list_shutdown_and_unref(
346
+ exec_ctx, p->latest_pending_subchannel_list,
347
+ "sl_outdated_dont_smash");
348
+ }
349
+ p->latest_pending_subchannel_list = subchannel_list;
350
+ }
351
+ // If we've started picking, start trying to connect to the first
352
+ // subchannel in the new list.
353
+ if (p->started_picking) {
354
+ grpc_lb_subchannel_list_ref_for_connectivity_watch(
355
+ subchannel_list, "connectivity_watch+update");
356
+ grpc_lb_subchannel_data_start_connectivity_watch(
357
+ exec_ctx, &subchannel_list->subchannels[0]);
358
+ }
359
+ }
360
+
361
+ static void pf_connectivity_changed_locked(grpc_exec_ctx* exec_ctx, void* arg,
362
+ grpc_error* error) {
363
+ grpc_lb_subchannel_data* sd = (grpc_lb_subchannel_data*)arg;
364
+ pick_first_lb_policy* p = (pick_first_lb_policy*)sd->subchannel_list->policy;
365
+ if (grpc_lb_pick_first_trace.enabled()) {
366
+ gpr_log(GPR_DEBUG,
367
+ "Pick First %p connectivity changed for subchannel %p (%" PRIuPTR
368
+ " of %" PRIuPTR
369
+ "), subchannel_list %p: state=%s p->shutdown=%d "
370
+ "sd->subchannel_list->shutting_down=%d error=%s",
371
+ (void*)p, (void*)sd->subchannel,
372
+ sd->subchannel_list->checking_subchannel,
373
+ sd->subchannel_list->num_subchannels, (void*)sd->subchannel_list,
374
+ grpc_connectivity_state_name(sd->pending_connectivity_state_unsafe),
375
+ p->shutdown, sd->subchannel_list->shutting_down,
376
+ grpc_error_string(error));
377
+ }
378
+ // If the policy is shutting down, unref and return.
379
+ 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");
384
+ return;
385
+ }
386
+ // If the subchannel list is shutting down, stop watching.
387
+ 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");
392
+ return;
393
+ }
394
+ // If we're still here, the notification must be for a subchannel in
395
+ // either the current or latest pending subchannel lists.
396
+ GPR_ASSERT(sd->subchannel_list == p->subchannel_list ||
397
+ sd->subchannel_list == p->latest_pending_subchannel_list);
398
+ // Update state.
399
+ sd->curr_connectivity_state = sd->pending_connectivity_state_unsafe;
400
+ // Handle updates for the currently selected subchannel.
401
+ if (p->selected == sd) {
402
+ // If the new state is anything other than READY and there is a
403
+ // pending update, switch to the pending update.
404
+ if (sd->curr_connectivity_state != GRPC_CHANNEL_READY &&
405
+ p->latest_pending_subchannel_list != nullptr) {
406
+ p->selected = nullptr;
407
+ grpc_lb_subchannel_list_shutdown_and_unref(
408
+ exec_ctx, p->subchannel_list, "selected_not_ready+switch_to_update");
409
+ p->subchannel_list = p->latest_pending_subchannel_list;
410
+ p->latest_pending_subchannel_list = nullptr;
411
+ grpc_connectivity_state_set(
412
+ exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
413
+ GRPC_ERROR_REF(error), "selected_not_ready+switch_to_update");
414
+ } else {
415
+ 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);
427
+ 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));
430
+ }
431
+ }
432
+ return;
433
+ }
434
+ // If we get here, there are two possible cases:
435
+ // 1. We do not currently have a selected subchannel, and the update is
436
+ // for a subchannel in p->subchannel_list that we're trying to
437
+ // connect to. The goal here is to find a subchannel that we can
438
+ // select.
439
+ // 2. We do currently have a selected subchannel, and the update is
440
+ // for a subchannel in p->latest_pending_subchannel_list. The
441
+ // goal here is to find a subchannel from the update that we can
442
+ // select in place of the current one.
443
+ switch (sd->curr_connectivity_state) {
444
+ case GRPC_CHANNEL_READY: {
445
+ // Case 2. Promote p->latest_pending_subchannel_list to
446
+ // p->subchannel_list.
447
+ if (sd->subchannel_list == p->latest_pending_subchannel_list) {
448
+ GPR_ASSERT(p->subchannel_list != nullptr);
449
+ grpc_lb_subchannel_list_shutdown_and_unref(exec_ctx, p->subchannel_list,
450
+ "finish_update");
451
+ p->subchannel_list = p->latest_pending_subchannel_list;
452
+ p->latest_pending_subchannel_list = nullptr;
453
+ }
454
+ // 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");
461
+ p->selected = sd;
462
+ if (grpc_lb_pick_first_trace.enabled()) {
463
+ gpr_log(GPR_INFO, "Pick First %p selected subchannel %p", (void*)p,
464
+ (void*)sd->subchannel);
465
+ }
466
+ // Drop all other subchannels, since we are now connected.
467
+ destroy_unselected_subchannels_locked(exec_ctx, p);
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");
474
+ if (grpc_lb_pick_first_trace.enabled()) {
475
+ gpr_log(GPR_INFO,
476
+ "Servicing pending pick with selected subchannel %p",
477
+ (void*)p->selected);
478
+ }
479
+ GRPC_CLOSURE_SCHED(exec_ctx, pp->on_complete, GRPC_ERROR_NONE);
480
+ gpr_free(pp);
481
+ }
482
+ // Renew notification.
483
+ grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
484
+ break;
485
+ }
486
+ case GRPC_CHANNEL_TRANSIENT_FAILURE: {
487
+ grpc_lb_subchannel_data_stop_connectivity_watch(exec_ctx, sd);
488
+ do {
489
+ sd->subchannel_list->checking_subchannel =
490
+ (sd->subchannel_list->checking_subchannel + 1) %
491
+ sd->subchannel_list->num_subchannels;
492
+ sd = &sd->subchannel_list
493
+ ->subchannels[sd->subchannel_list->checking_subchannel];
494
+ } while (sd->subchannel == nullptr);
495
+ // Case 1: Only set state to TRANSIENT_FAILURE if we've tried
496
+ // all subchannels.
497
+ if (sd->subchannel_list->checking_subchannel == 0 &&
498
+ sd->subchannel_list == p->subchannel_list) {
499
+ grpc_connectivity_state_set(
500
+ exec_ctx, &p->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE,
501
+ GRPC_ERROR_REF(error), "connecting_transient_failure");
502
+ }
503
+ // Reuses the connectivity refs from the previous watch.
504
+ grpc_lb_subchannel_data_start_connectivity_watch(exec_ctx, sd);
505
+ break;
506
+ }
507
+ case GRPC_CHANNEL_CONNECTING:
508
+ case GRPC_CHANNEL_IDLE: {
509
+ // Only update connectivity state in case 1.
510
+ 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");
514
+ }
515
+ // 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);
547
+ break;
548
+ }
549
+ }
550
+ }
551
+
552
+ static const grpc_lb_policy_vtable pick_first_lb_policy_vtable = {
553
+ pf_destroy,
554
+ pf_shutdown_locked,
555
+ pf_pick_locked,
556
+ pf_cancel_pick_locked,
557
+ pf_cancel_picks_locked,
558
+ pf_ping_one_locked,
559
+ pf_exit_idle_locked,
560
+ pf_check_connectivity_locked,
561
+ pf_notify_on_state_change_locked,
562
+ pf_update_locked};
563
+
564
+ static void pick_first_factory_ref(grpc_lb_policy_factory* factory) {}
565
+
566
+ static void pick_first_factory_unref(grpc_lb_policy_factory* factory) {}
567
+
568
+ static grpc_lb_policy* create_pick_first(grpc_exec_ctx* exec_ctx,
569
+ grpc_lb_policy_factory* factory,
570
+ grpc_lb_policy_args* args) {
571
+ GPR_ASSERT(args->client_channel_factory != nullptr);
572
+ pick_first_lb_policy* p = (pick_first_lb_policy*)gpr_zalloc(sizeof(*p));
573
+ if (grpc_lb_pick_first_trace.enabled()) {
574
+ gpr_log(GPR_DEBUG, "Pick First %p created.", (void*)p);
575
+ }
576
+ pf_update_locked(exec_ctx, &p->base, args);
577
+ grpc_lb_policy_init(&p->base, &pick_first_lb_policy_vtable, args->combiner);
578
+ grpc_subchannel_index_ref();
579
+ return &p->base;
580
+ }
581
+
582
+ static const grpc_lb_policy_factory_vtable pick_first_factory_vtable = {
583
+ pick_first_factory_ref, pick_first_factory_unref, create_pick_first,
584
+ "pick_first"};
585
+
586
+ static grpc_lb_policy_factory pick_first_lb_policy_factory = {
587
+ &pick_first_factory_vtable};
588
+
589
+ static grpc_lb_policy_factory* pick_first_lb_factory_create() {
590
+ return &pick_first_lb_policy_factory;
591
+ }
592
+
593
+ /* Plugin registration */
594
+
595
+ extern "C" void grpc_lb_policy_pick_first_init() {
596
+ grpc_register_lb_policy(pick_first_lb_factory_create());
597
+ }
598
+
599
+ extern "C" void grpc_lb_policy_pick_first_shutdown() {}