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,76 @@
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_STATISTICS_CENSUS_INTERFACE_H
35
+ #define GRPC_INTERNAL_CORE_STATISTICS_CENSUS_INTERFACE_H
36
+
37
+ #include <grpc/support/port_platform.h>
38
+
39
+ /* Maximum length of an individual census trace annotation. */
40
+ #define CENSUS_MAX_ANNOTATION_LENGTH 200
41
+
42
+ /* Structure of a census op id. Define as structure because 64bit integer is not
43
+ available on every platform for C89. */
44
+ typedef struct census_op_id {
45
+ gpr_uint32 upper;
46
+ gpr_uint32 lower;
47
+ } census_op_id;
48
+
49
+ typedef struct census_rpc_stats census_rpc_stats;
50
+
51
+ /* Initializes Census library. No-op if Census is already initialized. */
52
+ void census_init(void);
53
+
54
+ /* Shutdown Census Library. */
55
+ void census_shutdown(void);
56
+
57
+ /* Annotates grpc method name on a census_op_id. The method name has the format
58
+ of <full quantified rpc service name>/<rpc function name>. Returns 0 iff
59
+ op_id and method_name are all valid. op_id is valid after its creation and
60
+ before calling census_tracing_end_op().
61
+
62
+ TODO(hongyu): Figure out valid characters set for service name and command
63
+ name and document requirements here.*/
64
+ int census_add_method_tag(census_op_id op_id, const char *method_name);
65
+
66
+ /* Annotates tracing information to a specific op_id.
67
+ Up to CENSUS_MAX_ANNOTATION_LENGTH bytes are recorded. */
68
+ void census_tracing_print(census_op_id op_id, const char *annotation);
69
+
70
+ /* Starts tracing for an RPC. Returns a locally unique census_op_id */
71
+ census_op_id census_tracing_start_op(void);
72
+
73
+ /* Ends tracing. Calling this function will invalidate the input op_id. */
74
+ void census_tracing_end_op(census_op_id op_id);
75
+
76
+ #endif /* GRPC_INTERNAL_CORE_STATISTICS_CENSUS_INTERFACE_H */
@@ -0,0 +1,101 @@
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_STATISTICS_CENSUS_RPC_STATS_H
35
+ #define GRPC_INTERNAL_CORE_STATISTICS_CENSUS_RPC_STATS_H
36
+
37
+ #include "src/core/statistics/census_interface.h"
38
+ #include <grpc/support/port_platform.h>
39
+
40
+ #ifdef __cplusplus
41
+ extern "C" {
42
+ #endif
43
+
44
+ struct census_rpc_stats {
45
+ gpr_uint64 cnt;
46
+ gpr_uint64 rpc_error_cnt;
47
+ gpr_uint64 app_error_cnt;
48
+ double elapsed_time_ms;
49
+ double api_request_bytes;
50
+ double wire_request_bytes;
51
+ double api_response_bytes;
52
+ double wire_response_bytes;
53
+ };
54
+
55
+ /* Creates an empty rpc stats object on heap. */
56
+ census_rpc_stats *census_rpc_stats_create_empty(void);
57
+
58
+ typedef struct census_per_method_rpc_stats {
59
+ const char *method;
60
+ census_rpc_stats minute_stats; /* cumulative stats in the past minute */
61
+ census_rpc_stats hour_stats; /* cumulative stats in the past hour */
62
+ census_rpc_stats total_stats; /* cumulative stats from last gc */
63
+ } census_per_method_rpc_stats;
64
+
65
+ typedef struct census_aggregated_rpc_stats {
66
+ int num_entries;
67
+ census_per_method_rpc_stats *stats;
68
+ } census_aggregated_rpc_stats;
69
+
70
+ /* Initializes an aggregated rpc stats object to an empty state. */
71
+ void census_aggregated_rpc_stats_set_empty(census_aggregated_rpc_stats *data);
72
+
73
+ /* Records client side stats of a rpc. */
74
+ void census_record_rpc_client_stats(census_op_id op_id,
75
+ const census_rpc_stats *stats);
76
+
77
+ /* Records server side stats of a rpc. */
78
+ void census_record_rpc_server_stats(census_op_id op_id,
79
+ const census_rpc_stats *stats);
80
+
81
+ /* The following two functions are intended for inprocess query of
82
+ per-service per-method stats from grpc implementations. */
83
+
84
+ /* Populates *data_map with server side aggregated per-service per-method
85
+ stats.
86
+ DO NOT CALL from outside of grpc code. */
87
+ void census_get_server_stats(census_aggregated_rpc_stats *data_map);
88
+
89
+ /* Populates *data_map with client side aggregated per-service per-method
90
+ stats.
91
+ DO NOT CALL from outside of grpc code. */
92
+ void census_get_client_stats(census_aggregated_rpc_stats *data_map);
93
+
94
+ void census_stats_store_init(void);
95
+ void census_stats_store_shutdown(void);
96
+
97
+ #ifdef __cplusplus
98
+ }
99
+ #endif
100
+
101
+ #endif /* GRPC_INTERNAL_CORE_STATISTICS_CENSUS_RPC_STATS_H */
@@ -0,0 +1,90 @@
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/alloc.h>
35
+
36
+ #include <stdlib.h>
37
+ #include <grpc/support/log.h>
38
+ #include <grpc/support/port_platform.h>
39
+ #include "src/core/profiling/timers.h"
40
+
41
+ static gpr_allocation_functions g_alloc_functions = {malloc, realloc, free};
42
+
43
+ gpr_allocation_functions gpr_get_allocation_functions() {
44
+ return g_alloc_functions;
45
+ }
46
+
47
+ void gpr_set_allocation_functions(gpr_allocation_functions functions) {
48
+ GPR_ASSERT(functions.malloc_fn != NULL);
49
+ GPR_ASSERT(functions.realloc_fn != NULL);
50
+ GPR_ASSERT(functions.free_fn != NULL);
51
+ g_alloc_functions = functions;
52
+ }
53
+
54
+ void *gpr_malloc(size_t size) {
55
+ void *p;
56
+ GPR_TIMER_BEGIN("gpr_malloc", 0);
57
+ p = g_alloc_functions.malloc_fn(size);
58
+ if (!p) {
59
+ abort();
60
+ }
61
+ GPR_TIMER_END("gpr_malloc", 0);
62
+ return p;
63
+ }
64
+
65
+ void gpr_free(void *p) {
66
+ GPR_TIMER_BEGIN("gpr_free", 0);
67
+ g_alloc_functions.free_fn(p);
68
+ GPR_TIMER_END("gpr_free", 0);
69
+ }
70
+
71
+ void *gpr_realloc(void *p, size_t size) {
72
+ GPR_TIMER_BEGIN("gpr_realloc", 0);
73
+ p = g_alloc_functions.realloc_fn(p, size);
74
+ if (!p) {
75
+ abort();
76
+ }
77
+ GPR_TIMER_END("gpr_realloc", 0);
78
+ return p;
79
+ }
80
+
81
+ void *gpr_malloc_aligned(size_t size, size_t alignment_log) {
82
+ size_t alignment = ((size_t)1) << alignment_log;
83
+ size_t extra = alignment - 1 + sizeof(void *);
84
+ void *p = gpr_malloc(size + extra);
85
+ void **ret = (void **)(((gpr_uintptr)p + extra) & ~(alignment - 1));
86
+ ret[-1] = p;
87
+ return (void *)ret;
88
+ }
89
+
90
+ void gpr_free_aligned(void *ptr) { free(((void **)ptr)[-1]); }
@@ -0,0 +1,288 @@
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/avl.h>
35
+
36
+ #include <assert.h>
37
+ #include <stdlib.h>
38
+
39
+ #include <grpc/support/alloc.h>
40
+ #include <grpc/support/string_util.h>
41
+ #include <grpc/support/useful.h>
42
+
43
+ gpr_avl gpr_avl_create(const gpr_avl_vtable *vtable) {
44
+ gpr_avl out;
45
+ out.vtable = vtable;
46
+ out.root = NULL;
47
+ return out;
48
+ }
49
+
50
+ static gpr_avl_node *ref_node(gpr_avl_node *node) {
51
+ if (node) {
52
+ gpr_ref(&node->refs);
53
+ }
54
+ return node;
55
+ }
56
+
57
+ static void unref_node(const gpr_avl_vtable *vtable, gpr_avl_node *node) {
58
+ if (node == NULL) {
59
+ return;
60
+ }
61
+ if (gpr_unref(&node->refs)) {
62
+ vtable->destroy_key(node->key);
63
+ vtable->destroy_value(node->value);
64
+ unref_node(vtable, node->left);
65
+ unref_node(vtable, node->right);
66
+ gpr_free(node);
67
+ }
68
+ }
69
+
70
+ static long node_height(gpr_avl_node *node) {
71
+ return node == NULL ? 0 : node->height;
72
+ }
73
+
74
+ #ifndef NDEBUG
75
+ static long calculate_height(gpr_avl_node *node) {
76
+ return node == NULL ? 0 : 1 + GPR_MAX(calculate_height(node->left),
77
+ calculate_height(node->right));
78
+ }
79
+
80
+ static gpr_avl_node *assert_invariants(gpr_avl_node *n) {
81
+ if (n == NULL) return NULL;
82
+ assert_invariants(n->left);
83
+ assert_invariants(n->right);
84
+ assert(calculate_height(n) == n->height);
85
+ assert(labs(node_height(n->left) - node_height(n->right)) <= 1);
86
+ return n;
87
+ }
88
+ #else
89
+ static gpr_avl_node *assert_invariants(gpr_avl_node *n) { return n; }
90
+ #endif
91
+
92
+ gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left,
93
+ gpr_avl_node *right) {
94
+ gpr_avl_node *node = gpr_malloc(sizeof(*node));
95
+ gpr_ref_init(&node->refs, 1);
96
+ node->key = key;
97
+ node->value = value;
98
+ node->left = assert_invariants(left);
99
+ node->right = assert_invariants(right);
100
+ node->height = 1 + GPR_MAX(node_height(left), node_height(right));
101
+ return node;
102
+ }
103
+
104
+ static gpr_avl_node *get(const gpr_avl_vtable *vtable, gpr_avl_node *node,
105
+ void *key) {
106
+ long cmp;
107
+
108
+ if (node == NULL) {
109
+ return NULL;
110
+ }
111
+
112
+ cmp = vtable->compare_keys(node->key, key);
113
+ if (cmp == 0) {
114
+ return node;
115
+ } else if (cmp > 0) {
116
+ return get(vtable, node->left, key);
117
+ } else {
118
+ return get(vtable, node->right, key);
119
+ }
120
+ }
121
+
122
+ void *gpr_avl_get(gpr_avl avl, void *key) {
123
+ gpr_avl_node *node = get(avl.vtable, avl.root, key);
124
+ return node ? node->value : NULL;
125
+ }
126
+
127
+ static gpr_avl_node *rotate_left(const gpr_avl_vtable *vtable, void *key,
128
+ void *value, gpr_avl_node *left,
129
+ gpr_avl_node *right) {
130
+ gpr_avl_node *n =
131
+ new_node(vtable->copy_key(right->key), vtable->copy_value(right->value),
132
+ new_node(key, value, left, ref_node(right->left)),
133
+ ref_node(right->right));
134
+ unref_node(vtable, right);
135
+ return n;
136
+ }
137
+
138
+ static gpr_avl_node *rotate_right(const gpr_avl_vtable *vtable, void *key,
139
+ void *value, gpr_avl_node *left,
140
+ gpr_avl_node *right) {
141
+ gpr_avl_node *n = new_node(
142
+ vtable->copy_key(left->key), vtable->copy_value(left->value),
143
+ ref_node(left->left), new_node(key, value, ref_node(left->right), right));
144
+ unref_node(vtable, left);
145
+ return n;
146
+ }
147
+
148
+ static gpr_avl_node *rotate_left_right(const gpr_avl_vtable *vtable, void *key,
149
+ void *value, gpr_avl_node *left,
150
+ gpr_avl_node *right) {
151
+ /* rotate_right(..., rotate_left(left), right) */
152
+ gpr_avl_node *n = new_node(
153
+ vtable->copy_key(left->right->key),
154
+ vtable->copy_value(left->right->value),
155
+ new_node(vtable->copy_key(left->key), vtable->copy_value(left->value),
156
+ ref_node(left->left), ref_node(left->right->left)),
157
+ new_node(key, value, ref_node(left->right->right), right));
158
+ unref_node(vtable, left);
159
+ return n;
160
+ }
161
+
162
+ static gpr_avl_node *rotate_right_left(const gpr_avl_vtable *vtable, void *key,
163
+ void *value, gpr_avl_node *left,
164
+ gpr_avl_node *right) {
165
+ /* rotate_left(..., left, rotate_right(right)) */
166
+ gpr_avl_node *n = new_node(
167
+ vtable->copy_key(right->left->key),
168
+ vtable->copy_value(right->left->value),
169
+ new_node(key, value, left, ref_node(right->left->left)),
170
+ new_node(vtable->copy_key(right->key), vtable->copy_key(right->value),
171
+ ref_node(right->left->right), ref_node(right->right)));
172
+ unref_node(vtable, right);
173
+ return n;
174
+ }
175
+
176
+ static gpr_avl_node *rebalance(const gpr_avl_vtable *vtable, void *key,
177
+ void *value, gpr_avl_node *left,
178
+ gpr_avl_node *right) {
179
+ switch (node_height(left) - node_height(right)) {
180
+ case 2:
181
+ if (node_height(left->left) - node_height(left->right) == -1) {
182
+ return assert_invariants(
183
+ rotate_left_right(vtable, key, value, left, right));
184
+ } else {
185
+ return assert_invariants(rotate_right(vtable, key, value, left, right));
186
+ }
187
+ case -2:
188
+ if (node_height(right->left) - node_height(right->right) == 1) {
189
+ return assert_invariants(
190
+ rotate_right_left(vtable, key, value, left, right));
191
+ } else {
192
+ return assert_invariants(rotate_left(vtable, key, value, left, right));
193
+ }
194
+ default:
195
+ return assert_invariants(new_node(key, value, left, right));
196
+ }
197
+ }
198
+
199
+ static gpr_avl_node *add(const gpr_avl_vtable *vtable, gpr_avl_node *node,
200
+ void *key, void *value) {
201
+ long cmp;
202
+ if (node == NULL) {
203
+ return new_node(key, value, NULL, NULL);
204
+ }
205
+ cmp = vtable->compare_keys(node->key, key);
206
+ if (cmp == 0) {
207
+ return new_node(key, value, ref_node(node->left), ref_node(node->right));
208
+ } else if (cmp > 0) {
209
+ return rebalance(
210
+ vtable, vtable->copy_key(node->key), vtable->copy_value(node->value),
211
+ add(vtable, node->left, key, value), ref_node(node->right));
212
+ } else {
213
+ return rebalance(vtable, vtable->copy_key(node->key),
214
+ vtable->copy_value(node->value), ref_node(node->left),
215
+ add(vtable, node->right, key, value));
216
+ }
217
+ }
218
+
219
+ gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) {
220
+ gpr_avl_node *old_root = avl.root;
221
+ avl.root = add(avl.vtable, avl.root, key, value);
222
+ assert_invariants(avl.root);
223
+ unref_node(avl.vtable, old_root);
224
+ return avl;
225
+ }
226
+
227
+ static gpr_avl_node *in_order_head(gpr_avl_node *node) {
228
+ while (node->left != NULL) {
229
+ node = node->left;
230
+ }
231
+ return node;
232
+ }
233
+
234
+ static gpr_avl_node *in_order_tail(gpr_avl_node *node) {
235
+ while (node->right != NULL) {
236
+ node = node->right;
237
+ }
238
+ return node;
239
+ }
240
+
241
+ static gpr_avl_node *remove(const gpr_avl_vtable *vtable, gpr_avl_node *node,
242
+ void *key) {
243
+ long cmp;
244
+ if (node == NULL) {
245
+ return NULL;
246
+ }
247
+ cmp = vtable->compare_keys(node->key, key);
248
+ if (cmp == 0) {
249
+ if (node->left == NULL) {
250
+ return ref_node(node->right);
251
+ } else if (node->right == NULL) {
252
+ return ref_node(node->left);
253
+ } else if (node->left->height < node->right->height) {
254
+ gpr_avl_node *h = in_order_head(node->right);
255
+ return rebalance(vtable, vtable->copy_key(h->key),
256
+ vtable->copy_value(h->value), ref_node(node->left),
257
+ remove(vtable, node->right, h->key));
258
+ } else {
259
+ gpr_avl_node *h = in_order_tail(node->left);
260
+ return rebalance(
261
+ vtable, vtable->copy_key(h->key), vtable->copy_value(h->value),
262
+ remove(vtable, node->left, h->key), ref_node(node->right));
263
+ }
264
+ } else if (cmp > 0) {
265
+ return rebalance(vtable, vtable->copy_key(node->key),
266
+ vtable->copy_value(node->value),
267
+ remove(vtable, node->left, key), ref_node(node->right));
268
+ } else {
269
+ return rebalance(vtable, vtable->copy_key(node->key),
270
+ vtable->copy_value(node->value), ref_node(node->left),
271
+ remove(vtable, node->right, key));
272
+ }
273
+ }
274
+
275
+ gpr_avl gpr_avl_remove(gpr_avl avl, void *key) {
276
+ gpr_avl_node *old_root = avl.root;
277
+ avl.root = remove(avl.vtable, avl.root, key);
278
+ assert_invariants(avl.root);
279
+ unref_node(avl.vtable, old_root);
280
+ return avl;
281
+ }
282
+
283
+ gpr_avl gpr_avl_ref(gpr_avl avl) {
284
+ ref_node(avl.root);
285
+ return avl;
286
+ }
287
+
288
+ void gpr_avl_unref(gpr_avl avl) { unref_node(avl.vtable, avl.root); }