grpc 1.18.0 → 1.22.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (428) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +4731 -7404
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc.h +11 -6
  5. data/include/grpc/grpc_security.h +297 -4
  6. data/include/grpc/grpc_security_constants.h +1 -1
  7. data/include/grpc/impl/codegen/byte_buffer.h +13 -0
  8. data/include/grpc/impl/codegen/gpr_types.h +1 -1
  9. data/include/grpc/impl/codegen/grpc_types.h +30 -7
  10. data/include/grpc/impl/codegen/port_platform.h +88 -7
  11. data/include/grpc/impl/codegen/slice.h +2 -22
  12. data/include/grpc/impl/codegen/status.h +2 -1
  13. data/include/grpc/impl/codegen/sync_posix.h +18 -0
  14. data/include/grpc/slice.h +3 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +21 -16
  16. data/src/core/ext/filters/client_channel/backup_poller.h +8 -2
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +3 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +2435 -1557
  19. data/src/core/ext/filters/client_channel/client_channel.h +2 -10
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -89
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +8 -33
  22. data/src/core/ext/filters/client_channel/client_channel_factory.cc +22 -34
  23. data/src/core/ext/filters/client_channel/client_channel_factory.h +19 -38
  24. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -11
  25. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +179 -0
  26. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +68 -0
  27. data/src/core/ext/filters/client_channel/health/health_check_client.cc +59 -55
  28. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  29. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +146 -157
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +29 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +844 -859
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +3 -1
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +2 -6
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +14 -12
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +16 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +3 -3
  39. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +185 -312
  40. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +143 -375
  41. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +192 -245
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +1554 -955
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_secure.cc +0 -43
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.cc +14 -10
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +2 -2
  46. data/src/core/ext/filters/client_channel/lb_policy.cc +115 -22
  47. data/src/core/ext/filters/client_channel/lb_policy.h +260 -129
  48. data/src/core/ext/filters/client_channel/lb_policy_factory.h +5 -2
  49. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +107 -4
  50. data/src/core/ext/filters/client_channel/lb_policy_registry.h +10 -3
  51. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +96 -0
  52. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +56 -0
  53. data/src/core/ext/filters/client_channel/parse_address.cc +24 -5
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +121 -122
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +24 -10
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +111 -47
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  61. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  65. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  66. data/src/core/{lib/iomgr/network_status_tracker.cc → ext/filters/client_channel/resolver/dns/dns_resolver_selection.h} +8 -15
  67. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +36 -82
  68. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +111 -72
  69. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +13 -8
  70. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +28 -63
  71. data/src/core/ext/filters/client_channel/resolver.cc +54 -1
  72. data/src/core/ext/filters/client_channel/resolver.h +52 -23
  73. data/src/core/ext/filters/client_channel/resolver_factory.h +3 -1
  74. data/src/core/ext/filters/client_channel/resolver_registry.cc +5 -2
  75. data/src/core/ext/filters/client_channel/resolver_registry.h +5 -4
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +368 -241
  77. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +58 -76
  78. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +543 -0
  79. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +139 -0
  80. data/src/core/ext/filters/client_channel/server_address.cc +4 -54
  81. data/src/core/ext/filters/client_channel/server_address.h +1 -13
  82. data/src/core/ext/filters/client_channel/service_config.cc +329 -0
  83. data/src/core/ext/filters/client_channel/service_config.h +205 -0
  84. data/src/core/ext/filters/client_channel/subchannel.cc +803 -838
  85. data/src/core/ext/filters/client_channel/subchannel.h +295 -128
  86. data/src/core/ext/filters/client_channel/subchannel_interface.h +113 -0
  87. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +97 -0
  88. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +94 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  90. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  91. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  92. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  93. data/src/core/ext/filters/http/client_authority_filter.cc +6 -3
  94. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  95. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  96. data/src/core/ext/filters/max_age/max_age_filter.cc +5 -2
  97. data/src/core/ext/filters/message_size/message_size_filter.cc +119 -77
  98. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  99. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  100. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +13 -12
  101. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +45 -47
  102. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +134 -143
  103. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +68 -21
  104. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +4 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +4 -4
  106. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +7 -6
  107. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +4 -3
  108. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  109. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +156 -94
  110. data/src/core/ext/transport/chttp2/transport/flow_control.cc +2 -2
  111. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  112. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -37
  113. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  114. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +6 -5
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -2
  116. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -4
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.h +1 -1
  118. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +8 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -1
  120. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -4
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -1
  122. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +1 -1
  124. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +74 -55
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +33 -11
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +3 -2
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +7 -14
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +10 -1
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +9 -5
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +9 -3
  131. data/src/core/ext/transport/chttp2/transport/internal.h +43 -30
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +52 -70
  133. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +70 -33
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +26 -18
  136. data/src/core/lib/channel/channel_args.cc +2 -101
  137. data/src/core/lib/channel/channel_args.h +3 -37
  138. data/src/core/lib/channel/channel_stack.h +10 -6
  139. data/src/core/lib/channel/channel_trace.cc +4 -4
  140. data/src/core/lib/channel/channel_trace.h +4 -4
  141. data/src/core/lib/channel/channelz.cc +168 -38
  142. data/src/core/lib/channel/channelz.h +40 -44
  143. data/src/core/lib/channel/channelz_registry.cc +75 -107
  144. data/src/core/lib/channel/channelz_registry.h +10 -28
  145. data/src/core/lib/channel/connected_channel.cc +2 -2
  146. data/src/core/lib/channel/context.h +2 -2
  147. data/src/core/lib/channel/handshaker.cc +151 -218
  148. data/src/core/lib/channel/handshaker.h +110 -101
  149. data/src/core/lib/channel/handshaker_factory.h +11 -19
  150. data/src/core/lib/channel/handshaker_registry.cc +67 -51
  151. data/src/core/lib/channel/handshaker_registry.h +21 -16
  152. data/src/core/lib/compression/algorithm_metadata.h +3 -3
  153. data/src/core/lib/compression/compression.cc +14 -9
  154. data/src/core/lib/compression/compression_args.cc +127 -0
  155. data/src/core/lib/compression/compression_args.h +55 -0
  156. data/src/core/lib/compression/compression_internal.cc +16 -12
  157. data/src/core/lib/compression/compression_internal.h +1 -1
  158. data/src/core/lib/compression/stream_compression.cc +3 -2
  159. data/src/core/lib/compression/stream_compression.h +2 -2
  160. data/src/core/lib/compression/stream_compression_gzip.cc +9 -9
  161. data/src/core/lib/debug/trace.cc +13 -7
  162. data/src/core/lib/debug/trace.h +14 -1
  163. data/src/core/lib/gpr/arena.h +13 -9
  164. data/src/core/lib/gpr/cpu_posix.cc +5 -3
  165. data/src/core/lib/gpr/env.h +3 -6
  166. data/src/core/lib/gpr/env_linux.cc +6 -1
  167. data/src/core/lib/gpr/env_posix.cc +5 -0
  168. data/src/core/lib/gpr/env_windows.cc +7 -5
  169. data/src/core/lib/gpr/log.cc +9 -13
  170. data/src/core/lib/gpr/log_posix.cc +2 -1
  171. data/src/core/lib/gpr/string.cc +20 -7
  172. data/src/core/lib/gpr/string.h +10 -3
  173. data/src/core/lib/gpr/sync_posix.cc +65 -4
  174. data/src/core/lib/gpr/time.cc +8 -0
  175. data/src/core/lib/gpr/time_posix.cc +21 -2
  176. data/src/core/lib/gprpp/arena.cc +103 -0
  177. data/src/core/lib/gprpp/arena.h +121 -0
  178. data/src/core/lib/gprpp/atomic.h +75 -5
  179. data/src/core/lib/gprpp/fork.cc +13 -32
  180. data/src/core/lib/gprpp/fork.h +5 -1
  181. data/src/core/lib/gprpp/global_config.h +96 -0
  182. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  183. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  184. data/src/core/lib/gprpp/global_config_env.h +131 -0
  185. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  186. data/src/core/lib/gprpp/inlined_vector.h +8 -0
  187. data/src/core/lib/gprpp/map.h +436 -0
  188. data/src/core/lib/gprpp/memory.h +2 -2
  189. data/src/core/lib/gprpp/optional.h +48 -0
  190. data/src/core/lib/gprpp/orphanable.h +6 -5
  191. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  192. data/src/core/lib/gprpp/ref_counted.h +36 -17
  193. data/src/core/lib/gprpp/sync.h +126 -0
  194. data/src/core/lib/gprpp/thd.h +42 -7
  195. data/src/core/lib/gprpp/thd_posix.cc +31 -13
  196. data/src/core/lib/gprpp/thd_windows.cc +47 -34
  197. data/src/core/lib/http/httpcli.cc +6 -5
  198. data/src/core/lib/http/httpcli_security_connector.cc +13 -15
  199. data/src/core/lib/http/parser.cc +3 -2
  200. data/src/core/lib/http/parser.h +2 -1
  201. data/src/core/lib/iomgr/buffer_list.cc +182 -24
  202. data/src/core/lib/iomgr/buffer_list.h +72 -10
  203. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  204. data/src/core/lib/iomgr/call_combiner.h +75 -82
  205. data/src/core/lib/iomgr/cfstream_handle.cc +203 -0
  206. data/src/core/lib/iomgr/cfstream_handle.h +86 -0
  207. data/src/core/lib/iomgr/combiner.cc +11 -3
  208. data/src/core/lib/iomgr/combiner.h +1 -1
  209. data/src/core/lib/iomgr/endpoint.cc +2 -2
  210. data/src/core/lib/iomgr/endpoint.h +3 -2
  211. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  212. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  213. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  214. data/src/core/lib/iomgr/error.cc +21 -17
  215. data/src/core/lib/iomgr/error.h +36 -6
  216. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  217. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  218. data/src/core/lib/iomgr/error_internal.h +1 -1
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +44 -28
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +173 -194
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +16 -487
  222. data/src/core/lib/iomgr/ev_posix.cc +29 -19
  223. data/src/core/lib/iomgr/ev_posix.h +19 -3
  224. data/src/core/lib/iomgr/ev_windows.cc +2 -2
  225. data/src/core/lib/iomgr/exec_ctx.cc +1 -0
  226. data/src/core/lib/iomgr/exec_ctx.h +137 -8
  227. data/src/core/lib/iomgr/executor.cc +147 -95
  228. data/src/core/lib/iomgr/executor.h +55 -49
  229. data/src/core/lib/iomgr/fork_posix.cc +6 -5
  230. data/src/core/lib/{gprpp/atomic_with_std.h → iomgr/grpc_if_nametoindex.h} +8 -13
  231. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +42 -0
  232. data/src/core/lib/iomgr/{network_status_tracker.h → grpc_if_nametoindex_unsupported.cc} +15 -9
  233. data/src/core/lib/iomgr/internal_errqueue.cc +3 -5
  234. data/src/core/lib/iomgr/internal_errqueue.h +105 -3
  235. data/src/core/lib/iomgr/iomgr.cc +20 -13
  236. data/src/core/lib/iomgr/iomgr.h +15 -0
  237. data/src/core/lib/iomgr/iomgr_custom.cc +17 -3
  238. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  239. data/src/core/lib/iomgr/iomgr_internal.cc +10 -0
  240. data/src/core/lib/iomgr/iomgr_internal.h +12 -0
  241. data/src/core/lib/iomgr/iomgr_posix.cc +19 -2
  242. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  243. data/src/core/lib/iomgr/iomgr_windows.cc +18 -2
  244. data/src/core/lib/iomgr/lockfree_event.cc +4 -4
  245. data/src/core/lib/iomgr/port.h +35 -0
  246. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  247. data/src/core/lib/iomgr/resolve_address_windows.cc +2 -1
  248. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  249. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  250. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  251. data/src/core/lib/iomgr/socket_windows.h +8 -0
  252. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  253. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  254. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  255. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  256. data/src/core/lib/iomgr/tcp_custom.cc +10 -14
  257. data/src/core/lib/iomgr/tcp_posix.cc +256 -140
  258. data/src/core/lib/iomgr/tcp_server.cc +5 -0
  259. data/src/core/lib/iomgr/tcp_server.h +24 -0
  260. data/src/core/lib/iomgr/tcp_server_custom.cc +14 -12
  261. data/src/core/lib/iomgr/tcp_server_posix.cc +86 -12
  262. data/src/core/lib/iomgr/tcp_server_utils_posix.h +3 -0
  263. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -11
  264. data/src/core/lib/iomgr/tcp_uv.cc +5 -7
  265. data/src/core/lib/iomgr/tcp_windows.cc +8 -14
  266. data/src/core/lib/iomgr/timer.h +2 -1
  267. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  268. data/src/core/lib/iomgr/timer_manager.cc +20 -11
  269. data/src/core/lib/iomgr/udp_server.cc +8 -6
  270. data/src/core/lib/iomgr/wakeup_fd_posix.cc +1 -19
  271. data/src/core/lib/json/json.cc +1 -4
  272. data/src/core/lib/profiling/basic_timers.cc +10 -4
  273. data/src/core/lib/security/context/security_context.cc +6 -7
  274. data/src/core/lib/security/context/security_context.h +3 -4
  275. data/src/core/lib/security/credentials/alts/alts_credentials.cc +1 -1
  276. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  277. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -0
  278. data/src/core/lib/security/credentials/credentials.h +9 -1
  279. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +15 -3
  280. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +2 -0
  281. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  282. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +2 -1
  283. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +10 -6
  284. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -1
  285. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +3 -3
  286. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +9 -8
  287. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +20 -2
  288. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +2 -2
  289. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +192 -0
  290. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +210 -0
  291. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +129 -0
  292. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +62 -0
  293. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -8
  294. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -12
  295. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  296. data/src/core/lib/security/security_connector/local/local_security_connector.cc +10 -8
  297. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  298. data/src/core/lib/security/security_connector/security_connector.h +3 -3
  299. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +39 -38
  300. data/src/core/lib/security/security_connector/ssl_utils.cc +164 -26
  301. data/src/core/lib/security/security_connector/ssl_utils.h +70 -1
  302. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +426 -0
  303. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +122 -0
  304. data/src/core/lib/security/transport/auth_filters.h +5 -2
  305. data/src/core/lib/security/transport/client_auth_filter.cc +55 -50
  306. data/src/core/lib/security/transport/secure_endpoint.cc +6 -6
  307. data/src/core/lib/security/transport/security_handshaker.cc +271 -303
  308. data/src/core/lib/security/transport/security_handshaker.h +11 -2
  309. data/src/core/lib/security/transport/server_auth_filter.cc +3 -3
  310. data/src/core/lib/slice/b64.h +2 -2
  311. data/src/core/lib/slice/percent_encoding.cc +3 -3
  312. data/src/core/lib/slice/percent_encoding.h +3 -3
  313. data/src/core/lib/slice/slice.cc +174 -122
  314. data/src/core/lib/slice/slice_buffer.cc +54 -21
  315. data/src/core/lib/slice/slice_hash_table.h +4 -4
  316. data/src/core/lib/slice/slice_intern.cc +49 -107
  317. data/src/core/lib/slice/slice_internal.h +264 -3
  318. data/src/core/lib/slice/slice_string_helpers.cc +10 -1
  319. data/src/core/lib/slice/slice_string_helpers.h +3 -1
  320. data/src/core/lib/slice/slice_utils.h +50 -0
  321. data/src/core/lib/slice/slice_weak_hash_table.h +6 -6
  322. data/src/core/lib/surface/api_trace.h +1 -1
  323. data/src/core/lib/surface/byte_buffer_reader.cc +17 -0
  324. data/src/core/lib/surface/call.cc +67 -46
  325. data/src/core/lib/surface/call.h +7 -2
  326. data/src/core/lib/surface/call_details.cc +0 -1
  327. data/src/core/lib/surface/channel.cc +89 -97
  328. data/src/core/lib/surface/channel.h +60 -6
  329. data/src/core/lib/surface/channel_init.h +5 -0
  330. data/src/core/lib/surface/completion_queue.cc +221 -216
  331. data/src/core/lib/surface/completion_queue.h +2 -1
  332. data/src/core/lib/surface/init.cc +82 -33
  333. data/src/core/lib/surface/init.h +1 -0
  334. data/src/core/lib/surface/init_secure.cc +1 -1
  335. data/src/core/lib/surface/lame_client.cc +5 -7
  336. data/src/core/lib/surface/server.cc +42 -47
  337. data/src/core/lib/surface/validate_metadata.cc +14 -8
  338. data/src/core/lib/surface/validate_metadata.h +13 -2
  339. data/src/core/lib/surface/version.cc +1 -1
  340. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  341. data/src/core/lib/transport/bdp_estimator.h +2 -2
  342. data/src/core/lib/transport/connectivity_state.cc +10 -40
  343. data/src/core/lib/transport/connectivity_state.h +0 -8
  344. data/src/core/lib/transport/error_utils.cc +12 -0
  345. data/src/core/lib/transport/metadata.cc +258 -267
  346. data/src/core/lib/transport/metadata.h +227 -16
  347. data/src/core/lib/transport/metadata_batch.cc +1 -1
  348. data/src/core/lib/transport/metadata_batch.h +1 -1
  349. data/src/core/lib/transport/static_metadata.cc +477 -399
  350. data/src/core/lib/transport/static_metadata.h +273 -182
  351. data/src/core/lib/transport/status_metadata.cc +3 -3
  352. data/src/core/lib/transport/timeout_encoding.cc +1 -1
  353. data/src/core/lib/transport/timeout_encoding.h +1 -1
  354. data/src/core/lib/transport/transport.cc +39 -72
  355. data/src/core/lib/transport/transport.h +59 -24
  356. data/src/core/lib/transport/transport_impl.h +1 -1
  357. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -3
  358. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  359. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +1 -1
  360. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +4 -3
  361. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +1 -1
  362. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +1 -1
  363. data/src/core/tsi/fake_transport_security.cc +4 -4
  364. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  365. data/src/core/tsi/ssl_transport_security.cc +12 -10
  366. data/src/core/tsi/ssl_transport_security.h +24 -4
  367. data/src/ruby/bin/math_pb.rb +18 -16
  368. data/src/ruby/ext/grpc/extconf.rb +12 -4
  369. data/src/ruby/ext/grpc/rb_call_credentials.c +8 -5
  370. data/src/ruby/ext/grpc/rb_channel.c +14 -10
  371. data/src/ruby/ext/grpc/rb_channel_credentials.c +8 -4
  372. data/src/ruby/ext/grpc/rb_compression_options.c +9 -7
  373. data/src/ruby/ext/grpc/rb_event_thread.c +2 -0
  374. data/src/ruby/ext/grpc/rb_grpc.c +23 -24
  375. data/src/ruby/ext/grpc/rb_grpc.h +4 -2
  376. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +24 -0
  377. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +36 -0
  378. data/src/ruby/ext/grpc/rb_server.c +8 -4
  379. data/src/ruby/lib/grpc/errors.rb +22 -3
  380. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  381. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -2
  382. data/src/ruby/lib/grpc/version.rb +1 -1
  383. data/src/ruby/pb/README.md +1 -1
  384. data/src/ruby/pb/grpc/health/v1/health_pb.rb +13 -10
  385. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +18 -0
  386. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +3 -1
  387. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +58 -56
  388. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -0
  389. data/src/ruby/spec/errors_spec.rb +141 -0
  390. data/third_party/cares/cares/ares.h +12 -0
  391. data/third_party/cares/cares/ares_create_query.c +5 -1
  392. data/third_party/cares/cares/ares_data.c +74 -73
  393. data/third_party/cares/cares/ares_destroy.c +6 -1
  394. data/third_party/cares/cares/ares_gethostbyaddr.c +5 -5
  395. data/third_party/cares/cares/ares_gethostbyname.c +15 -4
  396. data/third_party/cares/cares/ares_getnameinfo.c +11 -0
  397. data/third_party/cares/cares/ares_init.c +274 -173
  398. data/third_party/cares/cares/ares_library_init.c +21 -3
  399. data/third_party/cares/cares/ares_options.c +6 -2
  400. data/third_party/cares/cares/ares_parse_naptr_reply.c +7 -6
  401. data/third_party/cares/cares/ares_parse_ptr_reply.c +4 -2
  402. data/third_party/cares/cares/ares_platform.c +7 -0
  403. data/third_party/cares/cares/ares_private.h +19 -11
  404. data/third_party/cares/cares/ares_process.c +27 -2
  405. data/third_party/cares/cares/ares_rules.h +1 -1
  406. data/third_party/cares/cares/ares_search.c +7 -0
  407. data/third_party/cares/cares/ares_send.c +6 -0
  408. data/third_party/cares/cares/ares_strsplit.c +174 -0
  409. data/third_party/cares/cares/ares_strsplit.h +43 -0
  410. data/third_party/cares/cares/ares_version.h +4 -4
  411. data/third_party/cares/cares/config-win32.h +1 -1
  412. data/third_party/cares/cares/inet_ntop.c +2 -3
  413. data/third_party/cares/config_darwin/ares_config.h +3 -0
  414. data/third_party/cares/config_freebsd/ares_config.h +3 -0
  415. data/third_party/cares/config_linux/ares_config.h +3 -0
  416. data/third_party/cares/config_openbsd/ares_config.h +3 -0
  417. metadata +83 -48
  418. data/src/core/ext/filters/client_channel/request_routing.cc +0 -936
  419. data/src/core/ext/filters/client_channel/request_routing.h +0 -177
  420. data/src/core/ext/filters/client_channel/subchannel_index.cc +0 -248
  421. data/src/core/ext/filters/client_channel/subchannel_index.h +0 -76
  422. data/src/core/lib/channel/handshaker_factory.cc +0 -42
  423. data/src/core/lib/gpr/arena.cc +0 -192
  424. data/src/core/lib/gprpp/atomic_with_atm.h +0 -57
  425. data/src/core/lib/iomgr/wakeup_fd_cv.cc +0 -107
  426. data/src/core/lib/iomgr/wakeup_fd_cv.h +0 -69
  427. data/src/core/lib/transport/service_config.cc +0 -106
  428. data/src/core/lib/transport/service_config.h +0 -249
