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,258 @@
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 <grpc/support/port_platform.h>
35
+
36
+ #ifdef GPR_LINUX_MULTIPOLL_WITH_EPOLL
37
+
38
+ #include <errno.h>
39
+ #include <poll.h>
40
+ #include <string.h>
41
+ #include <sys/epoll.h>
42
+ #include <unistd.h>
43
+
44
+ #include <grpc/support/alloc.h>
45
+ #include <grpc/support/log.h>
46
+ #include "src/core/iomgr/fd_posix.h"
47
+ #include "src/core/support/block_annotate.h"
48
+ #include "src/core/profiling/timers.h"
49
+
50
+ typedef struct {
51
+ grpc_pollset *pollset;
52
+ grpc_fd *fd;
53
+ grpc_closure closure;
54
+ } delayed_add;
55
+
56
+ typedef struct { int epoll_fd; } pollset_hdr;
57
+
58
+ static void finally_add_fd(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
59
+ grpc_fd *fd) {
60
+ pollset_hdr *h = pollset->data.ptr;
61
+ struct epoll_event ev;
62
+ int err;
63
+ grpc_fd_watcher watcher;
64
+
65
+ /* We pretend to be polling whilst adding an fd to keep the fd from being
66
+ closed during the add. This may result in a spurious wakeup being assigned
67
+ to this pollset whilst adding, but that should be benign. */
68
+ GPR_ASSERT(grpc_fd_begin_poll(fd, pollset, NULL, 0, 0, &watcher) == 0);
69
+ if (watcher.fd != NULL) {
70
+ ev.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET);
71
+ ev.data.ptr = fd;
72
+ err = epoll_ctl(h->epoll_fd, EPOLL_CTL_ADD, fd->fd, &ev);
73
+ if (err < 0) {
74
+ /* FDs may be added to a pollset multiple times, so EEXIST is normal. */
75
+ if (errno != EEXIST) {
76
+ gpr_log(GPR_ERROR, "epoll_ctl add for %d failed: %s", fd->fd,
77
+ strerror(errno));
78
+ }
79
+ }
80
+ }
81
+ grpc_fd_end_poll(exec_ctx, &watcher, 0, 0);
82
+ }
83
+
84
+ static void perform_delayed_add(grpc_exec_ctx *exec_ctx, void *arg,
85
+ int iomgr_status) {
86
+ delayed_add *da = arg;
87
+
88
+ if (!grpc_fd_is_orphaned(da->fd)) {
89
+ finally_add_fd(exec_ctx, da->pollset, da->fd);
90
+ }
91
+
92
+ gpr_mu_lock(&da->pollset->mu);
93
+ da->pollset->in_flight_cbs--;
94
+ if (da->pollset->shutting_down) {
95
+ /* We don't care about this pollset anymore. */
96
+ if (da->pollset->in_flight_cbs == 0 && !da->pollset->called_shutdown) {
97
+ da->pollset->called_shutdown = 1;
98
+ grpc_exec_ctx_enqueue(exec_ctx, da->pollset->shutdown_done, 1);
99
+ }
100
+ }
101
+ gpr_mu_unlock(&da->pollset->mu);
102
+
103
+ GRPC_FD_UNREF(da->fd, "delayed_add");
104
+
105
+ gpr_free(da);
106
+ }
107
+
108
+ static void multipoll_with_epoll_pollset_add_fd(grpc_exec_ctx *exec_ctx,
109
+ grpc_pollset *pollset,
110
+ grpc_fd *fd,
111
+ int and_unlock_pollset) {
112
+ if (and_unlock_pollset) {
113
+ gpr_mu_unlock(&pollset->mu);
114
+ finally_add_fd(exec_ctx, pollset, fd);
115
+ } else {
116
+ delayed_add *da = gpr_malloc(sizeof(*da));
117
+ da->pollset = pollset;
118
+ da->fd = fd;
119
+ GRPC_FD_REF(fd, "delayed_add");
120
+ grpc_closure_init(&da->closure, perform_delayed_add, da);
121
+ pollset->in_flight_cbs++;
122
+ grpc_exec_ctx_enqueue(exec_ctx, &da->closure, 1);
123
+ }
124
+ }
125
+
126
+ /* TODO(klempner): We probably want to turn this down a bit */
127
+ #define GRPC_EPOLL_MAX_EVENTS 1000
128
+
129
+ static void multipoll_with_epoll_pollset_maybe_work_and_unlock(
130
+ grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, grpc_pollset_worker *worker,
131
+ gpr_timespec deadline, gpr_timespec now) {
132
+ struct epoll_event ep_ev[GRPC_EPOLL_MAX_EVENTS];
133
+ int ep_rv;
134
+ int poll_rv;
135
+ pollset_hdr *h = pollset->data.ptr;
136
+ int timeout_ms;
137
+ struct pollfd pfds[2];
138
+
139
+ /* If you want to ignore epoll's ability to sanely handle parallel pollers,
140
+ * for a more apples-to-apples performance comparison with poll, add a
141
+ * if (pollset->counter != 0) { return 0; }
142
+ * here.
143
+ */
144
+
145
+ gpr_mu_unlock(&pollset->mu);
146
+
147
+ timeout_ms = grpc_poll_deadline_to_millis_timeout(deadline, now);
148
+
149
+ pfds[0].fd = GRPC_WAKEUP_FD_GET_READ_FD(&worker->wakeup_fd->fd);
150
+ pfds[0].events = POLLIN;
151
+ pfds[0].revents = 0;
152
+ pfds[1].fd = h->epoll_fd;
153
+ pfds[1].events = POLLIN;
154
+ pfds[1].revents = 0;
155
+
156
+ /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
157
+ even going into the blocking annotation if possible */
158
+ GPR_TIMER_BEGIN("poll", 0);
159
+ GRPC_SCHEDULING_START_BLOCKING_REGION;
160
+ poll_rv = grpc_poll_function(pfds, 2, timeout_ms);
161
+ GRPC_SCHEDULING_END_BLOCKING_REGION;
162
+ GPR_TIMER_END("poll", 0);
163
+
164
+ if (poll_rv < 0) {
165
+ if (errno != EINTR) {
166
+ gpr_log(GPR_ERROR, "poll() failed: %s", strerror(errno));
167
+ }
168
+ } else if (poll_rv == 0) {
169
+ /* do nothing */
170
+ } else {
171
+ if (pfds[0].revents) {
172
+ grpc_wakeup_fd_consume_wakeup(&worker->wakeup_fd->fd);
173
+ }
174
+ if (pfds[1].revents) {
175
+ do {
176
+ /* The following epoll_wait never blocks; it has a timeout of 0 */
177
+ ep_rv = epoll_wait(h->epoll_fd, ep_ev, GRPC_EPOLL_MAX_EVENTS, 0);
178
+ if (ep_rv < 0) {
179
+ if (errno != EINTR) {
180
+ gpr_log(GPR_ERROR, "epoll_wait() failed: %s", strerror(errno));
181
+ }
182
+ } else {
183
+ int i;
184
+ for (i = 0; i < ep_rv; ++i) {
185
+ grpc_fd *fd = ep_ev[i].data.ptr;
186
+ /* TODO(klempner): We might want to consider making err and pri
187
+ * separate events */
188
+ int cancel = ep_ev[i].events & (EPOLLERR | EPOLLHUP);
189
+ int read_ev = ep_ev[i].events & (EPOLLIN | EPOLLPRI);
190
+ int write_ev = ep_ev[i].events & EPOLLOUT;
191
+ if (fd == NULL) {
192
+ grpc_wakeup_fd_consume_wakeup(&grpc_global_wakeup_fd);
193
+ } else {
194
+ if (read_ev || cancel) {
195
+ grpc_fd_become_readable(exec_ctx, fd);
196
+ }
197
+ if (write_ev || cancel) {
198
+ grpc_fd_become_writable(exec_ctx, fd);
199
+ }
200
+ }
201
+ }
202
+ }
203
+ } while (ep_rv == GRPC_EPOLL_MAX_EVENTS);
204
+ }
205
+ }
206
+ }
207
+
208
+ static void multipoll_with_epoll_pollset_finish_shutdown(
209
+ grpc_pollset *pollset) {}
210
+
211
+ static void multipoll_with_epoll_pollset_destroy(grpc_pollset *pollset) {
212
+ pollset_hdr *h = pollset->data.ptr;
213
+ close(h->epoll_fd);
214
+ gpr_free(h);
215
+ }
216
+
217
+ static const grpc_pollset_vtable multipoll_with_epoll_pollset = {
218
+ multipoll_with_epoll_pollset_add_fd,
219
+ multipoll_with_epoll_pollset_maybe_work_and_unlock,
220
+ multipoll_with_epoll_pollset_finish_shutdown,
221
+ multipoll_with_epoll_pollset_destroy};
222
+
223
+ static void epoll_become_multipoller(grpc_exec_ctx *exec_ctx,
224
+ grpc_pollset *pollset, grpc_fd **fds,
225
+ size_t nfds) {
226
+ size_t i;
227
+ pollset_hdr *h = gpr_malloc(sizeof(pollset_hdr));
228
+ struct epoll_event ev;
229
+ int err;
230
+
231
+ pollset->vtable = &multipoll_with_epoll_pollset;
232
+ pollset->data.ptr = h;
233
+ h->epoll_fd = epoll_create1(EPOLL_CLOEXEC);
234
+ if (h->epoll_fd < 0) {
235
+ /* TODO(klempner): Fall back to poll here, especially on ENOSYS */
236
+ gpr_log(GPR_ERROR, "epoll_create1 failed: %s", strerror(errno));
237
+ abort();
238
+ }
239
+
240
+ ev.events = (uint32_t)(EPOLLIN | EPOLLET);
241
+ ev.data.ptr = NULL;
242
+ err = epoll_ctl(h->epoll_fd, EPOLL_CTL_ADD,
243
+ GRPC_WAKEUP_FD_GET_READ_FD(&grpc_global_wakeup_fd), &ev);
244
+ if (err < 0) {
245
+ gpr_log(GPR_ERROR, "epoll_ctl add for %d failed: %s",
246
+ GRPC_WAKEUP_FD_GET_READ_FD(&grpc_global_wakeup_fd),
247
+ strerror(errno));
248
+ }
249
+
250
+ for (i = 0; i < nfds; i++) {
251
+ multipoll_with_epoll_pollset_add_fd(exec_ctx, pollset, fds[i], 0);
252
+ }
253
+ }
254
+
255
+ grpc_platform_become_multipoller_type grpc_platform_become_multipoller =
256
+ epoll_become_multipoller;
257
+
258
+ #endif /* GPR_LINUX_MULTIPOLL_WITH_EPOLL */
@@ -0,0 +1,227 @@
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 <grpc/support/port_platform.h>
35
+
36
+ #ifdef GPR_POSIX_SOCKET
37
+
38
+ #include "src/core/iomgr/pollset_posix.h"
39
+
40
+ #include <errno.h>
41
+ #include <poll.h>
42
+ #include <stdlib.h>
43
+ #include <string.h>
44
+
45
+ #include "src/core/iomgr/fd_posix.h"
46
+ #include "src/core/iomgr/iomgr_internal.h"
47
+ #include "src/core/support/block_annotate.h"
48
+ #include <grpc/support/alloc.h>
49
+ #include <grpc/support/log.h>
50
+ #include <grpc/support/useful.h>
51
+
52
+ typedef struct {
53
+ /* all polled fds */
54
+ size_t fd_count;
55
+ size_t fd_capacity;
56
+ grpc_fd **fds;
57
+ /* fds that have been removed from the pollset explicitly */
58
+ size_t del_count;
59
+ size_t del_capacity;
60
+ grpc_fd **dels;
61
+ } pollset_hdr;
62
+
63
+ static void multipoll_with_poll_pollset_add_fd(grpc_exec_ctx *exec_ctx,
64
+ grpc_pollset *pollset,
65
+ grpc_fd *fd,
66
+ int and_unlock_pollset) {
67
+ size_t i;
68
+ pollset_hdr *h = pollset->data.ptr;
69
+ /* TODO(ctiller): this is O(num_fds^2); maybe switch to a hash set here */
70
+ for (i = 0; i < h->fd_count; i++) {
71
+ if (h->fds[i] == fd) goto exit;
72
+ }
73
+ if (h->fd_count == h->fd_capacity) {
74
+ h->fd_capacity = GPR_MAX(h->fd_capacity + 8, h->fd_count * 3 / 2);
75
+ h->fds = gpr_realloc(h->fds, sizeof(grpc_fd *) * h->fd_capacity);
76
+ }
77
+ h->fds[h->fd_count++] = fd;
78
+ GRPC_FD_REF(fd, "multipoller");
79
+ exit:
80
+ if (and_unlock_pollset) {
81
+ gpr_mu_unlock(&pollset->mu);
82
+ }
83
+ }
84
+
85
+ static void multipoll_with_poll_pollset_maybe_work_and_unlock(
86
+ grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, grpc_pollset_worker *worker,
87
+ gpr_timespec deadline, gpr_timespec now) {
88
+ #define POLLOUT_CHECK (POLLOUT | POLLHUP | POLLERR)
89
+ #define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR)
90
+
91
+ int timeout;
92
+ int r;
93
+ size_t i, j, fd_count;
94
+ nfds_t pfd_count;
95
+ pollset_hdr *h;
96
+ /* TODO(ctiller): inline some elements to avoid an allocation */
97
+ grpc_fd_watcher *watchers;
98
+ struct pollfd *pfds;
99
+
100
+ h = pollset->data.ptr;
101
+ timeout = grpc_poll_deadline_to_millis_timeout(deadline, now);
102
+ /* TODO(ctiller): perform just one malloc here if we exceed the inline case */
103
+ pfds = gpr_malloc(sizeof(*pfds) * (h->fd_count + 2));
104
+ watchers = gpr_malloc(sizeof(*watchers) * (h->fd_count + 2));
105
+ fd_count = 0;
106
+ pfd_count = 2;
107
+ pfds[0].fd = GRPC_WAKEUP_FD_GET_READ_FD(&grpc_global_wakeup_fd);
108
+ pfds[0].events = POLLIN;
109
+ pfds[0].revents = 0;
110
+ pfds[1].fd = GRPC_WAKEUP_FD_GET_READ_FD(&worker->wakeup_fd->fd);
111
+ pfds[1].events = POLLIN;
112
+ pfds[1].revents = 0;
113
+ for (i = 0; i < h->fd_count; i++) {
114
+ int remove = grpc_fd_is_orphaned(h->fds[i]);
115
+ for (j = 0; !remove && j < h->del_count; j++) {
116
+ if (h->fds[i] == h->dels[j]) remove = 1;
117
+ }
118
+ if (remove) {
119
+ GRPC_FD_UNREF(h->fds[i], "multipoller");
120
+ } else {
121
+ h->fds[fd_count++] = h->fds[i];
122
+ watchers[pfd_count].fd = h->fds[i];
123
+ pfds[pfd_count].fd = h->fds[i]->fd;
124
+ pfds[pfd_count].revents = 0;
125
+ pfd_count++;
126
+ }
127
+ }
128
+ for (j = 0; j < h->del_count; j++) {
129
+ GRPC_FD_UNREF(h->dels[j], "multipoller_del");
130
+ }
131
+ h->del_count = 0;
132
+ h->fd_count = fd_count;
133
+ gpr_mu_unlock(&pollset->mu);
134
+
135
+ for (i = 2; i < pfd_count; i++) {
136
+ pfds[i].events = (short)grpc_fd_begin_poll(watchers[i].fd, pollset, worker,
137
+ POLLIN, POLLOUT, &watchers[i]);
138
+ }
139
+
140
+ /* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
141
+ even going into the blocking annotation if possible */
142
+ GRPC_SCHEDULING_START_BLOCKING_REGION;
143
+ r = grpc_poll_function(pfds, pfd_count, timeout);
144
+ GRPC_SCHEDULING_END_BLOCKING_REGION;
145
+
146
+ if (r < 0) {
147
+ gpr_log(GPR_ERROR, "poll() failed: %s", strerror(errno));
148
+ for (i = 2; i < pfd_count; i++) {
149
+ grpc_fd_end_poll(exec_ctx, &watchers[i], 0, 0);
150
+ }
151
+ } else if (r == 0) {
152
+ for (i = 2; i < pfd_count; i++) {
153
+ grpc_fd_end_poll(exec_ctx, &watchers[i], 0, 0);
154
+ }
155
+ } else {
156
+ if (pfds[0].revents & POLLIN_CHECK) {
157
+ grpc_wakeup_fd_consume_wakeup(&grpc_global_wakeup_fd);
158
+ }
159
+ if (pfds[1].revents & POLLIN_CHECK) {
160
+ grpc_wakeup_fd_consume_wakeup(&worker->wakeup_fd->fd);
161
+ }
162
+ for (i = 2; i < pfd_count; i++) {
163
+ if (watchers[i].fd == NULL) {
164
+ grpc_fd_end_poll(exec_ctx, &watchers[i], 0, 0);
165
+ continue;
166
+ }
167
+ grpc_fd_end_poll(exec_ctx, &watchers[i], pfds[i].revents & POLLIN_CHECK,
168
+ pfds[i].revents & POLLOUT_CHECK);
169
+ }
170
+ }
171
+
172
+ gpr_free(pfds);
173
+ gpr_free(watchers);
174
+ }
175
+
176
+ static void multipoll_with_poll_pollset_finish_shutdown(grpc_pollset *pollset) {
177
+ size_t i;
178
+ pollset_hdr *h = pollset->data.ptr;
179
+ for (i = 0; i < h->fd_count; i++) {
180
+ GRPC_FD_UNREF(h->fds[i], "multipoller");
181
+ }
182
+ for (i = 0; i < h->del_count; i++) {
183
+ GRPC_FD_UNREF(h->dels[i], "multipoller_del");
184
+ }
185
+ h->fd_count = 0;
186
+ h->del_count = 0;
187
+ }
188
+
189
+ static void multipoll_with_poll_pollset_destroy(grpc_pollset *pollset) {
190
+ pollset_hdr *h = pollset->data.ptr;
191
+ multipoll_with_poll_pollset_finish_shutdown(pollset);
192
+ gpr_free(h->fds);
193
+ gpr_free(h->dels);
194
+ gpr_free(h);
195
+ }
196
+
197
+ static const grpc_pollset_vtable multipoll_with_poll_pollset = {
198
+ multipoll_with_poll_pollset_add_fd,
199
+ multipoll_with_poll_pollset_maybe_work_and_unlock,
200
+ multipoll_with_poll_pollset_finish_shutdown,
201
+ multipoll_with_poll_pollset_destroy};
202
+
203
+ void grpc_poll_become_multipoller(grpc_exec_ctx *exec_ctx,
204
+ grpc_pollset *pollset, grpc_fd **fds,
205
+ size_t nfds) {
206
+ size_t i;
207
+ pollset_hdr *h = gpr_malloc(sizeof(pollset_hdr));
208
+ pollset->vtable = &multipoll_with_poll_pollset;
209
+ pollset->data.ptr = h;
210
+ h->fd_count = nfds;
211
+ h->fd_capacity = nfds;
212
+ h->fds = gpr_malloc(nfds * sizeof(grpc_fd *));
213
+ h->del_count = 0;
214
+ h->del_capacity = 0;
215
+ h->dels = NULL;
216
+ for (i = 0; i < nfds; i++) {
217
+ h->fds[i] = fds[i];
218
+ GRPC_FD_REF(fds[i], "multipoller");
219
+ }
220
+ }
221
+
222
+ #endif /* GPR_POSIX_SOCKET */
223
+
224
+ #ifdef GPR_POSIX_MULTIPOLL_WITH_POLL
225
+ grpc_platform_become_multipoller_type grpc_platform_become_multipoller =
226
+ grpc_poll_become_multipoller;
227
+ #endif