wearefair-grpc 1.3.1.pre.a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1161) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/Makefile +19484 -0
  4. data/etc/roots.pem +5288 -0
  5. data/include/grpc/byte_buffer.h +102 -0
  6. data/include/grpc/byte_buffer_reader.h +39 -0
  7. data/include/grpc/census.h +484 -0
  8. data/include/grpc/compression.h +85 -0
  9. data/include/grpc/grpc.h +509 -0
  10. data/include/grpc/grpc_cronet.h +51 -0
  11. data/include/grpc/grpc_posix.h +81 -0
  12. data/include/grpc/grpc_security.h +390 -0
  13. data/include/grpc/grpc_security_constants.h +114 -0
  14. data/include/grpc/impl/codegen/atm.h +100 -0
  15. data/include/grpc/impl/codegen/atm_gcc_atomic.h +97 -0
  16. data/include/grpc/impl/codegen/atm_gcc_sync.h +97 -0
  17. data/include/grpc/impl/codegen/atm_windows.h +140 -0
  18. data/include/grpc/impl/codegen/byte_buffer_reader.h +57 -0
  19. data/include/grpc/impl/codegen/compression_types.h +122 -0
  20. data/include/grpc/impl/codegen/connectivity_state.h +61 -0
  21. data/include/grpc/impl/codegen/exec_ctx_fwd.h +41 -0
  22. data/include/grpc/impl/codegen/gpr_slice.h +84 -0
  23. data/include/grpc/impl/codegen/gpr_types.h +75 -0
  24. data/include/grpc/impl/codegen/grpc_types.h +550 -0
  25. data/include/grpc/impl/codegen/port_platform.h +421 -0
  26. data/include/grpc/impl/codegen/propagation_bits.h +67 -0
  27. data/include/grpc/impl/codegen/slice.h +157 -0
  28. data/include/grpc/impl/codegen/status.h +163 -0
  29. data/include/grpc/impl/codegen/sync.h +75 -0
  30. data/include/grpc/impl/codegen/sync_generic.h +55 -0
  31. data/include/grpc/impl/codegen/sync_posix.h +47 -0
  32. data/include/grpc/impl/codegen/sync_windows.h +49 -0
  33. data/include/grpc/load_reporting.h +63 -0
  34. data/include/grpc/module.modulemap +13 -0
  35. data/include/grpc/slice.h +168 -0
  36. data/include/grpc/slice_buffer.h +94 -0
  37. data/include/grpc/status.h +39 -0
  38. data/include/grpc/support/alloc.h +82 -0
  39. data/include/grpc/support/atm.h +39 -0
  40. data/include/grpc/support/atm_gcc_atomic.h +39 -0
  41. data/include/grpc/support/atm_gcc_sync.h +39 -0
  42. data/include/grpc/support/atm_windows.h +39 -0
  43. data/include/grpc/support/avl.h +97 -0
  44. data/include/grpc/support/cmdline.h +103 -0
  45. data/include/grpc/support/cpu.h +59 -0
  46. data/include/grpc/support/histogram.h +79 -0
  47. data/include/grpc/support/host_port.h +66 -0
  48. data/include/grpc/support/log.h +118 -0
  49. data/include/grpc/support/log_windows.h +53 -0
  50. data/include/grpc/support/port_platform.h +39 -0
  51. data/include/grpc/support/string_util.h +64 -0
  52. data/include/grpc/support/subprocess.h +59 -0
  53. data/include/grpc/support/sync.h +295 -0
  54. data/include/grpc/support/sync_generic.h +39 -0
  55. data/include/grpc/support/sync_posix.h +39 -0
  56. data/include/grpc/support/sync_windows.h +39 -0
  57. data/include/grpc/support/thd.h +91 -0
  58. data/include/grpc/support/time.h +105 -0
  59. data/include/grpc/support/tls.h +77 -0
  60. data/include/grpc/support/tls_gcc.h +100 -0
  61. data/include/grpc/support/tls_msvc.h +56 -0
  62. data/include/grpc/support/tls_pthread.h +60 -0
  63. data/include/grpc/support/useful.h +80 -0
  64. data/src/boringssl/err_data.c +1270 -0
  65. data/src/core/ext/census/aggregation.h +66 -0
  66. data/src/core/ext/census/base_resources.c +71 -0
  67. data/src/core/ext/census/base_resources.h +39 -0
  68. data/src/core/ext/census/census_interface.h +76 -0
  69. data/src/core/ext/census/census_rpc_stats.h +101 -0
  70. data/src/core/ext/census/context.c +509 -0
  71. data/src/core/ext/census/gen/census.pb.c +176 -0
  72. data/src/core/ext/census/gen/census.pb.h +295 -0
  73. data/src/core/ext/census/gen/trace_context.pb.c +54 -0
  74. data/src/core/ext/census/gen/trace_context.pb.h +93 -0
  75. data/src/core/ext/census/grpc_context.c +53 -0
  76. data/src/core/ext/census/grpc_filter.c +213 -0
  77. data/src/core/ext/census/grpc_filter.h +44 -0
  78. data/src/core/ext/census/grpc_plugin.c +85 -0
  79. data/src/core/ext/census/initialize.c +66 -0
  80. data/src/core/ext/census/mlog.c +600 -0
  81. data/src/core/ext/census/mlog.h +95 -0
  82. data/src/core/ext/census/operation.c +63 -0
  83. data/src/core/ext/census/placeholders.c +64 -0
  84. data/src/core/ext/census/resource.c +312 -0
  85. data/src/core/ext/census/resource.h +63 -0
  86. data/src/core/ext/census/rpc_metric_id.h +51 -0
  87. data/src/core/ext/census/trace_context.c +86 -0
  88. data/src/core/ext/census/trace_context.h +71 -0
  89. data/src/core/ext/census/trace_label.h +61 -0
  90. data/src/core/ext/census/trace_propagation.h +63 -0
  91. data/src/core/ext/census/trace_status.h +45 -0
  92. data/src/core/ext/census/trace_string.h +50 -0
  93. data/src/core/ext/census/tracing.c +71 -0
  94. data/src/core/ext/census/tracing.h +124 -0
  95. data/src/core/ext/filters/client_channel/channel_connectivity.c +226 -0
  96. data/src/core/ext/filters/client_channel/client_channel.c +1410 -0
  97. data/src/core/ext/filters/client_channel/client_channel.h +64 -0
  98. data/src/core/ext/filters/client_channel/client_channel_factory.c +87 -0
  99. data/src/core/ext/filters/client_channel/client_channel_factory.h +92 -0
  100. data/src/core/ext/filters/client_channel/client_channel_plugin.c +106 -0
  101. data/src/core/ext/filters/client_channel/connector.c +55 -0
  102. data/src/core/ext/filters/client_channel/connector.h +88 -0
  103. data/src/core/ext/filters/client_channel/http_connect_handshaker.c +389 -0
  104. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +49 -0
  105. data/src/core/ext/filters/client_channel/http_proxy.c +125 -0
  106. data/src/core/ext/filters/client_channel/http_proxy.h +39 -0
  107. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +1419 -0
  108. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +44 -0
  109. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +57 -0
  110. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.c +107 -0
  111. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +249 -0
  112. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +105 -0
  113. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +88 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +158 -0
  115. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +476 -0
  116. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +795 -0
  117. data/src/core/ext/filters/client_channel/lb_policy.c +167 -0
  118. data/src/core/ext/filters/client_channel/lb_policy.h +209 -0
  119. data/src/core/ext/filters/client_channel/lb_policy_factory.c +163 -0
  120. data/src/core/ext/filters/client_channel/lb_policy_factory.h +134 -0
  121. data/src/core/ext/filters/client_channel/lb_policy_registry.c +85 -0
  122. data/src/core/ext/filters/client_channel/lb_policy_registry.h +55 -0
  123. data/src/core/ext/filters/client_channel/parse_address.c +170 -0
  124. data/src/core/ext/filters/client_channel/parse_address.h +54 -0
  125. data/src/core/ext/filters/client_channel/proxy_mapper.c +63 -0
  126. data/src/core/ext/filters/client_channel/proxy_mapper.h +89 -0
  127. data/src/core/ext/filters/client_channel/proxy_mapper_registry.c +139 -0
  128. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +59 -0
  129. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c +350 -0
  130. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +66 -0
  131. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c +319 -0
  132. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c +289 -0
  133. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +64 -0
  134. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.c +325 -0
  135. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +234 -0
  136. data/src/core/ext/filters/client_channel/resolver.c +88 -0
  137. data/src/core/ext/filters/client_channel/resolver.h +101 -0
  138. data/src/core/ext/filters/client_channel/resolver_factory.c +56 -0
  139. data/src/core/ext/filters/client_channel/resolver_factory.h +85 -0
  140. data/src/core/ext/filters/client_channel/resolver_registry.c +174 -0
  141. data/src/core/ext/filters/client_channel/resolver_registry.h +84 -0
  142. data/src/core/ext/filters/client_channel/retry_throttle.c +210 -0
  143. data/src/core/ext/filters/client_channel/retry_throttle.h +65 -0
  144. data/src/core/ext/filters/client_channel/subchannel.c +835 -0
  145. data/src/core/ext/filters/client_channel/subchannel.h +203 -0
  146. data/src/core/ext/filters/client_channel/subchannel_index.c +262 -0
  147. data/src/core/ext/filters/client_channel/subchannel_index.h +77 -0
  148. data/src/core/ext/filters/client_channel/uri_parser.c +315 -0
  149. data/src/core/ext/filters/client_channel/uri_parser.h +65 -0
  150. data/src/core/ext/filters/load_reporting/load_reporting.c +106 -0
  151. data/src/core/ext/filters/load_reporting/load_reporting.h +73 -0
  152. data/src/core/ext/filters/load_reporting/load_reporting_filter.c +218 -0
  153. data/src/core/ext/filters/load_reporting/load_reporting_filter.h +42 -0
  154. data/src/core/ext/filters/max_age/max_age_filter.c +439 -0
  155. data/src/core/ext/filters/max_age/max_age_filter.h +39 -0
  156. data/src/core/ext/transport/chttp2/alpn/alpn.c +56 -0
  157. data/src/core/ext/transport/chttp2/alpn/alpn.h +49 -0
  158. data/src/core/ext/transport/chttp2/client/chttp2_connector.c +221 -0
  159. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +41 -0
  160. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +121 -0
  161. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +95 -0
  162. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +239 -0
  163. data/src/core/ext/transport/chttp2/server/chttp2_server.c +304 -0
  164. data/src/core/ext/transport/chttp2/server/chttp2_server.h +47 -0
  165. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +59 -0
  166. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +90 -0
  167. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +101 -0
  168. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +236 -0
  169. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +67 -0
  170. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +241 -0
  171. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +54 -0
  172. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +43 -0
  173. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +2847 -0
  174. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +53 -0
  175. data/src/core/ext/transport/chttp2/transport/frame.h +61 -0
  176. data/src/core/ext/transport/chttp2/transport/frame_data.c +287 -0
  177. data/src/core/ext/transport/chttp2/transport/frame_data.h +104 -0
  178. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +198 -0
  179. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +78 -0
  180. data/src/core/ext/transport/chttp2/transport/frame_ping.c +145 -0
  181. data/src/core/ext/transport/chttp2/transport/frame_ping.h +59 -0
  182. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +125 -0
  183. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +58 -0
  184. data/src/core/ext/transport/chttp2/transport/frame_settings.c +239 -0
  185. data/src/core/ext/transport/chttp2/transport/frame_settings.h +76 -0
  186. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +134 -0
  187. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +57 -0
  188. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +661 -0
  189. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +107 -0
  190. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +1734 -0
  191. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +129 -0
  192. data/src/core/ext/transport/chttp2/transport/hpack_table.c +383 -0
  193. data/src/core/ext/transport/chttp2/transport/hpack_table.h +112 -0
  194. data/src/core/ext/transport/chttp2/transport/http2_settings.c +75 -0
  195. data/src/core/ext/transport/chttp2/transport/http2_settings.h +74 -0
  196. data/src/core/ext/transport/chttp2/transport/huffsyms.c +105 -0
  197. data/src/core/ext/transport/chttp2/transport/huffsyms.h +48 -0
  198. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +88 -0
  199. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +63 -0
  200. data/src/core/ext/transport/chttp2/transport/internal.h +852 -0
  201. data/src/core/ext/transport/chttp2/transport/parsing.c +825 -0
  202. data/src/core/ext/transport/chttp2/transport/stream_lists.c +194 -0
  203. data/src/core/ext/transport/chttp2/transport/stream_map.c +176 -0
  204. data/src/core/ext/transport/chttp2/transport/stream_map.h +83 -0
  205. data/src/core/ext/transport/chttp2/transport/varint.c +65 -0
  206. data/src/core/ext/transport/chttp2/transport/varint.h +75 -0
  207. data/src/core/ext/transport/chttp2/transport/writing.c +429 -0
  208. data/src/core/lib/channel/channel_args.c +355 -0
  209. data/src/core/lib/channel/channel_args.h +126 -0
  210. data/src/core/lib/channel/channel_stack.c +291 -0
  211. data/src/core/lib/channel/channel_stack.h +319 -0
  212. data/src/core/lib/channel/channel_stack_builder.c +284 -0
  213. data/src/core/lib/channel/channel_stack_builder.h +170 -0
  214. data/src/core/lib/channel/compress_filter.c +353 -0
  215. data/src/core/lib/channel/compress_filter.h +67 -0
  216. data/src/core/lib/channel/connected_channel.c +188 -0
  217. data/src/core/lib/channel/connected_channel.h +48 -0
  218. data/src/core/lib/channel/context.h +64 -0
  219. data/src/core/lib/channel/deadline_filter.c +348 -0
  220. data/src/core/lib/channel/deadline_filter.h +102 -0
  221. data/src/core/lib/channel/handshaker.c +281 -0
  222. data/src/core/lib/channel/handshaker.h +182 -0
  223. data/src/core/lib/channel/handshaker_factory.c +54 -0
  224. data/src/core/lib/channel/handshaker_factory.h +66 -0
  225. data/src/core/lib/channel/handshaker_registry.c +113 -0
  226. data/src/core/lib/channel/handshaker_registry.h +63 -0
  227. data/src/core/lib/channel/http_client_filter.c +601 -0
  228. data/src/core/lib/channel/http_client_filter.h +47 -0
  229. data/src/core/lib/channel/http_server_filter.c +445 -0
  230. data/src/core/lib/channel/http_server_filter.h +42 -0
  231. data/src/core/lib/channel/message_size_filter.c +270 -0
  232. data/src/core/lib/channel/message_size_filter.h +39 -0
  233. data/src/core/lib/compression/algorithm_metadata.h +53 -0
  234. data/src/core/lib/compression/compression.c +198 -0
  235. data/src/core/lib/compression/message_compress.c +204 -0
  236. data/src/core/lib/compression/message_compress.h +54 -0
  237. data/src/core/lib/debug/trace.c +140 -0
  238. data/src/core/lib/debug/trace.h +43 -0
  239. data/src/core/lib/http/format_request.c +135 -0
  240. data/src/core/lib/http/format_request.h +47 -0
  241. data/src/core/lib/http/httpcli.c +336 -0
  242. data/src/core/lib/http/httpcli.h +141 -0
  243. data/src/core/lib/http/httpcli_security_connector.c +199 -0
  244. data/src/core/lib/http/parser.c +379 -0
  245. data/src/core/lib/http/parser.h +126 -0
  246. data/src/core/lib/iomgr/closure.c +168 -0
  247. data/src/core/lib/iomgr/closure.h +153 -0
  248. data/src/core/lib/iomgr/combiner.c +460 -0
  249. data/src/core/lib/iomgr/combiner.h +83 -0
  250. data/src/core/lib/iomgr/endpoint.c +78 -0
  251. data/src/core/lib/iomgr/endpoint.h +117 -0
  252. data/src/core/lib/iomgr/endpoint_pair.h +47 -0
  253. data/src/core/lib/iomgr/endpoint_pair_posix.c +87 -0
  254. data/src/core/lib/iomgr/endpoint_pair_uv.c +53 -0
  255. data/src/core/lib/iomgr/endpoint_pair_windows.c +101 -0
  256. data/src/core/lib/iomgr/error.c +793 -0
  257. data/src/core/lib/iomgr/error.h +218 -0
  258. data/src/core/lib/iomgr/error_internal.h +75 -0
  259. data/src/core/lib/iomgr/ev_epoll_linux.c +1965 -0
  260. data/src/core/lib/iomgr/ev_epoll_linux.h +48 -0
  261. data/src/core/lib/iomgr/ev_poll_posix.c +1593 -0
  262. data/src/core/lib/iomgr/ev_poll_posix.h +42 -0
  263. data/src/core/lib/iomgr/ev_posix.c +287 -0
  264. data/src/core/lib/iomgr/ev_posix.h +189 -0
  265. data/src/core/lib/iomgr/exec_ctx.c +117 -0
  266. data/src/core/lib/iomgr/exec_ctx.h +117 -0
  267. data/src/core/lib/iomgr/executor.c +170 -0
  268. data/src/core/lib/iomgr/executor.h +51 -0
  269. data/src/core/lib/iomgr/iocp_windows.c +168 -0
  270. data/src/core/lib/iomgr/iocp_windows.h +55 -0
  271. data/src/core/lib/iomgr/iomgr.c +183 -0
  272. data/src/core/lib/iomgr/iomgr.h +47 -0
  273. data/src/core/lib/iomgr/iomgr_internal.h +58 -0
  274. data/src/core/lib/iomgr/iomgr_posix.c +56 -0
  275. data/src/core/lib/iomgr/iomgr_posix.h +39 -0
  276. data/src/core/lib/iomgr/iomgr_uv.c +49 -0
  277. data/src/core/lib/iomgr/iomgr_windows.c +76 -0
  278. data/src/core/lib/iomgr/load_file.c +92 -0
  279. data/src/core/lib/iomgr/load_file.h +56 -0
  280. data/src/core/lib/iomgr/lockfree_event.c +238 -0
  281. data/src/core/lib/iomgr/lockfree_event.h +54 -0
  282. data/src/core/lib/iomgr/network_status_tracker.c +48 -0
  283. data/src/core/lib/iomgr/network_status_tracker.h +45 -0
  284. data/src/core/lib/iomgr/polling_entity.c +104 -0
  285. data/src/core/lib/iomgr/polling_entity.h +81 -0
  286. data/src/core/lib/iomgr/pollset.h +97 -0
  287. data/src/core/lib/iomgr/pollset_set.h +62 -0
  288. data/src/core/lib/iomgr/pollset_set_uv.c +63 -0
  289. data/src/core/lib/iomgr/pollset_set_windows.c +64 -0
  290. data/src/core/lib/iomgr/pollset_set_windows.h +39 -0
  291. data/src/core/lib/iomgr/pollset_uv.c +156 -0
  292. data/src/core/lib/iomgr/pollset_uv.h +42 -0
  293. data/src/core/lib/iomgr/pollset_windows.c +232 -0
  294. data/src/core/lib/iomgr/pollset_windows.h +78 -0
  295. data/src/core/lib/iomgr/port.h +138 -0
  296. data/src/core/lib/iomgr/resolve_address.h +70 -0
  297. data/src/core/lib/iomgr/resolve_address_posix.c +207 -0
  298. data/src/core/lib/iomgr/resolve_address_uv.c +284 -0
  299. data/src/core/lib/iomgr/resolve_address_windows.c +190 -0
  300. data/src/core/lib/iomgr/resource_quota.c +877 -0
  301. data/src/core/lib/iomgr/resource_quota.h +167 -0
  302. data/src/core/lib/iomgr/sockaddr.h +55 -0
  303. data/src/core/lib/iomgr/sockaddr_posix.h +44 -0
  304. data/src/core/lib/iomgr/sockaddr_utils.c +272 -0
  305. data/src/core/lib/iomgr/sockaddr_utils.h +93 -0
  306. data/src/core/lib/iomgr/sockaddr_windows.h +43 -0
  307. data/src/core/lib/iomgr/socket_factory_posix.c +110 -0
  308. data/src/core/lib/iomgr/socket_factory_posix.h +90 -0
  309. data/src/core/lib/iomgr/socket_mutator.c +98 -0
  310. data/src/core/lib/iomgr/socket_mutator.h +80 -0
  311. data/src/core/lib/iomgr/socket_utils.h +42 -0
  312. data/src/core/lib/iomgr/socket_utils_common_posix.c +330 -0
  313. data/src/core/lib/iomgr/socket_utils_linux.c +57 -0
  314. data/src/core/lib/iomgr/socket_utils_posix.c +73 -0
  315. data/src/core/lib/iomgr/socket_utils_posix.h +147 -0
  316. data/src/core/lib/iomgr/socket_utils_uv.c +49 -0
  317. data/src/core/lib/iomgr/socket_utils_windows.c +52 -0
  318. data/src/core/lib/iomgr/socket_windows.c +167 -0
  319. data/src/core/lib/iomgr/socket_windows.h +125 -0
  320. data/src/core/lib/iomgr/tcp_client.h +55 -0
  321. data/src/core/lib/iomgr/tcp_client_posix.c +368 -0
  322. data/src/core/lib/iomgr/tcp_client_posix.h +45 -0
  323. data/src/core/lib/iomgr/tcp_client_uv.c +192 -0
  324. data/src/core/lib/iomgr/tcp_client_windows.c +260 -0
  325. data/src/core/lib/iomgr/tcp_posix.c +677 -0
  326. data/src/core/lib/iomgr/tcp_posix.h +70 -0
  327. data/src/core/lib/iomgr/tcp_server.h +116 -0
  328. data/src/core/lib/iomgr/tcp_server_posix.c +579 -0
  329. data/src/core/lib/iomgr/tcp_server_utils_posix.h +135 -0
  330. data/src/core/lib/iomgr/tcp_server_utils_posix_common.c +221 -0
  331. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c +196 -0
  332. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c +49 -0
  333. data/src/core/lib/iomgr/tcp_server_uv.c +393 -0
  334. data/src/core/lib/iomgr/tcp_server_windows.c +558 -0
  335. data/src/core/lib/iomgr/tcp_uv.c +374 -0
  336. data/src/core/lib/iomgr/tcp_uv.h +59 -0
  337. data/src/core/lib/iomgr/tcp_windows.c +462 -0
  338. data/src/core/lib/iomgr/tcp_windows.h +59 -0
  339. data/src/core/lib/iomgr/time_averaged_stats.c +77 -0
  340. data/src/core/lib/iomgr/time_averaged_stats.h +88 -0
  341. data/src/core/lib/iomgr/timer.h +111 -0
  342. data/src/core/lib/iomgr/timer_generic.c +567 -0
  343. data/src/core/lib/iomgr/timer_generic.h +49 -0
  344. data/src/core/lib/iomgr/timer_heap.c +152 -0
  345. data/src/core/lib/iomgr/timer_heap.h +57 -0
  346. data/src/core/lib/iomgr/timer_uv.c +103 -0
  347. data/src/core/lib/iomgr/timer_uv.h +47 -0
  348. data/src/core/lib/iomgr/udp_server.c +529 -0
  349. data/src/core/lib/iomgr/udp_server.h +89 -0
  350. data/src/core/lib/iomgr/unix_sockets_posix.c +108 -0
  351. data/src/core/lib/iomgr/unix_sockets_posix.h +56 -0
  352. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +62 -0
  353. data/src/core/lib/iomgr/wakeup_fd_cv.c +118 -0
  354. data/src/core/lib/iomgr/wakeup_fd_cv.h +80 -0
  355. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +97 -0
  356. data/src/core/lib/iomgr/wakeup_fd_nospecial.c +51 -0
  357. data/src/core/lib/iomgr/wakeup_fd_pipe.c +112 -0
  358. data/src/core/lib/iomgr/wakeup_fd_pipe.h +41 -0
  359. data/src/core/lib/iomgr/wakeup_fd_posix.c +101 -0
  360. data/src/core/lib/iomgr/wakeup_fd_posix.h +109 -0
  361. data/src/core/lib/iomgr/workqueue.h +87 -0
  362. data/src/core/lib/iomgr/workqueue_uv.c +65 -0
  363. data/src/core/lib/iomgr/workqueue_uv.h +37 -0
  364. data/src/core/lib/iomgr/workqueue_windows.c +63 -0
  365. data/src/core/lib/iomgr/workqueue_windows.h +37 -0
  366. data/src/core/lib/json/json.c +63 -0
  367. data/src/core/lib/json/json.h +88 -0
  368. data/src/core/lib/json/json_common.h +49 -0
  369. data/src/core/lib/json/json_reader.c +675 -0
  370. data/src/core/lib/json/json_reader.h +160 -0
  371. data/src/core/lib/json/json_string.c +379 -0
  372. data/src/core/lib/json/json_writer.c +258 -0
  373. data/src/core/lib/json/json_writer.h +97 -0
  374. data/src/core/lib/profiling/basic_timers.c +298 -0
  375. data/src/core/lib/profiling/stap_timers.c +65 -0
  376. data/src/core/lib/profiling/timers.h +121 -0
  377. data/src/core/lib/security/context/security_context.c +350 -0
  378. data/src/core/lib/security/context/security_context.h +134 -0
  379. data/src/core/lib/security/credentials/composite/composite_credentials.c +274 -0
  380. data/src/core/lib/security/credentials/composite/composite_credentials.h +72 -0
  381. data/src/core/lib/security/credentials/credentials.c +308 -0
  382. data/src/core/lib/security/credentials/credentials.h +268 -0
  383. data/src/core/lib/security/credentials/credentials_metadata.c +103 -0
  384. data/src/core/lib/security/credentials/fake/fake_credentials.c +141 -0
  385. data/src/core/lib/security/credentials/fake/fake_credentials.h +71 -0
  386. data/src/core/lib/security/credentials/google_default/credentials_generic.c +54 -0
  387. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +337 -0
  388. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +60 -0
  389. data/src/core/lib/security/credentials/iam/iam_credentials.c +85 -0
  390. data/src/core/lib/security/credentials/iam/iam_credentials.h +44 -0
  391. data/src/core/lib/security/credentials/jwt/json_token.c +321 -0
  392. data/src/core/lib/security/credentials/jwt/json_token.h +88 -0
  393. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +195 -0
  394. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +63 -0
  395. data/src/core/lib/security/credentials/jwt/jwt_verifier.c +910 -0
  396. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +140 -0
  397. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +468 -0
  398. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +109 -0
  399. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +153 -0
  400. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +45 -0
  401. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +242 -0
  402. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +48 -0
  403. data/src/core/lib/security/transport/auth_filters.h +42 -0
  404. data/src/core/lib/security/transport/client_auth_filter.c +384 -0
  405. data/src/core/lib/security/transport/lb_targets_info.c +70 -0
  406. data/src/core/lib/security/transport/lb_targets_info.h +47 -0
  407. data/src/core/lib/security/transport/secure_endpoint.c +427 -0
  408. data/src/core/lib/security/transport/secure_endpoint.h +49 -0
  409. data/src/core/lib/security/transport/security_connector.c +909 -0
  410. data/src/core/lib/security/transport/security_connector.h +252 -0
  411. data/src/core/lib/security/transport/security_handshaker.c +507 -0
  412. data/src/core/lib/security/transport/security_handshaker.h +49 -0
  413. data/src/core/lib/security/transport/server_auth_filter.c +277 -0
  414. data/src/core/lib/security/transport/tsi_error.c +42 -0
  415. data/src/core/lib/security/transport/tsi_error.h +42 -0
  416. data/src/core/lib/security/util/json_util.c +61 -0
  417. data/src/core/lib/security/util/json_util.h +55 -0
  418. data/src/core/lib/slice/b64.c +251 -0
  419. data/src/core/lib/slice/b64.h +65 -0
  420. data/src/core/lib/slice/percent_encoding.c +182 -0
  421. data/src/core/lib/slice/percent_encoding.h +78 -0
  422. data/src/core/lib/slice/slice.c +466 -0
  423. data/src/core/lib/slice/slice_buffer.c +355 -0
  424. data/src/core/lib/slice/slice_hash_table.c +125 -0
  425. data/src/core/lib/slice/slice_hash_table.h +77 -0
  426. data/src/core/lib/slice/slice_intern.c +346 -0
  427. data/src/core/lib/slice/slice_internal.h +64 -0
  428. data/src/core/lib/slice/slice_string_helpers.c +95 -0
  429. data/src/core/lib/slice/slice_string_helpers.h +63 -0
  430. data/src/core/lib/support/alloc.c +117 -0
  431. data/src/core/lib/support/arena.c +98 -0
  432. data/src/core/lib/support/arena.h +54 -0
  433. data/src/core/lib/support/atm.c +47 -0
  434. data/src/core/lib/support/avl.c +299 -0
  435. data/src/core/lib/support/backoff.c +87 -0
  436. data/src/core/lib/support/backoff.h +71 -0
  437. data/src/core/lib/support/block_annotate.h +48 -0
  438. data/src/core/lib/support/cmdline.c +345 -0
  439. data/src/core/lib/support/cpu_iphone.c +49 -0
  440. data/src/core/lib/support/cpu_linux.c +83 -0
  441. data/src/core/lib/support/cpu_posix.c +72 -0
  442. data/src/core/lib/support/cpu_windows.c +47 -0
  443. data/src/core/lib/support/env.h +58 -0
  444. data/src/core/lib/support/env_linux.c +89 -0
  445. data/src/core/lib/support/env_posix.c +57 -0
  446. data/src/core/lib/support/env_windows.c +79 -0
  447. data/src/core/lib/support/histogram.c +243 -0
  448. data/src/core/lib/support/host_port.c +110 -0
  449. data/src/core/lib/support/log.c +103 -0
  450. data/src/core/lib/support/log_android.c +87 -0
  451. data/src/core/lib/support/log_linux.c +105 -0
  452. data/src/core/lib/support/log_posix.c +106 -0
  453. data/src/core/lib/support/log_windows.c +112 -0
  454. data/src/core/lib/support/mpscq.c +83 -0
  455. data/src/core/lib/support/mpscq.h +65 -0
  456. data/src/core/lib/support/murmur_hash.c +94 -0
  457. data/src/core/lib/support/murmur_hash.h +44 -0
  458. data/src/core/lib/support/spinlock.h +52 -0
  459. data/src/core/lib/support/stack_lockfree.c +185 -0
  460. data/src/core/lib/support/stack_lockfree.h +53 -0
  461. data/src/core/lib/support/string.c +315 -0
  462. data/src/core/lib/support/string.h +128 -0
  463. data/src/core/lib/support/string_posix.c +86 -0
  464. data/src/core/lib/support/string_util_windows.c +94 -0
  465. data/src/core/lib/support/string_windows.c +83 -0
  466. data/src/core/lib/support/string_windows.h +47 -0
  467. data/src/core/lib/support/subprocess_posix.c +114 -0
  468. data/src/core/lib/support/subprocess_windows.c +141 -0
  469. data/src/core/lib/support/sync.c +137 -0
  470. data/src/core/lib/support/sync_posix.c +113 -0
  471. data/src/core/lib/support/sync_windows.c +133 -0
  472. data/src/core/lib/support/thd.c +64 -0
  473. data/src/core/lib/support/thd_internal.h +39 -0
  474. data/src/core/lib/support/thd_posix.c +95 -0
  475. data/src/core/lib/support/thd_windows.c +117 -0
  476. data/src/core/lib/support/time.c +262 -0
  477. data/src/core/lib/support/time_posix.c +176 -0
  478. data/src/core/lib/support/time_precise.c +89 -0
  479. data/src/core/lib/support/time_precise.h +42 -0
  480. data/src/core/lib/support/time_windows.c +116 -0
  481. data/src/core/lib/support/tls_pthread.c +45 -0
  482. data/src/core/lib/support/tmpfile.h +53 -0
  483. data/src/core/lib/support/tmpfile_msys.c +73 -0
  484. data/src/core/lib/support/tmpfile_posix.c +85 -0
  485. data/src/core/lib/support/tmpfile_windows.c +84 -0
  486. data/src/core/lib/support/wrap_memcpy.c +55 -0
  487. data/src/core/lib/surface/alarm.c +87 -0
  488. data/src/core/lib/surface/api_trace.c +36 -0
  489. data/src/core/lib/surface/api_trace.h +65 -0
  490. data/src/core/lib/surface/byte_buffer.c +103 -0
  491. data/src/core/lib/surface/byte_buffer_reader.c +140 -0
  492. data/src/core/lib/surface/call.c +1835 -0
  493. data/src/core/lib/surface/call.h +135 -0
  494. data/src/core/lib/surface/call_details.c +56 -0
  495. data/src/core/lib/surface/call_log_batch.c +131 -0
  496. data/src/core/lib/surface/call_test_only.h +64 -0
  497. data/src/core/lib/surface/channel.c +434 -0
  498. data/src/core/lib/surface/channel.h +99 -0
  499. data/src/core/lib/surface/channel_init.c +140 -0
  500. data/src/core/lib/surface/channel_init.h +96 -0
  501. data/src/core/lib/surface/channel_ping.c +80 -0
  502. data/src/core/lib/surface/channel_stack_type.c +54 -0
  503. data/src/core/lib/surface/channel_stack_type.h +58 -0
  504. data/src/core/lib/surface/completion_queue.c +692 -0
  505. data/src/core/lib/surface/completion_queue.h +102 -0
  506. data/src/core/lib/surface/completion_queue_factory.c +77 -0
  507. data/src/core/lib/surface/completion_queue_factory.h +51 -0
  508. data/src/core/lib/surface/event_string.c +81 -0
  509. data/src/core/lib/surface/event_string.h +42 -0
  510. data/src/core/lib/surface/init.c +261 -0
  511. data/src/core/lib/surface/init.h +42 -0
  512. data/src/core/lib/surface/init_secure.c +94 -0
  513. data/src/core/lib/surface/lame_client.c +188 -0
  514. data/src/core/lib/surface/lame_client.h +41 -0
  515. data/src/core/lib/surface/metadata_array.c +49 -0
  516. data/src/core/lib/surface/server.c +1529 -0
  517. data/src/core/lib/surface/server.h +71 -0
  518. data/src/core/lib/surface/validate_metadata.c +108 -0
  519. data/src/core/lib/surface/validate_metadata.h +43 -0
  520. data/src/core/lib/surface/version.c +41 -0
  521. data/src/core/lib/transport/bdp_estimator.c +104 -0
  522. data/src/core/lib/transport/bdp_estimator.h +76 -0
  523. data/src/core/lib/transport/byte_stream.c +81 -0
  524. data/src/core/lib/transport/byte_stream.h +85 -0
  525. data/src/core/lib/transport/connectivity_state.c +219 -0
  526. data/src/core/lib/transport/connectivity_state.h +101 -0
  527. data/src/core/lib/transport/error_utils.c +124 -0
  528. data/src/core/lib/transport/error_utils.h +56 -0
  529. data/src/core/lib/transport/http2_errors.h +56 -0
  530. data/src/core/lib/transport/metadata.c +529 -0
  531. data/src/core/lib/transport/metadata.h +186 -0
  532. data/src/core/lib/transport/metadata_batch.c +328 -0
  533. data/src/core/lib/transport/metadata_batch.h +166 -0
  534. data/src/core/lib/transport/pid_controller.c +78 -0
  535. data/src/core/lib/transport/pid_controller.h +77 -0
  536. data/src/core/lib/transport/service_config.c +266 -0
  537. data/src/core/lib/transport/service_config.h +77 -0
  538. data/src/core/lib/transport/static_metadata.c +801 -0
  539. data/src/core/lib/transport/static_metadata.h +557 -0
  540. data/src/core/lib/transport/status_conversion.c +113 -0
  541. data/src/core/lib/transport/status_conversion.h +49 -0
  542. data/src/core/lib/transport/timeout_encoding.c +190 -0
  543. data/src/core/lib/transport/timeout_encoding.h +49 -0
  544. data/src/core/lib/transport/transport.c +282 -0
  545. data/src/core/lib/transport/transport.h +354 -0
  546. data/src/core/lib/transport/transport_impl.h +90 -0
  547. data/src/core/lib/transport/transport_op_string.c +217 -0
  548. data/src/core/plugin_registry/grpc_plugin_registry.c +82 -0
  549. data/src/core/tsi/fake_transport_security.c +527 -0
  550. data/src/core/tsi/fake_transport_security.h +61 -0
  551. data/src/core/tsi/ssl_transport_security.c +1533 -0
  552. data/src/core/tsi/ssl_transport_security.h +214 -0
  553. data/src/core/tsi/ssl_types.h +55 -0
  554. data/src/core/tsi/transport_security.c +266 -0
  555. data/src/core/tsi/transport_security.h +111 -0
  556. data/src/core/tsi/transport_security_interface.h +353 -0
  557. data/src/ruby/bin/apis/google/protobuf/empty.rb +44 -0
  558. data/src/ruby/bin/apis/pubsub_demo.rb +256 -0
  559. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +174 -0
  560. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +103 -0
  561. data/src/ruby/bin/math_client.rb +147 -0
  562. data/src/ruby/bin/math_pb.rb +32 -0
  563. data/src/ruby/bin/math_server.rb +206 -0
  564. data/src/ruby/bin/math_services_pb.rb +66 -0
  565. data/src/ruby/bin/noproto_client.rb +108 -0
  566. data/src/ruby/bin/noproto_server.rb +112 -0
  567. data/src/ruby/ext/grpc/extconf.rb +131 -0
  568. data/src/ruby/ext/grpc/rb_byte_buffer.c +77 -0
  569. data/src/ruby/ext/grpc/rb_byte_buffer.h +50 -0
  570. data/src/ruby/ext/grpc/rb_call.c +1009 -0
  571. data/src/ruby/ext/grpc/rb_call.h +66 -0
  572. data/src/ruby/ext/grpc/rb_call_credentials.c +295 -0
  573. data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
  574. data/src/ruby/ext/grpc/rb_channel.c +662 -0
  575. data/src/ruby/ext/grpc/rb_channel.h +49 -0
  576. data/src/ruby/ext/grpc/rb_channel_args.c +168 -0
  577. data/src/ruby/ext/grpc/rb_channel_args.h +53 -0
  578. data/src/ruby/ext/grpc/rb_channel_credentials.c +268 -0
  579. data/src/ruby/ext/grpc/rb_channel_credentials.h +47 -0
  580. data/src/ruby/ext/grpc/rb_completion_queue.c +117 -0
  581. data/src/ruby/ext/grpc/rb_completion_queue.h +51 -0
  582. data/src/ruby/ext/grpc/rb_compression_options.c +472 -0
  583. data/src/ruby/ext/grpc/rb_compression_options.h +44 -0
  584. data/src/ruby/ext/grpc/rb_event_thread.c +158 -0
  585. data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
  586. data/src/ruby/ext/grpc/rb_grpc.c +343 -0
  587. data/src/ruby/ext/grpc/rb_grpc.h +87 -0
  588. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +634 -0
  589. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +955 -0
  590. data/src/ruby/ext/grpc/rb_loader.c +72 -0
  591. data/src/ruby/ext/grpc/rb_loader.h +40 -0
  592. data/src/ruby/ext/grpc/rb_server.c +359 -0
  593. data/src/ruby/ext/grpc/rb_server.h +47 -0
  594. data/src/ruby/ext/grpc/rb_server_credentials.c +258 -0
  595. data/src/ruby/ext/grpc/rb_server_credentials.h +47 -0
  596. data/src/ruby/lib/grpc/core/time_consts.rb +71 -0
  597. data/src/ruby/lib/grpc/errors.rb +215 -0
  598. data/src/ruby/lib/grpc/generic/active_call.rb +547 -0
  599. data/src/ruby/lib/grpc/generic/bidi_call.rb +229 -0
  600. data/src/ruby/lib/grpc/generic/client_stub.rb +463 -0
  601. data/src/ruby/lib/grpc/generic/rpc_desc.rb +173 -0
  602. data/src/ruby/lib/grpc/generic/rpc_server.rb +476 -0
  603. data/src/ruby/lib/grpc/generic/service.rb +225 -0
  604. data/src/ruby/lib/grpc/grpc.rb +39 -0
  605. data/src/ruby/lib/grpc/grpc_c.bundle +0 -0
  606. data/src/ruby/lib/grpc/logconfig.rb +59 -0
  607. data/src/ruby/lib/grpc/notifier.rb +60 -0
  608. data/src/ruby/lib/grpc/version.rb +33 -0
  609. data/src/ruby/lib/grpc.rb +49 -0
  610. data/src/ruby/pb/README.md +42 -0
  611. data/src/ruby/pb/generate_proto_ruby.sh +58 -0
  612. data/src/ruby/pb/grpc/health/checker.rb +77 -0
  613. data/src/ruby/pb/grpc/health/v1/health_pb.rb +28 -0
  614. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +56 -0
  615. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +58 -0
  616. data/src/ruby/pb/grpc/testing/metrics_pb.rb +28 -0
  617. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +64 -0
  618. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +15 -0
  619. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +82 -0
  620. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +14 -0
  621. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +117 -0
  622. data/src/ruby/pb/test/client.rb +779 -0
  623. data/src/ruby/pb/test/server.rb +267 -0
  624. data/src/ruby/spec/call_credentials_spec.rb +57 -0
  625. data/src/ruby/spec/call_spec.rb +162 -0
  626. data/src/ruby/spec/channel_connection_spec.rb +141 -0
  627. data/src/ruby/spec/channel_credentials_spec.rb +97 -0
  628. data/src/ruby/spec/channel_spec.rb +205 -0
  629. data/src/ruby/spec/client_server_spec.rb +491 -0
  630. data/src/ruby/spec/compression_options_spec.rb +164 -0
  631. data/src/ruby/spec/error_sanity_spec.rb +64 -0
  632. data/src/ruby/spec/generic/active_call_spec.rb +632 -0
  633. data/src/ruby/spec/generic/client_stub_spec.rb +556 -0
  634. data/src/ruby/spec/generic/rpc_desc_spec.rb +351 -0
  635. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +142 -0
  636. data/src/ruby/spec/generic/rpc_server_spec.rb +524 -0
  637. data/src/ruby/spec/generic/service_spec.rb +276 -0
  638. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +71 -0
  639. data/src/ruby/spec/pb/health/checker_spec.rb +222 -0
  640. data/src/ruby/spec/server_credentials_spec.rb +94 -0
  641. data/src/ruby/spec/server_spec.rb +205 -0
  642. data/src/ruby/spec/spec_helper.rb +71 -0
  643. data/src/ruby/spec/testdata/README +1 -0
  644. data/src/ruby/spec/testdata/ca.pem +15 -0
  645. data/src/ruby/spec/testdata/server1.key +16 -0
  646. data/src/ruby/spec/testdata/server1.pem +16 -0
  647. data/src/ruby/spec/time_consts_spec.rb +89 -0
  648. data/third_party/boringssl/crypto/aes/aes.c +1142 -0
  649. data/third_party/boringssl/crypto/aes/internal.h +87 -0
  650. data/third_party/boringssl/crypto/aes/mode_wrappers.c +112 -0
  651. data/third_party/boringssl/crypto/asn1/a_bitstr.c +263 -0
  652. data/third_party/boringssl/crypto/asn1/a_bool.c +110 -0
  653. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +282 -0
  654. data/third_party/boringssl/crypto/asn1/a_dup.c +111 -0
  655. data/third_party/boringssl/crypto/asn1/a_enum.c +181 -0
  656. data/third_party/boringssl/crypto/asn1/a_gentm.c +256 -0
  657. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +147 -0
  658. data/third_party/boringssl/crypto/asn1/a_int.c +460 -0
  659. data/third_party/boringssl/crypto/asn1/a_mbstr.c +409 -0
  660. data/third_party/boringssl/crypto/asn1/a_object.c +400 -0
  661. data/third_party/boringssl/crypto/asn1/a_octet.c +77 -0
  662. data/third_party/boringssl/crypto/asn1/a_print.c +121 -0
  663. data/third_party/boringssl/crypto/asn1/a_strnid.c +309 -0
  664. data/third_party/boringssl/crypto/asn1/a_time.c +206 -0
  665. data/third_party/boringssl/crypto/asn1/a_type.c +151 -0
  666. data/third_party/boringssl/crypto/asn1/a_utctm.c +304 -0
  667. data/third_party/boringssl/crypto/asn1/a_utf8.c +234 -0
  668. data/third_party/boringssl/crypto/asn1/asn1_lib.c +483 -0
  669. data/third_party/boringssl/crypto/asn1/asn1_locl.h +63 -0
  670. data/third_party/boringssl/crypto/asn1/asn1_par.c +80 -0
  671. data/third_party/boringssl/crypto/asn1/asn_pack.c +105 -0
  672. data/third_party/boringssl/crypto/asn1/f_enum.c +93 -0
  673. data/third_party/boringssl/crypto/asn1/f_int.c +97 -0
  674. data/third_party/boringssl/crypto/asn1/f_string.c +91 -0
  675. data/third_party/boringssl/crypto/asn1/t_bitst.c +103 -0
  676. data/third_party/boringssl/crypto/asn1/tasn_dec.c +1221 -0
  677. data/third_party/boringssl/crypto/asn1/tasn_enc.c +665 -0
  678. data/third_party/boringssl/crypto/asn1/tasn_fre.c +246 -0
  679. data/third_party/boringssl/crypto/asn1/tasn_new.c +381 -0
  680. data/third_party/boringssl/crypto/asn1/tasn_typ.c +131 -0
  681. data/third_party/boringssl/crypto/asn1/tasn_utl.c +266 -0
  682. data/third_party/boringssl/crypto/asn1/x_bignum.c +153 -0
  683. data/third_party/boringssl/crypto/asn1/x_long.c +197 -0
  684. data/third_party/boringssl/crypto/base64/base64.c +442 -0
  685. data/third_party/boringssl/crypto/bio/bio.c +598 -0
  686. data/third_party/boringssl/crypto/bio/bio_mem.c +328 -0
  687. data/third_party/boringssl/crypto/bio/buffer.c +496 -0
  688. data/third_party/boringssl/crypto/bio/connect.c +553 -0
  689. data/third_party/boringssl/crypto/bio/fd.c +277 -0
  690. data/third_party/boringssl/crypto/bio/file.c +313 -0
  691. data/third_party/boringssl/crypto/bio/hexdump.c +191 -0
  692. data/third_party/boringssl/crypto/bio/internal.h +111 -0
  693. data/third_party/boringssl/crypto/bio/pair.c +803 -0
  694. data/third_party/boringssl/crypto/bio/printf.c +119 -0
  695. data/third_party/boringssl/crypto/bio/socket.c +203 -0
  696. data/third_party/boringssl/crypto/bio/socket_helper.c +113 -0
  697. data/third_party/boringssl/crypto/bn/add.c +377 -0
  698. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +531 -0
  699. data/third_party/boringssl/crypto/bn/bn.c +379 -0
  700. data/third_party/boringssl/crypto/bn/bn_asn1.c +80 -0
  701. data/third_party/boringssl/crypto/bn/cmp.c +225 -0
  702. data/third_party/boringssl/crypto/bn/convert.c +599 -0
  703. data/third_party/boringssl/crypto/bn/ctx.c +311 -0
  704. data/third_party/boringssl/crypto/bn/div.c +671 -0
  705. data/third_party/boringssl/crypto/bn/exponentiation.c +1258 -0
  706. data/third_party/boringssl/crypto/bn/gcd.c +628 -0
  707. data/third_party/boringssl/crypto/bn/generic.c +703 -0
  708. data/third_party/boringssl/crypto/bn/internal.h +245 -0
  709. data/third_party/boringssl/crypto/bn/kronecker.c +175 -0
  710. data/third_party/boringssl/crypto/bn/montgomery.c +410 -0
  711. data/third_party/boringssl/crypto/bn/montgomery_inv.c +160 -0
  712. data/third_party/boringssl/crypto/bn/mul.c +869 -0
  713. data/third_party/boringssl/crypto/bn/prime.c +861 -0
  714. data/third_party/boringssl/crypto/bn/random.c +340 -0
  715. data/third_party/boringssl/crypto/bn/rsaz_exp.c +319 -0
  716. data/third_party/boringssl/crypto/bn/rsaz_exp.h +56 -0
  717. data/third_party/boringssl/crypto/bn/shift.c +299 -0
  718. data/third_party/boringssl/crypto/bn/sqrt.c +504 -0
  719. data/third_party/boringssl/crypto/buf/buf.c +239 -0
  720. data/third_party/boringssl/crypto/bytestring/asn1_compat.c +51 -0
  721. data/third_party/boringssl/crypto/bytestring/ber.c +263 -0
  722. data/third_party/boringssl/crypto/bytestring/cbb.c +473 -0
  723. data/third_party/boringssl/crypto/bytestring/cbs.c +439 -0
  724. data/third_party/boringssl/crypto/bytestring/internal.h +75 -0
  725. data/third_party/boringssl/crypto/chacha/chacha.c +167 -0
  726. data/third_party/boringssl/crypto/cipher/aead.c +156 -0
  727. data/third_party/boringssl/crypto/cipher/cipher.c +652 -0
  728. data/third_party/boringssl/crypto/cipher/derive_key.c +154 -0
  729. data/third_party/boringssl/crypto/cipher/e_aes.c +1717 -0
  730. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +300 -0
  731. data/third_party/boringssl/crypto/cipher/e_des.c +205 -0
  732. data/third_party/boringssl/crypto/cipher/e_null.c +85 -0
  733. data/third_party/boringssl/crypto/cipher/e_rc2.c +443 -0
  734. data/third_party/boringssl/crypto/cipher/e_rc4.c +87 -0
  735. data/third_party/boringssl/crypto/cipher/e_ssl3.c +403 -0
  736. data/third_party/boringssl/crypto/cipher/e_tls.c +602 -0
  737. data/third_party/boringssl/crypto/cipher/internal.h +162 -0
  738. data/third_party/boringssl/crypto/cipher/tls_cbc.c +553 -0
  739. data/third_party/boringssl/crypto/cmac/cmac.c +239 -0
  740. data/third_party/boringssl/crypto/conf/conf.c +788 -0
  741. data/third_party/boringssl/crypto/conf/conf_def.h +127 -0
  742. data/third_party/boringssl/crypto/conf/internal.h +31 -0
  743. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +61 -0
  744. data/third_party/boringssl/crypto/cpu-arm-linux.c +360 -0
  745. data/third_party/boringssl/crypto/cpu-arm.c +38 -0
  746. data/third_party/boringssl/crypto/cpu-intel.c +263 -0
  747. data/third_party/boringssl/crypto/cpu-ppc64le.c +40 -0
  748. data/third_party/boringssl/crypto/crypto.c +164 -0
  749. data/third_party/boringssl/crypto/curve25519/curve25519.c +4944 -0
  750. data/third_party/boringssl/crypto/curve25519/internal.h +109 -0
  751. data/third_party/boringssl/crypto/curve25519/spake25519.c +464 -0
  752. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +246 -0
  753. data/third_party/boringssl/crypto/des/des.c +771 -0
  754. data/third_party/boringssl/crypto/des/internal.h +212 -0
  755. data/third_party/boringssl/crypto/dh/check.c +218 -0
  756. data/third_party/boringssl/crypto/dh/dh.c +487 -0
  757. data/third_party/boringssl/crypto/dh/dh_asn1.c +160 -0
  758. data/third_party/boringssl/crypto/dh/params.c +253 -0
  759. data/third_party/boringssl/crypto/digest/digest.c +248 -0
  760. data/third_party/boringssl/crypto/digest/digests.c +321 -0
  761. data/third_party/boringssl/crypto/digest/internal.h +112 -0
  762. data/third_party/boringssl/crypto/digest/md32_common.h +262 -0
  763. data/third_party/boringssl/crypto/dsa/dsa.c +964 -0
  764. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +339 -0
  765. data/third_party/boringssl/crypto/ec/ec.c +847 -0
  766. data/third_party/boringssl/crypto/ec/ec_asn1.c +549 -0
  767. data/third_party/boringssl/crypto/ec/ec_key.c +479 -0
  768. data/third_party/boringssl/crypto/ec/ec_montgomery.c +308 -0
  769. data/third_party/boringssl/crypto/ec/internal.h +276 -0
  770. data/third_party/boringssl/crypto/ec/oct.c +428 -0
  771. data/third_party/boringssl/crypto/ec/p224-64.c +1187 -0
  772. data/third_party/boringssl/crypto/ec/p256-64.c +1741 -0
  773. data/third_party/boringssl/crypto/ec/p256-x86_64-table.h +9543 -0
  774. data/third_party/boringssl/crypto/ec/p256-x86_64.c +574 -0
  775. data/third_party/boringssl/crypto/ec/simple.c +1117 -0
  776. data/third_party/boringssl/crypto/ec/util-64.c +109 -0
  777. data/third_party/boringssl/crypto/ec/wnaf.c +449 -0
  778. data/third_party/boringssl/crypto/ecdh/ecdh.c +159 -0
  779. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +478 -0
  780. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +227 -0
  781. data/third_party/boringssl/crypto/engine/engine.c +96 -0
  782. data/third_party/boringssl/crypto/err/err.c +756 -0
  783. data/third_party/boringssl/crypto/evp/digestsign.c +159 -0
  784. data/third_party/boringssl/crypto/evp/evp.c +367 -0
  785. data/third_party/boringssl/crypto/evp/evp_asn1.c +337 -0
  786. data/third_party/boringssl/crypto/evp/evp_ctx.c +448 -0
  787. data/third_party/boringssl/crypto/evp/internal.h +237 -0
  788. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +268 -0
  789. data/third_party/boringssl/crypto/evp/p_ec.c +236 -0
  790. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +257 -0
  791. data/third_party/boringssl/crypto/evp/p_rsa.c +673 -0
  792. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +200 -0
  793. data/third_party/boringssl/crypto/evp/pbkdf.c +151 -0
  794. data/third_party/boringssl/crypto/evp/print.c +520 -0
  795. data/third_party/boringssl/crypto/evp/sign.c +151 -0
  796. data/third_party/boringssl/crypto/ex_data.c +292 -0
  797. data/third_party/boringssl/crypto/hkdf/hkdf.c +110 -0
  798. data/third_party/boringssl/crypto/hmac/hmac.c +213 -0
  799. data/third_party/boringssl/crypto/internal.h +527 -0
  800. data/third_party/boringssl/crypto/lhash/lhash.c +342 -0
  801. data/third_party/boringssl/crypto/md4/md4.c +234 -0
  802. data/third_party/boringssl/crypto/md5/md5.c +275 -0
  803. data/third_party/boringssl/crypto/mem.c +200 -0
  804. data/third_party/boringssl/crypto/modes/cbc.c +216 -0
  805. data/third_party/boringssl/crypto/modes/cfb.c +230 -0
  806. data/third_party/boringssl/crypto/modes/ctr.c +219 -0
  807. data/third_party/boringssl/crypto/modes/gcm.c +1288 -0
  808. data/third_party/boringssl/crypto/modes/internal.h +358 -0
  809. data/third_party/boringssl/crypto/modes/ofb.c +95 -0
  810. data/third_party/boringssl/crypto/newhope/error_correction.c +131 -0
  811. data/third_party/boringssl/crypto/newhope/internal.h +71 -0
  812. data/third_party/boringssl/crypto/newhope/newhope.c +174 -0
  813. data/third_party/boringssl/crypto/newhope/ntt.c +148 -0
  814. data/third_party/boringssl/crypto/newhope/poly.c +183 -0
  815. data/third_party/boringssl/crypto/newhope/precomp.c +306 -0
  816. data/third_party/boringssl/crypto/newhope/reduce.c +42 -0
  817. data/third_party/boringssl/crypto/obj/obj.c +640 -0
  818. data/third_party/boringssl/crypto/obj/obj_dat.h +5254 -0
  819. data/third_party/boringssl/crypto/obj/obj_xref.c +124 -0
  820. data/third_party/boringssl/crypto/obj/obj_xref.h +96 -0
  821. data/third_party/boringssl/crypto/pem/pem_all.c +262 -0
  822. data/third_party/boringssl/crypto/pem/pem_info.c +381 -0
  823. data/third_party/boringssl/crypto/pem/pem_lib.c +778 -0
  824. data/third_party/boringssl/crypto/pem/pem_oth.c +88 -0
  825. data/third_party/boringssl/crypto/pem/pem_pk8.c +257 -0
  826. data/third_party/boringssl/crypto/pem/pem_pkey.c +227 -0
  827. data/third_party/boringssl/crypto/pem/pem_x509.c +65 -0
  828. data/third_party/boringssl/crypto/pem/pem_xaux.c +67 -0
  829. data/third_party/boringssl/crypto/pkcs8/internal.h +83 -0
  830. data/third_party/boringssl/crypto/pkcs8/p5_pbe.c +151 -0
  831. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +441 -0
  832. data/third_party/boringssl/crypto/pkcs8/p8_pkey.c +85 -0
  833. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +1219 -0
  834. data/third_party/boringssl/crypto/poly1305/internal.h +40 -0
  835. data/third_party/boringssl/crypto/poly1305/poly1305.c +324 -0
  836. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +304 -0
  837. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +890 -0
  838. data/third_party/boringssl/crypto/rand/deterministic.c +47 -0
  839. data/third_party/boringssl/crypto/rand/internal.h +32 -0
  840. data/third_party/boringssl/crypto/rand/rand.c +244 -0
  841. data/third_party/boringssl/crypto/rand/urandom.c +221 -0
  842. data/third_party/boringssl/crypto/rand/windows.c +53 -0
  843. data/third_party/boringssl/crypto/rc4/rc4.c +98 -0
  844. data/third_party/boringssl/crypto/refcount_c11.c +67 -0
  845. data/third_party/boringssl/crypto/refcount_lock.c +53 -0
  846. data/third_party/boringssl/crypto/rsa/blinding.c +264 -0
  847. data/third_party/boringssl/crypto/rsa/internal.h +148 -0
  848. data/third_party/boringssl/crypto/rsa/padding.c +708 -0
  849. data/third_party/boringssl/crypto/rsa/rsa.c +830 -0
  850. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +446 -0
  851. data/third_party/boringssl/crypto/rsa/rsa_impl.c +1139 -0
  852. data/third_party/boringssl/crypto/sha/sha1.c +337 -0
  853. data/third_party/boringssl/crypto/sha/sha256.c +327 -0
  854. data/third_party/boringssl/crypto/sha/sha512.c +607 -0
  855. data/third_party/boringssl/crypto/stack/stack.c +377 -0
  856. data/third_party/boringssl/crypto/thread.c +110 -0
  857. data/third_party/boringssl/crypto/thread_none.c +59 -0
  858. data/third_party/boringssl/crypto/thread_pthread.c +176 -0
  859. data/third_party/boringssl/crypto/thread_win.c +237 -0
  860. data/third_party/boringssl/crypto/time_support.c +206 -0
  861. data/third_party/boringssl/crypto/x509/a_digest.c +96 -0
  862. data/third_party/boringssl/crypto/x509/a_sign.c +135 -0
  863. data/third_party/boringssl/crypto/x509/a_strex.c +633 -0
  864. data/third_party/boringssl/crypto/x509/a_verify.c +127 -0
  865. data/third_party/boringssl/crypto/x509/algorithm.c +137 -0
  866. data/third_party/boringssl/crypto/x509/asn1_gen.c +818 -0
  867. data/third_party/boringssl/crypto/x509/by_dir.c +453 -0
  868. data/third_party/boringssl/crypto/x509/by_file.c +275 -0
  869. data/third_party/boringssl/crypto/x509/charmap.h +15 -0
  870. data/third_party/boringssl/crypto/x509/i2d_pr.c +83 -0
  871. data/third_party/boringssl/crypto/x509/internal.h +66 -0
  872. data/third_party/boringssl/crypto/x509/pkcs7.c +353 -0
  873. data/third_party/boringssl/crypto/x509/rsa_pss.c +385 -0
  874. data/third_party/boringssl/crypto/x509/t_crl.c +128 -0
  875. data/third_party/boringssl/crypto/x509/t_req.c +246 -0
  876. data/third_party/boringssl/crypto/x509/t_x509.c +506 -0
  877. data/third_party/boringssl/crypto/x509/t_x509a.c +111 -0
  878. data/third_party/boringssl/crypto/x509/vpm_int.h +70 -0
  879. data/third_party/boringssl/crypto/x509/x509.c +157 -0
  880. data/third_party/boringssl/crypto/x509/x509_att.c +381 -0
  881. data/third_party/boringssl/crypto/x509/x509_cmp.c +474 -0
  882. data/third_party/boringssl/crypto/x509/x509_d2.c +106 -0
  883. data/third_party/boringssl/crypto/x509/x509_def.c +98 -0
  884. data/third_party/boringssl/crypto/x509/x509_ext.c +206 -0
  885. data/third_party/boringssl/crypto/x509/x509_lu.c +690 -0
  886. data/third_party/boringssl/crypto/x509/x509_obj.c +197 -0
  887. data/third_party/boringssl/crypto/x509/x509_r2x.c +117 -0
  888. data/third_party/boringssl/crypto/x509/x509_req.c +322 -0
  889. data/third_party/boringssl/crypto/x509/x509_set.c +154 -0
  890. data/third_party/boringssl/crypto/x509/x509_trs.c +326 -0
  891. data/third_party/boringssl/crypto/x509/x509_txt.c +211 -0
  892. data/third_party/boringssl/crypto/x509/x509_v3.c +278 -0
  893. data/third_party/boringssl/crypto/x509/x509_vfy.c +2436 -0
  894. data/third_party/boringssl/crypto/x509/x509_vpm.c +647 -0
  895. data/third_party/boringssl/crypto/x509/x509cset.c +170 -0
  896. data/third_party/boringssl/crypto/x509/x509name.c +386 -0
  897. data/third_party/boringssl/crypto/x509/x509rset.c +81 -0
  898. data/third_party/boringssl/crypto/x509/x509spki.c +137 -0
  899. data/third_party/boringssl/crypto/x509/x509type.c +126 -0
  900. data/third_party/boringssl/crypto/x509/x_algor.c +151 -0
  901. data/third_party/boringssl/crypto/x509/x_all.c +501 -0
  902. data/third_party/boringssl/crypto/x509/x_attrib.c +111 -0
  903. data/third_party/boringssl/crypto/x509/x_crl.c +539 -0
  904. data/third_party/boringssl/crypto/x509/x_exten.c +75 -0
  905. data/third_party/boringssl/crypto/x509/x_info.c +98 -0
  906. data/third_party/boringssl/crypto/x509/x_name.c +534 -0
  907. data/third_party/boringssl/crypto/x509/x_pkey.c +103 -0
  908. data/third_party/boringssl/crypto/x509/x_pubkey.c +368 -0
  909. data/third_party/boringssl/crypto/x509/x_req.c +109 -0
  910. data/third_party/boringssl/crypto/x509/x_sig.c +69 -0
  911. data/third_party/boringssl/crypto/x509/x_spki.c +80 -0
  912. data/third_party/boringssl/crypto/x509/x_val.c +69 -0
  913. data/third_party/boringssl/crypto/x509/x_x509.c +289 -0
  914. data/third_party/boringssl/crypto/x509/x_x509a.c +205 -0
  915. data/third_party/boringssl/crypto/x509v3/ext_dat.h +135 -0
  916. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +284 -0
  917. data/third_party/boringssl/crypto/x509v3/pcy_data.c +130 -0
  918. data/third_party/boringssl/crypto/x509v3/pcy_int.h +217 -0
  919. data/third_party/boringssl/crypto/x509v3/pcy_lib.c +164 -0
  920. data/third_party/boringssl/crypto/x509v3/pcy_map.c +130 -0
  921. data/third_party/boringssl/crypto/x509v3/pcy_node.c +188 -0
  922. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +829 -0
  923. data/third_party/boringssl/crypto/x509v3/v3_akey.c +204 -0
  924. data/third_party/boringssl/crypto/x509v3/v3_akeya.c +72 -0
  925. data/third_party/boringssl/crypto/x509v3/v3_alt.c +614 -0
  926. data/third_party/boringssl/crypto/x509v3/v3_bcons.c +133 -0
  927. data/third_party/boringssl/crypto/x509v3/v3_bitst.c +141 -0
  928. data/third_party/boringssl/crypto/x509v3/v3_conf.c +462 -0
  929. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +496 -0
  930. data/third_party/boringssl/crypto/x509v3/v3_crld.c +561 -0
  931. data/third_party/boringssl/crypto/x509v3/v3_enum.c +100 -0
  932. data/third_party/boringssl/crypto/x509v3/v3_extku.c +148 -0
  933. data/third_party/boringssl/crypto/x509v3/v3_genn.c +250 -0
  934. data/third_party/boringssl/crypto/x509v3/v3_ia5.c +119 -0
  935. data/third_party/boringssl/crypto/x509v3/v3_info.c +212 -0
  936. data/third_party/boringssl/crypto/x509v3/v3_int.c +91 -0
  937. data/third_party/boringssl/crypto/x509v3/v3_lib.c +362 -0
  938. data/third_party/boringssl/crypto/x509v3/v3_ncons.c +482 -0
  939. data/third_party/boringssl/crypto/x509v3/v3_pci.c +317 -0
  940. data/third_party/boringssl/crypto/x509v3/v3_pcia.c +57 -0
  941. data/third_party/boringssl/crypto/x509v3/v3_pcons.c +139 -0
  942. data/third_party/boringssl/crypto/x509v3/v3_pku.c +110 -0
  943. data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +154 -0
  944. data/third_party/boringssl/crypto/x509v3/v3_prn.c +229 -0
  945. data/third_party/boringssl/crypto/x509v3/v3_purp.c +874 -0
  946. data/third_party/boringssl/crypto/x509v3/v3_skey.c +152 -0
  947. data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +274 -0
  948. data/third_party/boringssl/crypto/x509v3/v3_utl.c +1327 -0
  949. data/third_party/boringssl/include/openssl/aead.h +345 -0
  950. data/third_party/boringssl/include/openssl/aes.h +158 -0
  951. data/third_party/boringssl/include/openssl/arm_arch.h +121 -0
  952. data/third_party/boringssl/include/openssl/asn1.h +1038 -0
  953. data/third_party/boringssl/include/openssl/asn1_mac.h +18 -0
  954. data/third_party/boringssl/include/openssl/asn1t.h +896 -0
  955. data/third_party/boringssl/include/openssl/base.h +412 -0
  956. data/third_party/boringssl/include/openssl/base64.h +187 -0
  957. data/third_party/boringssl/include/openssl/bio.h +926 -0
  958. data/third_party/boringssl/include/openssl/blowfish.h +93 -0
  959. data/third_party/boringssl/include/openssl/bn.h +955 -0
  960. data/third_party/boringssl/include/openssl/buf.h +133 -0
  961. data/third_party/boringssl/include/openssl/buffer.h +18 -0
  962. data/third_party/boringssl/include/openssl/bytestring.h +437 -0
  963. data/third_party/boringssl/include/openssl/cast.h +96 -0
  964. data/third_party/boringssl/include/openssl/chacha.h +37 -0
  965. data/third_party/boringssl/include/openssl/cipher.h +588 -0
  966. data/third_party/boringssl/include/openssl/cmac.h +87 -0
  967. data/third_party/boringssl/include/openssl/conf.h +181 -0
  968. data/third_party/boringssl/include/openssl/cpu.h +181 -0
  969. data/third_party/boringssl/include/openssl/crypto.h +94 -0
  970. data/third_party/boringssl/include/openssl/curve25519.h +183 -0
  971. data/third_party/boringssl/include/openssl/des.h +177 -0
  972. data/third_party/boringssl/include/openssl/dh.h +297 -0
  973. data/third_party/boringssl/include/openssl/digest.h +285 -0
  974. data/third_party/boringssl/include/openssl/dsa.h +436 -0
  975. data/third_party/boringssl/include/openssl/dtls1.h +16 -0
  976. data/third_party/boringssl/include/openssl/ec.h +406 -0
  977. data/third_party/boringssl/include/openssl/ec_key.h +337 -0
  978. data/third_party/boringssl/include/openssl/ecdh.h +102 -0
  979. data/third_party/boringssl/include/openssl/ecdsa.h +217 -0
  980. data/third_party/boringssl/include/openssl/engine.h +109 -0
  981. data/third_party/boringssl/include/openssl/err.h +488 -0
  982. data/third_party/boringssl/include/openssl/evp.h +797 -0
  983. data/third_party/boringssl/include/openssl/ex_data.h +213 -0
  984. data/third_party/boringssl/include/openssl/hkdf.h +64 -0
  985. data/third_party/boringssl/include/openssl/hmac.h +174 -0
  986. data/third_party/boringssl/include/openssl/lhash.h +192 -0
  987. data/third_party/boringssl/include/openssl/lhash_macros.h +132 -0
  988. data/third_party/boringssl/include/openssl/md4.h +106 -0
  989. data/third_party/boringssl/include/openssl/md5.h +107 -0
  990. data/third_party/boringssl/include/openssl/mem.h +150 -0
  991. data/third_party/boringssl/include/openssl/newhope.h +158 -0
  992. data/third_party/boringssl/include/openssl/nid.h +4166 -0
  993. data/third_party/boringssl/include/openssl/obj.h +226 -0
  994. data/third_party/boringssl/include/openssl/obj_mac.h +18 -0
  995. data/third_party/boringssl/include/openssl/objects.h +18 -0
  996. data/third_party/boringssl/include/openssl/opensslconf.h +60 -0
  997. data/third_party/boringssl/include/openssl/opensslv.h +18 -0
  998. data/third_party/boringssl/include/openssl/ossl_typ.h +18 -0
  999. data/third_party/boringssl/include/openssl/pem.h +517 -0
  1000. data/third_party/boringssl/include/openssl/pkcs12.h +18 -0
  1001. data/third_party/boringssl/include/openssl/pkcs7.h +16 -0
  1002. data/third_party/boringssl/include/openssl/pkcs8.h +236 -0
  1003. data/third_party/boringssl/include/openssl/poly1305.h +51 -0
  1004. data/third_party/boringssl/include/openssl/rand.h +122 -0
  1005. data/third_party/boringssl/include/openssl/rc4.h +96 -0
  1006. data/third_party/boringssl/include/openssl/ripemd.h +107 -0
  1007. data/third_party/boringssl/include/openssl/rsa.h +699 -0
  1008. data/third_party/boringssl/include/openssl/safestack.h +16 -0
  1009. data/third_party/boringssl/include/openssl/sha.h +260 -0
  1010. data/third_party/boringssl/include/openssl/srtp.h +18 -0
  1011. data/third_party/boringssl/include/openssl/ssl.h +4826 -0
  1012. data/third_party/boringssl/include/openssl/ssl3.h +434 -0
  1013. data/third_party/boringssl/include/openssl/stack.h +293 -0
  1014. data/third_party/boringssl/include/openssl/stack_macros.h +3902 -0
  1015. data/third_party/boringssl/include/openssl/thread.h +191 -0
  1016. data/third_party/boringssl/include/openssl/time_support.h +91 -0
  1017. data/third_party/boringssl/include/openssl/tls1.h +657 -0
  1018. data/third_party/boringssl/include/openssl/type_check.h +91 -0
  1019. data/third_party/boringssl/include/openssl/x509.h +1299 -0
  1020. data/third_party/boringssl/include/openssl/x509_vfy.h +618 -0
  1021. data/third_party/boringssl/include/openssl/x509v3.h +819 -0
  1022. data/third_party/boringssl/ssl/custom_extensions.c +255 -0
  1023. data/third_party/boringssl/ssl/d1_both.c +845 -0
  1024. data/third_party/boringssl/ssl/d1_lib.c +270 -0
  1025. data/third_party/boringssl/ssl/d1_pkt.c +419 -0
  1026. data/third_party/boringssl/ssl/d1_srtp.c +236 -0
  1027. data/third_party/boringssl/ssl/dtls_method.c +203 -0
  1028. data/third_party/boringssl/ssl/dtls_record.c +309 -0
  1029. data/third_party/boringssl/ssl/handshake_client.c +2002 -0
  1030. data/third_party/boringssl/ssl/handshake_server.c +1932 -0
  1031. data/third_party/boringssl/ssl/internal.h +1551 -0
  1032. data/third_party/boringssl/ssl/s3_both.c +745 -0
  1033. data/third_party/boringssl/ssl/s3_enc.c +412 -0
  1034. data/third_party/boringssl/ssl/s3_lib.c +336 -0
  1035. data/third_party/boringssl/ssl/s3_pkt.c +497 -0
  1036. data/third_party/boringssl/ssl/ssl_aead_ctx.c +329 -0
  1037. data/third_party/boringssl/ssl/ssl_asn1.c +748 -0
  1038. data/third_party/boringssl/ssl/ssl_buffer.c +311 -0
  1039. data/third_party/boringssl/ssl/ssl_cert.c +814 -0
  1040. data/third_party/boringssl/ssl/ssl_cipher.c +2062 -0
  1041. data/third_party/boringssl/ssl/ssl_ecdh.c +610 -0
  1042. data/third_party/boringssl/ssl/ssl_file.c +586 -0
  1043. data/third_party/boringssl/ssl/ssl_lib.c +3063 -0
  1044. data/third_party/boringssl/ssl/ssl_rsa.c +793 -0
  1045. data/third_party/boringssl/ssl/ssl_session.c +985 -0
  1046. data/third_party/boringssl/ssl/ssl_stat.c +509 -0
  1047. data/third_party/boringssl/ssl/t1_enc.c +547 -0
  1048. data/third_party/boringssl/ssl/t1_lib.c +3279 -0
  1049. data/third_party/boringssl/ssl/tls13_both.c +440 -0
  1050. data/third_party/boringssl/ssl/tls13_client.c +682 -0
  1051. data/third_party/boringssl/ssl/tls13_enc.c +391 -0
  1052. data/third_party/boringssl/ssl/tls13_server.c +672 -0
  1053. data/third_party/boringssl/ssl/tls_method.c +245 -0
  1054. data/third_party/boringssl/ssl/tls_record.c +461 -0
  1055. data/third_party/cares/ares_build.h +264 -0
  1056. data/third_party/cares/cares/ares.h +636 -0
  1057. data/third_party/cares/cares/ares__close_sockets.c +61 -0
  1058. data/third_party/cares/cares/ares__get_hostent.c +261 -0
  1059. data/third_party/cares/cares/ares__read_line.c +73 -0
  1060. data/third_party/cares/cares/ares__timeval.c +111 -0
  1061. data/third_party/cares/cares/ares_cancel.c +63 -0
  1062. data/third_party/cares/cares/ares_create_query.c +202 -0
  1063. data/third_party/cares/cares/ares_data.c +221 -0
  1064. data/third_party/cares/cares/ares_data.h +72 -0
  1065. data/third_party/cares/cares/ares_destroy.c +108 -0
  1066. data/third_party/cares/cares/ares_dns.h +103 -0
  1067. data/third_party/cares/cares/ares_expand_name.c +205 -0
  1068. data/third_party/cares/cares/ares_expand_string.c +70 -0
  1069. data/third_party/cares/cares/ares_fds.c +59 -0
  1070. data/third_party/cares/cares/ares_free_hostent.c +41 -0
  1071. data/third_party/cares/cares/ares_free_string.c +25 -0
  1072. data/third_party/cares/cares/ares_getenv.c +30 -0
  1073. data/third_party/cares/cares/ares_getenv.h +26 -0
  1074. data/third_party/cares/cares/ares_gethostbyaddr.c +294 -0
  1075. data/third_party/cares/cares/ares_gethostbyname.c +518 -0
  1076. data/third_party/cares/cares/ares_getnameinfo.c +422 -0
  1077. data/third_party/cares/cares/ares_getopt.c +122 -0
  1078. data/third_party/cares/cares/ares_getopt.h +53 -0
  1079. data/third_party/cares/cares/ares_getsock.c +66 -0
  1080. data/third_party/cares/cares/ares_inet_net_pton.h +25 -0
  1081. data/third_party/cares/cares/ares_init.c +2146 -0
  1082. data/third_party/cares/cares/ares_iphlpapi.h +221 -0
  1083. data/third_party/cares/cares/ares_ipv6.h +78 -0
  1084. data/third_party/cares/cares/ares_library_init.c +167 -0
  1085. data/third_party/cares/cares/ares_library_init.h +42 -0
  1086. data/third_party/cares/cares/ares_llist.c +63 -0
  1087. data/third_party/cares/cares/ares_llist.h +39 -0
  1088. data/third_party/cares/cares/ares_mkquery.c +24 -0
  1089. data/third_party/cares/cares/ares_nowarn.c +260 -0
  1090. data/third_party/cares/cares/ares_nowarn.h +61 -0
  1091. data/third_party/cares/cares/ares_options.c +402 -0
  1092. data/third_party/cares/cares/ares_parse_a_reply.c +264 -0
  1093. data/third_party/cares/cares/ares_parse_aaaa_reply.c +264 -0
  1094. data/third_party/cares/cares/ares_parse_mx_reply.c +170 -0
  1095. data/third_party/cares/cares/ares_parse_naptr_reply.c +188 -0
  1096. data/third_party/cares/cares/ares_parse_ns_reply.c +183 -0
  1097. data/third_party/cares/cares/ares_parse_ptr_reply.c +219 -0
  1098. data/third_party/cares/cares/ares_parse_soa_reply.c +133 -0
  1099. data/third_party/cares/cares/ares_parse_srv_reply.c +179 -0
  1100. data/third_party/cares/cares/ares_parse_txt_reply.c +220 -0
  1101. data/third_party/cares/cares/ares_platform.c +11035 -0
  1102. data/third_party/cares/cares/ares_platform.h +43 -0
  1103. data/third_party/cares/cares/ares_private.h +363 -0
  1104. data/third_party/cares/cares/ares_process.c +1359 -0
  1105. data/third_party/cares/cares/ares_query.c +186 -0
  1106. data/third_party/cares/cares/ares_rules.h +125 -0
  1107. data/third_party/cares/cares/ares_search.c +316 -0
  1108. data/third_party/cares/cares/ares_send.c +131 -0
  1109. data/third_party/cares/cares/ares_setup.h +217 -0
  1110. data/third_party/cares/cares/ares_strcasecmp.c +66 -0
  1111. data/third_party/cares/cares/ares_strcasecmp.h +30 -0
  1112. data/third_party/cares/cares/ares_strdup.c +49 -0
  1113. data/third_party/cares/cares/ares_strdup.h +24 -0
  1114. data/third_party/cares/cares/ares_strerror.c +56 -0
  1115. data/third_party/cares/cares/ares_timeout.c +88 -0
  1116. data/third_party/cares/cares/ares_version.c +11 -0
  1117. data/third_party/cares/cares/ares_version.h +24 -0
  1118. data/third_party/cares/cares/ares_writev.c +79 -0
  1119. data/third_party/cares/cares/bitncmp.c +59 -0
  1120. data/third_party/cares/cares/bitncmp.h +26 -0
  1121. data/third_party/cares/cares/config-win32.h +377 -0
  1122. data/third_party/cares/cares/inet_net_pton.c +450 -0
  1123. data/third_party/cares/cares/inet_ntop.c +208 -0
  1124. data/third_party/cares/cares/setup_once.h +554 -0
  1125. data/third_party/cares/cares/windows_port.c +22 -0
  1126. data/third_party/cares/config_darwin/ares_config.h +523 -0
  1127. data/third_party/cares/config_linux/ares_config.h +524 -0
  1128. data/third_party/nanopb/pb.h +579 -0
  1129. data/third_party/nanopb/pb_common.c +97 -0
  1130. data/third_party/nanopb/pb_common.h +42 -0
  1131. data/third_party/nanopb/pb_decode.c +1347 -0
  1132. data/third_party/nanopb/pb_decode.h +149 -0
  1133. data/third_party/nanopb/pb_encode.c +696 -0
  1134. data/third_party/nanopb/pb_encode.h +154 -0
  1135. data/third_party/zlib/adler32.c +179 -0
  1136. data/third_party/zlib/compress.c +80 -0
  1137. data/third_party/zlib/crc32.c +425 -0
  1138. data/third_party/zlib/crc32.h +441 -0
  1139. data/third_party/zlib/deflate.c +1967 -0
  1140. data/third_party/zlib/deflate.h +346 -0
  1141. data/third_party/zlib/gzclose.c +25 -0
  1142. data/third_party/zlib/gzguts.h +209 -0
  1143. data/third_party/zlib/gzlib.c +634 -0
  1144. data/third_party/zlib/gzread.c +594 -0
  1145. data/third_party/zlib/gzwrite.c +577 -0
  1146. data/third_party/zlib/infback.c +640 -0
  1147. data/third_party/zlib/inffast.c +340 -0
  1148. data/third_party/zlib/inffast.h +11 -0
  1149. data/third_party/zlib/inffixed.h +94 -0
  1150. data/third_party/zlib/inflate.c +1512 -0
  1151. data/third_party/zlib/inflate.h +122 -0
  1152. data/third_party/zlib/inftrees.c +306 -0
  1153. data/third_party/zlib/inftrees.h +62 -0
  1154. data/third_party/zlib/trees.c +1226 -0
  1155. data/third_party/zlib/trees.h +128 -0
  1156. data/third_party/zlib/uncompr.c +59 -0
  1157. data/third_party/zlib/zconf.h +511 -0
  1158. data/third_party/zlib/zlib.h +1768 -0
  1159. data/third_party/zlib/zutil.c +324 -0
  1160. data/third_party/zlib/zutil.h +253 -0
  1161. metadata +1397 -0