@@ -0,0 +1,375 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #include "src/core/lib/iomgr/port.h"
22
+
23
+ #ifdef GRPC_CFSTREAM_ENDPOINT
24
+
25
+ #import <CoreFoundation/CoreFoundation.h>
26
+ #import "src/core/lib/iomgr/endpoint_cfstream.h"
27
+
28
+ #include <grpc/slice_buffer.h>
29
+ #include <grpc/support/alloc.h>
30
+ #include <grpc/support/string_util.h>
31
+
32
+ #include "src/core/lib/gpr/string.h"
33
+ #include "src/core/lib/iomgr/cfstream_handle.h"
34
+ #include "src/core/lib/iomgr/closure.h"
35
+ #include "src/core/lib/iomgr/endpoint.h"
36
+ #include "src/core/lib/iomgr/error_cfstream.h"
37
+ #include "src/core/lib/slice/slice_internal.h"
38
+ #include "src/core/lib/slice/slice_string_helpers.h"
39
+
40
+ extern grpc_core::TraceFlag grpc_tcp_trace;
41
+
42
+ typedef struct {
43
+ grpc_endpoint base;
44
+ gpr_refcount refcount;
45
+
46
+ CFReadStreamRef read_stream;
47
+ CFWriteStreamRef write_stream;
48
+ CFStreamHandle* stream_sync;
49
+
50
+ grpc_closure* read_cb;
51
+ grpc_closure* write_cb;
52
+ grpc_slice_buffer* read_slices;
53
+ grpc_slice_buffer* write_slices;
54
+
55
+ grpc_closure read_action;
56
+ grpc_closure write_action;
57
+
58
+ char* peer_string;
59
+ grpc_resource_user* resource_user;
60
+ grpc_resource_user_slice_allocator slice_allocator;
61
+ } CFStreamEndpoint;
62
+
63
+ static void CFStreamFree(CFStreamEndpoint* ep) {
64
+ grpc_resource_user_unref(ep->resource_user);
65
+ CFRelease(ep->read_stream);
66
+ CFRelease(ep->write_stream);
67
+ CFSTREAM_HANDLE_UNREF(ep->stream_sync, "free");
68
+ gpr_free(ep->peer_string);
69
+ gpr_free(ep);
70
+ }
71
+
72
+ #ifndef NDEBUG
73
+ #define EP_REF(ep, reason) CFStreamRef((ep), (reason), __FILE__, __LINE__)
74
+ #define EP_UNREF(ep, reason) CFStreamUnref((ep), (reason), __FILE__, __LINE__)
75
+ static void CFStreamUnref(CFStreamEndpoint* ep, const char* reason,
76
+ const char* file, int line) {
77
+ if (grpc_tcp_trace.enabled()) {
78
+ gpr_atm val = gpr_atm_no_barrier_load(&ep->refcount.count);
79
+ gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
80
+ "CFStream endpoint unref %p : %s %" PRIdPTR " -> %" PRIdPTR, ep,
81
+ reason, val, val - 1);
82
+ }
83
+ if (gpr_unref(&ep->refcount)) {
84
+ CFStreamFree(ep);
85
+ }
86
+ }
87
+ static void CFStreamRef(CFStreamEndpoint* ep, const char* reason,
88
+ const char* file, int line) {
89
+ if (grpc_tcp_trace.enabled()) {
90
+ gpr_atm val = gpr_atm_no_barrier_load(&ep->refcount.count);
91
+ gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
92
+ "CFStream endpoint ref %p : %s %" PRIdPTR " -> %" PRIdPTR, ep,
93
+ reason, val, val + 1);
94
+ }
95
+ gpr_ref(&ep->refcount);
96
+ }
97
+ #else
98
+ #define EP_REF(ep, reason) CFStreamRef((ep))
99
+ #define EP_UNREF(ep, reason) CFStreamUnref((ep))
100
+ static void CFStreamUnref(CFStreamEndpoint* ep) {
101
+ if (gpr_unref(&ep->refcount)) {
102
+ CFStreamFree(ep);
103
+ }
104
+ }
105
+ static void CFStreamRef(CFStreamEndpoint* ep) { gpr_ref(&ep->refcount); }
106
+ #endif
107
+
108
+ static grpc_error* CFStreamAnnotateError(grpc_error* src_error,
109
+ CFStreamEndpoint* ep) {
110
+ return grpc_error_set_str(
111
+ grpc_error_set_int(src_error, GRPC_ERROR_INT_GRPC_STATUS,
112
+ GRPC_STATUS_UNAVAILABLE),
113
+ GRPC_ERROR_STR_TARGET_ADDRESS,
114
+ grpc_slice_from_copied_string(ep->peer_string));
115
+ }
116
+
117
+ static void CallReadCb(CFStreamEndpoint* ep, grpc_error* error) {
118
+ if (grpc_tcp_trace.enabled()) {
119
+ gpr_log(GPR_DEBUG, "CFStream endpoint:%p call_read_cb %p %p:%p", ep,
120
+ ep->read_cb, ep->read_cb->cb, ep->read_cb->cb_arg);
121
+ size_t i;
122
+ const char* str = grpc_error_string(error);
123
+ gpr_log(GPR_DEBUG, "read: error=%s", str);
124
+
125
+ for (i = 0; i < ep->read_slices->count; i++) {
126
+ char* dump = grpc_dump_slice(ep->read_slices->slices[i],
127
+ GPR_DUMP_HEX | GPR_DUMP_ASCII);
128
+ gpr_log(GPR_DEBUG, "READ %p (peer=%s): %s", ep, ep->peer_string, dump);
129
+ gpr_free(dump);
130
+ }
131
+ }
132
+ grpc_closure* cb = ep->read_cb;
133
+ ep->read_cb = nullptr;
134
+ ep->read_slices = nullptr;
135
+ GRPC_CLOSURE_SCHED(cb, error);
136
+ }
137
+
138
+ static void CallWriteCb(CFStreamEndpoint* ep, grpc_error* error) {
139
+ if (grpc_tcp_trace.enabled()) {
140
+ gpr_log(GPR_DEBUG, "CFStream endpoint:%p call_write_cb %p %p:%p", ep,
141
+ ep->write_cb, ep->write_cb->cb, ep->write_cb->cb_arg);
142
+ const char* str = grpc_error_string(error);
143
+ gpr_log(GPR_DEBUG, "write: error=%s", str);
144
+ }
145
+ grpc_closure* cb = ep->write_cb;
146
+ ep->write_cb = nullptr;
147
+ ep->write_slices = nullptr;
148
+ GRPC_CLOSURE_SCHED(cb, error);
149
+ }
150
+
151
+ static void ReadAction(void* arg, grpc_error* error) {
152
+ CFStreamEndpoint* ep = static_cast<CFStreamEndpoint*>(arg);
153
+ GPR_ASSERT(ep->read_cb != nullptr);
154
+ if (error) {
155
+ grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
156
+ CallReadCb(ep, GRPC_ERROR_REF(error));
157
+ EP_UNREF(ep, "read");
158
+ return;
159
+ }
160
+
161
+ GPR_ASSERT(ep->read_slices->count == 1);
162
+ grpc_slice slice = ep->read_slices->slices[0];
163
+ size_t len = GRPC_SLICE_LENGTH(slice);
164
+ CFIndex read_size =
165
+ CFReadStreamRead(ep->read_stream, GRPC_SLICE_START_PTR(slice), len);
166
+ if (read_size == -1) {
167
+ grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
168
+ CFErrorRef stream_error = CFReadStreamCopyError(ep->read_stream);
169
+ if (stream_error != nullptr) {
170
+ error = CFStreamAnnotateError(
171
+ GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "Read error"), ep);
172
+ CFRelease(stream_error);
173
+ } else {
174
+ error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Read error");
175
+ }
176
+ CallReadCb(ep, error);
177
+ EP_UNREF(ep, "read");
178
+ } else if (read_size == 0) {
179
+ grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
180
+ CallReadCb(ep,
181
+ CFStreamAnnotateError(
182
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Socket closed"), ep));
183
+ EP_UNREF(ep, "read");
184
+ } else {
185
+ if (read_size < static_cast<CFIndex>(len)) {
186
+ grpc_slice_buffer_trim_end(ep->read_slices, len - read_size, nullptr);
187
+ }
188
+ CallReadCb(ep, GRPC_ERROR_NONE);
189
+ EP_UNREF(ep, "read");
190
+ }
191
+ }
192
+
193
+ static void WriteAction(void* arg, grpc_error* error) {
194
+ CFStreamEndpoint* ep = static_cast<CFStreamEndpoint*>(arg);
195
+ GPR_ASSERT(ep->write_cb != nullptr);
196
+ if (error) {
197
+ grpc_slice_buffer_reset_and_unref_internal(ep->write_slices);
198
+ CallWriteCb(ep, GRPC_ERROR_REF(error));
199
+ EP_UNREF(ep, "write");
200
+ return;
201
+ }
202
+
203
+ grpc_slice slice = grpc_slice_buffer_take_first(ep->write_slices);
204
+ size_t slice_len = GRPC_SLICE_LENGTH(slice);
205
+ CFIndex write_size = CFWriteStreamWrite(
206
+ ep->write_stream, GRPC_SLICE_START_PTR(slice), slice_len);
207
+ if (write_size == -1) {
208
+ grpc_slice_buffer_reset_and_unref_internal(ep->write_slices);
209
+ CFErrorRef stream_error = CFWriteStreamCopyError(ep->write_stream);
210
+ if (stream_error != nullptr) {
211
+ error = CFStreamAnnotateError(
212
+ GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "write failed."), ep);
213
+ CFRelease(stream_error);
214
+ } else {
215
+ error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("write failed.");
216
+ }
217
+ CallWriteCb(ep, error);
218
+ EP_UNREF(ep, "write");
219
+ } else {
220
+ if (write_size < static_cast<CFIndex>(GRPC_SLICE_LENGTH(slice))) {
221
+ grpc_slice_buffer_undo_take_first(
222
+ ep->write_slices, grpc_slice_sub(slice, write_size, slice_len));
223
+ }
224
+ if (ep->write_slices->length > 0) {
225
+ ep->stream_sync->NotifyOnWrite(&ep->write_action);
226
+ } else {
227
+ CallWriteCb(ep, GRPC_ERROR_NONE);
228
+ EP_UNREF(ep, "write");
229
+ }
230
+
231
+ if (grpc_tcp_trace.enabled()) {
232
+ grpc_slice trace_slice = grpc_slice_sub(slice, 0, write_size);
233
+ char* dump = grpc_dump_slice(trace_slice, GPR_DUMP_HEX | GPR_DUMP_ASCII);
234
+ gpr_log(GPR_DEBUG, "WRITE %p (peer=%s): %s", ep, ep->peer_string, dump);
235
+ gpr_free(dump);
236
+ grpc_slice_unref_internal(trace_slice);
237
+ }
238
+ }
239
+ grpc_slice_unref_internal(slice);
240
+ }
241
+
242
+ static void CFStreamReadAllocationDone(void* arg, grpc_error* error) {
243
+ CFStreamEndpoint* ep = static_cast<CFStreamEndpoint*>(arg);
244
+ if (error == GRPC_ERROR_NONE) {
245
+ ep->stream_sync->NotifyOnRead(&ep->read_action);
246
+ } else {
247
+ grpc_slice_buffer_reset_and_unref_internal(ep->read_slices);
248
+ CallReadCb(ep, error);
249
+ EP_UNREF(ep, "read");
250
+ }
251
+ }
252
+
253
+ static void CFStreamRead(grpc_endpoint* ep, grpc_slice_buffer* slices,
254
+ grpc_closure* cb, bool urgent) {
255
+ CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
256
+ if (grpc_tcp_trace.enabled()) {
257
+ gpr_log(GPR_DEBUG, "CFStream endpoint:%p read (%p, %p) length:%zu", ep_impl,
258
+ slices, cb, slices->length);
259
+ }
260
+ GPR_ASSERT(ep_impl->read_cb == nullptr);
261
+ ep_impl->read_cb = cb;
262
+ ep_impl->read_slices = slices;
263
+ grpc_slice_buffer_reset_and_unref_internal(slices);
264
+ grpc_resource_user_alloc_slices(&ep_impl->slice_allocator,
265
+ GRPC_TCP_DEFAULT_READ_SLICE_SIZE, 1,
266
+ ep_impl->read_slices);
267
+ EP_REF(ep_impl, "read");
268
+ }
269
+
270
+ static void CFStreamWrite(grpc_endpoint* ep, grpc_slice_buffer* slices,
271
+ grpc_closure* cb, void* arg) {
272
+ CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
273
+ if (grpc_tcp_trace.enabled()) {
274
+ gpr_log(GPR_DEBUG, "CFStream endpoint:%p write (%p, %p) length:%zu",
275
+ ep_impl, slices, cb, slices->length);
276
+ }
277
+ GPR_ASSERT(ep_impl->write_cb == nullptr);
278
+ ep_impl->write_cb = cb;
279
+ ep_impl->write_slices = slices;
280
+ EP_REF(ep_impl, "write");
281
+ ep_impl->stream_sync->NotifyOnWrite(&ep_impl->write_action);
282
+ }
283
+
284
+ void CFStreamShutdown(grpc_endpoint* ep, grpc_error* why) {
285
+ CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
286
+ if (grpc_tcp_trace.enabled()) {
287
+ gpr_log(GPR_DEBUG, "CFStream endpoint:%p shutdown (%p)", ep_impl, why);
288
+ }
289
+ CFReadStreamClose(ep_impl->read_stream);
290
+ CFWriteStreamClose(ep_impl->write_stream);
291
+ ep_impl->stream_sync->Shutdown(why);
292
+ grpc_resource_user_shutdown(ep_impl->resource_user);
293
+ if (grpc_tcp_trace.enabled()) {
294
+ gpr_log(GPR_DEBUG, "CFStream endpoint:%p shutdown DONE (%p)", ep_impl, why);
295
+ }
296
+ }
297
+
298
+ void CFStreamDestroy(grpc_endpoint* ep) {
299
+ CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
300
+ if (grpc_tcp_trace.enabled()) {
301
+ gpr_log(GPR_DEBUG, "CFStream endpoint:%p destroy", ep_impl);
302
+ }
303
+ EP_UNREF(ep_impl, "destroy");
304
+ }
305
+
306
+ grpc_resource_user* CFStreamGetResourceUser(grpc_endpoint* ep) {
307
+ CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
308
+ return ep_impl->resource_user;
309
+ }
310
+
311
+ char* CFStreamGetPeer(grpc_endpoint* ep) {
312
+ CFStreamEndpoint* ep_impl = reinterpret_cast<CFStreamEndpoint*>(ep);
313
+ return gpr_strdup(ep_impl->peer_string);
314
+ }
315
+
316
+ int CFStreamGetFD(grpc_endpoint* ep) { return 0; }
317
+
318
+ bool CFStreamCanTrackErr(grpc_endpoint* ep) { return false; }
319
+
320
+ void CFStreamAddToPollset(grpc_endpoint* ep, grpc_pollset* pollset) {}
321
+ void CFStreamAddToPollsetSet(grpc_endpoint* ep, grpc_pollset_set* pollset) {}
322
+ void CFStreamDeleteFromPollsetSet(grpc_endpoint* ep,
323
+ grpc_pollset_set* pollset) {}
324
+
325
+ static const grpc_endpoint_vtable vtable = {CFStreamRead,
326
+ CFStreamWrite,
327
+ CFStreamAddToPollset,
328
+ CFStreamAddToPollsetSet,
329
+ CFStreamDeleteFromPollsetSet,
330
+ CFStreamShutdown,
331
+ CFStreamDestroy,
332
+ CFStreamGetResourceUser,
333
+ CFStreamGetPeer,
334
+ CFStreamGetFD,
335
+ CFStreamCanTrackErr};
336
+
337
+ grpc_endpoint* grpc_cfstream_endpoint_create(
338
+ CFReadStreamRef read_stream, CFWriteStreamRef write_stream,
339
+ const char* peer_string, grpc_resource_quota* resource_quota,
340
+ CFStreamHandle* stream_sync) {
341
+ CFStreamEndpoint* ep_impl =
342
+ static_cast<CFStreamEndpoint*>(gpr_malloc(sizeof(CFStreamEndpoint)));
343
+ if (grpc_tcp_trace.enabled()) {
344
+ gpr_log(GPR_DEBUG,
345
+ "CFStream endpoint:%p create readStream:%p writeStream: %p",
346
+ ep_impl, read_stream, write_stream);
347
+ }
348
+ ep_impl->base.vtable = &vtable;
349
+ gpr_ref_init(&ep_impl->refcount, 1);
350
+ ep_impl->read_stream = read_stream;
351
+ ep_impl->write_stream = write_stream;
352
+ CFRetain(read_stream);
353
+ CFRetain(write_stream);
354
+ ep_impl->stream_sync = stream_sync;
355
+ CFSTREAM_HANDLE_REF(ep_impl->stream_sync, "endpoint create");
356
+
357
+ ep_impl->peer_string = gpr_strdup(peer_string);
358
+ ep_impl->read_cb = nil;
359
+ ep_impl->write_cb = nil;
360
+ ep_impl->read_slices = nil;
361
+ ep_impl->write_slices = nil;
362
+ GRPC_CLOSURE_INIT(&ep_impl->read_action, ReadAction,
363
+ static_cast<void*>(ep_impl), grpc_schedule_on_exec_ctx);
364
+ GRPC_CLOSURE_INIT(&ep_impl->write_action, WriteAction,
365
+ static_cast<void*>(ep_impl), grpc_schedule_on_exec_ctx);
366
+ ep_impl->resource_user =
367
+ grpc_resource_user_create(resource_quota, peer_string);
368
+ grpc_resource_user_slice_allocator_init(&ep_impl->slice_allocator,
369
+ ep_impl->resource_user,
370
+ CFStreamReadAllocationDone, ep_impl);
371
+
372
+ return &ep_impl->base;
373
+ }
374
+
375
+ #endif /* GRPC_CFSTREAM_ENDPOINT */
@@ -0,0 +1,49 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_LIB_IOMGR_ENDPOINT_CFSTREAM_H
20
+ #define GRPC_CORE_LIB_IOMGR_ENDPOINT_CFSTREAM_H
21
+ /*
22
+ Low level TCP "bottom half" implementation, for use by transports built on
23
+ top of a TCP connection.
24
+
25
+ Note that this file does not (yet) include APIs for creating the socket in
26
+ the first place.
27
+
28
+ All calls passing slice transfer ownership of a slice refcount unless
29
+ otherwise specified.
30
+ */
31
+
32
+ #include <grpc/support/port_platform.h>
33
+
34
+ #ifdef GRPC_CFSTREAM
35
+
36
+ #import <CoreFoundation/CoreFoundation.h>
37
+
38
+ #include "src/core/lib/debug/trace.h"
39
+ #include "src/core/lib/iomgr/cfstream_handle.h"
40
+ #include "src/core/lib/iomgr/endpoint.h"
41
+
42
+ grpc_endpoint* grpc_cfstream_endpoint_create(
43
+ CFReadStreamRef read_stream, CFWriteStreamRef write_stream,
44
+ const char* peer_string, grpc_resource_quota* resource_quota,
45
+ CFStreamHandle* stream_sync);
46
+
47
+ #endif /* GRPC_CFSTREAM */
48
+
49
+ #endif /* GRPC_CORE_LIB_IOMGR_ENDPOINT_CFSTREAM_H */
@@ -41,7 +41,7 @@ static void create_sockets(SOCKET sv[2]) {
41
41
  int addr_len = sizeof(addr);
42
42
 
43
43
  lst_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
44
- WSA_FLAG_OVERLAPPED);
44
+ grpc_get_default_wsa_socket_flags());
45
45
  GPR_ASSERT(lst_sock != INVALID_SOCKET);
