grpc 0.11.0 → 0.12.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 (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +29456 -0
  3. data/Rakefile +13 -8
  4. data/etc/roots.pem +5114 -0
  5. data/include/grpc/byte_buffer.h +120 -0
  6. data/include/grpc/byte_buffer_reader.h +58 -0
  7. data/include/grpc/census.h +488 -0
  8. data/include/grpc/compression.h +106 -0
  9. data/include/grpc/grpc.h +732 -0
  10. data/include/grpc/grpc_security.h +374 -0
  11. data/include/grpc/grpc_zookeeper.h +59 -0
  12. data/include/grpc/status.h +163 -0
  13. data/include/grpc/support/alloc.h +72 -0
  14. data/include/grpc/support/atm.h +92 -0
  15. data/include/grpc/support/atm_gcc_atomic.h +72 -0
  16. data/include/grpc/support/atm_gcc_sync.h +87 -0
  17. data/include/grpc/support/atm_win32.h +125 -0
  18. data/include/grpc/support/avl.h +91 -0
  19. data/include/grpc/support/cmdline.h +101 -0
  20. data/include/grpc/support/cpu.h +57 -0
  21. data/include/grpc/support/histogram.h +76 -0
  22. data/include/grpc/support/host_port.h +64 -0
  23. data/include/grpc/support/log.h +108 -0
  24. data/include/grpc/support/log_win32.h +51 -0
  25. data/include/grpc/support/port_platform.h +356 -0
  26. data/include/grpc/support/slice.h +182 -0
  27. data/include/grpc/support/slice_buffer.h +102 -0
  28. data/include/grpc/support/string_util.h +61 -0
  29. data/include/grpc/support/subprocess.h +57 -0
  30. data/include/grpc/support/sync.h +315 -0
  31. data/include/grpc/support/sync_generic.h +55 -0
  32. data/include/grpc/support/sync_posix.h +47 -0
  33. data/include/grpc/support/sync_win32.h +49 -0
  34. data/include/grpc/support/thd.h +91 -0
  35. data/include/grpc/support/time.h +128 -0
  36. data/include/grpc/support/tls.h +77 -0
  37. data/include/grpc/support/tls_gcc.h +56 -0
  38. data/include/grpc/support/tls_msvc.h +56 -0
  39. data/include/grpc/support/tls_pthread.h +60 -0
  40. data/include/grpc/support/useful.h +75 -0
  41. data/src/core/census/aggregation.h +66 -0
  42. data/src/core/census/context.c +46 -0
  43. data/src/core/census/context.h +47 -0
  44. data/src/core/census/grpc_context.c +53 -0
  45. data/src/core/census/grpc_filter.c +184 -0
  46. data/src/core/census/grpc_filter.h +44 -0
  47. data/src/core/census/initialize.c +57 -0
  48. data/src/core/census/operation.c +63 -0
  49. data/src/core/census/rpc_metric_id.h +51 -0
  50. data/src/core/census/tracing.c +45 -0
  51. data/src/core/channel/channel_args.c +209 -0
  52. data/src/core/channel/channel_args.h +88 -0
  53. data/src/core/channel/channel_stack.c +262 -0
  54. data/src/core/channel/channel_stack.h +260 -0
  55. data/src/core/channel/client_channel.c +524 -0
  56. data/src/core/channel/client_channel.h +63 -0
  57. data/src/core/channel/client_uchannel.c +243 -0
  58. data/src/core/channel/client_uchannel.h +60 -0
  59. data/src/core/channel/compress_filter.c +297 -0
  60. data/src/core/channel/compress_filter.h +65 -0
  61. data/src/core/channel/connected_channel.c +167 -0
  62. data/src/core/channel/connected_channel.h +51 -0
  63. data/src/core/channel/context.h +49 -0
  64. data/src/core/channel/http_client_filter.c +248 -0
  65. data/src/core/channel/http_client_filter.h +44 -0
  66. data/src/core/channel/http_server_filter.c +233 -0
  67. data/src/core/channel/http_server_filter.h +42 -0
  68. data/src/core/channel/subchannel_call_holder.c +259 -0
  69. data/src/core/channel/subchannel_call_holder.h +98 -0
  70. data/src/core/client_config/client_config.c +72 -0
  71. data/src/core/client_config/client_config.h +53 -0
  72. data/src/core/client_config/connector.c +54 -0
  73. data/src/core/client_config/connector.h +95 -0
  74. data/src/core/client_config/default_initial_connect_string.c +39 -0
  75. data/src/core/client_config/initial_connect_string.c +53 -0
  76. data/src/core/client_config/initial_connect_string.h +50 -0
  77. data/src/core/client_config/lb_policies/pick_first.c +398 -0
  78. data/src/core/client_config/lb_policies/pick_first.h +43 -0
  79. data/src/core/client_config/lb_policies/round_robin.c +537 -0
  80. data/src/core/client_config/lb_policies/round_robin.h +46 -0
  81. data/src/core/client_config/lb_policy.c +134 -0
  82. data/src/core/client_config/lb_policy.h +143 -0
  83. data/src/core/client_config/lb_policy_factory.c +48 -0
  84. data/src/core/client_config/lb_policy_factory.h +73 -0
  85. data/src/core/client_config/lb_policy_registry.c +88 -0
  86. data/src/core/client_config/lb_policy_registry.h +54 -0
  87. data/src/core/client_config/resolver.c +82 -0
  88. data/src/core/client_config/resolver.h +94 -0
  89. data/src/core/client_config/resolver_factory.c +55 -0
  90. data/src/core/client_config/resolver_factory.h +82 -0
  91. data/src/core/client_config/resolver_registry.c +137 -0
  92. data/src/core/client_config/resolver_registry.h +65 -0
  93. data/src/core/client_config/resolvers/dns_resolver.c +257 -0
  94. data/src/core/client_config/resolvers/dns_resolver.h +42 -0
  95. data/src/core/client_config/resolvers/sockaddr_resolver.c +391 -0
  96. data/src/core/client_config/resolvers/sockaddr_resolver.h +50 -0
  97. data/src/core/client_config/subchannel.c +697 -0
  98. data/src/core/client_config/subchannel.h +165 -0
  99. data/src/core/client_config/subchannel_factory.c +49 -0
  100. data/src/core/client_config/subchannel_factory.h +66 -0
  101. data/src/core/client_config/uri_parser.c +242 -0
  102. data/src/core/client_config/uri_parser.h +51 -0
  103. data/src/core/compression/algorithm.c +166 -0
  104. data/src/core/compression/algorithm_metadata.h +53 -0
  105. data/src/core/compression/message_compress.c +198 -0
  106. data/src/core/compression/message_compress.h +52 -0
  107. data/src/core/debug/trace.c +136 -0
  108. data/src/core/debug/trace.h +43 -0
  109. data/src/core/httpcli/format_request.c +120 -0
  110. data/src/core/httpcli/format_request.h +45 -0
  111. data/src/core/httpcli/httpcli.c +286 -0
  112. data/src/core/httpcli/httpcli.h +162 -0
  113. data/src/core/httpcli/httpcli_security_connector.c +189 -0
  114. data/src/core/httpcli/parser.c +211 -0
  115. data/src/core/httpcli/parser.h +64 -0
  116. data/src/core/iomgr/closure.c +98 -0
  117. data/src/core/iomgr/closure.h +97 -0
  118. data/src/core/iomgr/endpoint.c +67 -0
  119. data/src/core/iomgr/endpoint.h +102 -0
  120. data/src/core/iomgr/endpoint_pair.h +47 -0
  121. data/src/core/iomgr/endpoint_pair_posix.c +82 -0
  122. data/src/core/iomgr/endpoint_pair_windows.c +97 -0
  123. data/src/core/iomgr/exec_ctx.c +72 -0
  124. data/src/core/iomgr/exec_ctx.h +78 -0
  125. data/src/core/iomgr/executor.c +143 -0
  126. data/src/core/iomgr/executor.h +53 -0
  127. data/src/core/iomgr/fd_posix.c +438 -0
  128. data/src/core/iomgr/fd_posix.h +189 -0
  129. data/src/core/iomgr/iocp_windows.c +206 -0
  130. data/src/core/iomgr/iocp_windows.h +56 -0
  131. data/src/core/iomgr/iomgr.c +156 -0
  132. data/src/core/iomgr/iomgr.h +43 -0
  133. data/src/core/iomgr/iomgr_internal.h +58 -0
  134. data/src/core/iomgr/iomgr_posix.c +52 -0
  135. data/src/core/iomgr/iomgr_posix.h +39 -0
  136. data/src/core/iomgr/iomgr_windows.c +73 -0
  137. data/src/core/iomgr/pollset.h +95 -0
  138. data/src/core/iomgr/pollset_multipoller_with_epoll.c +258 -0
  139. data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +227 -0
  140. data/src/core/iomgr/pollset_posix.c +638 -0
  141. data/src/core/iomgr/pollset_posix.h +147 -0
  142. data/src/core/iomgr/pollset_set.h +67 -0
  143. data/src/core/iomgr/pollset_set_posix.c +182 -0
  144. data/src/core/iomgr/pollset_set_posix.h +61 -0
  145. data/src/core/iomgr/pollset_set_windows.c +60 -0
  146. data/src/core/iomgr/pollset_set_windows.h +39 -0
  147. data/src/core/iomgr/pollset_windows.c +248 -0
  148. data/src/core/iomgr/pollset_windows.h +79 -0
  149. data/src/core/iomgr/resolve_address.h +72 -0
  150. data/src/core/iomgr/resolve_address_posix.c +183 -0
  151. data/src/core/iomgr/resolve_address_windows.c +166 -0
  152. data/src/core/iomgr/sockaddr.h +47 -0
  153. data/src/core/iomgr/sockaddr_posix.h +44 -0
  154. data/src/core/iomgr/sockaddr_utils.c +234 -0
  155. data/src/core/iomgr/sockaddr_utils.h +89 -0
  156. data/src/core/iomgr/sockaddr_win32.h +46 -0
  157. data/src/core/iomgr/socket_utils_common_posix.c +208 -0
  158. data/src/core/iomgr/socket_utils_linux.c +51 -0
  159. data/src/core/iomgr/socket_utils_posix.c +70 -0
  160. data/src/core/iomgr/socket_utils_posix.h +113 -0
  161. data/src/core/iomgr/socket_windows.c +98 -0
  162. data/src/core/iomgr/socket_windows.h +111 -0
  163. data/src/core/iomgr/tcp_client.h +53 -0
  164. data/src/core/iomgr/tcp_client_posix.c +304 -0
  165. data/src/core/iomgr/tcp_client_windows.c +221 -0
  166. data/src/core/iomgr/tcp_posix.c +485 -0
  167. data/src/core/iomgr/tcp_posix.h +65 -0
  168. data/src/core/iomgr/tcp_server.h +83 -0
  169. data/src/core/iomgr/tcp_server_posix.c +562 -0
  170. data/src/core/iomgr/tcp_server_windows.c +509 -0
  171. data/src/core/iomgr/tcp_windows.c +406 -0
  172. data/src/core/iomgr/tcp_windows.h +57 -0
  173. data/src/core/iomgr/time_averaged_stats.c +77 -0
  174. data/src/core/iomgr/time_averaged_stats.h +88 -0
  175. data/src/core/iomgr/timer.c +345 -0
  176. data/src/core/iomgr/timer.h +89 -0
  177. data/src/core/iomgr/timer_heap.c +148 -0
  178. data/src/core/iomgr/timer_heap.h +57 -0
  179. data/src/core/iomgr/timer_internal.h +61 -0
  180. data/src/core/iomgr/udp_server.c +439 -0
  181. data/src/core/iomgr/udp_server.h +83 -0
  182. data/src/core/iomgr/wakeup_fd_eventfd.c +85 -0
  183. data/src/core/iomgr/wakeup_fd_nospecial.c +51 -0
  184. data/src/core/iomgr/wakeup_fd_pipe.c +97 -0
  185. data/src/core/iomgr/wakeup_fd_pipe.h +41 -0
  186. data/src/core/iomgr/wakeup_fd_posix.c +72 -0
  187. data/src/core/iomgr/wakeup_fd_posix.h +101 -0
  188. data/src/core/iomgr/workqueue.h +85 -0
  189. data/src/core/iomgr/workqueue_posix.c +143 -0
  190. data/src/core/iomgr/workqueue_posix.h +51 -0
  191. data/src/core/iomgr/workqueue_windows.c +40 -0
  192. data/src/core/iomgr/workqueue_windows.h +37 -0
  193. data/src/core/json/json.c +64 -0
  194. data/src/core/json/json.h +88 -0
  195. data/src/core/json/json_common.h +49 -0
  196. data/src/core/json/json_reader.c +660 -0
  197. data/src/core/json/json_reader.h +160 -0
  198. data/src/core/json/json_string.c +379 -0
  199. data/src/core/json/json_writer.c +260 -0
  200. data/src/core/json/json_writer.h +97 -0
  201. data/src/core/profiling/basic_timers.c +274 -0
  202. data/src/core/profiling/stap_timers.c +65 -0
  203. data/src/core/profiling/timers.h +119 -0
  204. data/src/core/security/auth_filters.h +42 -0
  205. data/src/core/security/base64.c +233 -0
  206. data/src/core/security/base64.h +52 -0
  207. data/src/core/security/client_auth_filter.c +337 -0
  208. data/src/core/security/credentials.c +1273 -0
  209. data/src/core/security/credentials.h +376 -0
  210. data/src/core/security/credentials_metadata.c +101 -0
  211. data/src/core/security/credentials_posix.c +61 -0
  212. data/src/core/security/credentials_win32.c +61 -0
  213. data/src/core/security/google_default_credentials.c +260 -0
  214. data/src/core/security/handshake.c +327 -0
  215. data/src/core/security/handshake.h +50 -0
  216. data/src/core/security/json_token.c +405 -0
  217. data/src/core/security/json_token.h +118 -0
  218. data/src/core/security/jwt_verifier.c +842 -0
  219. data/src/core/security/jwt_verifier.h +136 -0
  220. data/src/core/security/secure_endpoint.c +383 -0
  221. data/src/core/security/secure_endpoint.h +49 -0
  222. data/src/core/security/security_connector.c +756 -0
  223. data/src/core/security/security_connector.h +246 -0
  224. data/src/core/security/security_context.c +342 -0
  225. data/src/core/security/security_context.h +114 -0
  226. data/src/core/security/server_auth_filter.c +264 -0
  227. data/src/core/security/server_secure_chttp2.c +268 -0
  228. data/src/core/statistics/census_interface.h +76 -0
  229. data/src/core/statistics/census_rpc_stats.h +101 -0
  230. data/src/core/support/alloc.c +90 -0
  231. data/src/core/support/avl.c +288 -0
  232. data/src/core/support/block_annotate.h +48 -0
  233. data/src/core/support/cmdline.c +347 -0
  234. data/src/core/support/cpu_iphone.c +49 -0
  235. data/src/core/support/cpu_linux.c +78 -0
  236. data/src/core/support/cpu_posix.c +77 -0
  237. data/src/core/support/cpu_windows.c +47 -0
  238. data/src/core/support/env.h +60 -0
  239. data/src/core/support/env_linux.c +62 -0
  240. data/src/core/support/env_posix.c +57 -0
  241. data/src/core/support/env_win32.c +65 -0
  242. data/src/core/support/file.c +91 -0
  243. data/src/core/support/file.h +63 -0
  244. data/src/core/support/file_posix.c +85 -0
  245. data/src/core/support/file_win32.c +84 -0
  246. data/src/core/support/histogram.c +244 -0
  247. data/src/core/support/host_port.c +110 -0
  248. data/src/core/support/log.c +66 -0
  249. data/src/core/support/log_android.c +87 -0
  250. data/src/core/support/log_linux.c +105 -0
  251. data/src/core/support/log_posix.c +102 -0
  252. data/src/core/support/log_win32.c +125 -0
  253. data/src/core/support/murmur_hash.c +96 -0
  254. data/src/core/support/murmur_hash.h +44 -0
  255. data/src/core/support/slice.c +343 -0
  256. data/src/core/support/slice_buffer.c +282 -0
  257. data/src/core/support/stack_lockfree.c +175 -0
  258. data/src/core/support/stack_lockfree.h +53 -0
  259. data/src/core/support/string.c +296 -0
  260. data/src/core/support/string.h +121 -0
  261. data/src/core/support/string_posix.c +86 -0
  262. data/src/core/support/string_win32.c +109 -0
  263. data/src/core/support/string_win32.h +47 -0
  264. data/src/core/support/subprocess_posix.c +112 -0
  265. data/src/core/support/sync.c +122 -0
  266. data/src/core/support/sync_posix.c +104 -0
  267. data/src/core/support/sync_win32.c +128 -0
  268. data/src/core/support/thd.c +64 -0
  269. data/src/core/support/thd_internal.h +39 -0
  270. data/src/core/support/thd_posix.c +94 -0
  271. data/src/core/support/thd_win32.c +117 -0
  272. data/src/core/support/time.c +304 -0
  273. data/src/core/support/time_posix.c +161 -0
  274. data/src/core/support/time_precise.c +89 -0
  275. data/src/core/support/time_precise.h +42 -0
  276. data/src/core/support/time_win32.c +101 -0
  277. data/src/core/support/tls_pthread.c +45 -0
  278. data/src/core/surface/api_trace.c +36 -0
  279. data/src/core/surface/api_trace.h +65 -0
  280. data/src/core/surface/byte_buffer.c +97 -0
  281. data/src/core/surface/byte_buffer_reader.c +123 -0
  282. data/src/core/surface/call.c +1424 -0
  283. data/src/core/surface/call.h +109 -0
  284. data/src/core/surface/call_details.c +50 -0
  285. data/src/core/surface/call_log_batch.c +118 -0
  286. data/src/core/surface/call_test_only.h +64 -0
  287. data/src/core/surface/channel.c +327 -0
  288. data/src/core/surface/channel.h +74 -0
  289. data/src/core/surface/channel_connectivity.c +220 -0
  290. data/src/core/surface/channel_create.c +235 -0
  291. data/src/core/surface/channel_ping.c +79 -0
  292. data/src/core/surface/completion_queue.c +481 -0
  293. data/src/core/surface/completion_queue.h +91 -0
  294. data/src/core/surface/event_string.c +81 -0
  295. data/src/core/surface/event_string.h +42 -0
  296. data/src/core/surface/init.c +168 -0
  297. data/src/core/surface/init.h +40 -0
  298. data/src/core/surface/init_secure.c +42 -0
  299. data/src/core/surface/lame_client.c +149 -0
  300. data/src/core/surface/metadata_array.c +49 -0
  301. data/src/core/surface/secure_channel_create.c +336 -0
  302. data/src/core/surface/server.c +1343 -0
  303. data/src/core/surface/server.h +67 -0
  304. data/src/core/surface/server_chttp2.c +149 -0
  305. data/src/core/surface/server_create.c +51 -0
  306. data/src/core/surface/surface_trace.h +48 -0
  307. data/src/core/surface/validate_metadata.c +73 -0
  308. data/src/core/surface/version.c +39 -0
  309. data/src/core/transport/byte_stream.c +76 -0
  310. data/src/core/transport/byte_stream.h +88 -0
  311. data/src/core/transport/chttp2/alpn.c +56 -0
  312. data/src/core/transport/chttp2/alpn.h +49 -0
  313. data/src/core/transport/chttp2/bin_encoder.c +285 -0
  314. data/src/core/transport/chttp2/bin_encoder.h +54 -0
  315. data/src/core/transport/chttp2/frame.h +69 -0
  316. data/src/core/transport/chttp2/frame_data.c +245 -0
  317. data/src/core/transport/chttp2/frame_data.h +101 -0
  318. data/src/core/transport/chttp2/frame_goaway.c +193 -0
  319. data/src/core/transport/chttp2/frame_goaway.h +77 -0
  320. data/src/core/transport/chttp2/frame_ping.c +97 -0
  321. data/src/core/transport/chttp2/frame_ping.h +56 -0
  322. data/src/core/transport/chttp2/frame_rst_stream.c +100 -0
  323. data/src/core/transport/chttp2/frame_rst_stream.h +55 -0
  324. data/src/core/transport/chttp2/frame_settings.c +259 -0
  325. data/src/core/transport/chttp2/frame_settings.h +103 -0
  326. data/src/core/transport/chttp2/frame_window_update.c +114 -0
  327. data/src/core/transport/chttp2/frame_window_update.h +58 -0
  328. data/src/core/transport/chttp2/hpack_encoder.c +572 -0
  329. data/src/core/transport/chttp2/hpack_encoder.h +95 -0
  330. data/src/core/transport/chttp2/hpack_parser.c +1449 -0
  331. data/src/core/transport/chttp2/hpack_parser.h +116 -0
  332. data/src/core/transport/chttp2/hpack_table.c +361 -0
  333. data/src/core/transport/chttp2/hpack_table.h +108 -0
  334. data/src/core/transport/chttp2/http2_errors.h +56 -0
  335. data/src/core/transport/chttp2/huffsyms.c +297 -0
  336. data/src/core/transport/chttp2/huffsyms.h +48 -0
  337. data/src/core/transport/chttp2/incoming_metadata.c +96 -0
  338. data/src/core/transport/chttp2/incoming_metadata.h +60 -0
  339. data/src/core/transport/chttp2/internal.h +757 -0
  340. data/src/core/transport/chttp2/parsing.c +866 -0
  341. data/src/core/transport/chttp2/status_conversion.c +109 -0
  342. data/src/core/transport/chttp2/status_conversion.h +50 -0
  343. data/src/core/transport/chttp2/stream_lists.c +401 -0
  344. data/src/core/transport/chttp2/stream_map.c +198 -0
  345. data/src/core/transport/chttp2/stream_map.h +85 -0
  346. data/src/core/transport/chttp2/timeout_encoding.c +185 -0
  347. data/src/core/transport/chttp2/timeout_encoding.h +47 -0
  348. data/src/core/transport/chttp2/varint.c +66 -0
  349. data/src/core/transport/chttp2/varint.h +76 -0
  350. data/src/core/transport/chttp2/writing.c +356 -0
  351. data/src/core/transport/chttp2_transport.c +1692 -0
  352. data/src/core/transport/chttp2_transport.h +51 -0
  353. data/src/core/transport/connectivity_state.c +164 -0
  354. data/src/core/transport/connectivity_state.h +85 -0
  355. data/src/core/transport/metadata.c +690 -0
  356. data/src/core/transport/metadata.h +156 -0
  357. data/src/core/transport/metadata_batch.c +194 -0
  358. data/src/core/transport/metadata_batch.h +125 -0
  359. data/src/core/transport/static_metadata.c +90 -0
  360. data/src/core/transport/static_metadata.h +408 -0
  361. data/src/core/transport/transport.c +183 -0
  362. data/src/core/transport/transport.h +222 -0
  363. data/src/core/transport/transport_impl.h +78 -0
  364. data/src/core/transport/transport_op_string.c +140 -0
  365. data/src/core/tsi/fake_transport_security.c +525 -0
  366. data/src/core/tsi/fake_transport_security.h +61 -0
  367. data/src/core/tsi/ssl_transport_security.c +1467 -0
  368. data/src/core/tsi/ssl_transport_security.h +173 -0
  369. data/src/core/tsi/transport_security.c +284 -0
  370. data/src/core/tsi/transport_security.h +111 -0
  371. data/src/core/tsi/transport_security_interface.h +344 -0
  372. data/{bin → src/ruby/bin}/apis/google/protobuf/empty.rb +0 -0
  373. data/{bin → src/ruby/bin}/apis/pubsub_demo.rb +7 -15
  374. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub.rb +0 -0
  375. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub_services.rb +0 -0
  376. data/{bin → src/ruby/bin}/grpc_ruby_interop_client +0 -0
  377. data/{bin → src/ruby/bin}/grpc_ruby_interop_server +0 -0
  378. data/{bin → src/ruby/bin}/interop/interop_client.rb +0 -0
  379. data/{bin → src/ruby/bin}/interop/interop_server.rb +0 -0
  380. data/src/ruby/bin/math.rb +32 -0
  381. data/{bin → src/ruby/bin}/math_client.rb +1 -1
  382. data/{bin → src/ruby/bin}/math_server.rb +1 -1
  383. data/src/ruby/bin/math_services.rb +27 -0
  384. data/{bin → src/ruby/bin}/noproto_client.rb +1 -1
  385. data/{bin → src/ruby/bin}/noproto_server.rb +1 -1
  386. data/{ext → src/ruby/ext}/grpc/extconf.rb +24 -40
  387. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.c +0 -0
  388. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.h +0 -0
  389. data/{ext → src/ruby/ext}/grpc/rb_call.c +80 -18
  390. data/{ext → src/ruby/ext}/grpc/rb_call.h +6 -0
  391. data/src/ruby/ext/grpc/rb_call_credentials.c +315 -0
  392. data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
  393. data/{ext → src/ruby/ext}/grpc/rb_channel.c +19 -7
  394. data/{ext → src/ruby/ext}/grpc/rb_channel.h +0 -0
  395. data/{ext → src/ruby/ext}/grpc/rb_channel_args.c +2 -0
  396. data/{ext → src/ruby/ext}/grpc/rb_channel_args.h +0 -0
  397. data/src/ruby/ext/grpc/rb_channel_credentials.c +266 -0
  398. data/{ext/grpc/rb_credentials.h → src/ruby/ext/grpc/rb_channel_credentials.h} +3 -3
  399. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.c +3 -1
  400. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.h +0 -0
  401. data/src/ruby/ext/grpc/rb_event_thread.c +153 -0
  402. data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
  403. data/{ext → src/ruby/ext}/grpc/rb_grpc.c +25 -5
  404. data/{ext → src/ruby/ext}/grpc/rb_grpc.h +0 -0
  405. data/{ext → src/ruby/ext}/grpc/rb_server.c +4 -1
  406. data/{ext → src/ruby/ext}/grpc/rb_server.h +0 -0
  407. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.c +2 -0
  408. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.h +0 -0
  409. data/{lib → src/ruby/lib}/grpc.rb +6 -1
  410. data/{lib → src/ruby/lib}/grpc/core/time_consts.rb +0 -0
  411. data/{lib → src/ruby/lib}/grpc/errors.rb +0 -0
  412. data/{lib → src/ruby/lib}/grpc/generic/active_call.rb +4 -6
  413. data/{lib → src/ruby/lib}/grpc/generic/bidi_call.rb +16 -4
  414. data/{lib → src/ruby/lib}/grpc/generic/client_stub.rb +42 -52
  415. data/{lib → src/ruby/lib}/grpc/generic/rpc_desc.rb +0 -0
  416. data/{lib → src/ruby/lib}/grpc/generic/rpc_server.rb +15 -8
  417. data/{lib → src/ruby/lib}/grpc/generic/service.rb +4 -2
  418. data/src/ruby/lib/grpc/grpc.so +0 -0
  419. data/{lib → src/ruby/lib}/grpc/logconfig.rb +0 -0
  420. data/{lib → src/ruby/lib}/grpc/notifier.rb +0 -0
  421. data/{lib → src/ruby/lib}/grpc/version.rb +2 -2
  422. data/src/ruby/pb/README.md +42 -0
  423. data/src/ruby/pb/generate_proto_ruby.sh +51 -0
  424. data/src/ruby/pb/grpc/health/checker.rb +75 -0
  425. data/src/ruby/pb/grpc/health/v1alpha/health.rb +29 -0
  426. data/src/ruby/pb/grpc/health/v1alpha/health_services.rb +28 -0
  427. data/src/ruby/pb/test/client.rb +469 -0
  428. data/src/ruby/pb/test/proto/empty.rb +15 -0
  429. data/src/ruby/pb/test/proto/messages.rb +80 -0
  430. data/src/ruby/pb/test/proto/test.rb +14 -0
  431. data/src/ruby/pb/test/proto/test_services.rb +64 -0
  432. data/src/ruby/pb/test/server.rb +253 -0
  433. data/{bin/math_services.rb → src/ruby/spec/call_credentials_spec.rb} +19 -18
  434. data/{spec → src/ruby/spec}/call_spec.rb +10 -1
  435. data/{spec/credentials_spec.rb → src/ruby/spec/channel_credentials_spec.rb} +38 -12
  436. data/{spec → src/ruby/spec}/channel_spec.rb +14 -9
  437. data/{spec → src/ruby/spec}/client_server_spec.rb +31 -2
  438. data/{spec → src/ruby/spec}/completion_queue_spec.rb +0 -0
  439. data/{spec → src/ruby/spec}/generic/active_call_spec.rb +2 -1
  440. data/{spec → src/ruby/spec}/generic/client_stub_spec.rb +27 -67
  441. data/{spec → src/ruby/spec}/generic/rpc_desc_spec.rb +0 -0
  442. data/{spec → src/ruby/spec}/generic/rpc_server_pool_spec.rb +0 -0
  443. data/{spec → src/ruby/spec}/generic/rpc_server_spec.rb +12 -46
  444. data/{spec → src/ruby/spec}/generic/service_spec.rb +6 -3
  445. data/{spec → src/ruby/spec}/pb/health/checker_spec.rb +8 -8
  446. data/{spec → src/ruby/spec}/server_credentials_spec.rb +0 -0
  447. data/{spec → src/ruby/spec}/server_spec.rb +0 -0
  448. data/{spec → src/ruby/spec}/spec_helper.rb +0 -0
  449. data/{spec → src/ruby/spec}/testdata/README +0 -0
  450. data/{spec → src/ruby/spec}/testdata/ca.pem +0 -0
  451. data/{spec → src/ruby/spec}/testdata/server1.key +0 -0
  452. data/src/ruby/spec/testdata/server1.pem +16 -0
  453. data/{spec → src/ruby/spec}/time_consts_spec.rb +0 -0
  454. metadata +496 -97
  455. data/bin/math.proto +0 -80
  456. data/bin/math.rb +0 -61
  457. data/ext/grpc/rb_credentials.c +0 -294
  458. data/lib/grpc/grpc.so +0 -0
  459. data/spec/testdata/server1.pem +0 -16
@@ -0,0 +1,260 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #ifndef GRPC_INTERNAL_CORE_CHANNEL_CHANNEL_STACK_H
35
+ #define GRPC_INTERNAL_CORE_CHANNEL_CHANNEL_STACK_H
36
+
37
+ /* A channel filter defines how operations on a channel are implemented.
38
+ Channel filters are chained together to create full channels, and if those
39
+ chains are linear, then channel stacks provide a mechanism to minimize
40
+ allocations for that chain.
41
+ Call stacks are created by channel stacks and represent the per-call data
42
+ for that stack. */
43
+
44
+ #include <stddef.h>
45
+
46
+ #include <grpc/grpc.h>
47
+ #include <grpc/support/log.h>
48
+ #include "src/core/debug/trace.h"
49
+ #include "src/core/transport/transport.h"
50
+
51
+ typedef struct grpc_channel_element grpc_channel_element;
52
+ typedef struct grpc_call_element grpc_call_element;
53
+
54
+ typedef struct grpc_channel_stack grpc_channel_stack;
55
+ typedef struct grpc_call_stack grpc_call_stack;
56
+
57
+ typedef struct {
58
+ grpc_channel_stack *channel_stack;
59
+ const grpc_channel_args *channel_args;
60
+ int is_first;
61
+ int is_last;
62
+ } grpc_channel_element_args;
63
+
64
+ typedef struct {
65
+ grpc_call_stack *call_stack;
66
+ const void *server_transport_data;
67
+ grpc_call_context_element *context;
68
+ } grpc_call_element_args;
69
+
70
+ /* Channel filters specify:
71
+ 1. the amount of memory needed in the channel & call (via the sizeof_XXX
72
+ members)
73
+ 2. functions to initialize and destroy channel & call data
74
+ (init_XXX, destroy_XXX)
75
+ 3. functions to implement call operations and channel operations (call_op,
76
+ channel_op)
77
+ 4. a name, which is useful when debugging
78
+
79
+ Members are laid out in approximate frequency of use order. */
80
+ typedef struct {
81
+ /* Called to eg. send/receive data on a call.
82
+ See grpc_call_next_op on how to call the next element in the stack */
83
+ void (*start_transport_stream_op)(grpc_exec_ctx *exec_ctx,
84
+ grpc_call_element *elem,
85
+ grpc_transport_stream_op *op);
86
+ /* Called to handle channel level operations - e.g. new calls, or transport
87
+ closure.
88
+ See grpc_channel_next_op on how to call the next element in the stack */
89
+ void (*start_transport_op)(grpc_exec_ctx *exec_ctx,
90
+ grpc_channel_element *elem, grpc_transport_op *op);
91
+
92
+ /* sizeof(per call data) */
93
+ size_t sizeof_call_data;
94
+ /* Initialize per call data.
95
+ elem is initialized at the start of the call, and elem->call_data is what
96
+ needs initializing.
97
+ The filter does not need to do any chaining.
98
+ server_transport_data is an opaque pointer. If it is NULL, this call is
99
+ on a client; if it is non-NULL, then it points to memory owned by the
100
+ transport and is on the server. Most filters want to ignore this
101
+ argument. */
102
+ void (*init_call_elem)(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
103
+ grpc_call_element_args *args);
104
+ void (*set_pollset)(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
105
+ grpc_pollset *pollset);
106
+ /* Destroy per call data.
107
+ The filter does not need to do any chaining */
108
+ void (*destroy_call_elem)(grpc_exec_ctx *exec_ctx, grpc_call_element *elem);
109
+
110
+ /* sizeof(per channel data) */
111
+ size_t sizeof_channel_data;
112
+ /* Initialize per-channel data.
113
+ elem is initialized at the start of the call, and elem->channel_data is
114
+ what needs initializing.
115
+ is_first, is_last designate this elements position in the stack, and are
116
+ useful for asserting correct configuration by upper layer code.
117
+ The filter does not need to do any chaining */
118
+ void (*init_channel_elem)(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem,
119
+ grpc_channel_element_args *args);
120
+ /* Destroy per channel data.
121
+ The filter does not need to do any chaining */
122
+ void (*destroy_channel_elem)(grpc_exec_ctx *exec_ctx,
123
+ grpc_channel_element *elem);
124
+
125
+ /* Implement grpc_call_get_peer() */
126
+ char *(*get_peer)(grpc_exec_ctx *exec_ctx, grpc_call_element *elem);
127
+
128
+ /* The name of this filter */
129
+ const char *name;
130
+ } grpc_channel_filter;
131
+
132
+ /* A channel_element tracks its filter and the filter requested memory within
133
+ a channel allocation */
134
+ struct grpc_channel_element {
135
+ const grpc_channel_filter *filter;
136
+ void *channel_data;
137
+ };
138
+
139
+ /* A call_element tracks its filter, the filter requested memory within
140
+ a channel allocation, and the filter requested memory within a call
141
+ allocation */
142
+ struct grpc_call_element {
143
+ const grpc_channel_filter *filter;
144
+ void *channel_data;
145
+ void *call_data;
146
+ };
147
+
148
+ /* A channel stack tracks a set of related filters for one channel, and
149
+ guarantees they live within a single malloc() allocation */
150
+ struct grpc_channel_stack {
151
+ grpc_stream_refcount refcount;
152
+ size_t count;
153
+ /* Memory required for a call stack (computed at channel stack
154
+ initialization) */
155
+ size_t call_stack_size;
156
+ };
157
+
158
+ /* A call stack tracks a set of related filters for one call, and guarantees
159
+ they live within a single malloc() allocation */
160
+ struct grpc_call_stack {
161
+ /* shared refcount for this channel stack.
162
+ MUST be the first element: the underlying code calls destroy
163
+ with the address of the refcount, but higher layers prefer to think
164
+ about the address of the call stack itself. */
165
+ grpc_stream_refcount refcount;
166
+ size_t count;
167
+ };
168
+
169
+ /* Get a channel element given a channel stack and its index */
170
+ grpc_channel_element *grpc_channel_stack_element(grpc_channel_stack *stack,
171
+ size_t i);
172
+ /* Get the last channel element in a channel stack */
173
+ grpc_channel_element *grpc_channel_stack_last_element(
174
+ grpc_channel_stack *stack);
175
+ /* Get a call stack element given a call stack and an index */
176
+ grpc_call_element *grpc_call_stack_element(grpc_call_stack *stack, size_t i);
177
+
178
+ /* Determine memory required for a channel stack containing a set of filters */
179
+ size_t grpc_channel_stack_size(const grpc_channel_filter **filters,
180
+ size_t filter_count);
181
+ /* Initialize a channel stack given some filters */
182
+ void grpc_channel_stack_init(grpc_exec_ctx *exec_ctx, int initial_refs,
183
+ grpc_iomgr_cb_func destroy, void *destroy_arg,
184
+ const grpc_channel_filter **filters,
185
+ size_t filter_count, const grpc_channel_args *args,
186
+ const char *name, grpc_channel_stack *stack);
187
+ /* Destroy a channel stack */
188
+ void grpc_channel_stack_destroy(grpc_exec_ctx *exec_ctx,
189
+ grpc_channel_stack *stack);
190
+
191
+ /* Initialize a call stack given a channel stack. transport_server_data is
192
+ expected to be NULL on a client, or an opaque transport owned pointer on the
193
+ server. */
194
+ void grpc_call_stack_init(grpc_exec_ctx *exec_ctx,
195
+ grpc_channel_stack *channel_stack, int initial_refs,
196
+ grpc_iomgr_cb_func destroy, void *destroy_arg,
197
+ grpc_call_context_element *context,
198
+ const void *transport_server_data,
199
+ grpc_call_stack *call_stack);
200
+ /* Set a pollset for a call stack: must occur before the first op is started */
201
+ void grpc_call_stack_set_pollset(grpc_exec_ctx *exec_ctx,
202
+ grpc_call_stack *call_stack,
203
+ grpc_pollset *pollset);
204
+
205
+ #ifdef GRPC_STREAM_REFCOUNT_DEBUG
206
+ #define GRPC_CALL_STACK_REF(call_stack, reason) \
207
+ grpc_stream_ref(&(call_stack)->refcount, reason)
208
+ #define GRPC_CALL_STACK_UNREF(exec_ctx, call_stack, reason) \
209
+ grpc_stream_unref(exec_ctx, &(call_stack)->refcount, reason)
210
+ #define GRPC_CHANNEL_STACK_REF(channel_stack, reason) \
211
+ grpc_stream_ref(&(channel_stack)->refcount, reason)
212
+ #define GRPC_CHANNEL_STACK_UNREF(exec_ctx, channel_stack, reason) \
213
+ grpc_stream_unref(exec_ctx, &(channel_stack)->refcount, reason)
214
+ #else
215
+ #define GRPC_CALL_STACK_REF(call_stack, reason) \
216
+ grpc_stream_ref(&(call_stack)->refcount)
217
+ #define GRPC_CALL_STACK_UNREF(exec_ctx, call_stack, reason) \
218
+ grpc_stream_unref(exec_ctx, &(call_stack)->refcount)
219
+ #define GRPC_CHANNEL_STACK_REF(channel_stack, reason) \
220
+ grpc_stream_ref(&(channel_stack)->refcount)
221
+ #define GRPC_CHANNEL_STACK_UNREF(exec_ctx, channel_stack, reason) \
222
+ grpc_stream_unref(exec_ctx, &(channel_stack)->refcount)
223
+ #endif
224
+
225
+ /* Destroy a call stack */
226
+ void grpc_call_stack_destroy(grpc_exec_ctx *exec_ctx, grpc_call_stack *stack);
227
+
228
+ /* Ignore set pollset - used by filters to implement the set_pollset method
229
+ if they don't care about pollsets at all. Does nothing. */
230
+ void grpc_call_stack_ignore_set_pollset(grpc_exec_ctx *exec_ctx,
231
+ grpc_call_element *elem,
232
+ grpc_pollset *pollset);
233
+ /* Call the next operation in a call stack */
234
+ void grpc_call_next_op(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
235
+ grpc_transport_stream_op *op);
236
+ /* Call the next operation (depending on call directionality) in a channel
237
+ stack */
238
+ void grpc_channel_next_op(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem,
239
+ grpc_transport_op *op);
240
+ /* Pass through a request to get_peer to the next child element */
241
+ char *grpc_call_next_get_peer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem);
242
+
243
+ /* Given the top element of a channel stack, get the channel stack itself */
244
+ grpc_channel_stack *grpc_channel_stack_from_top_element(
245
+ grpc_channel_element *elem);
246
+ /* Given the top element of a call stack, get the call stack itself */
247
+ grpc_call_stack *grpc_call_stack_from_top_element(grpc_call_element *elem);
248
+
249
+ void grpc_call_log_op(char *file, int line, gpr_log_severity severity,
250
+ grpc_call_element *elem, grpc_transport_stream_op *op);
251
+
252
+ void grpc_call_element_send_cancel(grpc_exec_ctx *exec_ctx,
253
+ grpc_call_element *cur_elem);
254
+
255
+ extern int grpc_trace_channel;
256
+
257
+ #define GRPC_CALL_LOG_OP(sev, elem, op) \
258
+ if (grpc_trace_channel) grpc_call_log_op(sev, elem, op)
259
+
260
+ #endif /* GRPC_INTERNAL_CORE_CHANNEL_CHANNEL_STACK_H */
@@ -0,0 +1,524 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/channel/client_channel.h"
35
+
36
+ #include <stdio.h>
37
+ #include <string.h>
38
+
39
+ #include <grpc/support/alloc.h>
40
+ #include <grpc/support/log.h>
41
+ #include <grpc/support/sync.h>
42
+ #include <grpc/support/useful.h>
43
+
44
+ #include "src/core/channel/channel_args.h"
45
+ #include "src/core/channel/connected_channel.h"
46
+ #include "src/core/channel/subchannel_call_holder.h"
47
+ #include "src/core/iomgr/iomgr.h"
48
+ #include "src/core/profiling/timers.h"
49
+ #include "src/core/support/string.h"
50
+ #include "src/core/surface/channel.h"
51
+ #include "src/core/transport/connectivity_state.h"
52
+
53
+ /* Client channel implementation */
54
+
55
+ typedef grpc_subchannel_call_holder call_data;
56
+
57
+ typedef struct client_channel_channel_data {
58
+ /** resolver for this channel */
59
+ grpc_resolver *resolver;
60
+ /** have we started resolving this channel */
61
+ int started_resolving;
62
+
63
+ /** mutex protecting client configuration, including all
64
+ variables below in this data structure */
65
+ gpr_mu mu_config;
66
+ /** currently active load balancer - guarded by mu_config */
67
+ grpc_lb_policy *lb_policy;
68
+ /** incoming configuration - set by resolver.next
69
+ guarded by mu_config */
70
+ grpc_client_config *incoming_configuration;
71
+ /** a list of closures that are all waiting for config to come in */
72
+ grpc_closure_list waiting_for_config_closures;
73
+ /** resolver callback */
74
+ grpc_closure on_config_changed;
75
+ /** connectivity state being tracked */
76
+ grpc_connectivity_state_tracker state_tracker;
77
+ /** when an lb_policy arrives, should we try to exit idle */
78
+ int exit_idle_when_lb_policy_arrives;
79
+ /** owning stack */
80
+ grpc_channel_stack *owning_stack;
81
+ /** interested parties */
82
+ grpc_pollset_set interested_parties;
83
+ } channel_data;
84
+
85
+ /** We create one watcher for each new lb_policy that is returned from a
86
+ resolver,
87
+ to watch for state changes from the lb_policy. When a state change is seen,
88
+ we
89
+ update the channel, and create a new watcher */
90
+ typedef struct {
91
+ channel_data *chand;
92
+ grpc_closure on_changed;
93
+ grpc_connectivity_state state;
94
+ grpc_lb_policy *lb_policy;
95
+ } lb_policy_connectivity_watcher;
96
+
97
+ typedef struct {
98
+ grpc_closure closure;
99
+ grpc_call_element *elem;
100
+ } waiting_call;
101
+
102
+ static char *cc_get_peer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
103
+ return grpc_subchannel_call_holder_get_peer(exec_ctx, elem->call_data);
104
+ }
105
+
106
+ static void cc_start_transport_stream_op(grpc_exec_ctx *exec_ctx,
107
+ grpc_call_element *elem,
108
+ grpc_transport_stream_op *op) {
109
+ GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
110
+ grpc_subchannel_call_holder_perform_op(exec_ctx, elem->call_data, op);
111
+ }
112
+
113
+ static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand,
114
+ grpc_lb_policy *lb_policy,
115
+ grpc_connectivity_state current_state);
116
+
117
+ static void on_lb_policy_state_changed_locked(
118
+ grpc_exec_ctx *exec_ctx, lb_policy_connectivity_watcher *w) {
119
+ grpc_connectivity_state publish_state = w->state;
120
+ /* check if the notification is for a stale policy */
121
+ if (w->lb_policy != w->chand->lb_policy) return;
122
+
123
+ if (publish_state == GRPC_CHANNEL_FATAL_FAILURE &&
124
+ w->chand->resolver != NULL) {
125
+ publish_state = GRPC_CHANNEL_TRANSIENT_FAILURE;
126
+ grpc_resolver_channel_saw_error(exec_ctx, w->chand->resolver);
127
+ GRPC_LB_POLICY_UNREF(exec_ctx, w->chand->lb_policy, "channel");
128
+ w->chand->lb_policy = NULL;
129
+ }
130
+ grpc_connectivity_state_set(exec_ctx, &w->chand->state_tracker, publish_state,
131
+ "lb_changed");
132
+ if (w->state != GRPC_CHANNEL_FATAL_FAILURE) {
133
+ watch_lb_policy(exec_ctx, w->chand, w->lb_policy, w->state);
134
+ }
135
+ }
136
+
137
+ static void on_lb_policy_state_changed(grpc_exec_ctx *exec_ctx, void *arg,
138
+ int iomgr_success) {
139
+ lb_policy_connectivity_watcher *w = arg;
140
+
141
+ gpr_mu_lock(&w->chand->mu_config);
142
+ on_lb_policy_state_changed_locked(exec_ctx, w);
143
+ gpr_mu_unlock(&w->chand->mu_config);
144
+
145
+ GRPC_CHANNEL_STACK_UNREF(exec_ctx, w->chand->owning_stack, "watch_lb_policy");
146
+ gpr_free(w);
147
+ }
148
+
149
+ static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand,
150
+ grpc_lb_policy *lb_policy,
151
+ grpc_connectivity_state current_state) {
152
+ lb_policy_connectivity_watcher *w = gpr_malloc(sizeof(*w));
153
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "watch_lb_policy");
154
+
155
+ w->chand = chand;
156
+ grpc_closure_init(&w->on_changed, on_lb_policy_state_changed, w);
157
+ w->state = current_state;
158
+ w->lb_policy = lb_policy;
159
+ grpc_lb_policy_notify_on_state_change(exec_ctx, lb_policy, &w->state,
160
+ &w->on_changed);
161
+ }
162
+
163
+ static void cc_on_config_changed(grpc_exec_ctx *exec_ctx, void *arg,
164
+ int iomgr_success) {
165
+ channel_data *chand = arg;
166
+ grpc_lb_policy *lb_policy = NULL;
167
+ grpc_lb_policy *old_lb_policy;
168
+ grpc_resolver *old_resolver;
169
+ grpc_connectivity_state state = GRPC_CHANNEL_TRANSIENT_FAILURE;
170
+ int exit_idle = 0;
171
+
172
+ if (chand->incoming_configuration != NULL) {
173
+ lb_policy = grpc_client_config_get_lb_policy(chand->incoming_configuration);
174
+ if (lb_policy != NULL) {
175
+ GRPC_LB_POLICY_REF(lb_policy, "channel");
176
+ GRPC_LB_POLICY_REF(lb_policy, "config_change");
177
+ state = grpc_lb_policy_check_connectivity(exec_ctx, lb_policy);
178
+ }
179
+
180
+ grpc_client_config_unref(exec_ctx, chand->incoming_configuration);
181
+ }
182
+
183
+ chand->incoming_configuration = NULL;
184
+
185
+ if (lb_policy != NULL) {
186
+ grpc_pollset_set_add_pollset_set(exec_ctx, &lb_policy->interested_parties,
187
+ &chand->interested_parties);
188
+ }
189
+
190
+ gpr_mu_lock(&chand->mu_config);
191
+ old_lb_policy = chand->lb_policy;
192
+ chand->lb_policy = lb_policy;
193
+ if (lb_policy != NULL || chand->resolver == NULL /* disconnected */) {
194
+ grpc_exec_ctx_enqueue_list(exec_ctx, &chand->waiting_for_config_closures);
195
+ }
196
+ if (lb_policy != NULL && chand->exit_idle_when_lb_policy_arrives) {
197
+ GRPC_LB_POLICY_REF(lb_policy, "exit_idle");
198
+ exit_idle = 1;
199
+ chand->exit_idle_when_lb_policy_arrives = 0;
200
+ }
201
+
202
+ if (iomgr_success && chand->resolver) {
203
+ grpc_resolver *resolver = chand->resolver;
204
+ GRPC_RESOLVER_REF(resolver, "channel-next");
205
+ grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state,
206
+ "new_lb+resolver");
207
+ if (lb_policy != NULL) {
208
+ watch_lb_policy(exec_ctx, chand, lb_policy, state);
209
+ }
210
+ gpr_mu_unlock(&chand->mu_config);
211
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
212
+ grpc_resolver_next(exec_ctx, resolver, &chand->incoming_configuration,
213
+ &chand->on_config_changed);
214
+ GRPC_RESOLVER_UNREF(exec_ctx, resolver, "channel-next");
215
+ } else {
216
+ old_resolver = chand->resolver;
217
+ chand->resolver = NULL;
218
+ grpc_connectivity_state_set(exec_ctx, &chand->state_tracker,
219
+ GRPC_CHANNEL_FATAL_FAILURE, "resolver_gone");
220
+ gpr_mu_unlock(&chand->mu_config);
221
+ if (old_resolver != NULL) {
222
+ grpc_resolver_shutdown(exec_ctx, old_resolver);
223
+ GRPC_RESOLVER_UNREF(exec_ctx, old_resolver, "channel");
224
+ }
225
+ }
226
+
227
+ if (exit_idle) {
228
+ grpc_lb_policy_exit_idle(exec_ctx, lb_policy);
229
+ GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "exit_idle");
230
+ }
231
+
232
+ if (old_lb_policy != NULL) {
233
+ grpc_pollset_set_del_pollset_set(exec_ctx,
234
+ &old_lb_policy->interested_parties,
235
+ &chand->interested_parties);
236
+ GRPC_LB_POLICY_UNREF(exec_ctx, old_lb_policy, "channel");
237
+ }
238
+
239
+ if (lb_policy != NULL) {
240
+ GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "config_change");
241
+ }
242
+
243
+ GRPC_CHANNEL_STACK_UNREF(exec_ctx, chand->owning_stack, "resolver");
244
+ }
245
+
246
+ static void cc_start_transport_op(grpc_exec_ctx *exec_ctx,
247
+ grpc_channel_element *elem,
248
+ grpc_transport_op *op) {
249
+ channel_data *chand = elem->channel_data;
250
+ grpc_resolver *destroy_resolver = NULL;
251
+
252
+ grpc_exec_ctx_enqueue(exec_ctx, op->on_consumed, 1);
253
+
254
+ GPR_ASSERT(op->set_accept_stream == NULL);
255
+ if (op->bind_pollset != NULL) {
256
+ grpc_pollset_set_add_pollset(exec_ctx, &chand->interested_parties,
257
+ op->bind_pollset);
258
+ }
259
+
260
+ gpr_mu_lock(&chand->mu_config);
261
+ if (op->on_connectivity_state_change != NULL) {
262
+ grpc_connectivity_state_notify_on_state_change(
263
+ exec_ctx, &chand->state_tracker, op->connectivity_state,
264
+ op->on_connectivity_state_change);
265
+ op->on_connectivity_state_change = NULL;
266
+ op->connectivity_state = NULL;
267
+ }
268
+
269
+ if (op->send_ping != NULL) {
270
+ if (chand->lb_policy == NULL) {
271
+ grpc_exec_ctx_enqueue(exec_ctx, op->send_ping, 0);
272
+ } else {
273
+ grpc_lb_policy_ping_one(exec_ctx, chand->lb_policy, op->send_ping);
274
+ op->bind_pollset = NULL;
275
+ }
276
+ op->send_ping = NULL;
277
+ }
278
+
279
+ if (op->disconnect && chand->resolver != NULL) {
280
+ grpc_connectivity_state_set(exec_ctx, &chand->state_tracker,
281
+ GRPC_CHANNEL_FATAL_FAILURE, "disconnect");
282
+ destroy_resolver = chand->resolver;
283
+ chand->resolver = NULL;
284
+ if (chand->lb_policy != NULL) {
285
+ grpc_pollset_set_del_pollset_set(exec_ctx,
286
+ &chand->lb_policy->interested_parties,
287
+ &chand->interested_parties);
288
+ GRPC_LB_POLICY_UNREF(exec_ctx, chand->lb_policy, "channel");
289
+ chand->lb_policy = NULL;
290
+ }
291
+ }
292
+ gpr_mu_unlock(&chand->mu_config);
293
+
294
+ if (destroy_resolver) {
295
+ grpc_resolver_shutdown(exec_ctx, destroy_resolver);
296
+ GRPC_RESOLVER_UNREF(exec_ctx, destroy_resolver, "channel");
297
+ }
298
+ }
299
+
300
+ typedef struct {
301
+ grpc_metadata_batch *initial_metadata;
302
+ grpc_connected_subchannel **connected_subchannel;
303
+ grpc_closure *on_ready;
304
+ grpc_call_element *elem;
305
+ grpc_closure closure;
306
+ } continue_picking_args;
307
+
308
+ static int cc_pick_subchannel(grpc_exec_ctx *exec_ctx, void *arg,
309
+ grpc_metadata_batch *initial_metadata,
310
+ grpc_connected_subchannel **connected_subchannel,
311
+ grpc_closure *on_ready);
312
+
313
+ static void continue_picking(grpc_exec_ctx *exec_ctx, void *arg, int success) {
314
+ continue_picking_args *cpa = arg;
315
+ if (!success) {
316
+ grpc_exec_ctx_enqueue(exec_ctx, cpa->on_ready, 0);
317
+ } else if (cpa->connected_subchannel == NULL) {
318
+ /* cancelled, do nothing */
319
+ } else if (cc_pick_subchannel(exec_ctx, cpa->elem, cpa->initial_metadata,
320
+ cpa->connected_subchannel, cpa->on_ready)) {
321
+ grpc_exec_ctx_enqueue(exec_ctx, cpa->on_ready, 1);
322
+ }
323
+ gpr_free(cpa);
324
+ }
325
+
326
+ static int cc_pick_subchannel(grpc_exec_ctx *exec_ctx, void *elemp,
327
+ grpc_metadata_batch *initial_metadata,
328
+ grpc_connected_subchannel **connected_subchannel,
329
+ grpc_closure *on_ready) {
330
+ grpc_call_element *elem = elemp;
331
+ channel_data *chand = elem->channel_data;
332
+ call_data *calld = elem->call_data;
333
+ continue_picking_args *cpa;
334
+ grpc_closure *closure;
335
+
336
+ GPR_ASSERT(connected_subchannel);
337
+
338
+ gpr_mu_lock(&chand->mu_config);
339
+ if (initial_metadata == NULL) {
340
+ if (chand->lb_policy != NULL) {
341
+ grpc_lb_policy_cancel_pick(exec_ctx, chand->lb_policy,
342
+ connected_subchannel);
343
+ }
344
+ for (closure = chand->waiting_for_config_closures.head; closure != NULL;
345
+ closure = grpc_closure_next(closure)) {
346
+ cpa = closure->cb_arg;
347
+ if (cpa->connected_subchannel == connected_subchannel) {
348
+ cpa->connected_subchannel = NULL;
349
+ grpc_exec_ctx_enqueue(exec_ctx, cpa->on_ready, 0);
350
+ }
351
+ }
352
+ gpr_mu_unlock(&chand->mu_config);
353
+ return 1;
354
+ }
355
+ if (chand->lb_policy != NULL) {
356
+ int r =
357
+ grpc_lb_policy_pick(exec_ctx, chand->lb_policy, calld->pollset,
358
+ initial_metadata, connected_subchannel, on_ready);
359
+ gpr_mu_unlock(&chand->mu_config);
360
+ return r;
361
+ }
362
+ if (chand->resolver != NULL && !chand->started_resolving) {
363
+ chand->started_resolving = 1;
364
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
365
+ grpc_resolver_next(exec_ctx, chand->resolver,
366
+ &chand->incoming_configuration,
367
+ &chand->on_config_changed);
368
+ }
369
+ cpa = gpr_malloc(sizeof(*cpa));
370
+ cpa->initial_metadata = initial_metadata;
371
+ cpa->connected_subchannel = connected_subchannel;
372
+ cpa->on_ready = on_ready;
373
+ cpa->elem = elem;
374
+ grpc_closure_init(&cpa->closure, continue_picking, cpa);
375
+ grpc_closure_list_add(&chand->waiting_for_config_closures, &cpa->closure, 1);
376
+ gpr_mu_unlock(&chand->mu_config);
377
+ return 0;
378
+ }
379
+
380
+ /* Constructor for call_data */
381
+ static void init_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
382
+ grpc_call_element_args *args) {
383
+ grpc_subchannel_call_holder_init(elem->call_data, cc_pick_subchannel, elem,
384
+ args->call_stack);
385
+ }
386
+
387
+ /* Destructor for call_data */
388
+ static void destroy_call_elem(grpc_exec_ctx *exec_ctx,
389
+ grpc_call_element *elem) {
390
+ grpc_subchannel_call_holder_destroy(exec_ctx, elem->call_data);
391
+ }
392
+
393
+ /* Constructor for channel_data */
394
+ static void init_channel_elem(grpc_exec_ctx *exec_ctx,
395
+ grpc_channel_element *elem,
396
+ grpc_channel_element_args *args) {
397
+ channel_data *chand = elem->channel_data;
398
+
399
+ memset(chand, 0, sizeof(*chand));
400
+
401
+ GPR_ASSERT(args->is_last);
402
+ GPR_ASSERT(elem->filter == &grpc_client_channel_filter);
403
+
404
+ gpr_mu_init(&chand->mu_config);
405
+ grpc_closure_init(&chand->on_config_changed, cc_on_config_changed, chand);
406
+ chand->owning_stack = args->channel_stack;
407
+
408
+ grpc_connectivity_state_init(&chand->state_tracker, GRPC_CHANNEL_IDLE,
409
+ "client_channel");
410
+ grpc_pollset_set_init(&chand->interested_parties);
411
+ }
412
+
413
+ /* Destructor for channel_data */
414
+ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
415
+ grpc_channel_element *elem) {
416
+ channel_data *chand = elem->channel_data;
417
+
418
+ if (chand->resolver != NULL) {
419
+ grpc_resolver_shutdown(exec_ctx, chand->resolver);
420
+ GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel");
421
+ }
422
+ if (chand->lb_policy != NULL) {
423
+ grpc_pollset_set_del_pollset_set(exec_ctx,
424
+ &chand->lb_policy->interested_parties,
425
+ &chand->interested_parties);
426
+ GRPC_LB_POLICY_UNREF(exec_ctx, chand->lb_policy, "channel");
427
+ }
428
+ grpc_connectivity_state_destroy(exec_ctx, &chand->state_tracker);
429
+ grpc_pollset_set_destroy(&chand->interested_parties);
430
+ gpr_mu_destroy(&chand->mu_config);
431
+ }
432
+
433
+ static void cc_set_pollset(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
434
+ grpc_pollset *pollset) {
435
+ call_data *calld = elem->call_data;
436
+ calld->pollset = pollset;
437
+ }
438
+
439
+ const grpc_channel_filter grpc_client_channel_filter = {
440
+ cc_start_transport_stream_op, cc_start_transport_op, sizeof(call_data),
441
+ init_call_elem, cc_set_pollset, destroy_call_elem, sizeof(channel_data),
442
+ init_channel_elem, destroy_channel_elem, cc_get_peer, "client-channel",
443
+ };
444
+
445
+ void grpc_client_channel_set_resolver(grpc_exec_ctx *exec_ctx,
446
+ grpc_channel_stack *channel_stack,
447
+ grpc_resolver *resolver) {
448
+ /* post construction initialization: set the transport setup pointer */
449
+ grpc_channel_element *elem = grpc_channel_stack_last_element(channel_stack);
450
+ channel_data *chand = elem->channel_data;
451
+ gpr_mu_lock(&chand->mu_config);
452
+ GPR_ASSERT(!chand->resolver);
453
+ chand->resolver = resolver;
454
+ GRPC_RESOLVER_REF(resolver, "channel");
455
+ if (!grpc_closure_list_empty(chand->waiting_for_config_closures) ||
456
+ chand->exit_idle_when_lb_policy_arrives) {
457
+ chand->started_resolving = 1;
458
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
459
+ grpc_resolver_next(exec_ctx, resolver, &chand->incoming_configuration,
460
+ &chand->on_config_changed);
461
+ }
462
+ gpr_mu_unlock(&chand->mu_config);
463
+ }
464
+
465
+ grpc_connectivity_state grpc_client_channel_check_connectivity_state(
466
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, int try_to_connect) {
467
+ channel_data *chand = elem->channel_data;
468
+ grpc_connectivity_state out;
469
+ gpr_mu_lock(&chand->mu_config);
470
+ out = grpc_connectivity_state_check(&chand->state_tracker);
471
+ if (out == GRPC_CHANNEL_IDLE && try_to_connect) {
472
+ if (chand->lb_policy != NULL) {
473
+ grpc_lb_policy_exit_idle(exec_ctx, chand->lb_policy);
474
+ } else {
475
+ chand->exit_idle_when_lb_policy_arrives = 1;
476
+ if (!chand->started_resolving && chand->resolver != NULL) {
477
+ GRPC_CHANNEL_STACK_REF(chand->owning_stack, "resolver");
478
+ chand->started_resolving = 1;
479
+ grpc_resolver_next(exec_ctx, chand->resolver,
480
+ &chand->incoming_configuration,
481
+ &chand->on_config_changed);
482
+ }
483
+ }
484
+ }
485
+ gpr_mu_unlock(&chand->mu_config);
486
+ return out;
487
+ }
488
+
489
+ typedef struct {
490
+ channel_data *chand;
491
+ grpc_pollset *pollset;
492
+ grpc_closure *on_complete;
493
+ grpc_closure my_closure;
494
+ } external_connectivity_watcher;
495
+
496
+ static void on_external_watch_complete(grpc_exec_ctx *exec_ctx, void *arg,
497
+ int iomgr_success) {
498
+ external_connectivity_watcher *w = arg;
499
+ grpc_closure *follow_up = w->on_complete;
500
+ grpc_pollset_set_del_pollset(exec_ctx, &w->chand->interested_parties,
501
+ w->pollset);
502
+ GRPC_CHANNEL_STACK_UNREF(exec_ctx, w->chand->owning_stack,
503
+ "external_connectivity_watcher");
504
+ gpr_free(w);
505
+ follow_up->cb(exec_ctx, follow_up->cb_arg, iomgr_success);
506
+ }
507
+
508
+ void grpc_client_channel_watch_connectivity_state(
509
+ grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, grpc_pollset *pollset,
510
+ grpc_connectivity_state *state, grpc_closure *on_complete) {
511
+ channel_data *chand = elem->channel_data;
512
+ external_connectivity_watcher *w = gpr_malloc(sizeof(*w));
513
+ w->chand = chand;
514
+ w->pollset = pollset;
515
+ w->on_complete = on_complete;
516
+ grpc_pollset_set_add_pollset(exec_ctx, &chand->interested_parties, pollset);
517
+ grpc_closure_init(&w->my_closure, on_external_watch_complete, w);
518
+ GRPC_CHANNEL_STACK_REF(w->chand->owning_stack,
519
+ "external_connectivity_watcher");
520
+ gpr_mu_lock(&chand->mu_config);
521
+ grpc_connectivity_state_notify_on_state_change(
522
+ exec_ctx, &chand->state_tracker, state, &w->my_closure);
523
+ gpr_mu_unlock(&chand->mu_config);
524
+ }