@@ -0,0 +1,42 @@
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_CORE_LIB_SURFACE_INIT_H
35
+ #define GRPC_CORE_LIB_SURFACE_INIT_H
36
+
37
+ void grpc_register_security_filters(void);
38
+ void grpc_security_pre_init(void);
39
+ void grpc_security_init(void);
40
+ int grpc_is_initialized(void);
41
+
42
+ #endif /* GRPC_CORE_LIB_SURFACE_INIT_H */
@@ -0,0 +1,94 @@
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
+ #include "src/core/lib/surface/init.h"
37
+
38
+ #include <limits.h>
39
+ #include <string.h>
40
+
41
+ #include "src/core/lib/debug/trace.h"
42
+ #include "src/core/lib/security/credentials/credentials.h"
43
+ #include "src/core/lib/security/transport/auth_filters.h"
44
+ #include "src/core/lib/security/transport/secure_endpoint.h"
45
+ #include "src/core/lib/security/transport/security_connector.h"
46
+ #include "src/core/lib/security/transport/security_handshaker.h"
47
+ #include "src/core/lib/surface/channel_init.h"
48
+ #include "src/core/tsi/transport_security_interface.h"
49
+
50
+ void grpc_security_pre_init(void) {
51
+ grpc_register_tracer("secure_endpoint", &grpc_trace_secure_endpoint);
52
+ grpc_register_tracer("transport_security", &tsi_tracing_enabled);
53
+ }
54
+
55
+ static bool maybe_prepend_client_auth_filter(
56
+ grpc_exec_ctx *exec_ctx, grpc_channel_stack_builder *builder, void *arg) {
57
+ const grpc_channel_args *args =
58
+ grpc_channel_stack_builder_get_channel_arguments(builder);
59
+ if (args) {
60
+ for (size_t i = 0; i < args->num_args; i++) {
61
+ if (0 == strcmp(GRPC_ARG_SECURITY_CONNECTOR, args->args[i].key)) {
62
+ return grpc_channel_stack_builder_prepend_filter(
63
+ builder, &grpc_client_auth_filter, NULL, NULL);
64
+ }
65
+ }
66
+ }
67
+ return true;
68
+ }
69
+
70
+ static bool maybe_prepend_server_auth_filter(
71
+ grpc_exec_ctx *exec_ctx, grpc_channel_stack_builder *builder, void *arg) {
72
+ const grpc_channel_args *args =
73
+ grpc_channel_stack_builder_get_channel_arguments(builder);
74
+ if (args) {
75
+ for (size_t i = 0; i < args->num_args; i++) {
76
+ if (0 == strcmp(GRPC_SERVER_CREDENTIALS_ARG, args->args[i].key)) {
77
+ return grpc_channel_stack_builder_prepend_filter(
78
+ builder, &grpc_server_auth_filter, NULL, NULL);
79
+ }
80
+ }
81
+ }
82
+ return true;
83
+ }
84
+
85
+ void grpc_register_security_filters(void) {
86
+ grpc_channel_init_register_stage(GRPC_CLIENT_SUBCHANNEL, INT_MAX,
87
+ maybe_prepend_client_auth_filter, NULL);
88
+ grpc_channel_init_register_stage(GRPC_CLIENT_DIRECT_CHANNEL, INT_MAX,
89
+ maybe_prepend_client_auth_filter, NULL);
90
+ grpc_channel_init_register_stage(GRPC_SERVER_CHANNEL, INT_MAX,
91
+ maybe_prepend_server_auth_filter, NULL);
92
+ }
93
+
94
+ void grpc_security_init() { grpc_security_register_handshaker_factories(); }
@@ -0,0 +1,188 @@
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/lib/surface/lame_client.h"
35
+
36
+ #include <grpc/grpc.h>
37
+
38
+ #include <string.h>
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+ #include "src/core/lib/channel/channel_stack.h"
43
+ #include "src/core/lib/support/string.h"
44
+ #include "src/core/lib/surface/api_trace.h"
45
+ #include "src/core/lib/surface/call.h"
46
+ #include "src/core/lib/surface/channel.h"
47
+ #include "src/core/lib/transport/static_metadata.h"
48
+
49
+ typedef struct {
50
+ grpc_linked_mdelem status;
51
+ grpc_linked_mdelem details;
52
+ gpr_atm filled_metadata;
53
+ } call_data;
54
+
55
+ typedef struct {
56
+ grpc_status_code error_code;
57
+ const char *error_message;
58
+ } channel_data;
59
+
60
+ static void fill_metadata(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
61
+ grpc_metadata_batch *mdb) {
62
+ call_data *calld = elem->call_data;
63
+ if (!gpr_atm_no_barrier_cas(&calld->filled_metadata, 0, 1)) {
64
+ return;
65
+ }
66
+ channel_data *chand = elem->channel_data;
67
+ char tmp[GPR_LTOA_MIN_BUFSIZE];
68
+ gpr_ltoa(chand->error_code, tmp);
69
+ calld->status.md = grpc_mdelem_from_slices(
70
+ exec_ctx, GRPC_MDSTR_GRPC_STATUS, grpc_slice_from_copied_string(tmp));
71
+ calld->details.md = grpc_mdelem_from_slices(
72
+ exec_ctx, GRPC_MDSTR_GRPC_MESSAGE,
73
+ grpc_slice_from_copied_string(chand->error_message));
74
+ calld->status.prev = calld->details.next = NULL;
75
+ calld->status.next = &calld->details;
76
+ calld->details.prev = &calld->status;
77
+ mdb->list.head = &calld->status;
78
+ mdb->list.tail = &calld->details;
79
+ mdb->list.count = 2;
80
+ mdb->deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
81
+ }
82
+
83
+ static void lame_start_transport_stream_op_batch(
84
+ grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
85
+ grpc_transport_stream_op_batch *op) {
86
+ GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
87
+ if (op->recv_initial_metadata) {
88
+ fill_metadata(exec_ctx, elem,
89
+ op->payload->recv_initial_metadata.recv_initial_metadata);
90
+ } else if (op->recv_trailing_metadata) {
91
+ fill_metadata(exec_ctx, elem,
92
+ op->payload->recv_trailing_metadata.recv_trailing_metadata);
93
+ }
94
+ grpc_transport_stream_op_batch_finish_with_failure(
95
+ exec_ctx, op,
96
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel"));
97
+ }
98
+
99
+ static char *lame_get_peer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
100
+ return NULL;
101
+ }
102
+
103
+ static void lame_get_channel_info(grpc_exec_ctx *exec_ctx,
104
+ grpc_channel_element *elem,
105
+ const grpc_channel_info *channel_info) {}
106
+
107
+ static void lame_start_transport_op(grpc_exec_ctx *exec_ctx,
108
+ grpc_channel_element *elem,
109
+ grpc_transport_op *op) {
110
+ if (op->on_connectivity_state_change) {
111
+ GPR_ASSERT(*op->connectivity_state != GRPC_CHANNEL_SHUTDOWN);
112
+ *op->connectivity_state = GRPC_CHANNEL_SHUTDOWN;
113
+ grpc_closure_sched(exec_ctx, op->on_connectivity_state_change,
114
+ GRPC_ERROR_NONE);
115
+ }
116
+ if (op->send_ping != NULL) {
117
+ grpc_closure_sched(
118
+ exec_ctx, op->send_ping,
119
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel"));
120
+ }
121
+ GRPC_ERROR_UNREF(op->disconnect_with_error);
122
+ if (op->on_consumed != NULL) {
123
+ grpc_closure_sched(exec_ctx, op->on_consumed, GRPC_ERROR_NONE);
124
+ }
125
+ }
126
+
127
+ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
128
+ grpc_call_element *elem,
129
+ const grpc_call_element_args *args) {
130
+ call_data *calld = elem->call_data;
131
+ gpr_atm_no_barrier_store(&calld->filled_metadata, 0);
132
+ return GRPC_ERROR_NONE;
133
+ }
134
+
135
+ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
136
+ const grpc_call_final_info *final_info,
137
+ grpc_closure *then_schedule_closure) {
138
+ grpc_closure_sched(exec_ctx, then_schedule_closure, GRPC_ERROR_NONE);
139
+ }
140
+
141
+ static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
142
+ grpc_channel_element *elem,
143
+ grpc_channel_element_args *args) {
144
+ GPR_ASSERT(args->is_first);
145
+ GPR_ASSERT(args->is_last);
146
+ return GRPC_ERROR_NONE;
147
+ }
148
+
149
+ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
150
+ grpc_channel_element *elem) {}
151
+
152
+ const grpc_channel_filter grpc_lame_filter = {
153
+ lame_start_transport_stream_op_batch,
154
+ lame_start_transport_op,
155
+ sizeof(call_data),
156
+ init_call_elem,
157
+ grpc_call_stack_ignore_set_pollset_or_pollset_set,
158
+ destroy_call_elem,
159
+ sizeof(channel_data),
160
+ init_channel_elem,
161
+ destroy_channel_elem,
162
+ lame_get_peer,
163
+ lame_get_channel_info,
164
+ "lame-client",
165
+ };
166
+
167
+ #define CHANNEL_STACK_FROM_CHANNEL(c) ((grpc_channel_stack *)((c) + 1))
168
+
169
+ grpc_channel *grpc_lame_client_channel_create(const char *target,
170
+ grpc_status_code error_code,
171
+ const char *error_message) {
172
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
173
+ grpc_channel_element *elem;
174
+ channel_data *chand;
175
+ grpc_channel *channel = grpc_channel_create(&exec_ctx, target, NULL,
176
+ GRPC_CLIENT_LAME_CHANNEL, NULL);
177
+ elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
178
+ GRPC_API_TRACE(
179
+ "grpc_lame_client_channel_create(target=%s, error_code=%d, "
180
+ "error_message=%s)",
181
+ 3, (target, (int)error_code, error_message));
182
+ GPR_ASSERT(elem->filter == &grpc_lame_filter);
183
+ chand = (channel_data *)elem->channel_data;
184
+ chand->error_code = error_code;
185
+ chand->error_message = error_message;
186
+ grpc_exec_ctx_finish(&exec_ctx);
187
+ return channel;
188
+ }
@@ -0,0 +1,41 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, 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_CORE_LIB_SURFACE_LAME_CLIENT_H
35
+ #define GRPC_CORE_LIB_SURFACE_LAME_CLIENT_H
36
+
37
+ #include "src/core/lib/channel/channel_stack.h"
38
+
39
+ extern const grpc_channel_filter grpc_lame_filter;
40
+
41
+ #endif /* GRPC_CORE_LIB_SURFACE_LAME_CLIENT_H */
@@ -0,0 +1,49 @@
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/grpc.h>
35
+ #include <grpc/support/alloc.h>
36
+
37
+ #include <string.h>
38
+
39
+ #include "src/core/lib/surface/api_trace.h"
40
+
41
+ void grpc_metadata_array_init(grpc_metadata_array* array) {
42
+ GRPC_API_TRACE("grpc_metadata_array_init(array=%p)", 1, (array));
43
+ memset(array, 0, sizeof(*array));
44
+ }
45
+
46
+ void grpc_metadata_array_destroy(grpc_metadata_array* array) {
47
+ GRPC_API_TRACE("grpc_metadata_array_destroy(array=%p)", 1, (array));
48
+ gpr_free(array->metadata);
49
+ }
@@ -0,0 +1,1529 @@
1
+ /*
2
+ *
3
+ * Copyright 2015-2016, 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/lib/surface/server.h"
35
+
36
+ #include <limits.h>
37
+ #include <stdlib.h>
38
+ #include <string.h>
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+ #include <grpc/support/string_util.h>
43
+ #include <grpc/support/useful.h>
44
+
45
+ #include "src/core/lib/channel/channel_args.h"
46
+ #include "src/core/lib/channel/connected_channel.h"
47
+ #include "src/core/lib/iomgr/iomgr.h"
48
+ #include "src/core/lib/slice/slice_internal.h"
49
+ #include "src/core/lib/support/stack_lockfree.h"
50
+ #include "src/core/lib/support/string.h"
51
+ #include "src/core/lib/surface/api_trace.h"
52
+ #include "src/core/lib/surface/call.h"
53
+ #include "src/core/lib/surface/channel.h"
54
+ #include "src/core/lib/surface/completion_queue.h"
55
+ #include "src/core/lib/surface/init.h"
56
+ #include "src/core/lib/transport/metadata.h"
57
+ #include "src/core/lib/transport/static_metadata.h"
58
+
59
+ typedef struct listener {
60
+ void *arg;
61
+ void (*start)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
62
+ grpc_pollset **pollsets, size_t pollset_count);
63
+ void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
64
+ grpc_closure *closure);
65
+ struct listener *next;
66
+ grpc_closure destroy_done;
67
+ } listener;
68
+
69
+ typedef struct call_data call_data;
70
+ typedef struct channel_data channel_data;
71
+ typedef struct registered_method registered_method;
72
+
73
+ typedef enum { BATCH_CALL, REGISTERED_CALL } requested_call_type;
74
+
75
+ int grpc_server_channel_trace = 0;
76
+
77
+ typedef struct requested_call {
78
+ requested_call_type type;
79
+ size_t cq_idx;
80
+ void *tag;
81
+ grpc_server *server;
82
+ grpc_completion_queue *cq_bound_to_call;
83
+ grpc_call **call;
84
+ grpc_cq_completion completion;
85
+ grpc_metadata_array *initial_metadata;
86
+ union {
87
+ struct {
88
+ grpc_call_details *details;
89
+ } batch;
90
+ struct {
91
+ registered_method *registered_method;
92
+ gpr_timespec *deadline;
93
+ grpc_byte_buffer **optional_payload;
94
+ } registered;
95
+ } data;
96
+ } requested_call;
97
+
98
+ typedef struct channel_registered_method {
99
+ registered_method *server_registered_method;
100
+ uint32_t flags;
101
+ bool has_host;
102
+ grpc_slice method;
103
+ grpc_slice host;
104
+ } channel_registered_method;
105
+
106
+ struct channel_data {
107
+ grpc_server *server;
108
+ grpc_connectivity_state connectivity_state;
109
+ grpc_channel *channel;
110
+ size_t cq_idx;
111
+ /* linked list of all channels on a server */
112
+ channel_data *next;
113
+ channel_data *prev;
114
+ channel_registered_method *registered_methods;
115
+ uint32_t registered_method_slots;
116
+ uint32_t registered_method_max_probes;
117
+ grpc_closure finish_destroy_channel_closure;
118
+ grpc_closure channel_connectivity_changed;
119
+ };
120
+
121
+ typedef struct shutdown_tag {
122
+ void *tag;
123
+ grpc_completion_queue *cq;
124
+ grpc_cq_completion completion;
125
+ } shutdown_tag;
126
+
127
+ typedef enum {
128
+ /* waiting for metadata */
129
+ NOT_STARTED,
130
+ /* inital metadata read, not flow controlled in yet */
131
+ PENDING,
132
+ /* flow controlled in, on completion queue */
133
+ ACTIVATED,
134
+ /* cancelled before being queued */
135
+ ZOMBIED
136
+ } call_state;
137
+
138
+ typedef struct request_matcher request_matcher;
139
+
140
+ struct call_data {
141
+ grpc_call *call;
142
+
143
+ /** protects state */
144
+ gpr_mu mu_state;
145
+ /** the current state of a call - see call_state */
146
+ call_state state;
147
+
148
+ bool path_set;
149
+ bool host_set;
150
+ grpc_slice path;
151
+ grpc_slice host;
152
+ gpr_timespec deadline;
153
+
154
+ grpc_completion_queue *cq_new;
155
+
156
+ grpc_metadata_batch *recv_initial_metadata;
157
+ uint32_t recv_initial_metadata_flags;
158
+ grpc_metadata_array initial_metadata;
159
+
160
+ request_matcher *request_matcher;
161
+ grpc_byte_buffer *payload;
162
+
163
+ grpc_closure got_initial_metadata;
164
+ grpc_closure server_on_recv_initial_metadata;
165
+ grpc_closure kill_zombie_closure;
166
+ grpc_closure *on_done_recv_initial_metadata;
167
+
168
+ grpc_closure publish;
169
+
170
+ call_data *pending_next;
171
+ };
172
+
173
+ struct request_matcher {
174
+ grpc_server *server;
175
+ call_data *pending_head;
176
+ call_data *pending_tail;
177
+ gpr_stack_lockfree **requests_per_cq;
178
+ };
179
+
180
+ struct registered_method {
181
+ char *method;
182
+ char *host;
183
+ grpc_server_register_method_payload_handling payload_handling;
184
+ uint32_t flags;
185
+ /* one request matcher per method */
186
+ request_matcher request_matcher;
187
+ registered_method *next;
188
+ };
189
+
190
+ typedef struct {
191
+ grpc_channel **channels;
192
+ size_t num_channels;
193
+ } channel_broadcaster;
194
+
195
+ struct grpc_server {
196
+ grpc_channel_args *channel_args;
197
+
198
+ grpc_completion_queue **cqs;
199
+ grpc_pollset **pollsets;
200
+ size_t cq_count;
201
+ size_t pollset_count;
202
+ bool started;
203
+
204
+ /* The two following mutexes control access to server-state
205
+ mu_global controls access to non-call-related state (e.g., channel state)
206
+ mu_call controls access to call-related state (e.g., the call lists)
207
+
208
+ If they are ever required to be nested, you must lock mu_global
209
+ before mu_call. This is currently used in shutdown processing
210
+ (grpc_server_shutdown_and_notify and maybe_finish_shutdown) */
211
+ gpr_mu mu_global; /* mutex for server and channel state */
212
+ gpr_mu mu_call; /* mutex for call-specific state */
213
+
214
+ registered_method *registered_methods;
215
+ /** one request matcher for unregistered methods */
216
+ request_matcher unregistered_request_matcher;
217
+ /** free list of available requested_calls_per_cq indices */
218
+ gpr_stack_lockfree **request_freelist_per_cq;
219
+ /** requested call backing data */
220
+ requested_call **requested_calls_per_cq;
221
+ int max_requested_calls_per_cq;
222
+
223
+ gpr_atm shutdown_flag;
224
+ uint8_t shutdown_published;
225
+ size_t num_shutdown_tags;
226
+ shutdown_tag *shutdown_tags;
227
+
228
+ channel_data root_channel_data;
229
+
230
+ listener *listeners;
231
+ int listeners_destroyed;
232
+ gpr_refcount internal_refcount;
233
+
234
+ /** when did we print the last shutdown progress message */
235
+ gpr_timespec last_shutdown_message_time;
236
+ };
237
+
238
+ #define SERVER_FROM_CALL_ELEM(elem) \
239
+ (((channel_data *)(elem)->channel_data)->server)
240
+
241
+ static void publish_new_rpc(grpc_exec_ctx *exec_ctx, void *calld,
242
+ grpc_error *error);
243
+ static void fail_call(grpc_exec_ctx *exec_ctx, grpc_server *server,
244
+ size_t cq_idx, requested_call *rc, grpc_error *error);
245
+ /* Before calling maybe_finish_shutdown, we must hold mu_global and not
246
+ hold mu_call */
247
+ static void maybe_finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_server *server);
248
+
249
+ /*
250
+ * channel broadcaster
251
+ */
252
+
253
+ /* assumes server locked */
254
+ static void channel_broadcaster_init(grpc_server *s, channel_broadcaster *cb) {
255
+ channel_data *c;
256
+ size_t count = 0;
257
+ for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
258
+ count++;
259
+ }
260
+ cb->num_channels = count;
261
+ cb->channels = gpr_malloc(sizeof(*cb->channels) * cb->num_channels);
262
+ count = 0;
263
+ for (c = s->root_channel_data.next; c != &s->root_channel_data; c = c->next) {
264
+ cb->channels[count++] = c->channel;
265
+ GRPC_CHANNEL_INTERNAL_REF(c->channel, "broadcast");
266
+ }
267
+ }
268
+
269
+ struct shutdown_cleanup_args {
270
+ grpc_closure closure;
271
+ grpc_slice slice;
272
+ };
273
+
274
+ static void shutdown_cleanup(grpc_exec_ctx *exec_ctx, void *arg,
275
+ grpc_error *error) {
276
+ struct shutdown_cleanup_args *a = arg;
277
+ grpc_slice_unref_internal(exec_ctx, a->slice);
278
+ gpr_free(a);
279
+ }
280
+
281
+ static void send_shutdown(grpc_exec_ctx *exec_ctx, grpc_channel *channel,
282
+ bool send_goaway, grpc_error *send_disconnect) {
283
+ struct shutdown_cleanup_args *sc = gpr_malloc(sizeof(*sc));
284
+ grpc_closure_init(&sc->closure, shutdown_cleanup, sc,
285
+ grpc_schedule_on_exec_ctx);
286
+ grpc_transport_op *op = grpc_make_transport_op(&sc->closure);
287
+ grpc_channel_element *elem;
288
+
289
+ op->goaway_error =
290
+ send_goaway ? grpc_error_set_int(
291
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"),
292
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK)
293
+ : GRPC_ERROR_NONE;
294
+ op->set_accept_stream = true;
295
+ sc->slice = grpc_slice_from_copied_string("Server shutdown");
296
+ op->disconnect_with_error = send_disconnect;
297
+
298
+ elem = grpc_channel_stack_element(grpc_channel_get_channel_stack(channel), 0);
299
+ elem->filter->start_transport_op(exec_ctx, elem, op);
300
+ }
301
+
302
+ static void channel_broadcaster_shutdown(grpc_exec_ctx *exec_ctx,
303
+ channel_broadcaster *cb,
304
+ bool send_goaway,
305
+ grpc_error *force_disconnect) {
306
+ size_t i;
307
+
308
+ for (i = 0; i < cb->num_channels; i++) {
309
+ send_shutdown(exec_ctx, cb->channels[i], send_goaway,
310
+ GRPC_ERROR_REF(force_disconnect));
311
+ GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, cb->channels[i], "broadcast");
312
+ }
313
+ gpr_free(cb->channels);
314
+ GRPC_ERROR_UNREF(force_disconnect);
315
+ }
316
+
317
+ /*
318
+ * request_matcher
319
+ */
320
+
321
+ static void request_matcher_init(request_matcher *rm, size_t entries,
322
+ grpc_server *server) {
323
+ memset(rm, 0, sizeof(*rm));
324
+ rm->server = server;
325
+ rm->requests_per_cq =
326
+ gpr_malloc(sizeof(*rm->requests_per_cq) * server->cq_count);
327
+ for (size_t i = 0; i < server->cq_count; i++) {
328
+ rm->requests_per_cq[i] = gpr_stack_lockfree_create(entries);
329
+ }
330
+ }
331
+
332
+ static void request_matcher_destroy(request_matcher *rm) {
333
+ for (size_t i = 0; i < rm->server->cq_count; i++) {
334
+ GPR_ASSERT(gpr_stack_lockfree_pop(rm->requests_per_cq[i]) == -1);
335
+ gpr_stack_lockfree_destroy(rm->requests_per_cq[i]);
336
+ }
337
+ gpr_free(rm->requests_per_cq);
338
+ }
339
+
340
+ static void kill_zombie(grpc_exec_ctx *exec_ctx, void *elem,
341
+ grpc_error *error) {
342
+ grpc_call_destroy(grpc_call_from_top_element(elem));
343
+ }
344
+
345
+ static void request_matcher_zombify_all_pending_calls(grpc_exec_ctx *exec_ctx,
346
+ request_matcher *rm) {
347
+ while (rm->pending_head) {
348
+ call_data *calld = rm->pending_head;
349
+ rm->pending_head = calld->pending_next;
350
+ gpr_mu_lock(&calld->mu_state);
351
+ calld->state = ZOMBIED;
352
+ gpr_mu_unlock(&calld->mu_state);
353
+ grpc_closure_init(
354
+ &calld->kill_zombie_closure, kill_zombie,
355
+ grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
356
+ grpc_schedule_on_exec_ctx);
357
+ grpc_closure_sched(exec_ctx, &calld->kill_zombie_closure, GRPC_ERROR_NONE);
358
+ }
359
+ }
360
+
361
+ static void request_matcher_kill_requests(grpc_exec_ctx *exec_ctx,
362
+ grpc_server *server,
363
+ request_matcher *rm,
364
+ grpc_error *error) {
365
+ int request_id;
366
+ for (size_t i = 0; i < server->cq_count; i++) {
367
+ while ((request_id = gpr_stack_lockfree_pop(rm->requests_per_cq[i])) !=
368
+ -1) {
369
+ fail_call(exec_ctx, server, i,
370
+ &server->requested_calls_per_cq[i][request_id],
371
+ GRPC_ERROR_REF(error));
372
+ }
373
+ }
374
+ GRPC_ERROR_UNREF(error);
375
+ }
376
+
377
+ /*
378
+ * server proper
379
+ */
380
+
381
+ static void server_ref(grpc_server *server) {
382
+ gpr_ref(&server->internal_refcount);
383
+ }
384
+
385
+ static void server_delete(grpc_exec_ctx *exec_ctx, grpc_server *server) {
386
+ registered_method *rm;
387
+ size_t i;
388
+ grpc_channel_args_destroy(exec_ctx, server->channel_args);
389
+ gpr_mu_destroy(&server->mu_global);
390
+ gpr_mu_destroy(&server->mu_call);
391
+ while ((rm = server->registered_methods) != NULL) {
392
+ server->registered_methods = rm->next;
393
+ if (server->started) {
394
+ request_matcher_destroy(&rm->request_matcher);
395
+ }
396
+ gpr_free(rm->method);
397
+ gpr_free(rm->host);
398
+ gpr_free(rm);
399
+ }
400
+ if (server->started) {
401
+ request_matcher_destroy(&server->unregistered_request_matcher);
402
+ }
403
+ for (i = 0; i < server->cq_count; i++) {
404
+ GRPC_CQ_INTERNAL_UNREF(server->cqs[i], "server");
405
+ if (server->started) {
406
+ gpr_stack_lockfree_destroy(server->request_freelist_per_cq[i]);
407
+ gpr_free(server->requested_calls_per_cq[i]);
408
+ }
409
+ }
410
+ gpr_free(server->request_freelist_per_cq);
411
+ gpr_free(server->requested_calls_per_cq);
412
+ gpr_free(server->cqs);
413
+ gpr_free(server->pollsets);
414
+ gpr_free(server->shutdown_tags);
415
+ gpr_free(server);
416
+ }
417
+
418
+ static void server_unref(grpc_exec_ctx *exec_ctx, grpc_server *server) {
419
+ if (gpr_unref(&server->internal_refcount)) {
420
+ server_delete(exec_ctx, server);
421
+ }
422
+ }
423
+
424
+ static int is_channel_orphaned(channel_data *chand) {
425
+ return chand->next == chand;
426
+ }
427
+
428
+ static void orphan_channel(channel_data *chand) {
429
+ chand->next->prev = chand->prev;
430
+ chand->prev->next = chand->next;
431
+ chand->next = chand->prev = chand;
432
+ }
433
+
434
+ static void finish_destroy_channel(grpc_exec_ctx *exec_ctx, void *cd,
435
+ grpc_error *error) {
436
+ channel_data *chand = cd;
437
+ grpc_server *server = chand->server;
438
+ GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, chand->channel, "server");
439
+ server_unref(exec_ctx, server);
440
+ }
441
+
442
+ static void destroy_channel(grpc_exec_ctx *exec_ctx, channel_data *chand,
443
+ grpc_error *error) {
444
+ if (is_channel_orphaned(chand)) return;
445
+ GPR_ASSERT(chand->server != NULL);
446
+ orphan_channel(chand);
447
+ server_ref(chand->server);
448
+ maybe_finish_shutdown(exec_ctx, chand->server);
449
+ grpc_closure_init(&chand->finish_destroy_channel_closure,
450
+ finish_destroy_channel, chand, grpc_schedule_on_exec_ctx);
451
+
452
+ if (grpc_server_channel_trace && error != GRPC_ERROR_NONE) {
453
+ const char *msg = grpc_error_string(error);
454
+ gpr_log(GPR_INFO, "Disconnected client: %s", msg);
455
+ }
456
+ GRPC_ERROR_UNREF(error);
457
+
458
+ grpc_transport_op *op =
459
+ grpc_make_transport_op(&chand->finish_destroy_channel_closure);
460
+ op->set_accept_stream = true;
461
+ grpc_channel_next_op(exec_ctx,
462
+ grpc_channel_stack_element(
463
+ grpc_channel_get_channel_stack(chand->channel), 0),
464
+ op);
465
+ }
466
+
467
+ static void done_request_event(grpc_exec_ctx *exec_ctx, void *req,
468
+ grpc_cq_completion *c) {
469
+ requested_call *rc = req;
470
+ grpc_server *server = rc->server;
471
+
472
+ if (rc >= server->requested_calls_per_cq[rc->cq_idx] &&
473
+ rc < server->requested_calls_per_cq[rc->cq_idx] +
474
+ server->max_requested_calls_per_cq) {
475
+ GPR_ASSERT(rc - server->requested_calls_per_cq[rc->cq_idx] <= INT_MAX);
476
+ gpr_stack_lockfree_push(
477
+ server->request_freelist_per_cq[rc->cq_idx],
478
+ (int)(rc - server->requested_calls_per_cq[rc->cq_idx]));
479
+ } else {
480
+ gpr_free(req);
481
+ }
482
+
483
+ server_unref(exec_ctx, server);
484
+ }
485
+
486
+ static void publish_call(grpc_exec_ctx *exec_ctx, grpc_server *server,
487
+ call_data *calld, size_t cq_idx, requested_call *rc) {
488
+ grpc_call_set_completion_queue(exec_ctx, calld->call, rc->cq_bound_to_call);
489
+ grpc_call *call = calld->call;
490
+ *rc->call = call;
491
+ calld->cq_new = server->cqs[cq_idx];
492
+ GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, calld->initial_metadata);
493
+ switch (rc->type) {
494
+ case BATCH_CALL:
495
+ GPR_ASSERT(calld->host_set);
496
+ GPR_ASSERT(calld->path_set);
497
+ rc->data.batch.details->host = grpc_slice_ref_internal(calld->host);
498
+ rc->data.batch.details->method = grpc_slice_ref_internal(calld->path);
499
+ rc->data.batch.details->deadline = calld->deadline;
500
+ rc->data.batch.details->flags = calld->recv_initial_metadata_flags;
501
+ break;
502
+ case REGISTERED_CALL:
503
+ *rc->data.registered.deadline = calld->deadline;
504
+ if (rc->data.registered.optional_payload) {
505
+ *rc->data.registered.optional_payload = calld->payload;
506
+ }
507
+ break;
508
+ default:
509
+ GPR_UNREACHABLE_CODE(return );
510
+ }
511
+
512
+ grpc_call_element *elem =
513
+ grpc_call_stack_element(grpc_call_get_call_stack(call), 0);
514
+ channel_data *chand = elem->channel_data;
515
+ server_ref(chand->server);
516
+ grpc_cq_end_op(exec_ctx, calld->cq_new, rc->tag, GRPC_ERROR_NONE,
517
+ done_request_event, rc, &rc->completion);
518
+ }
519
+
520
+ static void publish_new_rpc(grpc_exec_ctx *exec_ctx, void *arg,
521
+ grpc_error *error) {
522
+ grpc_call_element *call_elem = arg;
523
+ call_data *calld = call_elem->call_data;
524
+ channel_data *chand = call_elem->channel_data;
525
+ request_matcher *rm = calld->request_matcher;
526
+ grpc_server *server = rm->server;
527
+
528
+ if (error != GRPC_ERROR_NONE || gpr_atm_acq_load(&server->shutdown_flag)) {
529
+ gpr_mu_lock(&calld->mu_state);
530
+ calld->state = ZOMBIED;
531
+ gpr_mu_unlock(&calld->mu_state);
532
+ grpc_closure_init(
533
+ &calld->kill_zombie_closure, kill_zombie,
534
+ grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
535
+ grpc_schedule_on_exec_ctx);
536
+ grpc_closure_sched(exec_ctx, &calld->kill_zombie_closure,
537
+ GRPC_ERROR_REF(error));
538
+ return;
539
+ }
540
+
541
+ for (size_t i = 0; i < server->cq_count; i++) {
542
+ size_t cq_idx = (chand->cq_idx + i) % server->cq_count;
543
+ int request_id = gpr_stack_lockfree_pop(rm->requests_per_cq[cq_idx]);
544
+ if (request_id == -1) {
545
+ continue;
546
+ } else {
547
+ gpr_mu_lock(&calld->mu_state);
548
+ calld->state = ACTIVATED;
549
+ gpr_mu_unlock(&calld->mu_state);
550
+ publish_call(exec_ctx, server, calld, cq_idx,
551
+ &server->requested_calls_per_cq[cq_idx][request_id]);
552
+ return; /* early out */
553
+ }
554
+ }
555
+
556
+ /* no cq to take the request found: queue it on the slow list */
557
+ gpr_mu_lock(&server->mu_call);
558
+ gpr_mu_lock(&calld->mu_state);
559
+ calld->state = PENDING;
560
+ gpr_mu_unlock(&calld->mu_state);
561
+ if (rm->pending_head == NULL) {
562
+ rm->pending_tail = rm->pending_head = calld;
563
+ } else {
564
+ rm->pending_tail->pending_next = calld;
565
+ rm->pending_tail = calld;
566
+ }
567
+ calld->pending_next = NULL;
568
+ gpr_mu_unlock(&server->mu_call);
569
+ }
570
+
571
+ static void finish_start_new_rpc(
572
+ grpc_exec_ctx *exec_ctx, grpc_server *server, grpc_call_element *elem,
573
+ request_matcher *rm,
574
+ grpc_server_register_method_payload_handling payload_handling) {
575
+ call_data *calld = elem->call_data;
576
+
577
+ if (gpr_atm_acq_load(&server->shutdown_flag)) {
578
+ gpr_mu_lock(&calld->mu_state);
579
+ calld->state = ZOMBIED;
580
+ gpr_mu_unlock(&calld->mu_state);
581
+ grpc_closure_init(&calld->kill_zombie_closure, kill_zombie, elem,
582
+ grpc_schedule_on_exec_ctx);
583
+ grpc_closure_sched(exec_ctx, &calld->kill_zombie_closure, GRPC_ERROR_NONE);
584
+ return;
585
+ }
586
+
587
+ calld->request_matcher = rm;
588
+
589
+ switch (payload_handling) {
590
+ case GRPC_SRM_PAYLOAD_NONE:
591
+ publish_new_rpc(exec_ctx, elem, GRPC_ERROR_NONE);
592
+ break;
593
+ case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: {
594
+ grpc_op op;
595
+ memset(&op, 0, sizeof(op));
596
+ op.op = GRPC_OP_RECV_MESSAGE;
597
+ op.data.recv_message.recv_message = &calld->payload;
598
+ grpc_closure_init(&calld->publish, publish_new_rpc, elem,
599
+ grpc_schedule_on_exec_ctx);
600
+ grpc_call_start_batch_and_execute(exec_ctx, calld->call, &op, 1,
601
+ &calld->publish);
602
+ break;
603
+ }
604
+ }
605
+ }
606
+
607
+ static void start_new_rpc(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) {
608
+ channel_data *chand = elem->channel_data;
609
+ call_data *calld = elem->call_data;
610
+ grpc_server *server = chand->server;
611
+ uint32_t i;
612
+ uint32_t hash;
613
+ channel_registered_method *rm;
614
+
615
+ if (chand->registered_methods && calld->path_set && calld->host_set) {
616
+ /* TODO(ctiller): unify these two searches */
617
+ /* check for an exact match with host */
618
+ hash = GRPC_MDSTR_KV_HASH(grpc_slice_hash(calld->host),
619
+ grpc_slice_hash(calld->path));
620
+ for (i = 0; i <= chand->registered_method_max_probes; i++) {
621
+ rm = &chand->registered_methods[(hash + i) %
622
+ chand->registered_method_slots];
623
+ if (!rm) break;
624
+ if (!rm->has_host) continue;
625
+ if (!grpc_slice_eq(rm->host, calld->host)) continue;
626
+ if (!grpc_slice_eq(rm->method, calld->path)) continue;
627
+ if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
628
+ 0 == (calld->recv_initial_metadata_flags &
629
+ GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
630
+ continue;
631
+ }
632
+ finish_start_new_rpc(exec_ctx, server, elem,
633
+ &rm->server_registered_method->request_matcher,
634
+ rm->server_registered_method->payload_handling);
635
+ return;
636
+ }
637
+ /* check for a wildcard method definition (no host set) */
638
+ hash = GRPC_MDSTR_KV_HASH(0, grpc_slice_hash(calld->path));
639
+ for (i = 0; i <= chand->registered_method_max_probes; i++) {
640
+ rm = &chand->registered_methods[(hash + i) %
641
+ chand->registered_method_slots];
642
+ if (!rm) break;
643
+ if (rm->has_host) continue;
644
+ if (!grpc_slice_eq(rm->method, calld->path)) continue;
645
+ if ((rm->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) &&
646
+ 0 == (calld->recv_initial_metadata_flags &
647
+ GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST)) {
648
+ continue;
649
+ }
650
+ finish_start_new_rpc(exec_ctx, server, elem,
651
+ &rm->server_registered_method->request_matcher,
652
+ rm->server_registered_method->payload_handling);
653
+ return;
654
+ }
655
+ }
656
+ finish_start_new_rpc(exec_ctx, server, elem,
657
+ &server->unregistered_request_matcher,
658
+ GRPC_SRM_PAYLOAD_NONE);
659
+ }
660
+
661
+ static int num_listeners(grpc_server *server) {
662
+ listener *l;
663
+ int n = 0;
664
+ for (l = server->listeners; l; l = l->next) {
665
+ n++;
666
+ }
667
+ return n;
668
+ }
669
+
670
+ static void done_shutdown_event(grpc_exec_ctx *exec_ctx, void *server,
671
+ grpc_cq_completion *completion) {
672
+ server_unref(exec_ctx, server);
673
+ }
674
+
675
+ static int num_channels(grpc_server *server) {
676
+ channel_data *chand;
677
+ int n = 0;
678
+ for (chand = server->root_channel_data.next;
679
+ chand != &server->root_channel_data; chand = chand->next) {
680
+ n++;
681
+ }
682
+ return n;
683
+ }
684
+
685
+ static void kill_pending_work_locked(grpc_exec_ctx *exec_ctx,
686
+ grpc_server *server, grpc_error *error) {
687
+ if (server->started) {
688
+ request_matcher_kill_requests(exec_ctx, server,
689
+ &server->unregistered_request_matcher,
690
+ GRPC_ERROR_REF(error));
691
+ request_matcher_zombify_all_pending_calls(
692
+ exec_ctx, &server->unregistered_request_matcher);
693
+ for (registered_method *rm = server->registered_methods; rm;
694
+ rm = rm->next) {
695
+ request_matcher_kill_requests(exec_ctx, server, &rm->request_matcher,
696
+ GRPC_ERROR_REF(error));
697
+ request_matcher_zombify_all_pending_calls(exec_ctx, &rm->request_matcher);
698
+ }
699
+ }
700
+ GRPC_ERROR_UNREF(error);
701
+ }
702
+
703
+ static void maybe_finish_shutdown(grpc_exec_ctx *exec_ctx,
704
+ grpc_server *server) {
705
+ size_t i;
706
+ if (!gpr_atm_acq_load(&server->shutdown_flag) || server->shutdown_published) {
707
+ return;
708
+ }
709
+
710
+ kill_pending_work_locked(
711
+ exec_ctx, server,
712
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
713
+
714
+ if (server->root_channel_data.next != &server->root_channel_data ||
715
+ server->listeners_destroyed < num_listeners(server)) {
716
+ if (gpr_time_cmp(gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME),
717
+ server->last_shutdown_message_time),
718
+ gpr_time_from_seconds(1, GPR_TIMESPAN)) >= 0) {
719
+ server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
720
+ gpr_log(GPR_DEBUG,
721
+ "Waiting for %d channels and %d/%d listeners to be destroyed"
722
+ " before shutting down server",
723
+ num_channels(server),
724
+ num_listeners(server) - server->listeners_destroyed,
725
+ num_listeners(server));
726
+ }
727
+ return;
728
+ }
729
+ server->shutdown_published = 1;
730
+ for (i = 0; i < server->num_shutdown_tags; i++) {
731
+ server_ref(server);
732
+ grpc_cq_end_op(exec_ctx, server->shutdown_tags[i].cq,
733
+ server->shutdown_tags[i].tag, GRPC_ERROR_NONE,
734
+ done_shutdown_event, server,
735
+ &server->shutdown_tags[i].completion);
736
+ }
737
+ }
738
+
739
+ static void server_on_recv_initial_metadata(grpc_exec_ctx *exec_ctx, void *ptr,
740
+ grpc_error *error) {
741
+ grpc_call_element *elem = ptr;
742
+ call_data *calld = elem->call_data;
743
+ gpr_timespec op_deadline;
744
+
745
+ if (error == GRPC_ERROR_NONE) {
746
+ GPR_ASSERT(calld->recv_initial_metadata->idx.named.path != NULL);
747
+ GPR_ASSERT(calld->recv_initial_metadata->idx.named.authority != NULL);
748
+ calld->path = grpc_slice_ref_internal(
749
+ GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.path->md));
750
+ calld->host = grpc_slice_ref_internal(
751
+ GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.authority->md));
752
+ calld->path_set = true;
753
+ calld->host_set = true;
754
+ grpc_metadata_batch_remove(exec_ctx, calld->recv_initial_metadata,
755
+ calld->recv_initial_metadata->idx.named.path);
756
+ grpc_metadata_batch_remove(
757
+ exec_ctx, calld->recv_initial_metadata,
758
+ calld->recv_initial_metadata->idx.named.authority);
759
+ } else {
760
+ GRPC_ERROR_REF(error);
761
+ }
762
+ op_deadline = calld->recv_initial_metadata->deadline;
763
+ if (0 != gpr_time_cmp(op_deadline, gpr_inf_future(op_deadline.clock_type))) {
764
+ calld->deadline = op_deadline;
765
+ }
766
+ if (calld->host_set && calld->path_set) {
767
+ /* do nothing */
768
+ } else {
769
+ grpc_error *src_error = error;
770
+ error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(
771
+ "Missing :authority or :path", &error, 1);
772
+ GRPC_ERROR_UNREF(src_error);
773
+ }
774
+
775
+ grpc_closure_run(exec_ctx, calld->on_done_recv_initial_metadata, error);
776
+ }
777
+
778
+ static void server_mutate_op(grpc_call_element *elem,
779
+ grpc_transport_stream_op_batch *op) {
780
+ call_data *calld = elem->call_data;
781
+
782
+ if (op->recv_initial_metadata) {
783
+ GPR_ASSERT(op->payload->recv_initial_metadata.recv_flags == NULL);
784
+ calld->recv_initial_metadata =
785
+ op->payload->recv_initial_metadata.recv_initial_metadata;
786
+ calld->on_done_recv_initial_metadata =
787
+ op->payload->recv_initial_metadata.recv_initial_metadata_ready;
788
+ op->payload->recv_initial_metadata.recv_initial_metadata_ready =
789
+ &calld->server_on_recv_initial_metadata;
790
+ op->payload->recv_initial_metadata.recv_flags =
791
+ &calld->recv_initial_metadata_flags;
792
+ }
793
+ }
794
+
795
+ static void server_start_transport_stream_op_batch(
796
+ grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
797
+ grpc_transport_stream_op_batch *op) {
798
+ GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
799
+ server_mutate_op(elem, op);
800
+ grpc_call_next_op(exec_ctx, elem, op);
801
+ }
802
+
803
+ static void got_initial_metadata(grpc_exec_ctx *exec_ctx, void *ptr,
804
+ grpc_error *error) {
805
+ grpc_call_element *elem = ptr;
806
+ call_data *calld = elem->call_data;
807
+ if (error == GRPC_ERROR_NONE) {
808
+ start_new_rpc(exec_ctx, elem);
809
+ } else {
810
+ gpr_mu_lock(&calld->mu_state);
811
+ if (calld->state == NOT_STARTED) {
812
+ calld->state = ZOMBIED;
813
+ gpr_mu_unlock(&calld->mu_state);
814
+ grpc_closure_init(&calld->kill_zombie_closure, kill_zombie, elem,
815
+ grpc_schedule_on_exec_ctx);
816
+ grpc_closure_sched(exec_ctx, &calld->kill_zombie_closure,
817
+ GRPC_ERROR_NONE);
818
+ } else if (calld->state == PENDING) {
819
+ calld->state = ZOMBIED;
820
+ gpr_mu_unlock(&calld->mu_state);
821
+ /* zombied call will be destroyed when it's removed from the pending
822
+ queue... later */
823
+ } else {
824
+ gpr_mu_unlock(&calld->mu_state);
825
+ }
826
+ }
827
+ }
828
+
829
+ static void accept_stream(grpc_exec_ctx *exec_ctx, void *cd,
830
+ grpc_transport *transport,
831
+ const void *transport_server_data) {
832
+ channel_data *chand = cd;
833
+ /* create a call */
834
+ grpc_call_create_args args;
835
+ memset(&args, 0, sizeof(args));
836
+ args.channel = chand->channel;
837
+ args.server_transport_data = transport_server_data;
838
+ args.send_deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
839
+ grpc_call *call;
840
+ grpc_error *error = grpc_call_create(exec_ctx, &args, &call);
841
+ grpc_call_element *elem =
842
+ grpc_call_stack_element(grpc_call_get_call_stack(call), 0);
843
+ if (error != GRPC_ERROR_NONE) {
844
+ got_initial_metadata(exec_ctx, elem, error);
845
+ GRPC_ERROR_UNREF(error);
846
+ return;
847
+ }
848
+ call_data *calld = elem->call_data;
849
+ grpc_op op;
850
+ memset(&op, 0, sizeof(op));
851
+ op.op = GRPC_OP_RECV_INITIAL_METADATA;
852
+ op.data.recv_initial_metadata.recv_initial_metadata =
853
+ &calld->initial_metadata;
854
+ grpc_closure_init(&calld->got_initial_metadata, got_initial_metadata, elem,
855
+ grpc_schedule_on_exec_ctx);
856
+ grpc_call_start_batch_and_execute(exec_ctx, call, &op, 1,
857
+ &calld->got_initial_metadata);
858
+ }
859
+
860
+ static void channel_connectivity_changed(grpc_exec_ctx *exec_ctx, void *cd,
861
+ grpc_error *error) {
862
+ channel_data *chand = cd;
863
+ grpc_server *server = chand->server;
864
+ if (chand->connectivity_state != GRPC_CHANNEL_SHUTDOWN) {
865
+ grpc_transport_op *op = grpc_make_transport_op(NULL);
866
+ op->on_connectivity_state_change = &chand->channel_connectivity_changed,
867
+ op->connectivity_state = &chand->connectivity_state;
868
+ grpc_channel_next_op(exec_ctx,
869
+ grpc_channel_stack_element(
870
+ grpc_channel_get_channel_stack(chand->channel), 0),
871
+ op);
872
+ } else {
873
+ gpr_mu_lock(&server->mu_global);
874
+ destroy_channel(exec_ctx, chand, GRPC_ERROR_REF(error));
875
+ gpr_mu_unlock(&server->mu_global);
876
+ GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, chand->channel, "connectivity");
877
+ }
878
+ }
879
+
880
+ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
881
+ grpc_call_element *elem,
882
+ const grpc_call_element_args *args) {
883
+ call_data *calld = elem->call_data;
884
+ channel_data *chand = elem->channel_data;
885
+ memset(calld, 0, sizeof(call_data));
886
+ calld->deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
887
+ calld->call = grpc_call_from_top_element(elem);
888
+ gpr_mu_init(&calld->mu_state);
889
+
890
+ grpc_closure_init(&calld->server_on_recv_initial_metadata,
891
+ server_on_recv_initial_metadata, elem,
892
+ grpc_schedule_on_exec_ctx);
893
+
894
+ server_ref(chand->server);
895
+ return GRPC_ERROR_NONE;
896
+ }
897
+
898
+ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
899
+ const grpc_call_final_info *final_info,
900
+ grpc_closure *ignored) {
901
+ channel_data *chand = elem->channel_data;
902
+ call_data *calld = elem->call_data;
903
+
904
+ GPR_ASSERT(calld->state != PENDING);
905
+
906
+ if (calld->host_set) {
907
+ grpc_slice_unref_internal(exec_ctx, calld->host);
908
+ }
909
+ if (calld->path_set) {
910
+ grpc_slice_unref_internal(exec_ctx, calld->path);
911
+ }
912
+ grpc_metadata_array_destroy(&calld->initial_metadata);
913
+
914
+ gpr_mu_destroy(&calld->mu_state);
915
+
916
+ server_unref(exec_ctx, chand->server);
917
+ }
918
+
919
+ static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx,
920
+ grpc_channel_element *elem,
921
+ grpc_channel_element_args *args) {
922
+ channel_data *chand = elem->channel_data;
923
+ GPR_ASSERT(args->is_first);
924
+ GPR_ASSERT(!args->is_last);
925
+ chand->server = NULL;
926
+ chand->channel = NULL;
927
+ chand->next = chand->prev = chand;
928
+ chand->registered_methods = NULL;
929
+ chand->connectivity_state = GRPC_CHANNEL_IDLE;
930
+ grpc_closure_init(&chand->channel_connectivity_changed,
931
+ channel_connectivity_changed, chand,
932
+ grpc_schedule_on_exec_ctx);
933
+ return GRPC_ERROR_NONE;
934
+ }
935
+
936
+ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
937
+ grpc_channel_element *elem) {
938
+ size_t i;
939
+ channel_data *chand = elem->channel_data;
940
+ if (chand->registered_methods) {
941
+ for (i = 0; i < chand->registered_method_slots; i++) {
942
+ grpc_slice_unref_internal(exec_ctx, chand->registered_methods[i].method);
943
+ if (chand->registered_methods[i].has_host) {
944
+ grpc_slice_unref_internal(exec_ctx, chand->registered_methods[i].host);
945
+ }
946
+ }
947
+ gpr_free(chand->registered_methods);
948
+ }
949
+ if (chand->server) {
950
+ gpr_mu_lock(&chand->server->mu_global);
951
+ chand->next->prev = chand->prev;
952
+ chand->prev->next = chand->next;
953
+ chand->next = chand->prev = chand;
954
+ maybe_finish_shutdown(exec_ctx, chand->server);
955
+ gpr_mu_unlock(&chand->server->mu_global);
956
+ server_unref(exec_ctx, chand->server);
957
+ }
958
+ }
959
+
960
+ const grpc_channel_filter grpc_server_top_filter = {
961
+ server_start_transport_stream_op_batch,
962
+ grpc_channel_next_op,
963
+ sizeof(call_data),
964
+ init_call_elem,
965
+ grpc_call_stack_ignore_set_pollset_or_pollset_set,
966
+ destroy_call_elem,
967
+ sizeof(channel_data),
968
+ init_channel_elem,
969
+ destroy_channel_elem,
970
+ grpc_call_next_get_peer,
971
+ grpc_channel_next_get_info,
972
+ "server",
973
+ };
974
+
975
+ static void register_completion_queue(grpc_server *server,
976
+ grpc_completion_queue *cq,
977
+ bool is_non_listening, void *reserved) {
978
+ size_t i, n;
979
+ GPR_ASSERT(!reserved);
980
+ for (i = 0; i < server->cq_count; i++) {
981
+ if (server->cqs[i] == cq) return;
982
+ }
983
+
984
+ grpc_cq_mark_server_cq(cq);
985
+
986
+ if (is_non_listening) {
987
+ grpc_cq_mark_non_listening_server_cq(cq);
988
+ }
989
+
990
+ GRPC_CQ_INTERNAL_REF(cq, "server");
991
+ n = server->cq_count++;
992
+ server->cqs = gpr_realloc(server->cqs,
993
+ server->cq_count * sizeof(grpc_completion_queue *));
994
+ server->cqs[n] = cq;
995
+ }
996
+
997
+ void grpc_server_register_completion_queue(grpc_server *server,
998
+ grpc_completion_queue *cq,
999
+ void *reserved) {
1000
+ GRPC_API_TRACE(
1001
+ "grpc_server_register_completion_queue(server=%p, cq=%p, reserved=%p)", 3,
1002
+ (server, cq, reserved));
1003
+ register_completion_queue(server, cq, false, reserved);
1004
+ }
1005
+
1006
+ void grpc_server_register_non_listening_completion_queue(
1007
+ grpc_server *server, grpc_completion_queue *cq, void *reserved) {
1008
+ GRPC_API_TRACE(
1009
+ "grpc_server_register_non_listening_completion_queue(server=%p, cq=%p, "
1010
+ "reserved=%p)",
1011
+ 3, (server, cq, reserved));
1012
+ register_completion_queue(server, cq, true, reserved);
1013
+ }
1014
+
1015
+ grpc_server *grpc_server_create(const grpc_channel_args *args, void *reserved) {
1016
+ GRPC_API_TRACE("grpc_server_create(%p, %p)", 2, (args, reserved));
1017
+
1018
+ grpc_server *server = gpr_zalloc(sizeof(grpc_server));
1019
+
1020
+ GPR_ASSERT(grpc_is_initialized() && "call grpc_init()");
1021
+
1022
+ gpr_mu_init(&server->mu_global);
1023
+ gpr_mu_init(&server->mu_call);
1024
+
1025
+ /* decremented by grpc_server_destroy */
1026
+ gpr_ref_init(&server->internal_refcount, 1);
1027
+ server->root_channel_data.next = server->root_channel_data.prev =
1028
+ &server->root_channel_data;
1029
+
1030
+ /* TODO(ctiller): expose a channel_arg for this */
1031
+ server->max_requested_calls_per_cq = 32768;
1032
+ server->channel_args = grpc_channel_args_copy(args);
1033
+
1034
+ return server;
1035
+ }
1036
+
1037
+ static int streq(const char *a, const char *b) {
1038
+ if (a == NULL && b == NULL) return 1;
1039
+ if (a == NULL) return 0;
1040
+ if (b == NULL) return 0;
1041
+ return 0 == strcmp(a, b);
1042
+ }
1043
+
1044
+ void *grpc_server_register_method(
1045
+ grpc_server *server, const char *method, const char *host,
1046
+ grpc_server_register_method_payload_handling payload_handling,
1047
+ uint32_t flags) {
1048
+ registered_method *m;
1049
+ GRPC_API_TRACE(
1050
+ "grpc_server_register_method(server=%p, method=%s, host=%s, "
1051
+ "flags=0x%08x)",
1052
+ 4, (server, method, host, flags));
1053
+ if (!method) {
1054
+ gpr_log(GPR_ERROR,
1055
+ "grpc_server_register_method method string cannot be NULL");
1056
+ return NULL;
1057
+ }
1058
+ for (m = server->registered_methods; m; m = m->next) {
1059
+ if (streq(m->method, method) && streq(m->host, host)) {
1060
+ gpr_log(GPR_ERROR, "duplicate registration for %s@%s", method,
1061
+ host ? host : "*");
1062
+ return NULL;
1063
+ }
1064
+ }
1065
+ if ((flags & ~GRPC_INITIAL_METADATA_USED_MASK) != 0) {
1066
+ gpr_log(GPR_ERROR, "grpc_server_register_method invalid flags 0x%08x",
1067
+ flags);
1068
+ return NULL;
1069
+ }
1070
+ m = gpr_zalloc(sizeof(registered_method));
1071
+ m->method = gpr_strdup(method);
1072
+ m->host = gpr_strdup(host);
1073
+ m->next = server->registered_methods;
1074
+ m->payload_handling = payload_handling;
1075
+ m->flags = flags;
1076
+ server->registered_methods = m;
1077
+ return m;
1078
+ }
1079
+
1080
+ void grpc_server_start(grpc_server *server) {
1081
+ listener *l;
1082
+ size_t i;
1083
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1084
+
1085
+ GRPC_API_TRACE("grpc_server_start(server=%p)", 1, (server));
1086
+
1087
+ server->started = true;
1088
+ server->pollset_count = 0;
1089
+ server->pollsets = gpr_malloc(sizeof(grpc_pollset *) * server->cq_count);
1090
+ server->request_freelist_per_cq =
1091
+ gpr_malloc(sizeof(*server->request_freelist_per_cq) * server->cq_count);
1092
+ server->requested_calls_per_cq =
1093
+ gpr_malloc(sizeof(*server->requested_calls_per_cq) * server->cq_count);
1094
+ for (i = 0; i < server->cq_count; i++) {
1095
+ if (!grpc_cq_is_non_listening_server_cq(server->cqs[i])) {
1096
+ server->pollsets[server->pollset_count++] =
1097
+ grpc_cq_pollset(server->cqs[i]);
1098
+ }
1099
+ server->request_freelist_per_cq[i] =
1100
+ gpr_stack_lockfree_create((size_t)server->max_requested_calls_per_cq);
1101
+ for (int j = 0; j < server->max_requested_calls_per_cq; j++) {
1102
+ gpr_stack_lockfree_push(server->request_freelist_per_cq[i], j);
1103
+ }
1104
+ server->requested_calls_per_cq[i] =
1105
+ gpr_malloc((size_t)server->max_requested_calls_per_cq *
1106
+ sizeof(*server->requested_calls_per_cq[i]));
1107
+ }
1108
+ request_matcher_init(&server->unregistered_request_matcher,
1109
+ (size_t)server->max_requested_calls_per_cq, server);
1110
+ for (registered_method *rm = server->registered_methods; rm; rm = rm->next) {
1111
+ request_matcher_init(&rm->request_matcher,
1112
+ (size_t)server->max_requested_calls_per_cq, server);
1113
+ }
1114
+
1115
+ for (l = server->listeners; l; l = l->next) {
1116
+ l->start(&exec_ctx, server, l->arg, server->pollsets,
1117
+ server->pollset_count);
1118
+ }
1119
+
1120
+ grpc_exec_ctx_finish(&exec_ctx);
1121
+ }
1122
+
1123
+ void grpc_server_get_pollsets(grpc_server *server, grpc_pollset ***pollsets,
1124
+ size_t *pollset_count) {
1125
+ *pollset_count = server->pollset_count;
1126
+ *pollsets = server->pollsets;
1127
+ }
1128
+
1129
+ void grpc_server_setup_transport(grpc_exec_ctx *exec_ctx, grpc_server *s,
1130
+ grpc_transport *transport,
1131
+ grpc_pollset *accepting_pollset,
1132
+ const grpc_channel_args *args) {
1133
+ size_t num_registered_methods;
1134
+ size_t alloc;
1135
+ registered_method *rm;
1136
+ channel_registered_method *crm;
1137
+ grpc_channel *channel;
1138
+ channel_data *chand;
1139
+ uint32_t hash;
1140
+ size_t slots;
1141
+ uint32_t probes;
1142
+ uint32_t max_probes = 0;
1143
+ grpc_transport_op *op = NULL;
1144
+
1145
+ channel =
1146
+ grpc_channel_create(exec_ctx, NULL, args, GRPC_SERVER_CHANNEL, transport);
1147
+ chand = (channel_data *)grpc_channel_stack_element(
1148
+ grpc_channel_get_channel_stack(channel), 0)
1149
+ ->channel_data;
1150
+ chand->server = s;
1151
+ server_ref(s);
1152
+ chand->channel = channel;
1153
+
1154
+ size_t cq_idx;
1155
+ grpc_completion_queue *accepting_cq = grpc_cq_from_pollset(accepting_pollset);
1156
+ for (cq_idx = 0; cq_idx < s->cq_count; cq_idx++) {
1157
+ if (s->cqs[cq_idx] == accepting_cq) break;
1158
+ }
1159
+ if (cq_idx == s->cq_count) {
1160
+ /* completion queue not found: pick a random one to publish new calls to */
1161
+ cq_idx = (size_t)rand() % s->cq_count;
1162
+ }
1163
+ chand->cq_idx = cq_idx;
1164
+
1165
+ num_registered_methods = 0;
1166
+ for (rm = s->registered_methods; rm; rm = rm->next) {
1167
+ num_registered_methods++;
1168
+ }
1169
+ /* build a lookup table phrased in terms of mdstr's in this channels context
1170
+ to quickly find registered methods */
1171
+ if (num_registered_methods > 0) {
1172
+ slots = 2 * num_registered_methods;
1173
+ alloc = sizeof(channel_registered_method) * slots;
1174
+ chand->registered_methods = gpr_zalloc(alloc);
1175
+ for (rm = s->registered_methods; rm; rm = rm->next) {
1176
+ grpc_slice host;
1177
+ bool has_host;
1178
+ grpc_slice method;
1179
+ if (rm->host != NULL) {
1180
+ host = grpc_slice_intern(grpc_slice_from_static_string(rm->host));
1181
+ has_host = true;
1182
+ } else {
1183
+ has_host = false;
1184
+ }
1185
+ method = grpc_slice_intern(grpc_slice_from_static_string(rm->method));
1186
+ hash = GRPC_MDSTR_KV_HASH(has_host ? grpc_slice_hash(host) : 0,
1187
+ grpc_slice_hash(method));
1188
+ for (probes = 0; chand->registered_methods[(hash + probes) % slots]
1189
+ .server_registered_method != NULL;
1190
+ probes++)
1191
+ ;
1192
+ if (probes > max_probes) max_probes = probes;
1193
+ crm = &chand->registered_methods[(hash + probes) % slots];
1194
+ crm->server_registered_method = rm;
1195
+ crm->flags = rm->flags;
1196
+ crm->has_host = has_host;
1197
+ if (has_host) {
1198
+ crm->host = host;
1199
+ }
1200
+ crm->method = method;
1201
+ }
1202
+ GPR_ASSERT(slots <= UINT32_MAX);
1203
+ chand->registered_method_slots = (uint32_t)slots;
1204
+ chand->registered_method_max_probes = max_probes;
1205
+ }
1206
+
1207
+ gpr_mu_lock(&s->mu_global);
1208
+ chand->next = &s->root_channel_data;
1209
+ chand->prev = chand->next->prev;
1210
+ chand->next->prev = chand->prev->next = chand;
1211
+ gpr_mu_unlock(&s->mu_global);
1212
+
1213
+ GRPC_CHANNEL_INTERNAL_REF(channel, "connectivity");
1214
+ op = grpc_make_transport_op(NULL);
1215
+ op->set_accept_stream = true;
1216
+ op->set_accept_stream_fn = accept_stream;
1217
+ op->set_accept_stream_user_data = chand;
1218
+ op->on_connectivity_state_change = &chand->channel_connectivity_changed;
1219
+ op->connectivity_state = &chand->connectivity_state;
1220
+ if (gpr_atm_acq_load(&s->shutdown_flag) != 0) {
1221
+ op->disconnect_with_error =
1222
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown");
1223
+ }
1224
+ grpc_transport_perform_op(exec_ctx, transport, op);
1225
+ }
1226
+
1227
+ void done_published_shutdown(grpc_exec_ctx *exec_ctx, void *done_arg,
1228
+ grpc_cq_completion *storage) {
1229
+ (void)done_arg;
1230
+ gpr_free(storage);
1231
+ }
1232
+
1233
+ static void listener_destroy_done(grpc_exec_ctx *exec_ctx, void *s,
1234
+ grpc_error *error) {
1235
+ grpc_server *server = s;
1236
+ gpr_mu_lock(&server->mu_global);
1237
+ server->listeners_destroyed++;
1238
+ maybe_finish_shutdown(exec_ctx, server);
1239
+ gpr_mu_unlock(&server->mu_global);
1240
+ }
1241
+
1242
+ void grpc_server_shutdown_and_notify(grpc_server *server,
1243
+ grpc_completion_queue *cq, void *tag) {
1244
+ listener *l;
1245
+ shutdown_tag *sdt;
1246
+ channel_broadcaster broadcaster;
1247
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1248
+
1249
+ GRPC_API_TRACE("grpc_server_shutdown_and_notify(server=%p, cq=%p, tag=%p)", 3,
1250
+ (server, cq, tag));
1251
+
1252
+ /* lock, and gather up some stuff to do */
1253
+ gpr_mu_lock(&server->mu_global);
1254
+ grpc_cq_begin_op(cq, tag);
1255
+ if (server->shutdown_published) {
1256
+ grpc_cq_end_op(&exec_ctx, cq, tag, GRPC_ERROR_NONE, done_published_shutdown,
1257
+ NULL, gpr_malloc(sizeof(grpc_cq_completion)));
1258
+ gpr_mu_unlock(&server->mu_global);
1259
+ goto done;
1260
+ }
1261
+ server->shutdown_tags =
1262
+ gpr_realloc(server->shutdown_tags,
1263
+ sizeof(shutdown_tag) * (server->num_shutdown_tags + 1));
1264
+ sdt = &server->shutdown_tags[server->num_shutdown_tags++];
1265
+ sdt->tag = tag;
1266
+ sdt->cq = cq;
1267
+ if (gpr_atm_acq_load(&server->shutdown_flag)) {
1268
+ gpr_mu_unlock(&server->mu_global);
1269
+ goto done;
1270
+ }
1271
+
1272
+ server->last_shutdown_message_time = gpr_now(GPR_CLOCK_REALTIME);
1273
+
1274
+ channel_broadcaster_init(server, &broadcaster);
1275
+
1276
+ gpr_atm_rel_store(&server->shutdown_flag, 1);
1277
+
1278
+ /* collect all unregistered then registered calls */
1279
+ gpr_mu_lock(&server->mu_call);
1280
+ kill_pending_work_locked(
1281
+ &exec_ctx, server,
1282
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
1283
+ gpr_mu_unlock(&server->mu_call);
1284
+
1285
+ maybe_finish_shutdown(&exec_ctx, server);
1286
+ gpr_mu_unlock(&server->mu_global);
1287
+
1288
+ /* Shutdown listeners */
1289
+ for (l = server->listeners; l; l = l->next) {
1290
+ grpc_closure_init(&l->destroy_done, listener_destroy_done, server,
1291
+ grpc_schedule_on_exec_ctx);
1292
+ l->destroy(&exec_ctx, server, l->arg, &l->destroy_done);
1293
+ }
1294
+
1295
+ channel_broadcaster_shutdown(&exec_ctx, &broadcaster, true /* send_goaway */,
1296
+ GRPC_ERROR_NONE);
1297
+
1298
+ done:
1299
+ grpc_exec_ctx_finish(&exec_ctx);
1300
+ }
1301
+
1302
+ void grpc_server_cancel_all_calls(grpc_server *server) {
1303
+ channel_broadcaster broadcaster;
1304
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1305
+
1306
+ GRPC_API_TRACE("grpc_server_cancel_all_calls(server=%p)", 1, (server));
1307
+
1308
+ gpr_mu_lock(&server->mu_global);
1309
+ channel_broadcaster_init(server, &broadcaster);
1310
+ gpr_mu_unlock(&server->mu_global);
1311
+
1312
+ channel_broadcaster_shutdown(
1313
+ &exec_ctx, &broadcaster, false /* send_goaway */,
1314
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls"));
1315
+ grpc_exec_ctx_finish(&exec_ctx);
1316
+ }
1317
+
1318
+ void grpc_server_destroy(grpc_server *server) {
1319
+ listener *l;
1320
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1321
+
1322
+ GRPC_API_TRACE("grpc_server_destroy(server=%p)", 1, (server));
1323
+
1324
+ gpr_mu_lock(&server->mu_global);
1325
+ GPR_ASSERT(gpr_atm_acq_load(&server->shutdown_flag) || !server->listeners);
1326
+ GPR_ASSERT(server->listeners_destroyed == num_listeners(server));
1327
+
1328
+ while (server->listeners) {
1329
+ l = server->listeners;
1330
+ server->listeners = l->next;
1331
+ gpr_free(l);
1332
+ }
1333
+
1334
+ gpr_mu_unlock(&server->mu_global);
1335
+
1336
+ server_unref(&exec_ctx, server);
1337
+ grpc_exec_ctx_finish(&exec_ctx);
1338
+ }
1339
+
1340
+ void grpc_server_add_listener(
1341
+ grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
1342
+ void (*start)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
1343
+ grpc_pollset **pollsets, size_t pollset_count),
1344
+ void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_server *server, void *arg,
1345
+ grpc_closure *on_done)) {
1346
+ listener *l = gpr_malloc(sizeof(listener));
1347
+ l->arg = arg;
1348
+ l->start = start;
1349
+ l->destroy = destroy;
1350
+ l->next = server->listeners;
1351
+ server->listeners = l;
1352
+ }
1353
+
1354
+ static grpc_call_error queue_call_request(grpc_exec_ctx *exec_ctx,
1355
+ grpc_server *server, size_t cq_idx,
1356
+ requested_call *rc) {
1357
+ call_data *calld = NULL;
1358
+ request_matcher *rm = NULL;
1359
+ int request_id;
1360
+ if (gpr_atm_acq_load(&server->shutdown_flag)) {
1361
+ fail_call(exec_ctx, server, cq_idx, rc,
1362
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown"));
1363
+ return GRPC_CALL_OK;
1364
+ }
1365
+ request_id = gpr_stack_lockfree_pop(server->request_freelist_per_cq[cq_idx]);
1366
+ if (request_id == -1) {
1367
+ /* out of request ids: just fail this one */
1368
+ fail_call(exec_ctx, server, cq_idx, rc,
1369
+ grpc_error_set_int(
1370
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Out of request ids"),
1371
+ GRPC_ERROR_INT_LIMIT, server->max_requested_calls_per_cq));
1372
+ return GRPC_CALL_OK;
1373
+ }
1374
+ switch (rc->type) {
1375
+ case BATCH_CALL:
1376
+ rm = &server->unregistered_request_matcher;
1377
+ break;
1378
+ case REGISTERED_CALL:
1379
+ rm = &rc->data.registered.registered_method->request_matcher;
1380
+ break;
1381
+ }
1382
+ server->requested_calls_per_cq[cq_idx][request_id] = *rc;
1383
+ gpr_free(rc);
1384
+ if (gpr_stack_lockfree_push(rm->requests_per_cq[cq_idx], request_id)) {
1385
+ /* this was the first queued request: we need to lock and start
1386
+ matching calls */
1387
+ gpr_mu_lock(&server->mu_call);
1388
+ while ((calld = rm->pending_head) != NULL) {
1389
+ request_id = gpr_stack_lockfree_pop(rm->requests_per_cq[cq_idx]);
1390
+ if (request_id == -1) break;
1391
+ rm->pending_head = calld->pending_next;
1392
+ gpr_mu_unlock(&server->mu_call);
1393
+ gpr_mu_lock(&calld->mu_state);
1394
+ if (calld->state == ZOMBIED) {
1395
+ gpr_mu_unlock(&calld->mu_state);
1396
+ grpc_closure_init(
1397
+ &calld->kill_zombie_closure, kill_zombie,
1398
+ grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0),
1399
+ grpc_schedule_on_exec_ctx);
1400
+ grpc_closure_sched(exec_ctx, &calld->kill_zombie_closure,
1401
+ GRPC_ERROR_NONE);
1402
+ } else {
1403
+ GPR_ASSERT(calld->state == PENDING);
1404
+ calld->state = ACTIVATED;
1405
+ gpr_mu_unlock(&calld->mu_state);
1406
+ publish_call(exec_ctx, server, calld, cq_idx,
1407
+ &server->requested_calls_per_cq[cq_idx][request_id]);
1408
+ }
1409
+ gpr_mu_lock(&server->mu_call);
1410
+ }
1411
+ gpr_mu_unlock(&server->mu_call);
1412
+ }
1413
+ return GRPC_CALL_OK;
1414
+ }
1415
+
1416
+ grpc_call_error grpc_server_request_call(
1417
+ grpc_server *server, grpc_call **call, grpc_call_details *details,
1418
+ grpc_metadata_array *initial_metadata,
1419
+ grpc_completion_queue *cq_bound_to_call,
1420
+ grpc_completion_queue *cq_for_notification, void *tag) {
1421
+ grpc_call_error error;
1422
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1423
+ requested_call *rc = gpr_malloc(sizeof(*rc));
1424
+ GRPC_API_TRACE(
1425
+ "grpc_server_request_call("
1426
+ "server=%p, call=%p, details=%p, initial_metadata=%p, "
1427
+ "cq_bound_to_call=%p, cq_for_notification=%p, tag=%p)",
1428
+ 7, (server, call, details, initial_metadata, cq_bound_to_call,
1429
+ cq_for_notification, tag));
1430
+ size_t cq_idx;
1431
+ for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
1432
+ if (server->cqs[cq_idx] == cq_for_notification) {
1433
+ break;
1434
+ }
1435
+ }
1436
+ if (cq_idx == server->cq_count) {
1437
+ gpr_free(rc);
1438
+ error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
1439
+ goto done;
1440
+ }
1441
+ grpc_cq_begin_op(cq_for_notification, tag);
1442
+ details->reserved = NULL;
1443
+ rc->cq_idx = cq_idx;
1444
+ rc->type = BATCH_CALL;
1445
+ rc->server = server;
1446
+ rc->tag = tag;
1447
+ rc->cq_bound_to_call = cq_bound_to_call;
1448
+ rc->call = call;
1449
+ rc->data.batch.details = details;
1450
+ rc->initial_metadata = initial_metadata;
1451
+ error = queue_call_request(&exec_ctx, server, cq_idx, rc);
1452
+ done:
1453
+ grpc_exec_ctx_finish(&exec_ctx);
1454
+ return error;
1455
+ }
1456
+
1457
+ grpc_call_error grpc_server_request_registered_call(
1458
+ grpc_server *server, void *rmp, grpc_call **call, gpr_timespec *deadline,
1459
+ grpc_metadata_array *initial_metadata, grpc_byte_buffer **optional_payload,
1460
+ grpc_completion_queue *cq_bound_to_call,
1461
+ grpc_completion_queue *cq_for_notification, void *tag) {
1462
+ grpc_call_error error;
1463
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1464
+ requested_call *rc = gpr_malloc(sizeof(*rc));
1465
+ registered_method *rm = rmp;
1466
+ GRPC_API_TRACE(
1467
+ "grpc_server_request_registered_call("
1468
+ "server=%p, rmp=%p, call=%p, deadline=%p, initial_metadata=%p, "
1469
+ "optional_payload=%p, cq_bound_to_call=%p, cq_for_notification=%p, "
1470
+ "tag=%p)",
1471
+ 9, (server, rmp, call, deadline, initial_metadata, optional_payload,
1472
+ cq_bound_to_call, cq_for_notification, tag));
1473
+
1474
+ size_t cq_idx;
1475
+ for (cq_idx = 0; cq_idx < server->cq_count; cq_idx++) {
1476
+ if (server->cqs[cq_idx] == cq_for_notification) {
1477
+ break;
1478
+ }
1479
+ }
1480
+ if (cq_idx == server->cq_count) {
1481
+ gpr_free(rc);
1482
+ error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
1483
+ goto done;
1484
+ }
1485
+ if ((optional_payload == NULL) !=
1486
+ (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) {
1487
+ gpr_free(rc);
1488
+ error = GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
1489
+ goto done;
1490
+ }
1491
+ grpc_cq_begin_op(cq_for_notification, tag);
1492
+ rc->cq_idx = cq_idx;
1493
+ rc->type = REGISTERED_CALL;
1494
+ rc->server = server;
1495
+ rc->tag = tag;
1496
+ rc->cq_bound_to_call = cq_bound_to_call;
1497
+ rc->call = call;
1498
+ rc->data.registered.registered_method = rm;
1499
+ rc->data.registered.deadline = deadline;
1500
+ rc->initial_metadata = initial_metadata;
1501
+ rc->data.registered.optional_payload = optional_payload;
1502
+ error = queue_call_request(&exec_ctx, server, cq_idx, rc);
1503
+ done:
1504
+ grpc_exec_ctx_finish(&exec_ctx);
1505
+ return error;
1506
+ }
1507
+
1508
+ static void fail_call(grpc_exec_ctx *exec_ctx, grpc_server *server,
1509
+ size_t cq_idx, requested_call *rc, grpc_error *error) {
1510
+ *rc->call = NULL;
1511
+ rc->initial_metadata->count = 0;
1512
+ GPR_ASSERT(error != GRPC_ERROR_NONE);
1513
+
1514
+ server_ref(server);
1515
+ grpc_cq_end_op(exec_ctx, server->cqs[cq_idx], rc->tag, error,
1516
+ done_request_event, rc, &rc->completion);
1517
+ }
1518
+
1519
+ const grpc_channel_args *grpc_server_get_channel_args(grpc_server *server) {
1520
+ return server->channel_args;
1521
+ }
1522
+
1523
+ int grpc_server_has_open_connections(grpc_server *server) {
1524
+ int r;
1525
+ gpr_mu_lock(&server->mu_global);
1526
+ r = server->root_channel_data.next != &server->root_channel_data;
1527
+ gpr_mu_unlock(&server->mu_global);
1528
+ return r;
1529
+ }