wearefair-grpc 1.3.1.pre.a

Sign up to get free protection for your applications and to get access to all the features.
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
+ }