46
46
 
47
47
  memset(&addr, 0, sizeof(addr));
@@ -54,7 +54,7 @@ static void create_sockets(SOCKET sv[2]) {
54
54
  SOCKET_ERROR);
55
55
 
56
56
  cli_sock = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
57
- WSA_FLAG_OVERLAPPED);
57
+ grpc_get_default_wsa_socket_flags());
58
58
  GPR_ASSERT(cli_sock != INVALID_SOCKET);
59
59
 
60
60
  GPR_ASSERT(WSAConnect(cli_sock, (grpc_sockaddr*)&addr, addr_len, NULL, NULL,
@@ -150,13 +150,12 @@ static void unref_errs(grpc_error* err) {
150
150
  }
151
151
  }
152
152
 
153
- static void unref_slice(grpc_slice slice) { grpc_slice_unref_internal(slice); }
154
-
155
153
  static void unref_strs(grpc_error* err) {
156
154
  for (size_t which = 0; which < GRPC_ERROR_STR_MAX; ++which) {
157
155
  uint8_t slot = err->strs[which];
158
156
  if (slot != UINT8_MAX) {
159
- unref_slice(*reinterpret_cast<grpc_slice*>(err->arena + slot));
157
+ grpc_slice_unref_internal(
158
+ *reinterpret_cast<grpc_slice*>(err->arena + slot));
160
159
  }
161
160
  }
162
161
  }
@@ -231,7 +230,7 @@ static void internal_set_int(grpc_error** err, grpc_error_ints which,
231
230
  }
232
231
 
233
232
  static void internal_set_str(grpc_error** err, grpc_error_strs which,
234
- grpc_slice value) {
233
+ const grpc_slice& value) {
235
234
  uint8_t slot = (*err)->strs[which];
236
235
  if (slot == UINT8_MAX) {
237
236
  slot = get_placement(err, sizeof(value));
@@ -243,7 +242,8 @@ static void internal_set_str(grpc_error** err, grpc_error_strs which,
243
242
  return;
244
243
  }
245
244
  } else {
246
- unref_slice(*reinterpret_cast<grpc_slice*>((*err)->arena + slot));
245
+ grpc_slice_unref_internal(
246
+ *reinterpret_cast<grpc_slice*>((*err)->arena + slot));
247
247
  }
248
248
  (*err)->strs[which] = slot;
249
249
  memcpy((*err)->arena + slot, &value, sizeof(value));
@@ -303,14 +303,18 @@ static void internal_add_error(grpc_error** err, grpc_error* new_err) {
303
303
  // It is very common to include and extra int and string in an error
304
304
  #define SURPLUS_CAPACITY (2 * SLOTS_PER_INT + SLOTS_PER_TIME)
305
305
 
306
- static bool g_error_creation_allowed = true;
306
+ static gpr_atm g_error_creation_allowed = true;
307
307
 
308
- void grpc_disable_error_creation() { g_error_creation_allowed = false; }
308
+ void grpc_disable_error_creation() {
309
+ gpr_atm_no_barrier_store(&g_error_creation_allowed, false);
310
+ }
309
311
 
310
- void grpc_enable_error_creation() { g_error_creation_allowed = true; }
312
+ void grpc_enable_error_creation() {
313
+ gpr_atm_no_barrier_store(&g_error_creation_allowed, true);
314
+ }
311
315
 
312
- grpc_error* grpc_error_create(const char* file, int line, grpc_slice desc,
313
- grpc_error** referencing,
316
+ grpc_error* grpc_error_create(const char* file, int line,
317
+ const grpc_slice& desc, grpc_error** referencing,
314
318
  size_t num_referencing) {
315
319
  GPR_TIMER_SCOPE("grpc_error_create", 0);
316
320
  uint8_t initial_arena_capacity = static_cast<uint8_t>(
@@ -323,7 +327,7 @@ grpc_error* grpc_error_create(const char* file, int line, grpc_slice desc,
323
327
  return GRPC_ERROR_OOM;
324
328
  }
325
329
  #ifndef NDEBUG
326
- if (!g_error_creation_allowed) {
330
+ if (!gpr_atm_no_barrier_load(&g_error_creation_allowed)) {
327
331
  gpr_log(GPR_ERROR,
328
332
  "Error creation occurred when error creation was disabled [%s:%d]",
329
333
  file, line);
@@ -468,7 +472,7 @@ bool grpc_error_get_int(grpc_error* err, grpc_error_ints which, intptr_t* p) {
468
472
  }
469
473
 
470
474
  grpc_error* grpc_error_set_str(grpc_error* src, grpc_error_strs which,
471
- grpc_slice str) {
475
+ const grpc_slice& str) {
472
476
  GPR_TIMER_SCOPE("grpc_error_set_str", 0);
473
477
  grpc_error* new_err = copy_error_and_unref(src);
474
478
  internal_set_str(&new_err, which, str);
@@ -616,7 +620,7 @@ static char* key_str(grpc_error_strs which) {
616
620
  return gpr_strdup(error_str_name(which));
617
621
  }
618
622
 
619
- static char* fmt_str(grpc_slice slice) {
623
+ static char* fmt_str(const grpc_slice& slice) {
620
624
  char* s = nullptr;
621
625
  size_t sz = 0;
622
626
  size_t cap = 0;
@@ -765,7 +769,7 @@ grpc_error* grpc_os_error(const char* file, int line, int err,
765
769
  grpc_error_set_str(
766
770
  grpc_error_set_int(
767
771
  grpc_error_create(file, line,
768
- grpc_slice_from_static_string("OS Error"),
772
+ grpc_slice_from_static_string(strerror(err)),
769
773
  nullptr, 0),
770
774
  GRPC_ERROR_INT_ERRNO, err),
771
775
  GRPC_ERROR_STR_OS_ERROR,
@@ -791,9 +795,9 @@ grpc_error* grpc_wsa_error(const char* file, int line, int err,
791
795
  }
792
796
  #endif
793
797
 
794
- bool grpc_log_if_error(const char* what, grpc_error* error, const char* file,
795
- int line) {
796
- if (error == GRPC_ERROR_NONE) return true;
798
+ bool grpc_log_error(const char* what, grpc_error* error, const char* file,
799
+ int line) {
800
+ GPR_DEBUG_ASSERT(error != GRPC_ERROR_NONE);
797
801
  const char* msg = grpc_error_string(error);
798
802
  gpr_log(file, line, GPR_LOG_SEVERITY_ERROR, "%s: %s", what, msg);
799
803
  GRPC_ERROR_UNREF(error);
@@ -30,6 +30,7 @@
30
30
  #include <grpc/support/time.h>
31
31
 
32
32
  #include "src/core/lib/debug/trace.h"
33
+ #include "src/core/lib/gprpp/inlined_vector.h"
33
34
 
34
35
  /// Opaque representation of an error.
35
36
  /// See https://github.com/grpc/grpc/blob/master/doc/core/grpc-error.md for a
@@ -138,8 +139,9 @@ void grpc_enable_error_creation();
138
139
  const char* grpc_error_string(grpc_error* error);
139
140
 
140
141
  /// Create an error - but use GRPC_ERROR_CREATE instead
141
- grpc_error* grpc_error_create(const char* file, int line, grpc_slice desc,
142
- grpc_error** referencing, size_t num_referencing);
142
+ grpc_error* grpc_error_create(const char* file, int line,
143
+ const grpc_slice& desc, grpc_error** referencing,
144
+ size_t num_referencing);
143
145
  /// Create an error (this is the preferred way of generating an error that is
144
146
  /// not due to a system call - for system calls, use GRPC_OS_ERROR or
145
147
  /// GRPC_WSA_ERROR as appropriate)
@@ -164,6 +166,9 @@ grpc_error* grpc_error_create(const char* file, int line, grpc_slice desc,
164
166
  grpc_error_create(__FILE__, __LINE__, grpc_slice_from_copied_string(desc), \
165
167
  errs, count)
166
168
 
169
+ #define GRPC_ERROR_CREATE_FROM_VECTOR(desc, error_list) \
170
+ grpc_error_create_from_vector(__FILE__, __LINE__, desc, error_list)
171
+
167
172
  #ifndef NDEBUG
168
173
  grpc_error* grpc_error_do_ref(grpc_error* err, const char* file, int line);
169
174
  void grpc_error_do_unref(grpc_error* err, const char* file, int line);
@@ -192,6 +197,25 @@ inline void grpc_error_unref(grpc_error* err) {
192
197
  #define GRPC_ERROR_UNREF(err) grpc_error_unref(err)
193
198
  #endif
194
199
 
200
+ // Consumes all the errors in the vector and forms a referencing error from
201
+ // them. If the vector is empty, return GRPC_ERROR_NONE.
202
+ template <size_t N>
203
+ static grpc_error* grpc_error_create_from_vector(
204
+ const char* file, int line, const char* desc,
205
+ grpc_core::InlinedVector<grpc_error*, N>* error_list) {
206
+ grpc_error* error = GRPC_ERROR_NONE;
207
+ if (error_list->size() != 0) {
208
+ error = grpc_error_create(file, line, grpc_slice_from_static_string(desc),
209
+ error_list->data(), error_list->size());
210
+ // Remove refs to all errors in error_list.
211
+ for (size_t i = 0; i < error_list->size(); i++) {
212
+ GRPC_ERROR_UNREF((*error_list)[i]);
213
+ }
214
+ error_list->clear();
215
+ }
216
+ return error;
217
+ }
218
+
195
219
  grpc_error* grpc_error_set_int(grpc_error* src, grpc_error_ints which,
196
220
  intptr_t value) GRPC_MUST_USE_RESULT;
197
221
  /// It is an error to pass nullptr as `p`. Caller should allocate a dummy
@@ -200,7 +224,7 @@ bool grpc_error_get_int(grpc_error* error, grpc_error_ints which, intptr_t* p);
200
224
  /// This call takes ownership of the slice; the error is responsible for
201
225
  /// eventually unref-ing it.
202
226
  grpc_error* grpc_error_set_str(grpc_error* src, grpc_error_strs which,
203
- grpc_slice str) GRPC_MUST_USE_RESULT;
227
+ const grpc_slice& str) GRPC_MUST_USE_RESULT;
204
228
  /// Returns false if the specified string is not set.
205
229
  /// Caller does NOT own the slice.
206
230
  bool grpc_error_get_str(grpc_error* error, grpc_error_strs which,
@@ -237,9 +261,15 @@ grpc_error* grpc_wsa_error(const char* file, int line, int err,
237
261
  #define GRPC_WSA_ERROR(err, call_name) \
238
262
  grpc_wsa_error(__FILE__, __LINE__, err, call_name)
239
263
 
240
- bool grpc_log_if_error(const char* what, grpc_error* error, const char* file,
241
- int line);
264
+ bool grpc_log_error(const char* what, grpc_error* error, const char* file,
265
+ int line);
266
+ inline bool grpc_log_if_error(const char* what, grpc_error* error,
267
+ const char* file, int line) {
268
+ return error == GRPC_ERROR_NONE ? true
269
+ : grpc_log_error(what, error, file, line);
270
+ }
271
+
242
272
  #define GRPC_LOG_IF_ERROR(what, error) \
243
- grpc_log_if_error((what), (error), __FILE__, __LINE__)
273
+ (grpc_log_if_error((what), (error), __FILE__, __LINE__))
244
274
 
245
275
  #endif /* GRPC_CORE_LIB_IOMGR_ERROR_H */
@@ -0,0 +1,52 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #include <grpc/support/port_platform.h>
20
+
21
+ #ifdef GRPC_CFSTREAM
22
+ #include <CoreFoundation/CoreFoundation.h>
23
+
24
+ #include <grpc/support/alloc.h>
25
+ #include <grpc/support/string_util.h>
26
+
27
+ #include "src/core/lib/iomgr/error.h"
28
+
29
+ #define MAX_ERROR_DESCRIPTION 256
30
+
31
+ grpc_error* grpc_error_create_from_cferror(const char* file, int line,
32
+ void* arg, const char* custom_desc) {
33
+ CFErrorRef error = static_cast<CFErrorRef>(arg);
34
+ char buf_domain[MAX_ERROR_DESCRIPTION];
35
+ char buf_desc[MAX_ERROR_DESCRIPTION];
36
+ char* error_msg;
37
+ CFErrorDomain domain = CFErrorGetDomain((error));
38
+ CFIndex code = CFErrorGetCode((error));
39
+ CFStringRef desc = CFErrorCopyDescription((error));
40
+ CFStringGetCString(domain, buf_domain, MAX_ERROR_DESCRIPTION,
41
+ kCFStringEncodingUTF8);
42
+ CFStringGetCString(desc, buf_desc, MAX_ERROR_DESCRIPTION,
43
+ kCFStringEncodingUTF8);
44
+ gpr_asprintf(&error_msg, "%s (error domain:%s, code:%ld, description:%s)",
45
+ custom_desc, buf_domain, code, buf_desc);
46
+ CFRelease(desc);
47
+ grpc_error* return_error = grpc_error_create(
48
+ file, line, grpc_slice_from_copied_string(error_msg), NULL, 0);
49
+ gpr_free(error_msg);
50
+ return return_error;
51
+ }
52
+ #endif /* GRPC_CFSTREAM */