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,89 @@
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_IOMGR_TIMER_H
35
+ #define GRPC_INTERNAL_CORE_IOMGR_TIMER_H
36
+
37
+ #include "src/core/iomgr/iomgr.h"
38
+ #include "src/core/iomgr/exec_ctx.h"
39
+ #include <grpc/support/port_platform.h>
40
+ #include <grpc/support/time.h>
41
+
42
+ typedef struct grpc_timer {
43
+ gpr_timespec deadline;
44
+ gpr_uint32 heap_index; /* INVALID_HEAP_INDEX if not in heap */
45
+ int triggered;
46
+ struct grpc_timer *next;
47
+ struct grpc_timer *prev;
48
+ grpc_closure closure;
49
+ } grpc_timer;
50
+
51
+ /* Initialize *timer. When expired or canceled, timer_cb will be called with
52
+ *timer_cb_arg and status to indicate if it expired (SUCCESS) or was
53
+ canceled (CANCELLED). timer_cb is guaranteed to be called exactly once,
54
+ and application code should check the status to determine how it was
55
+ invoked. The application callback is also responsible for maintaining
56
+ information about when to free up any user-level state. */
57
+ void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer,
58
+ gpr_timespec deadline, grpc_iomgr_cb_func timer_cb,
59
+ void *timer_cb_arg, gpr_timespec now);
60
+
61
+ /* Note that there is no timer destroy function. This is because the
62
+ timer is a one-time occurrence with a guarantee that the callback will
63
+ be called exactly once, either at expiration or cancellation. Thus, all
64
+ the internal timer event management state is destroyed just before
65
+ that callback is invoked. If the user has additional state associated with
66
+ the timer, the user is responsible for determining when it is safe to
67
+ destroy that state. */
68
+
69
+ /* Cancel an *timer.
70
+ There are three cases:
71
+ 1. We normally cancel the timer
72
+ 2. The timer has already run
73
+ 3. We can't cancel the timer because it is "in flight".
74
+
75
+ In all of these cases, the cancellation is still considered successful.
76
+ They are essentially distinguished in that the timer_cb will be run
77
+ exactly once from either the cancellation (with status CANCELLED)
78
+ or from the activation (with status SUCCESS)
79
+
80
+ Note carefully that the callback function MAY occur in the same callstack
81
+ as grpc_timer_cancel. It's expected that most timers will be cancelled (their
82
+ primary use is to implement deadlines), and so this code is optimized such
83
+ that cancellation costs as little as possible. Making callbacks run inline
84
+ matches this aim.
85
+
86
+ Requires: cancel() must happen after add() on a given timer */
87
+ void grpc_timer_cancel(grpc_exec_ctx *exec_ctx, grpc_timer *timer);
88
+
89
+ #endif /* GRPC_INTERNAL_CORE_IOMGR_TIMER_H */
@@ -0,0 +1,148 @@
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/iomgr/timer_heap.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include <grpc/support/alloc.h>
39
+ #include <grpc/support/useful.h>
40
+
41
+ /* Adjusts a heap so as to move a hole at position i closer to the root,
42
+ until a suitable position is found for element t. Then, copies t into that
43
+ position. This functor is called each time immediately after modifying a
44
+ value in the underlying container, with the offset of the modified element as
45
+ its argument. */
46
+ static void adjust_upwards(grpc_timer **first, gpr_uint32 i, grpc_timer *t) {
47
+ while (i > 0) {
48
+ gpr_uint32 parent = (gpr_uint32)(((int)i - 1) / 2);
49
+ if (gpr_time_cmp(first[parent]->deadline, t->deadline) >= 0) break;
50
+ first[i] = first[parent];
51
+ first[i]->heap_index = i;
52
+ i = parent;
53
+ }
54
+ first[i] = t;
55
+ t->heap_index = i;
56
+ }
57
+
58
+ /* Adjusts a heap so as to move a hole at position i farther away from the root,
59
+ until a suitable position is found for element t. Then, copies t into that
60
+ position. */
61
+ static void adjust_downwards(grpc_timer **first, gpr_uint32 i,
62
+ gpr_uint32 length, grpc_timer *t) {
63
+ for (;;) {
64
+ gpr_uint32 left_child = 1u + 2u * i;
65
+ gpr_uint32 right_child;
66
+ gpr_uint32 next_i;
67
+ if (left_child >= length) break;
68
+ right_child = left_child + 1;
69
+ next_i = right_child < length &&
70
+ gpr_time_cmp(first[left_child]->deadline,
71
+ first[right_child]->deadline) < 0
72
+ ? right_child
73
+ : left_child;
74
+ if (gpr_time_cmp(t->deadline, first[next_i]->deadline) >= 0) break;
75
+ first[i] = first[next_i];
76
+ first[i]->heap_index = i;
77
+ i = next_i;
78
+ }
79
+ first[i] = t;
80
+ t->heap_index = i;
81
+ }
82
+
83
+ #define SHRINK_MIN_ELEMS 8
84
+ #define SHRINK_FULLNESS_FACTOR 2
85
+
86
+ static void maybe_shrink(grpc_timer_heap *heap) {
87
+ if (heap->timer_count >= 8 &&
88
+ heap->timer_count <= heap->timer_capacity / SHRINK_FULLNESS_FACTOR / 2) {
89
+ heap->timer_capacity = heap->timer_count * SHRINK_FULLNESS_FACTOR;
90
+ heap->timers =
91
+ gpr_realloc(heap->timers, heap->timer_capacity * sizeof(grpc_timer *));
92
+ }
93
+ }
94
+
95
+ static void note_changed_priority(grpc_timer_heap *heap, grpc_timer *timer) {
96
+ gpr_uint32 i = timer->heap_index;
97
+ gpr_uint32 parent = (gpr_uint32)(((int)i - 1) / 2);
98
+ if (gpr_time_cmp(heap->timers[parent]->deadline, timer->deadline) < 0) {
99
+ adjust_upwards(heap->timers, i, timer);
100
+ } else {
101
+ adjust_downwards(heap->timers, i, heap->timer_count, timer);
102
+ }
103
+ }
104
+
105
+ void grpc_timer_heap_init(grpc_timer_heap *heap) {
106
+ memset(heap, 0, sizeof(*heap));
107
+ }
108
+
109
+ void grpc_timer_heap_destroy(grpc_timer_heap *heap) { gpr_free(heap->timers); }
110
+
111
+ int grpc_timer_heap_add(grpc_timer_heap *heap, grpc_timer *timer) {
112
+ if (heap->timer_count == heap->timer_capacity) {
113
+ heap->timer_capacity =
114
+ GPR_MAX(heap->timer_capacity + 1, heap->timer_capacity * 3 / 2);
115
+ heap->timers =
116
+ gpr_realloc(heap->timers, heap->timer_capacity * sizeof(grpc_timer *));
117
+ }
118
+ timer->heap_index = heap->timer_count;
119
+ adjust_upwards(heap->timers, heap->timer_count, timer);
120
+ heap->timer_count++;
121
+ return timer->heap_index == 0;
122
+ }
123
+
124
+ void grpc_timer_heap_remove(grpc_timer_heap *heap, grpc_timer *timer) {
125
+ gpr_uint32 i = timer->heap_index;
126
+ if (i == heap->timer_count - 1) {
127
+ heap->timer_count--;
128
+ maybe_shrink(heap);
129
+ return;
130
+ }
131
+ heap->timers[i] = heap->timers[heap->timer_count - 1];
132
+ heap->timers[i]->heap_index = i;
133
+ heap->timer_count--;
134
+ maybe_shrink(heap);
135
+ note_changed_priority(heap, heap->timers[i]);
136
+ }
137
+
138
+ int grpc_timer_heap_is_empty(grpc_timer_heap *heap) {
139
+ return heap->timer_count == 0;
140
+ }
141
+
142
+ grpc_timer *grpc_timer_heap_top(grpc_timer_heap *heap) {
143
+ return heap->timers[0];
144
+ }
145
+
146
+ void grpc_timer_heap_pop(grpc_timer_heap *heap) {
147
+ grpc_timer_heap_remove(heap, grpc_timer_heap_top(heap));
148
+ }
@@ -0,0 +1,57 @@
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_IOMGR_TIMER_HEAP_H
35
+ #define GRPC_INTERNAL_CORE_IOMGR_TIMER_HEAP_H
36
+
37
+ #include "src/core/iomgr/timer.h"
38
+
39
+ typedef struct {
40
+ grpc_timer **timers;
41
+ gpr_uint32 timer_count;
42
+ gpr_uint32 timer_capacity;
43
+ } grpc_timer_heap;
44
+
45
+ /* return 1 if the new timer is the first timer in the heap */
46
+ int grpc_timer_heap_add(grpc_timer_heap *heap, grpc_timer *timer);
47
+
48
+ void grpc_timer_heap_init(grpc_timer_heap *heap);
49
+ void grpc_timer_heap_destroy(grpc_timer_heap *heap);
50
+
51
+ void grpc_timer_heap_remove(grpc_timer_heap *heap, grpc_timer *timer);
52
+ grpc_timer *grpc_timer_heap_top(grpc_timer_heap *heap);
53
+ void grpc_timer_heap_pop(grpc_timer_heap *heap);
54
+
55
+ int grpc_timer_heap_is_empty(grpc_timer_heap *heap);
56
+
57
+ #endif /* GRPC_INTERNAL_CORE_IOMGR_TIMER_HEAP_H */
@@ -0,0 +1,61 @@
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_IOMGR_TIMER_INTERNAL_H
35
+ #define GRPC_INTERNAL_CORE_IOMGR_TIMER_INTERNAL_H
36
+
37
+ #include "src/core/iomgr/exec_ctx.h"
38
+ #include <grpc/support/sync.h>
39
+ #include <grpc/support/time.h>
40
+
41
+ /* iomgr internal api for dealing with timers */
42
+
43
+ /* Check for timers to be run, and run them.
44
+ Return non zero if timer callbacks were executed.
45
+ Drops drop_mu if it is non-null before executing callbacks.
46
+ If next is non-null, TRY to update *next with the next running timer
47
+ IF that timer occurs before *next current value.
48
+ *next is never guaranteed to be updated on any given execution; however,
49
+ with high probability at least one thread in the system will see an update
50
+ at any time slice. */
51
+
52
+ int grpc_timer_check(grpc_exec_ctx* exec_ctx, gpr_timespec now,
53
+ gpr_timespec* next);
54
+ void grpc_timer_list_init(gpr_timespec now);
55
+ void grpc_timer_list_shutdown(grpc_exec_ctx* exec_ctx);
56
+
57
+ /* the following must be implemented by each iomgr implementation */
58
+
59
+ void grpc_kick_poller(void);
60
+
61
+ #endif /* GRPC_INTERNAL_CORE_IOMGR_TIMER_INTERNAL_H */
@@ -0,0 +1,439 @@
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
+ /* FIXME: "posix" files shouldn't be depending on _GNU_SOURCE */
35
+ #ifndef _GNU_SOURCE
36
+ #define _GNU_SOURCE
37
+ #endif
38
+
39
+ #include <grpc/support/port_platform.h>
40
+
41
+ #ifdef GRPC_NEED_UDP
42
+ #ifdef GPR_POSIX_SOCKET
43
+
44
+ #include "src/core/iomgr/udp_server.h"
45
+
46
+ #include <errno.h>
47
+ #include <fcntl.h>
48
+ #include <limits.h>
49
+ #include <netinet/in.h>
50
+ #include <netinet/tcp.h>
51
+ #include <string.h>
52
+ #include <sys/socket.h>
53
+ #include <sys/stat.h>
54
+ #include <sys/types.h>
55
+ #include <sys/un.h>
56
+ #include <unistd.h>
57
+
58
+ #include "src/core/iomgr/fd_posix.h"
59
+ #include "src/core/iomgr/pollset_posix.h"
60
+ #include "src/core/iomgr/resolve_address.h"
61
+ #include "src/core/iomgr/sockaddr_utils.h"
62
+ #include "src/core/iomgr/socket_utils_posix.h"
63
+ #include "src/core/support/string.h"
64
+ #include <grpc/support/alloc.h>
65
+ #include <grpc/support/log.h>
66
+ #include <grpc/support/sync.h>
67
+ #include <grpc/support/string_util.h>
68
+ #include <grpc/support/time.h>
69
+
70
+ #define INIT_PORT_CAP 2
71
+
72
+ /* one listening port */
73
+ typedef struct {
74
+ int fd;
75
+ grpc_fd *emfd;
76
+ grpc_udp_server *server;
77
+ union {
78
+ gpr_uint8 untyped[GRPC_MAX_SOCKADDR_SIZE];
79
+ struct sockaddr sockaddr;
80
+ struct sockaddr_un un;
81
+ } addr;
82
+ size_t addr_len;
83
+ grpc_closure read_closure;
84
+ grpc_closure destroyed_closure;
85
+ grpc_udp_server_read_cb read_cb;
86
+ } server_port;
87
+
88
+ static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) {
89
+ struct stat st;
90
+
91
+ if (stat(un->sun_path, &st) == 0 && (st.st_mode & S_IFMT) == S_IFSOCK) {
92
+ unlink(un->sun_path);
93
+ }
94
+ }
95
+
96
+ /* the overall server */
97
+ struct grpc_udp_server {
98
+ gpr_mu mu;
99
+ gpr_cv cv;
100
+
101
+ /* active port count: how many ports are actually still listening */
102
+ size_t active_ports;
103
+ /* destroyed port count: how many ports are completely destroyed */
104
+ size_t destroyed_ports;
105
+
106
+ /* is this server shutting down? (boolean) */
107
+ int shutdown;
108
+
109
+ /* all listening ports */
110
+ server_port *ports;
111
+ size_t nports;
112
+ size_t port_capacity;
113
+
114
+ /* shutdown callback */
115
+ grpc_closure *shutdown_complete;
116
+
117
+ /* all pollsets interested in new connections */
118
+ grpc_pollset **pollsets;
119
+ /* number of pollsets in the pollsets array */
120
+ size_t pollset_count;
121
+ /* The parent grpc server */
122
+ grpc_server *grpc_server;
123
+ };
124
+
125
+ grpc_udp_server *grpc_udp_server_create(void) {
126
+ grpc_udp_server *s = gpr_malloc(sizeof(grpc_udp_server));
127
+ gpr_mu_init(&s->mu);
128
+ gpr_cv_init(&s->cv);
129
+ s->active_ports = 0;
130
+ s->destroyed_ports = 0;
131
+ s->shutdown = 0;
132
+ s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
133
+ s->nports = 0;
134
+ s->port_capacity = INIT_PORT_CAP;
135
+
136
+ return s;
137
+ }
138
+
139
+ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) {
140
+ grpc_exec_ctx_enqueue(exec_ctx, s->shutdown_complete, 1);
141
+
142
+ gpr_mu_destroy(&s->mu);
143
+ gpr_cv_destroy(&s->cv);
144
+
145
+ gpr_free(s->ports);
146
+ gpr_free(s);
147
+ }
148
+
149
+ static void destroyed_port(grpc_exec_ctx *exec_ctx, void *server, int success) {
150
+ grpc_udp_server *s = server;
151
+ gpr_mu_lock(&s->mu);
152
+ s->destroyed_ports++;
153
+ if (s->destroyed_ports == s->nports) {
154
+ gpr_mu_unlock(&s->mu);
155
+ finish_shutdown(exec_ctx, s);
156
+ } else {
157
+ gpr_mu_unlock(&s->mu);
158
+ }
159
+ }
160
+
161
+ /* called when all listening endpoints have been shutdown, so no further
162
+ events will be received on them - at this point it's safe to destroy
163
+ things */
164
+ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) {
165
+ size_t i;
166
+
167
+ /* delete ALL the things */
168
+ gpr_mu_lock(&s->mu);
169
+
170
+ if (!s->shutdown) {
171
+ gpr_mu_unlock(&s->mu);
172
+ return;
173
+ }
174
+
175
+ if (s->nports) {
176
+ for (i = 0; i < s->nports; i++) {
177
+ server_port *sp = &s->ports[i];
178
+ if (sp->addr.sockaddr.sa_family == AF_UNIX) {
179
+ unlink_if_unix_domain_socket(&sp->addr.un);
180
+ }
181
+ sp->destroyed_closure.cb = destroyed_port;
182
+ sp->destroyed_closure.cb_arg = s;
183
+ grpc_fd_orphan(exec_ctx, sp->emfd, &sp->destroyed_closure, NULL,
184
+ "udp_listener_shutdown");
185
+ }
186
+ gpr_mu_unlock(&s->mu);
187
+ } else {
188
+ gpr_mu_unlock(&s->mu);
189
+ finish_shutdown(exec_ctx, s);
190
+ }
191
+ }
192
+
193
+ void grpc_udp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_udp_server *s,
194
+ grpc_closure *on_done) {
195
+ size_t i;
196
+ gpr_mu_lock(&s->mu);
197
+
198
+ GPR_ASSERT(!s->shutdown);
199
+ s->shutdown = 1;
200
+
201
+ s->shutdown_complete = on_done;
202
+
203
+ /* shutdown all fd's */
204
+ if (s->active_ports) {
205
+ for (i = 0; i < s->nports; i++) {
206
+ grpc_fd_shutdown(exec_ctx, s->ports[i].emfd);
207
+ }
208
+ gpr_mu_unlock(&s->mu);
209
+ } else {
210
+ gpr_mu_unlock(&s->mu);
211
+ deactivated_all_ports(exec_ctx, s);
212
+ }
213
+ }
214
+
215
+ /* Prepare a recently-created socket for listening. */
216
+ static int prepare_socket(int fd, const struct sockaddr *addr,
217
+ size_t addr_len) {
218
+ struct sockaddr_storage sockname_temp;
219
+ socklen_t sockname_len;
220
+ int get_local_ip;
221
+ int rc;
222
+
223
+ if (fd < 0) {
224
+ goto error;
225
+ }
226
+
227
+ if (!grpc_set_socket_nonblocking(fd, 1) || !grpc_set_socket_cloexec(fd, 1)) {
228
+ gpr_log(GPR_ERROR, "Unable to configure socket %d: %s", fd,
229
+ strerror(errno));
230
+ }
231
+
232
+ get_local_ip = 1;
233
+ rc = setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
234
+ sizeof(get_local_ip));
235
+ if (rc == 0 && addr->sa_family == AF_INET6) {
236
+ #if !defined(__APPLE__)
237
+ rc = setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip,
238
+ sizeof(get_local_ip));
239
+ #endif
240
+ }
241
+
242
+ GPR_ASSERT(addr_len < ~(socklen_t)0);
243
+ if (bind(fd, addr, (socklen_t)addr_len) < 0) {
244
+ char *addr_str;
245
+ grpc_sockaddr_to_string(&addr_str, addr, 0);
246
+ gpr_log(GPR_ERROR, "bind addr=%s: %s", addr_str, strerror(errno));
247
+ gpr_free(addr_str);
248
+ goto error;
249
+ }
250
+
251
+ sockname_len = sizeof(sockname_temp);
252
+ if (getsockname(fd, (struct sockaddr *)&sockname_temp, &sockname_len) < 0) {
253
+ goto error;
254
+ }
255
+
256
+ return grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
257
+
258
+ error:
259
+ if (fd >= 0) {
260
+ close(fd);
261
+ }
262
+ return -1;
263
+ }
264
+
265
+ /* event manager callback when reads are ready */
266
+ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, int success) {
267
+ server_port *sp = arg;
268
+
269
+ if (success == 0) {
270
+ gpr_mu_lock(&sp->server->mu);
271
+ if (0 == --sp->server->active_ports) {
272
+ gpr_mu_unlock(&sp->server->mu);
273
+ deactivated_all_ports(exec_ctx, sp->server);
274
+ } else {
275
+ gpr_mu_unlock(&sp->server->mu);
276
+ }
277
+ return;
278
+ }
279
+
280
+ /* Tell the registered callback that data is available to read. */
281
+ GPR_ASSERT(sp->read_cb);
282
+ sp->read_cb(exec_ctx, sp->emfd, sp->server->grpc_server);
283
+
284
+ /* Re-arm the notification event so we get another chance to read. */
285
+ grpc_fd_notify_on_read(exec_ctx, sp->emfd, &sp->read_closure);
286
+ }
287
+
288
+ static int add_socket_to_server(grpc_udp_server *s, int fd,
289
+ const struct sockaddr *addr, size_t addr_len,
290
+ grpc_udp_server_read_cb read_cb) {
291
+ server_port *sp;
292
+ int port;
293
+ char *addr_str;
294
+ char *name;
295
+
296
+ port = prepare_socket(fd, addr, addr_len);
297
+ if (port >= 0) {
298
+ grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1);
299
+ gpr_asprintf(&name, "udp-server-listener:%s", addr_str);
300
+ gpr_free(addr_str);
301
+ gpr_mu_lock(&s->mu);
302
+ /* append it to the list under a lock */
303
+ if (s->nports == s->port_capacity) {
304
+ s->port_capacity *= 2;
305
+ s->ports = gpr_realloc(s->ports, sizeof(server_port) * s->port_capacity);
306
+ }
307
+ sp = &s->ports[s->nports++];
308
+ sp->server = s;
309
+ sp->fd = fd;
310
+ sp->emfd = grpc_fd_create(fd, name);
311
+ memcpy(sp->addr.untyped, addr, addr_len);
312
+ sp->addr_len = addr_len;
313
+ sp->read_cb = read_cb;
314
+ GPR_ASSERT(sp->emfd);
315
+ gpr_mu_unlock(&s->mu);
316
+ gpr_free(name);
317
+ }
318
+
319
+ return port;
320
+ }
321
+
322
+ int grpc_udp_server_add_port(grpc_udp_server *s, const void *addr,
323
+ size_t addr_len, grpc_udp_server_read_cb read_cb) {
324
+ int allocated_port1 = -1;
325
+ int allocated_port2 = -1;
326
+ unsigned i;
327
+ int fd;
328
+ grpc_dualstack_mode dsmode;
329
+ struct sockaddr_in6 addr6_v4mapped;
330
+ struct sockaddr_in wild4;
331
+ struct sockaddr_in6 wild6;
332
+ struct sockaddr_in addr4_copy;
333
+ struct sockaddr *allocated_addr = NULL;
334
+ struct sockaddr_storage sockname_temp;
335
+ socklen_t sockname_len;
336
+ int port;
337
+
338
+ if (((struct sockaddr *)addr)->sa_family == AF_UNIX) {
339
+ unlink_if_unix_domain_socket(addr);
340
+ }
341
+
342
+ /* Check if this is a wildcard port, and if so, try to keep the port the same
343
+ as some previously created listener. */
344
+ if (grpc_sockaddr_get_port(addr) == 0) {
345
+ for (i = 0; i < s->nports; i++) {
346
+ sockname_len = sizeof(sockname_temp);
347
+ if (0 == getsockname(s->ports[i].fd, (struct sockaddr *)&sockname_temp,
348
+ &sockname_len)) {
349
+ port = grpc_sockaddr_get_port((struct sockaddr *)&sockname_temp);
350
+ if (port > 0) {
351
+ allocated_addr = malloc(addr_len);
352
+ memcpy(allocated_addr, addr, addr_len);
353
+ grpc_sockaddr_set_port(allocated_addr, port);
354
+ addr = allocated_addr;
355
+ break;
356
+ }
357
+ }
358
+ }
359
+ }
360
+
361
+ if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) {
362
+ addr = (const struct sockaddr *)&addr6_v4mapped;
363
+ addr_len = sizeof(addr6_v4mapped);
364
+ }
365
+
366
+ /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */
367
+ if (grpc_sockaddr_is_wildcard(addr, &port)) {
368
+ grpc_sockaddr_make_wildcards(port, &wild4, &wild6);
369
+
370
+ /* Try listening on IPv6 first. */
371
+ addr = (struct sockaddr *)&wild6;
372
+ addr_len = sizeof(wild6);
373
+ fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode);
374
+ allocated_port1 = add_socket_to_server(s, fd, addr, addr_len, read_cb);
375
+ if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) {
376
+ goto done;
377
+ }
378
+
379
+ /* If we didn't get a dualstack socket, also listen on 0.0.0.0. */
380
+ if (port == 0 && allocated_port1 > 0) {
381
+ grpc_sockaddr_set_port((struct sockaddr *)&wild4, allocated_port1);
382
+ }
383
+ addr = (struct sockaddr *)&wild4;
384
+ addr_len = sizeof(wild4);
385
+ }
386
+
387
+ fd = grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode);
388
+ if (fd < 0) {
389
+ gpr_log(GPR_ERROR, "Unable to create socket: %s", strerror(errno));
390
+ }
391
+ if (dsmode == GRPC_DSMODE_IPV4 &&
392
+ grpc_sockaddr_is_v4mapped(addr, &addr4_copy)) {
393
+ addr = (struct sockaddr *)&addr4_copy;
394
+ addr_len = sizeof(addr4_copy);
395
+ }
396
+ allocated_port2 = add_socket_to_server(s, fd, addr, addr_len, read_cb);
397
+
398
+ done:
399
+ gpr_free(allocated_addr);
400
+ return allocated_port1 >= 0 ? allocated_port1 : allocated_port2;
401
+ }
402
+
403
+ int grpc_udp_server_get_fd(grpc_udp_server *s, unsigned port_index) {
404
+ return (port_index < s->nports) ? s->ports[port_index].fd : -1;
405
+ }
406
+
407
+ void grpc_udp_server_start(grpc_exec_ctx *exec_ctx, grpc_udp_server *s,
408
+ grpc_pollset **pollsets, size_t pollset_count,
409
+ grpc_server *server) {
410
+ size_t i, j;
411
+ gpr_mu_lock(&s->mu);
412
+ GPR_ASSERT(s->active_ports == 0);
413
+ s->pollsets = pollsets;
414
+ s->grpc_server = server;
415
+ for (i = 0; i < s->nports; i++) {
416
+ for (j = 0; j < pollset_count; j++) {
417
+ grpc_pollset_add_fd(exec_ctx, pollsets[j], s->ports[i].emfd);
418
+ }
419
+ s->ports[i].read_closure.cb = on_read;
420
+ s->ports[i].read_closure.cb_arg = &s->ports[i];
421
+ grpc_fd_notify_on_read(exec_ctx, s->ports[i].emfd,
422
+ &s->ports[i].read_closure);
423
+ s->active_ports++;
424
+ }
425
+ gpr_mu_unlock(&s->mu);
426
+ }
427
+
428
+ /* TODO(rjshade): Add a test for this method. */
429
+ void grpc_udp_server_write(server_port *sp, const char *buffer, size_t buf_len,
430
+ const struct sockaddr *peer_address) {
431
+ ssize_t rc;
432
+ rc = sendto(sp->fd, buffer, buf_len, 0, peer_address, sizeof(peer_address));
433
+ if (rc < 0) {
434
+ gpr_log(GPR_ERROR, "Unable to send data: %s", strerror(errno));
435
+ }
436
+ }
437
+
438
+ #endif
439
+ #endif