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,50 @@
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_CLIENT_CONFIG_RESOLVERS_UNIX_RESOLVER_H
35
+ #define GRPC_INTERNAL_CORE_CLIENT_CONFIG_RESOLVERS_UNIX_RESOLVER_H
36
+
37
+ #include <grpc/support/port_platform.h>
38
+
39
+ #include "src/core/client_config/resolver_factory.h"
40
+
41
+ grpc_resolver_factory *grpc_ipv4_resolver_factory_create(void);
42
+
43
+ grpc_resolver_factory *grpc_ipv6_resolver_factory_create(void);
44
+
45
+ #ifdef GPR_POSIX_SOCKET
46
+ /** Create a unix resolver factory */
47
+ grpc_resolver_factory *grpc_unix_resolver_factory_create(void);
48
+ #endif
49
+
50
+ #endif /* GRPC_INTERNAL_CORE_CLIENT_CONFIG_RESOLVERS_UNIX_RESOLVER_H */
@@ -0,0 +1,697 @@
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/client_config/subchannel.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include <grpc/support/alloc.h>
39
+
40
+ #include "src/core/channel/channel_args.h"
41
+ #include "src/core/channel/client_channel.h"
42
+ #include "src/core/channel/connected_channel.h"
43
+ #include "src/core/client_config/initial_connect_string.h"
44
+ #include "src/core/iomgr/timer.h"
45
+ #include "src/core/profiling/timers.h"
46
+ #include "src/core/surface/channel.h"
47
+ #include "src/core/transport/connectivity_state.h"
48
+ #include "src/core/transport/connectivity_state.h"
49
+
50
+ #define INTERNAL_REF_BITS 16
51
+ #define STRONG_REF_MASK (~(gpr_atm)((1 << INTERNAL_REF_BITS) - 1))
52
+
53
+ #define GRPC_SUBCHANNEL_MIN_CONNECT_TIMEOUT_SECONDS 20
54
+ #define GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS 1
55
+ #define GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER 1.6
56
+ #define GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS 120
57
+ #define GRPC_SUBCHANNEL_RECONNECT_JITTER 0.2
58
+
59
+ #define GET_CONNECTED_SUBCHANNEL(subchannel, barrier) \
60
+ ((grpc_connected_subchannel *)(gpr_atm_##barrier##_load( \
61
+ &(subchannel)->connected_subchannel)))
62
+
63
+ typedef struct {
64
+ grpc_closure closure;
65
+ grpc_subchannel *subchannel;
66
+ grpc_connectivity_state connectivity_state;
67
+ } state_watcher;
68
+
69
+ typedef struct external_state_watcher {
70
+ grpc_subchannel *subchannel;
71
+ grpc_pollset_set *pollset_set;
72
+ grpc_closure *notify;
73
+ grpc_closure closure;
74
+ struct external_state_watcher *next;
75
+ struct external_state_watcher *prev;
76
+ } external_state_watcher;
77
+
78
+ struct grpc_subchannel {
79
+ grpc_connector *connector;
80
+
81
+ /** refcount
82
+ - lower INTERNAL_REF_BITS bits are for internal references:
83
+ these do not keep the subchannel open.
84
+ - upper remaining bits are for public references: these do
85
+ keep the subchannel open */
86
+ gpr_atm ref_pair;
87
+
88
+ /** non-transport related channel filters */
89
+ const grpc_channel_filter **filters;
90
+ size_t num_filters;
91
+ /** channel arguments */
92
+ grpc_channel_args *args;
93
+ /** address to connect to */
94
+ struct sockaddr *addr;
95
+ size_t addr_len;
96
+
97
+ /** initial string to send to peer */
98
+ gpr_slice initial_connect_string;
99
+
100
+ /** set during connection */
101
+ grpc_connect_out_args connecting_result;
102
+
103
+ /** callback for connection finishing */
104
+ grpc_closure connected;
105
+
106
+ /** pollset_set tracking who's interested in a connection
107
+ being setup */
108
+ grpc_pollset_set pollset_set;
109
+
110
+ /** active connection, or null; of type grpc_connected_subchannel */
111
+ gpr_atm connected_subchannel;
112
+
113
+ /** mutex protecting remaining elements */
114
+ gpr_mu mu;
115
+
116
+ /** have we seen a disconnection? */
117
+ int disconnected;
118
+ /** are we connecting */
119
+ int connecting;
120
+ /** connectivity state tracking */
121
+ grpc_connectivity_state_tracker state_tracker;
122
+
123
+ external_state_watcher root_external_state_watcher;
124
+
125
+ /** next connect attempt time */
126
+ gpr_timespec next_attempt;
127
+ /** amount to backoff each failure */
128
+ gpr_timespec backoff_delta;
129
+ /** do we have an active alarm? */
130
+ int have_alarm;
131
+ /** our alarm */
132
+ grpc_timer alarm;
133
+ /** current random value */
134
+ gpr_uint32 random;
135
+ };
136
+
137
+ struct grpc_subchannel_call {
138
+ grpc_connected_subchannel *connection;
139
+ };
140
+
141
+ #define SUBCHANNEL_CALL_TO_CALL_STACK(call) ((grpc_call_stack *)((call) + 1))
142
+ #define CHANNEL_STACK_FROM_CONNECTION(con) ((grpc_channel_stack *)(con))
143
+ #define CALLSTACK_TO_SUBCHANNEL_CALL(callstack) \
144
+ (((grpc_subchannel_call *)(callstack)) - 1)
145
+
146
+ static gpr_timespec compute_connect_deadline(grpc_subchannel *c);
147
+ static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *subchannel,
148
+ int iomgr_success);
149
+
150
+ #ifdef GRPC_STREAM_REFCOUNT_DEBUG
151
+ #define REF_REASON reason
152
+ #define REF_LOG(name, p) \
153
+ gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "%s: %p ref %d -> %d %s", \
154
+ (name), (p), (p)->refs.count, (p)->refs.count + 1, reason)
155
+ #define UNREF_LOG(name, p) \
156
+ gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "%s: %p unref %d -> %d %s", \
157
+ (name), (p), (p)->refs.count, (p)->refs.count - 1, reason)
158
+ #define REF_MUTATE_EXTRA_ARGS \
159
+ GRPC_SUBCHANNEL_REF_EXTRA_ARGS, const char *purpose
160
+ #define REF_MUTATE_PURPOSE(x) , file, line, reason, x
161
+ #else
162
+ #define REF_REASON ""
163
+ #define REF_LOG(name, p) \
164
+ do { \
165
+ } while (0)
166
+ #define UNREF_LOG(name, p) \
167
+ do { \
168
+ } while (0)
169
+ #define REF_MUTATE_EXTRA_ARGS
170
+ #define REF_MUTATE_PURPOSE(x)
171
+ #endif
172
+
173
+ /*
174
+ * connection implementation
175
+ */
176
+
177
+ static void connection_destroy(grpc_exec_ctx *exec_ctx, void *arg,
178
+ int success) {
179
+ grpc_connected_subchannel *c = arg;
180
+ grpc_channel_stack_destroy(exec_ctx, CHANNEL_STACK_FROM_CONNECTION(c));
181
+ gpr_free(c);
182
+ }
183
+
184
+ void grpc_connected_subchannel_ref(grpc_connected_subchannel *c
185
+ GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
186
+ GRPC_CHANNEL_STACK_REF(CHANNEL_STACK_FROM_CONNECTION(c), REF_REASON);
187
+ }
188
+
189
+ void grpc_connected_subchannel_unref(grpc_exec_ctx *exec_ctx,
190
+ grpc_connected_subchannel *c
191
+ GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
192
+ GRPC_CHANNEL_STACK_UNREF(exec_ctx, CHANNEL_STACK_FROM_CONNECTION(c),
193
+ REF_REASON);
194
+ }
195
+
196
+ /*
197
+ * grpc_subchannel implementation
198
+ */
199
+
200
+ static void subchannel_destroy(grpc_exec_ctx *exec_ctx, void *arg,
201
+ int success) {
202
+ grpc_subchannel *c = arg;
203
+ gpr_free((void *)c->filters);
204
+ grpc_channel_args_destroy(c->args);
205
+ gpr_free(c->addr);
206
+ gpr_slice_unref(c->initial_connect_string);
207
+ grpc_connectivity_state_destroy(exec_ctx, &c->state_tracker);
208
+ grpc_connector_unref(exec_ctx, c->connector);
209
+ grpc_pollset_set_destroy(&c->pollset_set);
210
+ gpr_free(c);
211
+ }
212
+
213
+ static gpr_atm ref_mutate(grpc_subchannel *c, gpr_atm delta,
214
+ int barrier REF_MUTATE_EXTRA_ARGS) {
215
+ gpr_atm old_val = barrier ? gpr_atm_full_fetch_add(&c->ref_pair, delta)
216
+ : gpr_atm_no_barrier_fetch_add(&c->ref_pair, delta);
217
+ #ifdef GRPC_STREAM_REFCOUNT_DEBUG
218
+ gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
219
+ "SUBCHANNEL: %p % 12s 0x%08x -> 0x%08x [%s]", c, purpose, old_val,
220
+ old_val + delta, reason);
221
+ #endif
222
+ return old_val;
223
+ }
224
+
225
+ void grpc_subchannel_ref(grpc_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
226
+ gpr_atm old_refs;
227
+ old_refs = ref_mutate(c, (1 << INTERNAL_REF_BITS),
228
+ 0 REF_MUTATE_PURPOSE("STRONG_REF"));
229
+ GPR_ASSERT((old_refs & STRONG_REF_MASK) != 0);
230
+ }
231
+
232
+ void grpc_subchannel_weak_ref(grpc_subchannel *c
233
+ GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
234
+ gpr_atm old_refs;
235
+ old_refs = ref_mutate(c, 1, 0 REF_MUTATE_PURPOSE("WEAK_REF"));
236
+ GPR_ASSERT(old_refs != 0);
237
+ }
238
+
239
+ static void disconnect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
240
+ grpc_connected_subchannel *con;
241
+ gpr_mu_lock(&c->mu);
242
+ GPR_ASSERT(!c->disconnected);
243
+ c->disconnected = 1;
244
+ grpc_connector_shutdown(exec_ctx, c->connector);
245
+ con = GET_CONNECTED_SUBCHANNEL(c, no_barrier);
246
+ if (con != NULL) {
247
+ GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, con, "connection");
248
+ gpr_atm_no_barrier_store(&c->connected_subchannel, 0xdeadbeef);
249
+ }
250
+ gpr_mu_unlock(&c->mu);
251
+ }
252
+
253
+ void grpc_subchannel_unref(grpc_exec_ctx *exec_ctx,
254
+ grpc_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
255
+ gpr_atm old_refs;
256
+ old_refs = ref_mutate(c, (gpr_atm)1 - (gpr_atm)(1 << INTERNAL_REF_BITS),
257
+ 1 REF_MUTATE_PURPOSE("STRONG_UNREF"));
258
+ if ((old_refs & STRONG_REF_MASK) == (1 << INTERNAL_REF_BITS)) {
259
+ disconnect(exec_ctx, c);
260
+ }
261
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "strong-unref");
262
+ }
263
+
264
+ void grpc_subchannel_weak_unref(grpc_exec_ctx *exec_ctx,
265
+ grpc_subchannel *c
266
+ GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
267
+ gpr_atm old_refs;
268
+ old_refs = ref_mutate(c, -(gpr_atm)1, 1 REF_MUTATE_PURPOSE("WEAK_UNREF"));
269
+ if (old_refs == 1) {
270
+ grpc_exec_ctx_enqueue(exec_ctx, grpc_closure_create(subchannel_destroy, c),
271
+ 1);
272
+ }
273
+ }
274
+
275
+ static gpr_uint32 random_seed() {
276
+ return (gpr_uint32)(gpr_time_to_millis(gpr_now(GPR_CLOCK_MONOTONIC)));
277
+ }
278
+
279
+ grpc_subchannel *grpc_subchannel_create(grpc_connector *connector,
280
+ grpc_subchannel_args *args) {
281
+ grpc_subchannel *c = gpr_malloc(sizeof(*c));
282
+ memset(c, 0, sizeof(*c));
283
+ gpr_atm_no_barrier_store(&c->ref_pair, 1 << INTERNAL_REF_BITS);
284
+ c->connector = connector;
285
+ grpc_connector_ref(c->connector);
286
+ c->num_filters = args->filter_count;
287
+ c->filters = gpr_malloc(sizeof(grpc_channel_filter *) * c->num_filters);
288
+ memcpy((void *)c->filters, args->filters,
289
+ sizeof(grpc_channel_filter *) * c->num_filters);
290
+ c->addr = gpr_malloc(args->addr_len);
291
+ memcpy(c->addr, args->addr, args->addr_len);
292
+ grpc_pollset_set_init(&c->pollset_set);
293
+ c->addr_len = args->addr_len;
294
+ grpc_set_initial_connect_string(&c->addr, &c->addr_len,
295
+ &c->initial_connect_string);
296
+ c->args = grpc_channel_args_copy(args->args);
297
+ c->random = random_seed();
298
+ c->root_external_state_watcher.next = c->root_external_state_watcher.prev =
299
+ &c->root_external_state_watcher;
300
+ grpc_closure_init(&c->connected, subchannel_connected, c);
301
+ grpc_connectivity_state_init(&c->state_tracker, GRPC_CHANNEL_IDLE,
302
+ "subchannel");
303
+ gpr_mu_init(&c->mu);
304
+ return c;
305
+ }
306
+
307
+ static void continue_connect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
308
+ grpc_connect_in_args args;
309
+
310
+ args.interested_parties = &c->pollset_set;
311
+ args.addr = c->addr;
312
+ args.addr_len = c->addr_len;
313
+ args.deadline = compute_connect_deadline(c);
314
+ args.channel_args = c->args;
315
+ args.initial_connect_string = c->initial_connect_string;
316
+
317
+ grpc_connectivity_state_set(exec_ctx, &c->state_tracker,
318
+ GRPC_CHANNEL_CONNECTING, "state_change");
319
+ grpc_connector_connect(exec_ctx, c->connector, &args, &c->connecting_result,
320
+ &c->connected);
321
+ }
322
+
323
+ static void start_connect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
324
+ c->backoff_delta = gpr_time_from_seconds(
325
+ GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS, GPR_TIMESPAN);
326
+ c->next_attempt =
327
+ gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), c->backoff_delta);
328
+ continue_connect(exec_ctx, c);
329
+ }
330
+
331
+ grpc_connectivity_state grpc_subchannel_check_connectivity(grpc_subchannel *c) {
332
+ grpc_connectivity_state state;
333
+ gpr_mu_lock(&c->mu);
334
+ state = grpc_connectivity_state_check(&c->state_tracker);
335
+ gpr_mu_unlock(&c->mu);
336
+ return state;
337
+ }
338
+
339
+ static void on_external_state_watcher_done(grpc_exec_ctx *exec_ctx, void *arg,
340
+ int success) {
341
+ external_state_watcher *w = arg;
342
+ grpc_closure *follow_up = w->notify;
343
+ if (w->pollset_set != NULL) {
344
+ grpc_pollset_set_del_pollset_set(exec_ctx, &w->subchannel->pollset_set,
345
+ w->pollset_set);
346
+ }
347
+ gpr_mu_lock(&w->subchannel->mu);
348
+ w->next->prev = w->prev;
349
+ w->prev->next = w->next;
350
+ gpr_mu_unlock(&w->subchannel->mu);
351
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, w->subchannel, "external_state_watcher");
352
+ gpr_free(w);
353
+ follow_up->cb(exec_ctx, follow_up->cb_arg, success);
354
+ }
355
+
356
+ void grpc_subchannel_notify_on_state_change(
357
+ grpc_exec_ctx *exec_ctx, grpc_subchannel *c,
358
+ grpc_pollset_set *interested_parties, grpc_connectivity_state *state,
359
+ grpc_closure *notify) {
360
+ int do_connect = 0;
361
+ external_state_watcher *w;
362
+
363
+ if (state == NULL) {
364
+ gpr_mu_lock(&c->mu);
365
+ for (w = c->root_external_state_watcher.next;
366
+ w != &c->root_external_state_watcher; w = w->next) {
367
+ if (w->notify == notify) {
368
+ grpc_connectivity_state_notify_on_state_change(
369
+ exec_ctx, &c->state_tracker, NULL, &w->closure);
370
+ }
371
+ }
372
+ gpr_mu_unlock(&c->mu);
373
+ } else {
374
+ w = gpr_malloc(sizeof(*w));
375
+ w->subchannel = c;
376
+ w->pollset_set = interested_parties;
377
+ w->notify = notify;
378
+ grpc_closure_init(&w->closure, on_external_state_watcher_done, w);
379
+ if (interested_parties != NULL) {
380
+ grpc_pollset_set_add_pollset_set(exec_ctx, &c->pollset_set,
381
+ interested_parties);
382
+ }
383
+ GRPC_SUBCHANNEL_WEAK_REF(c, "external_state_watcher");
384
+ gpr_mu_lock(&c->mu);
385
+ w->next = &c->root_external_state_watcher;
386
+ w->prev = w->next->prev;
387
+ w->next->prev = w->prev->next = w;
388
+ if (grpc_connectivity_state_notify_on_state_change(
389
+ exec_ctx, &c->state_tracker, state, &w->closure)) {
390
+ do_connect = 1;
391
+ c->connecting = 1;
392
+ /* released by connection */
393
+ GRPC_SUBCHANNEL_WEAK_REF(c, "connecting");
394
+ }
395
+ gpr_mu_unlock(&c->mu);
396
+ }
397
+
398
+ if (do_connect) {
399
+ start_connect(exec_ctx, c);
400
+ }
401
+ }
402
+
403
+ void grpc_connected_subchannel_process_transport_op(
404
+ grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con,
405
+ grpc_transport_op *op) {
406
+ grpc_channel_stack *channel_stack = CHANNEL_STACK_FROM_CONNECTION(con);
407
+ grpc_channel_element *top_elem = grpc_channel_stack_element(channel_stack, 0);
408
+ top_elem->filter->start_transport_op(exec_ctx, top_elem, op);
409
+ }
410
+
411
+ static void subchannel_on_child_state_changed(grpc_exec_ctx *exec_ctx, void *p,
412
+ int iomgr_success) {
413
+ state_watcher *sw = p;
414
+ grpc_subchannel *c = sw->subchannel;
415
+ gpr_mu *mu = &c->mu;
416
+
417
+ gpr_mu_lock(mu);
418
+
419
+ /* if we failed just leave this closure */
420
+ if (iomgr_success) {
421
+ if (sw->connectivity_state == GRPC_CHANNEL_TRANSIENT_FAILURE) {
422
+ /* any errors on a subchannel ==> we're done, create a new one */
423
+ sw->connectivity_state = GRPC_CHANNEL_FATAL_FAILURE;
424
+ }
425
+ grpc_connectivity_state_set(exec_ctx, &c->state_tracker,
426
+ sw->connectivity_state, "reflect_child");
427
+ if (sw->connectivity_state != GRPC_CHANNEL_FATAL_FAILURE) {
428
+ grpc_connected_subchannel_notify_on_state_change(
429
+ exec_ctx, GET_CONNECTED_SUBCHANNEL(c, no_barrier), NULL,
430
+ &sw->connectivity_state, &sw->closure);
431
+ GRPC_SUBCHANNEL_WEAK_REF(c, "state_watcher");
432
+ sw = NULL;
433
+ }
434
+ }
435
+
436
+ gpr_mu_unlock(mu);
437
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "state_watcher");
438
+ gpr_free(sw);
439
+ }
440
+
441
+ static void connected_subchannel_state_op(grpc_exec_ctx *exec_ctx,
442
+ grpc_connected_subchannel *con,
443
+ grpc_pollset_set *interested_parties,
444
+ grpc_connectivity_state *state,
445
+ grpc_closure *closure) {
446
+ grpc_transport_op op;
447
+ grpc_channel_element *elem;
448
+ memset(&op, 0, sizeof(op));
449
+ op.connectivity_state = state;
450
+ op.on_connectivity_state_change = closure;
451
+ op.bind_pollset_set = interested_parties;
452
+ elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CONNECTION(con), 0);
453
+ elem->filter->start_transport_op(exec_ctx, elem, &op);
454
+ }
455
+
456
+ void grpc_connected_subchannel_notify_on_state_change(
457
+ grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con,
458
+ grpc_pollset_set *interested_parties, grpc_connectivity_state *state,
459
+ grpc_closure *closure) {
460
+ connected_subchannel_state_op(exec_ctx, con, interested_parties, state,
461
+ closure);
462
+ }
463
+
464
+ void grpc_connected_subchannel_ping(grpc_exec_ctx *exec_ctx,
465
+ grpc_connected_subchannel *con,
466
+ grpc_closure *closure) {
467
+ grpc_transport_op op;
468
+ grpc_channel_element *elem;
469
+ memset(&op, 0, sizeof(op));
470
+ op.send_ping = closure;
471
+ elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CONNECTION(con), 0);
472
+ elem->filter->start_transport_op(exec_ctx, elem, &op);
473
+ }
474
+
475
+ static void publish_transport(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) {
476
+ size_t channel_stack_size;
477
+ grpc_connected_subchannel *con;
478
+ grpc_channel_stack *stk;
479
+ size_t num_filters;
480
+ const grpc_channel_filter **filters;
481
+ state_watcher *sw_subchannel;
482
+
483
+ /* build final filter list */
484
+ num_filters = c->num_filters + c->connecting_result.num_filters + 1;
485
+ filters = gpr_malloc(sizeof(*filters) * num_filters);
486
+ memcpy((void *)filters, c->filters, sizeof(*filters) * c->num_filters);
487
+ memcpy((void *)(filters + c->num_filters), c->connecting_result.filters,
488
+ sizeof(*filters) * c->connecting_result.num_filters);
489
+ filters[num_filters - 1] = &grpc_connected_channel_filter;
490
+
491
+ /* construct channel stack */
492
+ channel_stack_size = grpc_channel_stack_size(filters, num_filters);
493
+ con = gpr_malloc(channel_stack_size);
494
+ stk = CHANNEL_STACK_FROM_CONNECTION(con);
495
+ grpc_channel_stack_init(exec_ctx, 1, connection_destroy, con, filters,
496
+ num_filters, c->connecting_result.channel_args,
497
+ "CONNECTED_SUBCHANNEL", stk);
498
+ grpc_connected_channel_bind_transport(stk, c->connecting_result.transport);
499
+ gpr_free((void *)c->connecting_result.filters);
500
+ memset(&c->connecting_result, 0, sizeof(c->connecting_result));
501
+
502
+ /* initialize state watcher */
503
+ sw_subchannel = gpr_malloc(sizeof(*sw_subchannel));
504
+ sw_subchannel->subchannel = c;
505
+ sw_subchannel->connectivity_state = GRPC_CHANNEL_READY;
506
+ grpc_closure_init(&sw_subchannel->closure, subchannel_on_child_state_changed,
507
+ sw_subchannel);
508
+
509
+ gpr_mu_lock(&c->mu);
510
+
511
+ if (c->disconnected) {
512
+ gpr_mu_unlock(&c->mu);
513
+ gpr_free(sw_subchannel);
514
+ gpr_free((void *)filters);
515
+ grpc_channel_stack_destroy(exec_ctx, stk);
516
+ gpr_free(con);
517
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
518
+ return;
519
+ }
520
+
521
+ /* publish */
522
+ GPR_ASSERT(gpr_atm_no_barrier_cas(&c->connected_subchannel, 0, (gpr_atm)con));
523
+ c->connecting = 0;
524
+
525
+ /* setup subchannel watching connected subchannel for changes; subchannel ref
526
+ for connecting is donated
527
+ to the state watcher */
528
+ GRPC_SUBCHANNEL_WEAK_REF(c, "state_watcher");
529
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
530
+ grpc_connected_subchannel_notify_on_state_change(
531
+ exec_ctx, con, &c->pollset_set, &sw_subchannel->connectivity_state,
532
+ &sw_subchannel->closure);
533
+
534
+ /* signal completion */
535
+ grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_READY,
536
+ "connected");
537
+
538
+ gpr_mu_unlock(&c->mu);
539
+ gpr_free((void *)filters);
540
+ }
541
+
542
+ /* Generate a random number between 0 and 1. */
543
+ static double generate_uniform_random_number(grpc_subchannel *c) {
544
+ c->random = (1103515245 * c->random + 12345) % ((gpr_uint32)1 << 31);
545
+ return c->random / (double)((gpr_uint32)1 << 31);
546
+ }
547
+
548
+ /* Update backoff_delta and next_attempt in subchannel */
549
+ static void update_reconnect_parameters(grpc_subchannel *c) {
550
+ size_t i;
551
+ gpr_int32 backoff_delta_millis, jitter;
552
+ gpr_int32 max_backoff_millis =
553
+ GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS * 1000;
554
+ double jitter_range;
555
+
556
+ if (c->args) {
557
+ for (i = 0; i < c->args->num_args; i++) {
558
+ if (0 == strcmp(c->args->args[i].key,
559
+ "grpc.testing.fixed_reconnect_backoff")) {
560
+ GPR_ASSERT(c->args->args[i].type == GRPC_ARG_INTEGER);
561
+ c->next_attempt = gpr_time_add(
562
+ gpr_now(GPR_CLOCK_MONOTONIC),
563
+ gpr_time_from_millis(c->args->args[i].value.integer, GPR_TIMESPAN));
564
+ return;
565
+ }
566
+ }
567
+ }
568
+
569
+ backoff_delta_millis =
570
+ (gpr_int32)(gpr_time_to_millis(c->backoff_delta) *
571
+ GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER);
572
+ if (backoff_delta_millis > max_backoff_millis) {
573
+ backoff_delta_millis = max_backoff_millis;
574
+ }
575
+ c->backoff_delta = gpr_time_from_millis(backoff_delta_millis, GPR_TIMESPAN);
576
+ c->next_attempt =
577
+ gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), c->backoff_delta);
578
+
579
+ jitter_range = GRPC_SUBCHANNEL_RECONNECT_JITTER * backoff_delta_millis;
580
+ jitter =
581
+ (gpr_int32)((2 * generate_uniform_random_number(c) - 1) * jitter_range);
582
+ c->next_attempt =
583
+ gpr_time_add(c->next_attempt, gpr_time_from_millis(jitter, GPR_TIMESPAN));
584
+ }
585
+
586
+ static void on_alarm(grpc_exec_ctx *exec_ctx, void *arg, int iomgr_success) {
587
+ grpc_subchannel *c = arg;
588
+ gpr_mu_lock(&c->mu);
589
+ c->have_alarm = 0;
590
+ if (c->disconnected) {
591
+ iomgr_success = 0;
592
+ }
593
+ gpr_mu_unlock(&c->mu);
594
+ if (iomgr_success) {
595
+ update_reconnect_parameters(c);
596
+ continue_connect(exec_ctx, c);
597
+ } else {
598
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
599
+ }
600
+ }
601
+
602
+ static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *arg,
603
+ int iomgr_success) {
604
+ grpc_subchannel *c = arg;
605
+
606
+ if (c->connecting_result.transport != NULL) {
607
+ publish_transport(exec_ctx, c);
608
+ } else if (c->disconnected) {
609
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, c, "connecting");
610
+ } else {
611
+ gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
612
+ gpr_mu_lock(&c->mu);
613
+ GPR_ASSERT(!c->have_alarm);
614
+ c->have_alarm = 1;
615
+ grpc_connectivity_state_set(exec_ctx, &c->state_tracker,
616
+ GRPC_CHANNEL_TRANSIENT_FAILURE,
617
+ "connect_failed");
618
+ grpc_timer_init(exec_ctx, &c->alarm, c->next_attempt, on_alarm, c, now);
619
+ gpr_mu_unlock(&c->mu);
620
+ }
621
+ }
622
+
623
+ static gpr_timespec compute_connect_deadline(grpc_subchannel *c) {
624
+ gpr_timespec current_deadline =
625
+ gpr_time_add(c->next_attempt, c->backoff_delta);
626
+ gpr_timespec min_deadline = gpr_time_add(
627
+ gpr_now(GPR_CLOCK_MONOTONIC),
628
+ gpr_time_from_seconds(GRPC_SUBCHANNEL_MIN_CONNECT_TIMEOUT_SECONDS,
629
+ GPR_TIMESPAN));
630
+ return gpr_time_cmp(current_deadline, min_deadline) > 0 ? current_deadline
631
+ : min_deadline;
632
+ }
633
+
634
+ /*
635
+ * grpc_subchannel_call implementation
636
+ */
637
+
638
+ static void subchannel_call_destroy(grpc_exec_ctx *exec_ctx, void *call,
639
+ int success) {
640
+ grpc_subchannel_call *c = call;
641
+ GPR_TIMER_BEGIN("grpc_subchannel_call_unref.destroy", 0);
642
+ grpc_call_stack_destroy(exec_ctx, SUBCHANNEL_CALL_TO_CALL_STACK(c));
643
+ GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, c->connection, "subchannel_call");
644
+ gpr_free(c);
645
+ GPR_TIMER_END("grpc_subchannel_call_unref.destroy", 0);
646
+ }
647
+
648
+ void grpc_subchannel_call_ref(grpc_subchannel_call *c
649
+ GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
650
+ GRPC_CALL_STACK_REF(SUBCHANNEL_CALL_TO_CALL_STACK(c), REF_REASON);
651
+ }
652
+
653
+ void grpc_subchannel_call_unref(grpc_exec_ctx *exec_ctx,
654
+ grpc_subchannel_call *c
655
+ GRPC_SUBCHANNEL_REF_EXTRA_ARGS) {
656
+ GRPC_CALL_STACK_UNREF(exec_ctx, SUBCHANNEL_CALL_TO_CALL_STACK(c), REF_REASON);
657
+ }
658
+
659
+ char *grpc_subchannel_call_get_peer(grpc_exec_ctx *exec_ctx,
660
+ grpc_subchannel_call *call) {
661
+ grpc_call_stack *call_stack = SUBCHANNEL_CALL_TO_CALL_STACK(call);
662
+ grpc_call_element *top_elem = grpc_call_stack_element(call_stack, 0);
663
+ return top_elem->filter->get_peer(exec_ctx, top_elem);
664
+ }
665
+
666
+ void grpc_subchannel_call_process_op(grpc_exec_ctx *exec_ctx,
667
+ grpc_subchannel_call *call,
668
+ grpc_transport_stream_op *op) {
669
+ grpc_call_stack *call_stack = SUBCHANNEL_CALL_TO_CALL_STACK(call);
670
+ grpc_call_element *top_elem = grpc_call_stack_element(call_stack, 0);
671
+ top_elem->filter->start_transport_stream_op(exec_ctx, top_elem, op);
672
+ }
673
+
674
+ grpc_connected_subchannel *grpc_subchannel_get_connected_subchannel(
675
+ grpc_subchannel *c) {
676
+ return GET_CONNECTED_SUBCHANNEL(c, acq);
677
+ }
678
+
679
+ grpc_subchannel_call *grpc_connected_subchannel_create_call(
680
+ grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con,
681
+ grpc_pollset *pollset) {
682
+ grpc_channel_stack *chanstk = CHANNEL_STACK_FROM_CONNECTION(con);
683
+ grpc_subchannel_call *call =
684
+ gpr_malloc(sizeof(grpc_subchannel_call) + chanstk->call_stack_size);
685
+ grpc_call_stack *callstk = SUBCHANNEL_CALL_TO_CALL_STACK(call);
686
+ call->connection = con;
687
+ GRPC_CONNECTED_SUBCHANNEL_REF(con, "subchannel_call");
688
+ grpc_call_stack_init(exec_ctx, chanstk, 1, subchannel_call_destroy, call,
689
+ NULL, NULL, callstk);
690
+ grpc_call_stack_set_pollset(exec_ctx, callstk, pollset);
691
+ return call;
692
+ }
693
+
694
+ grpc_call_stack *grpc_subchannel_call_get_call_stack(
695
+ grpc_subchannel_call *subchannel_call) {
696
+ return SUBCHANNEL_CALL_TO_CALL_STACK(subchannel_call);
697
+ }