grpc 0.13.1 → 0.14.1.pre1

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 (724) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +2098 -828
  3. data/include/grpc/byte_buffer.h +1 -1
  4. data/include/grpc/byte_buffer_reader.h +1 -20
  5. data/include/grpc/census.h +4 -4
  6. data/include/grpc/compression.h +6 -5
  7. data/include/grpc/grpc.h +31 -20
  8. data/include/grpc/grpc_security.h +17 -31
  9. data/include/grpc/grpc_security_constants.h +114 -0
  10. data/include/grpc/grpc_zookeeper.h +1 -1
  11. data/include/grpc/impl/codegen/alloc.h +1 -1
  12. data/include/grpc/impl/codegen/atm.h +1 -1
  13. data/include/grpc/impl/codegen/atm_gcc_atomic.h +1 -1
  14. data/include/grpc/impl/codegen/atm_gcc_sync.h +1 -1
  15. data/include/grpc/impl/codegen/atm_win32.h +1 -1
  16. data/include/grpc/impl/codegen/byte_buffer.h +1 -1
  17. data/{src/core/client_config/lb_policies/round_robin.h → include/grpc/impl/codegen/byte_buffer_reader.h} +19 -8
  18. data/include/grpc/impl/codegen/grpc_types.h +20 -3
  19. data/include/grpc/impl/codegen/log.h +9 -2
  20. data/include/grpc/impl/codegen/port_platform.h +102 -17
  21. data/include/grpc/impl/codegen/propagation_bits.h +3 -3
  22. data/include/grpc/impl/codegen/slice.h +3 -3
  23. data/include/grpc/impl/codegen/slice_buffer.h +3 -3
  24. data/include/grpc/impl/codegen/status.h +1 -1
  25. data/include/grpc/impl/codegen/sync_generic.h +1 -1
  26. data/include/grpc/impl/codegen/sync_posix.h +1 -1
  27. data/include/grpc/impl/codegen/sync_win32.h +1 -1
  28. data/include/grpc/impl/codegen/time.h +3 -3
  29. data/include/grpc/status.h +1 -1
  30. data/include/grpc/support/alloc.h +1 -1
  31. data/include/grpc/support/atm.h +1 -1
  32. data/include/grpc/support/atm_gcc_atomic.h +4 -4
  33. data/include/grpc/support/atm_gcc_sync.h +1 -1
  34. data/include/grpc/support/atm_win32.h +1 -1
  35. data/include/grpc/support/avl.h +1 -1
  36. data/include/grpc/support/cmdline.h +1 -1
  37. data/include/grpc/support/cpu.h +1 -1
  38. data/include/grpc/support/histogram.h +1 -1
  39. data/include/grpc/support/host_port.h +1 -1
  40. data/include/grpc/support/log.h +1 -1
  41. data/include/grpc/support/log_win32.h +1 -1
  42. data/include/grpc/support/port_platform.h +1 -1
  43. data/include/grpc/support/slice.h +1 -1
  44. data/include/grpc/support/slice_buffer.h +1 -1
  45. data/include/grpc/support/string_util.h +3 -1
  46. data/include/grpc/support/subprocess.h +2 -2
  47. data/include/grpc/support/sync.h +1 -1
  48. data/include/grpc/support/sync_generic.h +1 -1
  49. data/include/grpc/support/sync_posix.h +1 -1
  50. data/include/grpc/support/sync_win32.h +1 -1
  51. data/include/grpc/support/thd.h +1 -1
  52. data/include/grpc/support/time.h +1 -1
  53. data/include/grpc/support/tls.h +1 -1
  54. data/include/grpc/support/tls_gcc.h +45 -1
  55. data/include/grpc/support/tls_msvc.h +3 -3
  56. data/include/grpc/support/tls_pthread.h +1 -1
  57. data/include/grpc/support/useful.h +1 -1
  58. data/src/boringssl/err_data.c +258 -252
  59. data/src/core/{census → ext/census}/aggregation.h +3 -3
  60. data/src/core/{statistics → ext/census}/census_interface.h +3 -3
  61. data/src/core/{statistics → ext/census}/census_rpc_stats.h +4 -4
  62. data/src/core/{census → ext/census}/context.c +2 -2
  63. data/src/core/{census → ext/census}/grpc_context.c +2 -2
  64. data/src/core/{census → ext/census}/grpc_filter.c +30 -16
  65. data/src/core/{census → ext/census}/grpc_filter.h +4 -4
  66. data/src/core/ext/census/grpc_plugin.c +82 -0
  67. data/src/core/{census → ext/census}/initialize.c +1 -1
  68. data/src/core/{census → ext/census}/mlog.c +2 -2
  69. data/src/core/{census → ext/census}/mlog.h +4 -4
  70. data/src/core/{census → ext/census}/operation.c +0 -0
  71. data/src/core/{census → ext/census}/placeholders.c +0 -0
  72. data/src/core/{census → ext/census}/rpc_metric_id.h +3 -3
  73. data/src/core/{census → ext/census}/tracing.c +0 -0
  74. data/src/core/{surface → ext/client_config}/channel_connectivity.c +8 -21
  75. data/src/core/{channel → ext/client_config}/client_channel.c +80 -35
  76. data/src/core/{channel → ext/client_config}/client_channel.h +5 -5
  77. data/src/core/{client_config/subchannel_factory.c → ext/client_config/client_channel_factory.c} +14 -6
  78. data/src/core/ext/client_config/client_channel_factory.h +85 -0
  79. data/src/core/{client_config → ext/client_config}/client_config.c +4 -2
  80. data/src/core/{client_config → ext/client_config}/client_config.h +4 -4
  81. data/src/core/ext/client_config/client_config_plugin.c +95 -0
  82. data/src/core/{client_config → ext/client_config}/connector.c +2 -2
  83. data/src/core/{client_config → ext/client_config}/connector.h +7 -10
  84. data/src/core/{client_config → ext/client_config}/default_initial_connect_string.c +1 -1
  85. data/src/core/{client_config → ext/client_config}/initial_connect_string.c +1 -1
  86. data/src/core/{client_config → ext/client_config}/initial_connect_string.h +4 -4
  87. data/src/core/{client_config → ext/client_config}/lb_policy.c +12 -3
  88. data/src/core/{client_config → ext/client_config}/lb_policy.h +19 -6
  89. data/src/core/{client_config → ext/client_config}/lb_policy_factory.c +4 -3
  90. data/src/core/{client_config → ext/client_config}/lb_policy_factory.h +14 -9
  91. data/src/core/{client_config → ext/client_config}/lb_policy_registry.c +4 -9
  92. data/src/core/{client_config → ext/client_config}/lb_policy_registry.h +7 -6
  93. data/src/core/ext/client_config/parse_address.c +137 -0
  94. data/src/core/ext/client_config/parse_address.h +56 -0
  95. data/src/core/{client_config → ext/client_config}/resolver.c +1 -1
  96. data/src/core/{client_config → ext/client_config}/resolver.h +6 -6
  97. data/src/core/{client_config → ext/client_config}/resolver_factory.c +1 -1
  98. data/src/core/{client_config → ext/client_config}/resolver_factory.h +7 -7
  99. data/src/core/{client_config → ext/client_config}/resolver_registry.c +25 -11
  100. data/src/core/{client_config → ext/client_config}/resolver_registry.h +9 -5
  101. data/src/core/{client_config → ext/client_config}/subchannel.c +90 -126
  102. data/src/core/{client_config → ext/client_config}/subchannel.h +15 -15
  103. data/src/core/{channel → ext/client_config}/subchannel_call_holder.c +9 -8
  104. data/src/core/{channel → ext/client_config}/subchannel_call_holder.h +7 -7
  105. data/src/core/{client_config → ext/client_config}/subchannel_index.c +3 -2
  106. data/src/core/{client_config → ext/client_config}/subchannel_index.h +5 -5
  107. data/src/core/{client_config → ext/client_config}/uri_parser.c +69 -1
  108. data/src/core/{client_config → ext/client_config}/uri_parser.h +15 -3
  109. data/src/core/{client_config/lb_policies → ext/lb_policy/grpclb}/load_balancer_api.c +18 -9
  110. data/src/core/{client_config/lb_policies → ext/lb_policy/grpclb}/load_balancer_api.h +5 -5
  111. data/src/core/{proto → ext/lb_policy/grpclb/proto}/grpc/lb/v0/load_balancer.pb.c +1 -1
  112. data/src/core/{proto → ext/lb_policy/grpclb/proto}/grpc/lb/v0/load_balancer.pb.h +0 -0
  113. data/src/core/{client_config/lb_policies → ext/lb_policy/pick_first}/pick_first.c +95 -32
  114. data/src/core/{client_config/lb_policies → ext/lb_policy/round_robin}/round_robin.c +98 -34
  115. data/src/core/{client_config/resolvers → ext/resolver/dns/native}/dns_resolver.c +83 -39
  116. data/src/core/{client_config/resolvers → ext/resolver/sockaddr}/sockaddr_resolver.c +66 -169
  117. data/src/core/{transport/chttp2 → ext/transport/chttp2/alpn}/alpn.c +1 -1
  118. data/src/core/{transport/chttp2 → ext/transport/chttp2/alpn}/alpn.h +3 -3
  119. data/src/core/{surface → ext/transport/chttp2/client/insecure}/channel_create.c +65 -59
  120. data/src/core/{surface → ext/transport/chttp2/client/secure}/secure_channel_create.c +77 -69
  121. data/src/core/{surface → ext/transport/chttp2/server/insecure}/server_chttp2.c +8 -11
  122. data/src/core/{security → ext/transport/chttp2/server/secure}/server_secure_chttp2.c +14 -17
  123. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/bin_encoder.c +28 -74
  124. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/bin_encoder.h +5 -5
  125. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.c +46 -0
  126. data/src/core/{transport → ext/transport/chttp2/transport}/chttp2_transport.c +551 -310
  127. data/src/core/{transport → ext/transport/chttp2/transport}/chttp2_transport.h +5 -5
  128. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame.h +3 -3
  129. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_data.c +30 -14
  130. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_data.h +10 -7
  131. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_goaway.c +2 -2
  132. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_goaway.h +5 -5
  133. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_ping.c +2 -2
  134. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_ping.h +5 -5
  135. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_rst_stream.c +9 -5
  136. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_rst_stream.h +8 -6
  137. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_settings.c +6 -6
  138. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_settings.h +5 -5
  139. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_window_update.c +11 -5
  140. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/frame_window_update.h +8 -6
  141. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_encoder.c +21 -12
  142. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_encoder.h +8 -6
  143. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_parser.c +42 -25
  144. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_parser.h +7 -7
  145. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_table.c +21 -11
  146. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/hpack_table.h +4 -4
  147. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/http2_errors.h +3 -3
  148. data/src/core/ext/transport/chttp2/transport/huffsyms.c +105 -0
  149. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/huffsyms.h +3 -3
  150. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/incoming_metadata.c +2 -2
  151. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/incoming_metadata.h +4 -4
  152. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/internal.h +81 -37
  153. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/parsing.c +54 -21
  154. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/status_conversion.c +1 -1
  155. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/status_conversion.h +4 -4
  156. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_lists.c +10 -2
  157. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_map.c +1 -1
  158. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/stream_map.h +3 -3
  159. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/timeout_encoding.c +4 -4
  160. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/timeout_encoding.h +4 -4
  161. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/varint.c +1 -1
  162. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/varint.h +3 -3
  163. data/src/core/{transport/chttp2 → ext/transport/chttp2/transport}/writing.c +30 -20
  164. data/src/core/{channel → lib/channel}/channel_args.c +3 -15
  165. data/src/core/{channel → lib/channel}/channel_args.h +11 -15
  166. data/src/core/{channel → lib/channel}/channel_stack.c +5 -3
  167. data/src/core/{channel → lib/channel}/channel_stack.h +13 -8
  168. data/src/core/lib/channel/channel_stack_builder.c +277 -0
  169. data/src/core/lib/channel/channel_stack_builder.h +161 -0
  170. data/src/core/{channel → lib/channel}/compress_filter.c +51 -16
  171. data/src/core/{channel → lib/channel}/compress_filter.h +6 -4
  172. data/src/core/{channel → lib/channel}/connected_channel.c +34 -24
  173. data/src/core/lib/channel/connected_channel.h +42 -0
  174. data/src/core/{channel → lib/channel}/context.h +3 -3
  175. data/src/core/{channel → lib/channel}/http_client_filter.c +24 -13
  176. data/src/core/{channel → lib/channel}/http_client_filter.h +4 -4
  177. data/src/core/{channel → lib/channel}/http_server_filter.c +39 -19
  178. data/src/core/{channel → lib/channel}/http_server_filter.h +4 -4
  179. data/src/core/{compression → lib/compression}/algorithm_metadata.h +4 -4
  180. data/src/core/{compression → lib/compression}/compression_algorithm.c +46 -9
  181. data/src/core/{compression → lib/compression}/message_compress.c +1 -1
  182. data/src/core/{compression → lib/compression}/message_compress.h +3 -3
  183. data/src/core/{debug → lib/debug}/trace.c +2 -2
  184. data/src/core/{debug → lib/debug}/trace.h +3 -3
  185. data/src/core/{httpcli → lib/http}/format_request.c +8 -8
  186. data/src/core/{httpcli → lib/http}/format_request.h +4 -4
  187. data/src/core/{httpcli → lib/http}/httpcli.c +24 -19
  188. data/src/core/{httpcli → lib/http}/httpcli.h +14 -33
  189. data/src/core/{httpcli → lib/http}/httpcli_security_connector.c +5 -5
  190. data/src/core/lib/http/parser.c +341 -0
  191. data/src/core/lib/http/parser.h +119 -0
  192. data/src/core/{iomgr → lib/iomgr}/closure.c +8 -2
  193. data/src/core/{iomgr → lib/iomgr}/closure.h +7 -4
  194. data/src/core/{iomgr → lib/iomgr}/endpoint.c +1 -1
  195. data/src/core/{iomgr → lib/iomgr}/endpoint.h +5 -5
  196. data/src/core/{iomgr → lib/iomgr}/endpoint_pair.h +4 -4
  197. data/src/core/{iomgr → lib/iomgr}/endpoint_pair_posix.c +8 -7
  198. data/src/core/{iomgr → lib/iomgr}/endpoint_pair_windows.c +4 -4
  199. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +1936 -0
  200. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.h +41 -0
  201. data/src/core/lib/iomgr/ev_posix.c +164 -0
  202. data/src/core/lib/iomgr/ev_posix.h +158 -0
  203. data/src/core/{iomgr → lib/iomgr}/exec_ctx.c +78 -3
  204. data/src/core/{iomgr → lib/iomgr}/exec_ctx.h +25 -10
  205. data/src/core/{iomgr → lib/iomgr}/executor.c +3 -3
  206. data/src/core/{iomgr → lib/iomgr}/executor.h +5 -5
  207. data/src/core/{iomgr → lib/iomgr}/iocp_windows.c +6 -6
  208. data/src/core/{iomgr → lib/iomgr}/iocp_windows.h +5 -5
  209. data/src/core/{iomgr → lib/iomgr}/iomgr.c +13 -10
  210. data/src/core/{iomgr → lib/iomgr}/iomgr.h +3 -3
  211. data/src/core/{iomgr → lib/iomgr}/iomgr_internal.h +5 -9
  212. data/src/core/{iomgr → lib/iomgr}/iomgr_posix.c +6 -6
  213. data/src/core/{iomgr → lib/iomgr}/iomgr_posix.h +4 -4
  214. data/src/core/{iomgr → lib/iomgr}/iomgr_windows.c +7 -4
  215. data/src/core/{iomgr → lib/iomgr}/pollset.h +11 -11
  216. data/src/core/{iomgr → lib/iomgr}/pollset_set.h +5 -5
  217. data/src/core/{iomgr → lib/iomgr}/pollset_set_windows.c +2 -2
  218. data/src/core/lib/iomgr/pollset_set_windows.h +39 -0
  219. data/src/core/{iomgr → lib/iomgr}/pollset_windows.c +7 -7
  220. data/src/core/{iomgr → lib/iomgr}/pollset_windows.h +8 -5
  221. data/src/core/{iomgr → lib/iomgr}/resolve_address.h +10 -9
  222. data/src/core/{iomgr → lib/iomgr}/resolve_address_posix.c +22 -22
  223. data/src/core/{iomgr → lib/iomgr}/resolve_address_windows.c +20 -12
  224. data/src/core/{iomgr → lib/iomgr}/sockaddr.h +5 -5
  225. data/src/core/{iomgr → lib/iomgr}/sockaddr_posix.h +5 -5
  226. data/src/core/{iomgr → lib/iomgr}/sockaddr_utils.c +9 -16
  227. data/src/core/{iomgr → lib/iomgr}/sockaddr_utils.h +4 -4
  228. data/src/core/{iomgr → lib/iomgr}/sockaddr_win32.h +6 -4
  229. data/src/core/{iomgr → lib/iomgr}/socket_utils_common_posix.c +29 -7
  230. data/src/core/{iomgr → lib/iomgr}/socket_utils_linux.c +2 -2
  231. data/src/core/{iomgr → lib/iomgr}/socket_utils_posix.c +1 -1
  232. data/src/core/{iomgr → lib/iomgr}/socket_utils_posix.h +14 -4
  233. data/src/core/{iomgr → lib/iomgr}/socket_windows.c +7 -5
  234. data/src/core/{iomgr → lib/iomgr}/socket_windows.h +6 -6
  235. data/src/core/{iomgr → lib/iomgr}/tcp_client.h +6 -6
  236. data/src/core/{iomgr → lib/iomgr}/tcp_client_posix.c +33 -18
  237. data/src/core/{iomgr → lib/iomgr}/tcp_client_windows.c +30 -20
  238. data/src/core/{iomgr → lib/iomgr}/tcp_posix.c +9 -10
  239. data/src/core/{iomgr → lib/iomgr}/tcp_posix.h +6 -6
  240. data/src/core/{iomgr → lib/iomgr}/tcp_server.h +6 -6
  241. data/src/core/{iomgr → lib/iomgr}/tcp_server_posix.c +24 -37
  242. data/src/core/{iomgr → lib/iomgr}/tcp_server_windows.c +8 -36
  243. data/src/core/{iomgr → lib/iomgr}/tcp_windows.c +27 -17
  244. data/src/core/{iomgr → lib/iomgr}/tcp_windows.h +5 -5
  245. data/src/core/{iomgr → lib/iomgr}/time_averaged_stats.c +1 -1
  246. data/src/core/{iomgr → lib/iomgr}/time_averaged_stats.h +3 -3
  247. data/src/core/{iomgr → lib/iomgr}/timer.c +31 -4
  248. data/src/core/{iomgr → lib/iomgr}/timer.h +6 -7
  249. data/src/core/{iomgr → lib/iomgr}/timer_heap.c +2 -2
  250. data/src/core/{iomgr → lib/iomgr}/timer_heap.h +4 -4
  251. data/src/core/{iomgr → lib/iomgr}/udp_server.c +13 -37
  252. data/src/core/{iomgr → lib/iomgr}/udp_server.h +11 -10
  253. data/src/core/lib/iomgr/unix_sockets_posix.c +89 -0
  254. data/src/core/{client_config/resolvers/sockaddr_resolver.h → lib/iomgr/unix_sockets_posix.h} +15 -11
  255. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +59 -0
  256. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_eventfd.c +2 -2
  257. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_nospecial.c +1 -1
  258. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_pipe.c +8 -3
  259. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_pipe.h +4 -4
  260. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_posix.c +2 -2
  261. data/src/core/{iomgr → lib/iomgr}/wakeup_fd_posix.h +3 -3
  262. data/src/core/{iomgr → lib/iomgr}/workqueue.h +10 -10
  263. data/src/core/{iomgr → lib/iomgr}/workqueue_posix.c +5 -6
  264. data/src/core/{iomgr → lib/iomgr}/workqueue_posix.h +5 -5
  265. data/src/core/{iomgr → lib/iomgr}/workqueue_windows.c +1 -1
  266. data/src/core/{iomgr → lib/iomgr}/workqueue_windows.h +3 -3
  267. data/src/core/{json → lib/json}/json.c +1 -1
  268. data/src/core/{json → lib/json}/json.h +4 -4
  269. data/src/core/{json → lib/json}/json_common.h +3 -3
  270. data/src/core/{json → lib/json}/json_reader.c +16 -4
  271. data/src/core/{json → lib/json}/json_reader.h +4 -4
  272. data/src/core/{json → lib/json}/json_string.c +4 -4
  273. data/src/core/{json → lib/json}/json_writer.c +1 -1
  274. data/src/core/{json → lib/json}/json_writer.h +4 -4
  275. data/src/core/{profiling → lib/profiling}/basic_timers.c +3 -2
  276. data/src/core/{profiling → lib/profiling}/stap_timers.c +2 -2
  277. data/src/core/{profiling → lib/profiling}/timers.h +3 -3
  278. data/src/core/{security → lib/security}/auth_filters.h +4 -4
  279. data/src/core/{security → lib/security}/b64.c +2 -2
  280. data/src/core/{security → lib/security}/b64.h +4 -4
  281. data/src/core/{security → lib/security}/client_auth_filter.c +16 -16
  282. data/src/core/{security → lib/security}/credentials.c +42 -26
  283. data/src/core/{security → lib/security}/credentials.h +11 -10
  284. data/src/core/{security → lib/security}/credentials_metadata.c +1 -1
  285. data/src/core/{security → lib/security}/credentials_posix.c +3 -3
  286. data/src/core/{security → lib/security}/credentials_win32.c +3 -3
  287. data/src/core/{security → lib/security}/google_default_credentials.c +10 -9
  288. data/src/core/{security → lib/security}/handshake.c +4 -4
  289. data/src/core/{security → lib/security}/handshake.h +6 -6
  290. data/src/core/{security → lib/security}/json_token.c +4 -4
  291. data/src/core/{security → lib/security}/json_token.h +4 -4
  292. data/src/core/{security → lib/security}/jwt_verifier.c +14 -14
  293. data/src/core/{security → lib/security}/jwt_verifier.h +5 -5
  294. data/src/core/{security → lib/security}/secure_endpoint.c +9 -8
  295. data/src/core/{security → lib/security}/secure_endpoint.h +4 -4
  296. data/src/core/{security → lib/security}/security_connector.c +53 -21
  297. data/src/core/{security → lib/security}/security_connector.h +8 -8
  298. data/src/core/{security → lib/security}/security_context.c +5 -5
  299. data/src/core/{security → lib/security}/security_context.h +5 -5
  300. data/src/core/{security → lib/security}/server_auth_filter.c +9 -9
  301. data/src/core/{support → lib/support}/alloc.c +5 -3
  302. data/src/core/{support → lib/support}/avl.c +1 -1
  303. data/src/core/lib/support/backoff.c +76 -0
  304. data/src/core/lib/support/backoff.h +68 -0
  305. data/src/core/{support → lib/support}/block_annotate.h +3 -3
  306. data/src/core/{support → lib/support}/cmdline.c +1 -1
  307. data/src/core/{support → lib/support}/cpu_iphone.c +0 -0
  308. data/src/core/{support → lib/support}/cpu_linux.c +2 -2
  309. data/src/core/{support → lib/support}/cpu_posix.c +2 -2
  310. data/src/core/{support → lib/support}/cpu_windows.c +0 -0
  311. data/src/core/{support → lib/support}/env.h +3 -3
  312. data/src/core/{support → lib/support}/env_linux.c +3 -3
  313. data/src/core/{support → lib/support}/env_posix.c +2 -2
  314. data/src/core/{support → lib/support}/env_win32.c +27 -21
  315. data/src/core/{support → lib/support}/histogram.c +1 -1
  316. data/src/core/{support → lib/support}/host_port.c +1 -1
  317. data/src/core/{support → lib/support}/load_file.c +4 -4
  318. data/src/core/{support → lib/support}/load_file.h +4 -4
  319. data/src/core/{support → lib/support}/log.c +33 -0
  320. data/src/core/{support → lib/support}/log_android.c +2 -2
  321. data/src/core/{support → lib/support}/log_linux.c +6 -5
  322. data/src/core/{support → lib/support}/log_posix.c +3 -3
  323. data/src/core/{support → lib/support}/log_win32.c +8 -22
  324. data/src/core/{support → lib/support}/murmur_hash.c +1 -1
  325. data/src/core/{support → lib/support}/murmur_hash.h +3 -3
  326. data/src/core/{support → lib/support}/slice.c +0 -0
  327. data/src/core/{support → lib/support}/slice_buffer.c +0 -0
  328. data/src/core/{support → lib/support}/stack_lockfree.c +7 -7
  329. data/src/core/{support → lib/support}/stack_lockfree.h +3 -3
  330. data/src/core/{support → lib/support}/string.c +1 -1
  331. data/src/core/{support → lib/support}/string.h +4 -4
  332. data/src/core/{support → lib/support}/string_posix.c +1 -1
  333. data/src/core/{support/string_win32.c → lib/support/string_util_win32.c} +23 -38
  334. data/src/core/lib/support/string_win32.c +83 -0
  335. data/src/core/{support → lib/support}/string_win32.h +3 -3
  336. data/src/core/{support → lib/support}/subprocess_posix.c +3 -3
  337. data/src/core/{support → lib/support}/subprocess_windows.c +3 -3
  338. data/src/core/{support → lib/support}/sync.c +2 -2
  339. data/src/core/{support → lib/support}/sync_posix.c +3 -3
  340. data/src/core/{support → lib/support}/sync_win32.c +1 -1
  341. data/src/core/{support → lib/support}/thd.c +0 -0
  342. data/src/core/{support → lib/support}/thd_internal.h +3 -3
  343. data/src/core/{support → lib/support}/thd_posix.c +4 -3
  344. data/src/core/{support → lib/support}/thd_win32.c +1 -1
  345. data/src/core/{support → lib/support}/time.c +2 -2
  346. data/src/core/{support → lib/support}/time_posix.c +12 -6
  347. data/src/core/{support → lib/support}/time_precise.c +0 -0
  348. data/src/core/{support → lib/support}/time_precise.h +3 -3
  349. data/src/core/{support → lib/support}/time_win32.c +7 -7
  350. data/src/core/{support → lib/support}/tls_pthread.c +0 -0
  351. data/src/core/{support → lib/support}/tmpfile.h +4 -4
  352. data/src/core/lib/support/tmpfile_msys.c +73 -0
  353. data/src/core/{support → lib/support}/tmpfile_posix.c +5 -5
  354. data/src/core/{support → lib/support}/tmpfile_win32.c +5 -5
  355. data/src/core/{support → lib/support}/wrap_memcpy.c +0 -0
  356. data/src/core/{surface → lib/surface}/alarm.c +3 -3
  357. data/src/core/{surface → lib/surface}/api_trace.c +1 -1
  358. data/src/core/{surface → lib/surface}/api_trace.h +4 -4
  359. data/src/core/{surface → lib/surface}/byte_buffer.c +3 -3
  360. data/src/core/{surface → lib/surface}/byte_buffer_reader.c +3 -3
  361. data/src/core/{surface → lib/surface}/call.c +145 -73
  362. data/src/core/{surface → lib/surface}/call.h +14 -7
  363. data/src/core/{surface → lib/surface}/call_details.c +1 -1
  364. data/src/core/{surface → lib/surface}/call_log_batch.c +2 -2
  365. data/src/core/{surface → lib/surface}/call_test_only.h +3 -3
  366. data/src/core/{surface → lib/surface}/channel.c +33 -34
  367. data/src/core/{surface → lib/surface}/channel.h +9 -9
  368. data/src/core/lib/surface/channel_init.c +140 -0
  369. data/src/core/lib/surface/channel_init.h +87 -0
  370. data/src/core/{surface → lib/surface}/channel_ping.c +4 -4
  371. data/src/core/lib/surface/channel_stack_type.c +54 -0
  372. data/src/core/{httpcli/parser.h → lib/surface/channel_stack_type.h} +22 -28
  373. data/src/core/{surface → lib/surface}/completion_queue.c +15 -11
  374. data/src/core/{surface → lib/surface}/completion_queue.h +4 -4
  375. data/src/core/{surface → lib/surface}/event_string.c +2 -2
  376. data/src/core/{surface → lib/surface}/event_string.h +3 -3
  377. data/src/core/lib/surface/init.c +217 -0
  378. data/src/core/{surface → lib/surface}/init.h +4 -3
  379. data/src/core/lib/surface/init_secure.c +89 -0
  380. data/src/core/{surface → lib/surface}/lame_client.c +31 -19
  381. data/src/core/{iomgr/pollset_set_windows.h → lib/surface/lame_client.h} +7 -5
  382. data/src/core/{surface → lib/surface}/metadata_array.c +1 -1
  383. data/src/core/{surface → lib/surface}/server.c +208 -183
  384. data/src/core/{surface → lib/surface}/server.h +6 -11
  385. data/src/core/{surface → lib/surface}/surface_trace.h +5 -5
  386. data/src/core/{surface → lib/surface}/validate_metadata.c +1 -1
  387. data/src/core/{surface → lib/surface}/version.c +2 -2
  388. data/src/core/{transport → lib/transport}/byte_stream.c +1 -1
  389. data/src/core/{transport → lib/transport}/byte_stream.h +4 -4
  390. data/src/core/{transport → lib/transport}/connectivity_state.c +2 -2
  391. data/src/core/{transport → lib/transport}/connectivity_state.h +4 -4
  392. data/src/core/{transport → lib/transport}/metadata.c +71 -19
  393. data/src/core/{transport → lib/transport}/metadata.h +11 -4
  394. data/src/core/{transport → lib/transport}/metadata_batch.c +2 -2
  395. data/src/core/{transport → lib/transport}/metadata_batch.h +4 -4
  396. data/src/core/{transport → lib/transport}/static_metadata.c +100 -32
  397. data/src/core/{transport → lib/transport}/static_metadata.h +58 -58
  398. data/src/core/{transport → lib/transport}/transport.c +25 -5
  399. data/src/core/{transport → lib/transport}/transport.h +41 -16
  400. data/src/core/{transport → lib/transport}/transport_impl.h +8 -5
  401. data/src/core/{transport → lib/transport}/transport_op_string.c +2 -2
  402. data/src/core/{tsi → lib/tsi}/fake_transport_security.c +18 -14
  403. data/src/core/{tsi → lib/tsi}/fake_transport_security.h +4 -4
  404. data/src/core/{tsi → lib/tsi}/ssl_transport_security.c +173 -63
  405. data/src/core/{tsi → lib/tsi}/ssl_transport_security.h +24 -6
  406. data/src/core/{tsi → lib/tsi}/ssl_types.h +3 -3
  407. data/src/core/{tsi → lib/tsi}/transport_security.c +12 -28
  408. data/src/core/{tsi → lib/tsi}/transport_security.h +4 -4
  409. data/src/core/{tsi → lib/tsi}/transport_security_interface.h +12 -3
  410. data/src/core/plugin_registry/grpc_plugin_registry.c +66 -0
  411. data/src/ruby/ext/grpc/extconf.rb +14 -20
  412. data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -3
  413. data/src/ruby/ext/grpc/rb_call.c +37 -4
  414. data/src/ruby/ext/grpc/rb_call_credentials.c +13 -3
  415. data/src/ruby/ext/grpc/rb_channel.c +2 -3
  416. data/src/ruby/ext/grpc/rb_channel_args.c +2 -3
  417. data/src/ruby/ext/grpc/rb_channel_credentials.c +31 -3
  418. data/src/ruby/ext/grpc/rb_completion_queue.c +2 -2
  419. data/src/ruby/ext/grpc/rb_event_thread.c +1 -1
  420. data/src/ruby/ext/grpc/rb_grpc.c +4 -2
  421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +8 -0
  422. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +14 -2
  423. data/src/ruby/ext/grpc/rb_server.c +2 -3
  424. data/src/ruby/ext/grpc/rb_server_credentials.c +16 -13
  425. data/src/ruby/ext/grpc/rb_signal.c +70 -0
  426. data/src/ruby/ext/grpc/rb_signal.h +39 -0
  427. data/src/ruby/lib/grpc.rb +21 -13
  428. data/src/ruby/lib/grpc/core/time_consts.rb +2 -2
  429. data/src/ruby/lib/grpc/errors.rb +2 -2
  430. data/src/ruby/lib/grpc/generic/active_call.rb +10 -3
  431. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -2
  432. data/src/ruby/lib/grpc/generic/client_stub.rb +10 -7
  433. data/src/ruby/lib/grpc/generic/rpc_desc.rb +2 -2
  434. data/src/ruby/lib/grpc/generic/rpc_server.rb +21 -61
  435. data/src/ruby/lib/grpc/generic/service.rb +5 -15
  436. data/src/ruby/lib/grpc/grpc.rb +3 -3
  437. data/src/ruby/{bin/interop/interop_server.rb → lib/grpc/signals.rb} +39 -20
  438. data/src/ruby/lib/grpc/version.rb +2 -2
  439. data/src/ruby/pb/generate_proto_ruby.sh +9 -2
  440. data/src/ruby/pb/grpc/health/checker.rb +1 -1
  441. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services.rb +28 -0
  442. data/src/ruby/pb/grpc/testing/metrics.rb +28 -0
  443. data/src/ruby/pb/grpc/testing/metrics_services.rb +27 -0
  444. data/src/ruby/pb/test/client.rb +12 -23
  445. data/src/ruby/pb/test/server.rb +1 -1
  446. data/src/ruby/spec/client_server_spec.rb +1 -1
  447. data/src/ruby/spec/generic/client_stub_spec.rb +18 -17
  448. data/src/ruby/spec/generic/rpc_server_spec.rb +23 -7
  449. data/src/ruby/spec/generic/service_spec.rb +0 -69
  450. data/src/ruby/{bin/interop/interop_client.rb → spec/pb/duplicate/codegen_spec.rb} +41 -21
  451. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  452. data/third_party/boringssl/crypto/asn1/a_bitstr.c +184 -176
  453. data/third_party/boringssl/crypto/asn1/a_bool.c +42 -44
  454. data/third_party/boringssl/crypto/asn1/a_bytes.c +236 -245
  455. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +173 -192
  456. data/third_party/boringssl/crypto/asn1/a_dup.c +43 -35
  457. data/third_party/boringssl/crypto/asn1/a_enum.c +107 -109
  458. data/third_party/boringssl/crypto/asn1/a_gentm.c +180 -181
  459. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +73 -80
  460. data/third_party/boringssl/crypto/asn1/a_int.c +357 -353
  461. data/third_party/boringssl/crypto/asn1/a_mbstr.c +272 -253
  462. data/third_party/boringssl/crypto/asn1/a_object.c +293 -309
  463. data/third_party/boringssl/crypto/asn1/a_octet.c +13 -6
  464. data/third_party/boringssl/crypto/asn1/a_print.c +54 -52
  465. data/third_party/boringssl/crypto/asn1/a_strnid.c +179 -157
  466. data/third_party/boringssl/crypto/asn1/a_time.c +125 -129
  467. data/third_party/boringssl/crypto/asn1/a_type.c +79 -86
  468. data/third_party/boringssl/crypto/asn1/a_utctm.c +246 -255
  469. data/third_party/boringssl/crypto/asn1/a_utf8.c +159 -135
  470. data/third_party/boringssl/crypto/asn1/asn1_lib.c +361 -368
  471. data/third_party/boringssl/crypto/asn1/asn1_locl.h +11 -11
  472. data/third_party/boringssl/crypto/asn1/asn1_par.c +309 -351
  473. data/third_party/boringssl/crypto/asn1/asn_pack.c +30 -29
  474. data/third_party/boringssl/crypto/asn1/bio_asn1.c +375 -394
  475. data/third_party/boringssl/crypto/asn1/bio_ndef.c +146 -149
  476. data/third_party/boringssl/crypto/asn1/f_enum.c +128 -134
  477. data/third_party/boringssl/crypto/asn1/f_int.c +131 -139
  478. data/third_party/boringssl/crypto/asn1/f_string.c +125 -133
  479. data/third_party/boringssl/crypto/asn1/t_bitst.c +30 -29
  480. data/third_party/boringssl/crypto/asn1/t_pkey.c +45 -47
  481. data/third_party/boringssl/crypto/asn1/tasn_dec.c +1099 -1216
  482. data/third_party/boringssl/crypto/asn1/tasn_enc.c +556 -592
  483. data/third_party/boringssl/crypto/asn1/tasn_fre.c +175 -193
  484. data/third_party/boringssl/crypto/asn1/tasn_new.c +271 -288
  485. data/third_party/boringssl/crypto/asn1/tasn_prn.c +462 -508
  486. data/third_party/boringssl/crypto/asn1/tasn_typ.c +28 -21
  487. data/third_party/boringssl/crypto/asn1/x_bignum.c +62 -52
  488. data/third_party/boringssl/crypto/asn1/x_long.c +101 -86
  489. data/third_party/boringssl/crypto/bio/buffer.c +3 -3
  490. data/third_party/boringssl/crypto/bn/asm/x86_64-gcc.c +8 -68
  491. data/third_party/boringssl/crypto/bn/bn.c +1 -1
  492. data/third_party/boringssl/crypto/bn/bn_asn1.c +9 -22
  493. data/third_party/boringssl/crypto/bn/convert.c +9 -4
  494. data/third_party/boringssl/crypto/bn/div.c +0 -20
  495. data/third_party/boringssl/crypto/bn/exponentiation.c +22 -13
  496. data/third_party/boringssl/crypto/bn/generic.c +6 -242
  497. data/third_party/boringssl/crypto/bn/internal.h +9 -70
  498. data/third_party/boringssl/crypto/bn/montgomery.c +1 -2
  499. data/third_party/boringssl/crypto/bn/mul.c +6 -26
  500. data/third_party/boringssl/crypto/bn/rsaz_exp.c +21 -28
  501. data/third_party/boringssl/crypto/bytestring/asn1_compat.c +51 -0
  502. data/third_party/boringssl/crypto/bytestring/ber.c +128 -87
  503. data/third_party/boringssl/crypto/bytestring/cbb.c +37 -3
  504. data/third_party/boringssl/crypto/bytestring/internal.h +39 -10
  505. data/third_party/boringssl/crypto/chacha/chacha_vec.c +18 -13
  506. data/third_party/boringssl/crypto/cipher/e_aes.c +2 -2
  507. data/third_party/boringssl/crypto/cipher/e_chacha20poly1305.c +4 -9
  508. data/third_party/boringssl/crypto/cipher/tls_cbc.c +39 -10
  509. data/third_party/boringssl/crypto/conf/conf.c +9 -0
  510. data/third_party/boringssl/crypto/cpu-intel.c +1 -1
  511. data/third_party/boringssl/crypto/crypto.c +2 -0
  512. data/third_party/boringssl/crypto/curve25519/curve25519.c +125 -120
  513. data/third_party/boringssl/crypto/curve25519/internal.h +45 -0
  514. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +225 -0
  515. data/third_party/boringssl/crypto/dh/check.c +32 -10
  516. data/third_party/boringssl/crypto/dh/dh.c +1 -1
  517. data/third_party/boringssl/crypto/digest/md32_common.h +0 -60
  518. data/third_party/boringssl/crypto/dsa/dsa.c +47 -21
  519. data/third_party/boringssl/crypto/dsa/dsa_asn1.c +249 -64
  520. data/third_party/boringssl/crypto/ec/ec.c +45 -31
  521. data/third_party/boringssl/crypto/ec/ec_asn1.c +315 -382
  522. data/third_party/boringssl/crypto/ec/ec_key.c +1 -4
  523. data/third_party/boringssl/crypto/ec/ec_montgomery.c +0 -9
  524. data/third_party/boringssl/crypto/ec/internal.h +1 -19
  525. data/third_party/boringssl/crypto/ec/oct.c +12 -0
  526. data/third_party/boringssl/crypto/ec/p224-64.c +4 -65
  527. data/third_party/boringssl/crypto/ec/p256-64.c +9 -71
  528. data/third_party/boringssl/crypto/ec/p256-x86_64-table.h +1 -6
  529. data/third_party/boringssl/crypto/ec/p256-x86_64.c +3 -13
  530. data/third_party/boringssl/crypto/ec/simple.c +0 -76
  531. data/third_party/boringssl/crypto/ecdsa/ecdsa.c +1 -1
  532. data/third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c +10 -24
  533. data/third_party/boringssl/crypto/evp/evp.c +4 -3
  534. data/third_party/boringssl/crypto/evp/evp_asn1.c +101 -0
  535. data/third_party/boringssl/crypto/evp/evp_ctx.c +22 -51
  536. data/third_party/boringssl/crypto/evp/internal.h +28 -27
  537. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +78 -249
  538. data/third_party/boringssl/crypto/evp/p_ec.c +19 -66
  539. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +74 -231
  540. data/third_party/boringssl/crypto/evp/p_rsa.c +90 -13
  541. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +49 -48
  542. data/third_party/boringssl/crypto/internal.h +16 -1
  543. data/third_party/boringssl/crypto/mem.c +2 -2
  544. data/third_party/boringssl/crypto/modes/ctr.c +2 -1
  545. data/third_party/boringssl/crypto/modes/gcm.c +5 -3
  546. data/third_party/boringssl/crypto/obj/obj_dat.h +6 -3
  547. data/third_party/boringssl/crypto/pem/pem_all.c +83 -102
  548. data/third_party/boringssl/crypto/pem/pem_info.c +286 -309
  549. data/third_party/boringssl/crypto/pem/pem_lib.c +690 -710
  550. data/third_party/boringssl/crypto/pem/pem_oth.c +15 -16
  551. data/third_party/boringssl/crypto/pem/pem_pk8.c +132 -119
  552. data/third_party/boringssl/crypto/pem/pem_pkey.c +144 -220
  553. data/third_party/boringssl/crypto/pem/pem_x509.c +3 -3
  554. data/third_party/boringssl/crypto/pem/pem_xaux.c +5 -4
  555. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +54 -60
  556. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +3 -1
  557. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +48 -50
  558. data/third_party/boringssl/crypto/rand/rand.c +2 -0
  559. data/third_party/boringssl/crypto/rsa/blinding.c +8 -48
  560. data/third_party/boringssl/crypto/rsa/internal.h +1 -9
  561. data/third_party/boringssl/crypto/rsa/padding.c +73 -77
  562. data/third_party/boringssl/crypto/rsa/rsa.c +1 -1
  563. data/third_party/boringssl/crypto/rsa/rsa_asn1.c +27 -46
  564. data/third_party/boringssl/crypto/rsa/rsa_impl.c +23 -34
  565. data/third_party/boringssl/crypto/test/scoped_types.h +3 -0
  566. data/third_party/boringssl/crypto/thread_win.c +15 -13
  567. data/third_party/boringssl/crypto/time_support.c +0 -6
  568. data/third_party/boringssl/crypto/x509/a_digest.c +26 -27
  569. data/third_party/boringssl/crypto/x509/a_sign.c +63 -64
  570. data/third_party/boringssl/crypto/x509/a_strex.c +482 -413
  571. data/third_party/boringssl/crypto/x509/a_verify.c +45 -51
  572. data/third_party/boringssl/crypto/x509/asn1_gen.c +715 -769
  573. data/third_party/boringssl/crypto/x509/by_dir.c +355 -393
  574. data/third_party/boringssl/crypto/x509/by_file.c +186 -206
  575. data/third_party/boringssl/crypto/x509/charmap.h +11 -11
  576. data/third_party/boringssl/crypto/x509/i2d_pr.c +21 -22
  577. data/third_party/boringssl/crypto/x509/t_crl.c +50 -51
  578. data/third_party/boringssl/crypto/x509/t_x509.c +414 -406
  579. data/third_party/boringssl/crypto/x509/t_x509a.c +44 -42
  580. data/third_party/boringssl/crypto/x509/vpm_int.h +13 -13
  581. data/third_party/boringssl/crypto/x509/x509_att.c +241 -219
  582. data/third_party/boringssl/crypto/x509/x509_cmp.c +343 -359
  583. data/third_party/boringssl/crypto/x509/x509_d2.c +36 -35
  584. data/third_party/boringssl/crypto/x509/x509_def.c +23 -13
  585. data/third_party/boringssl/crypto/x509/x509_ext.c +75 -75
  586. data/third_party/boringssl/crypto/x509/x509_lu.c +574 -612
  587. data/third_party/boringssl/crypto/x509/x509_obj.c +104 -115
  588. data/third_party/boringssl/crypto/x509/x509_r2x.c +40 -40
  589. data/third_party/boringssl/crypto/x509/x509_req.c +181 -174
  590. data/third_party/boringssl/crypto/x509/x509_set.c +71 -76
  591. data/third_party/boringssl/crypto/x509/x509_trs.c +193 -171
  592. data/third_party/boringssl/crypto/x509/x509_txt.c +135 -138
  593. data/third_party/boringssl/crypto/x509/x509_v3.c +174 -167
  594. data/third_party/boringssl/crypto/x509/x509_vfy.c +2079 -2130
  595. data/third_party/boringssl/crypto/x509/x509_vpm.c +486 -522
  596. data/third_party/boringssl/crypto/x509/x509cset.c +96 -99
  597. data/third_party/boringssl/crypto/x509/x509name.c +280 -275
  598. data/third_party/boringssl/crypto/x509/x509rset.c +15 -14
  599. data/third_party/boringssl/crypto/x509/x509spki.c +62 -60
  600. data/third_party/boringssl/crypto/x509/x509type.c +58 -60
  601. data/third_party/boringssl/crypto/x509/x_algor.c +70 -73
  602. data/third_party/boringssl/crypto/x509/x_all.c +282 -328
  603. data/third_party/boringssl/crypto/x509/x_attrib.c +36 -42
  604. data/third_party/boringssl/crypto/x509/x_crl.c +397 -418
  605. data/third_party/boringssl/crypto/x509/x_exten.c +5 -5
  606. data/third_party/boringssl/crypto/x509/x_info.c +30 -27
  607. data/third_party/boringssl/crypto/x509/x_name.c +387 -388
  608. data/third_party/boringssl/crypto/x509/x_pkey.c +32 -29
  609. data/third_party/boringssl/crypto/x509/x_pubkey.c +261 -280
  610. data/third_party/boringssl/crypto/x509/x_req.c +30 -33
  611. data/third_party/boringssl/crypto/x509/x_sig.c +2 -2
  612. data/third_party/boringssl/crypto/x509/x_spki.c +9 -7
  613. data/third_party/boringssl/crypto/x509/x_val.c +2 -2
  614. data/third_party/boringssl/crypto/x509/x_x509.c +120 -119
  615. data/third_party/boringssl/crypto/x509/x_x509a.c +99 -91
  616. data/third_party/boringssl/crypto/x509v3/ext_dat.h +57 -51
  617. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +199 -214
  618. data/third_party/boringssl/crypto/x509v3/pcy_data.c +57 -64
  619. data/third_party/boringssl/crypto/x509v3/pcy_int.h +95 -90
  620. data/third_party/boringssl/crypto/x509v3/pcy_lib.c +86 -87
  621. data/third_party/boringssl/crypto/x509v3/pcy_map.c +61 -64
  622. data/third_party/boringssl/crypto/x509v3/pcy_node.c +108 -117
  623. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +676 -724
  624. data/third_party/boringssl/crypto/x509v3/v3_akey.c +128 -136
  625. data/third_party/boringssl/crypto/x509v3/v3_akeya.c +7 -6
  626. data/third_party/boringssl/crypto/x509v3/v3_alt.c +499 -507
  627. data/third_party/boringssl/crypto/x509v3/v3_bcons.c +54 -47
  628. data/third_party/boringssl/crypto/x509v3/v3_bitst.c +67 -67
  629. data/third_party/boringssl/crypto/x509v3/v3_conf.c +330 -328
  630. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +354 -338
  631. data/third_party/boringssl/crypto/x509v3/v3_crld.c +441 -496
  632. data/third_party/boringssl/crypto/x509v3/v3_enum.c +35 -33
  633. data/third_party/boringssl/crypto/x509v3/v3_extku.c +66 -63
  634. data/third_party/boringssl/crypto/x509v3/v3_genn.c +157 -159
  635. data/third_party/boringssl/crypto/x509v3/v3_ia5.c +45 -43
  636. data/third_party/boringssl/crypto/x509v3/v3_info.c +124 -112
  637. data/third_party/boringssl/crypto/x509v3/v3_int.c +30 -26
  638. data/third_party/boringssl/crypto/x509v3/v3_lib.c +231 -204
  639. data/third_party/boringssl/crypto/x509v3/v3_ncons.c +353 -381
  640. data/third_party/boringssl/crypto/x509v3/v3_pci.c +252 -270
  641. data/third_party/boringssl/crypto/x509v3/v3_pcia.c +9 -8
  642. data/third_party/boringssl/crypto/x509v3/v3_pcons.c +58 -61
  643. data/third_party/boringssl/crypto/x509v3/v3_pku.c +35 -34
  644. data/third_party/boringssl/crypto/x509v3/v3_pmaps.c +72 -74
  645. data/third_party/boringssl/crypto/x509v3/v3_prn.c +146 -121
  646. data/third_party/boringssl/crypto/x509v3/v3_purp.c +651 -582
  647. data/third_party/boringssl/crypto/x509v3/v3_skey.c +76 -72
  648. data/third_party/boringssl/crypto/x509v3/v3_sxnet.c +139 -131
  649. data/third_party/boringssl/crypto/x509v3/v3_utl.c +1072 -1068
  650. data/third_party/boringssl/include/openssl/asn1.h +40 -38
  651. data/third_party/boringssl/include/openssl/base.h +10 -1
  652. data/third_party/boringssl/include/openssl/bio.h +10 -11
  653. data/third_party/boringssl/include/openssl/bn.h +12 -9
  654. data/third_party/boringssl/include/openssl/buf.h +1 -1
  655. data/third_party/boringssl/include/openssl/bytestring.h +29 -0
  656. data/third_party/boringssl/include/openssl/conf.h +25 -0
  657. data/third_party/boringssl/include/openssl/crypto.h +6 -1
  658. data/third_party/boringssl/include/openssl/curve25519.h +6 -3
  659. data/third_party/boringssl/include/openssl/dh.h +7 -3
  660. data/third_party/boringssl/include/openssl/dsa.h +108 -51
  661. data/third_party/boringssl/include/openssl/ec.h +46 -21
  662. data/third_party/boringssl/include/openssl/ec_key.h +78 -42
  663. data/third_party/boringssl/include/openssl/ecdsa.h +4 -4
  664. data/third_party/boringssl/include/openssl/err.h +3 -2
  665. data/third_party/boringssl/include/openssl/evp.h +120 -37
  666. data/third_party/boringssl/include/openssl/mem.h +4 -13
  667. data/third_party/boringssl/include/openssl/obj_mac.h +4 -0
  668. data/third_party/boringssl/include/openssl/pem.h +0 -9
  669. data/third_party/boringssl/include/openssl/pkcs8.h +6 -2
  670. data/third_party/boringssl/include/openssl/rand.h +3 -0
  671. data/third_party/boringssl/include/openssl/rsa.h +42 -42
  672. data/third_party/boringssl/include/openssl/ssl.h +115 -41
  673. data/third_party/boringssl/include/openssl/stack.h +0 -3
  674. data/third_party/boringssl/include/openssl/stack_macros.h +0 -256
  675. data/third_party/boringssl/include/openssl/tls1.h +1 -1
  676. data/third_party/boringssl/include/openssl/x509.h +0 -2
  677. data/third_party/boringssl/include/openssl/x509_vfy.h +5 -0
  678. data/third_party/boringssl/ssl/d1_both.c +102 -101
  679. data/third_party/boringssl/ssl/d1_clnt.c +145 -150
  680. data/third_party/boringssl/ssl/d1_lib.c +63 -62
  681. data/third_party/boringssl/ssl/d1_pkt.c +73 -71
  682. data/third_party/boringssl/ssl/d1_srvr.c +116 -125
  683. data/third_party/boringssl/ssl/dtls_record.c +3 -3
  684. data/third_party/boringssl/ssl/internal.h +210 -208
  685. data/third_party/boringssl/ssl/pqueue/pqueue.c +2 -2
  686. data/third_party/boringssl/ssl/s3_both.c +116 -130
  687. data/third_party/boringssl/ssl/s3_clnt.c +589 -740
  688. data/third_party/boringssl/ssl/s3_enc.c +52 -151
  689. data/third_party/boringssl/ssl/s3_lib.c +70 -76
  690. data/third_party/boringssl/ssl/s3_pkt.c +105 -144
  691. data/third_party/boringssl/ssl/s3_srvr.c +542 -806
  692. data/third_party/boringssl/ssl/ssl_aead_ctx.c +1 -1
  693. data/third_party/boringssl/ssl/ssl_cert.c +2 -2
  694. data/third_party/boringssl/ssl/ssl_cipher.c +7 -3
  695. data/third_party/boringssl/ssl/ssl_ecdh.c +374 -0
  696. data/third_party/boringssl/ssl/ssl_lib.c +260 -221
  697. data/third_party/boringssl/ssl/ssl_session.c +17 -17
  698. data/third_party/boringssl/ssl/t1_enc.c +128 -273
  699. data/third_party/boringssl/ssl/t1_lib.c +134 -258
  700. data/third_party/boringssl/ssl/test/test_config.h +2 -0
  701. data/third_party/boringssl/ssl/tls_record.c +52 -15
  702. metadata +385 -359
  703. data/src/core/channel/client_uchannel.c +0 -243
  704. data/src/core/channel/client_uchannel.h +0 -60
  705. data/src/core/channel/connected_channel.h +0 -51
  706. data/src/core/client_config/lb_policies/pick_first.h +0 -43
  707. data/src/core/client_config/resolvers/dns_resolver.h +0 -42
  708. data/src/core/client_config/subchannel_factory.h +0 -66
  709. data/src/core/httpcli/parser.c +0 -211
  710. data/src/core/iomgr/fd_posix.c +0 -451
  711. data/src/core/iomgr/fd_posix.h +0 -192
  712. data/src/core/iomgr/pollset_multipoller_with_epoll.c +0 -324
  713. data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +0 -234
  714. data/src/core/iomgr/pollset_posix.c +0 -633
  715. data/src/core/iomgr/pollset_posix.h +0 -153
  716. data/src/core/iomgr/pollset_set_posix.c +0 -202
  717. data/src/core/iomgr/pollset_set_posix.h +0 -45
  718. data/src/core/surface/init.c +0 -174
  719. data/src/core/surface/init_secure.c +0 -42
  720. data/src/core/surface/server_create.c +0 -48
  721. data/src/core/transport/chttp2/huffsyms.c +0 -297
  722. data/src/ruby/bin/grpc_ruby_interop_client +0 -33
  723. data/src/ruby/bin/grpc_ruby_interop_server +0 -33
  724. data/third_party/boringssl/crypto/dsa/internal.h +0 -78
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  *
3
- * Copyright 2015-2016, Google Inc.
3
+ * Copyright 2015, Google Inc.
4
4
  * All rights reserved.
5
5
  *
6
6
  * Redistribution and use in source and binary forms, with or without
@@ -31,8 +31,8 @@
31
31
  *
32
32
  */
33
33
 
34
- #ifndef GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_BIN_ENCODER_H
35
- #define GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_BIN_ENCODER_H
34
+ #ifndef GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_BIN_ENCODER_H
35
+ #define GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_BIN_ENCODER_H
36
36
 
37
37
  #include <grpc/support/slice.h>
38
38
 
@@ -49,6 +49,6 @@ gpr_slice grpc_chttp2_huffman_compress(gpr_slice input);
49
49
  gpr_slice y = grpc_chttp2_huffman_compress(x);
50
50
  gpr_slice_unref(x);
51
51
  return y; */
52
- gpr_slice grpc_chttp2_base64_encode_and_huffman_compress(gpr_slice input);
52
+ gpr_slice grpc_chttp2_base64_encode_and_huffman_compress_impl(gpr_slice input);
53
53
 
54
- #endif /* GRPC_INTERNAL_CORE_TRANSPORT_CHTTP2_BIN_ENCODER_H */
54
+ #endif /* GRPC_CORE_EXT_TRANSPORT_CHTTP2_TRANSPORT_BIN_ENCODER_H */
@@ -0,0 +1,46 @@
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/ext/transport/chttp2/transport/bin_encoder.h"
35
+ #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
36
+ #include "src/core/lib/debug/trace.h"
37
+ #include "src/core/lib/transport/metadata.h"
38
+
39
+ void grpc_chttp2_plugin_init(void) {
40
+ grpc_chttp2_base64_encode_and_huffman_compress =
41
+ grpc_chttp2_base64_encode_and_huffman_compress_impl;
42
+ grpc_register_tracer("http", &grpc_http_trace);
43
+ grpc_register_tracer("flowctl", &grpc_flowctl_trace);
44
+ }
45
+
46
+ void grpc_chttp2_plugin_shutdown(void) {}
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  *
3
- * Copyright 2015-2016, Google Inc.
3
+ * Copyright 2015, Google Inc.
4
4
  * All rights reserved.
5
5
  *
6
6
  * Redistribution and use in source and binary forms, with or without
@@ -31,7 +31,7 @@
31
31
  *
32
32
  */
33
33
 
34
- #include "src/core/transport/chttp2_transport.h"
34
+ #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
35
35
 
36
36
  #include <math.h>
37
37
  #include <stdio.h>
@@ -43,14 +43,14 @@
43
43
  #include <grpc/support/string_util.h>
44
44
  #include <grpc/support/useful.h>
45
45
 
46
- #include "src/core/profiling/timers.h"
47
- #include "src/core/support/string.h"
48
- #include "src/core/transport/chttp2/http2_errors.h"
49
- #include "src/core/transport/chttp2/internal.h"
50
- #include "src/core/transport/chttp2/status_conversion.h"
51
- #include "src/core/transport/chttp2/timeout_encoding.h"
52
- #include "src/core/transport/static_metadata.h"
53
- #include "src/core/transport/transport_impl.h"
46
+ #include "src/core/ext/transport/chttp2/transport/http2_errors.h"
47
+ #include "src/core/ext/transport/chttp2/transport/internal.h"
48
+ #include "src/core/ext/transport/chttp2/transport/status_conversion.h"
49
+ #include "src/core/ext/transport/chttp2/transport/timeout_encoding.h"
50
+ #include "src/core/lib/profiling/timers.h"
51
+ #include "src/core/lib/support/string.h"
52
+ #include "src/core/lib/transport/static_metadata.h"
53
+ #include "src/core/lib/transport/transport_impl.h"
54
54
 
55
55
  #define DEFAULT_WINDOW 65535
56
56
  #define DEFAULT_CONNECTION_WINDOW_TARGET (1024 * 1024)
@@ -81,27 +81,25 @@ int grpc_flowctl_trace = 0;
81
81
 
82
82
  static const grpc_transport_vtable vtable;
83
83
 
84
- static void lock(grpc_chttp2_transport *t);
85
- static void unlock(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t);
86
-
87
84
  /* forward declarations of various callbacks that we'll build closures around */
88
85
  static void writing_action(grpc_exec_ctx *exec_ctx, void *t,
89
86
  bool iomgr_success_ignored);
87
+ static void reading_action(grpc_exec_ctx *exec_ctx, void *t,
88
+ bool iomgr_success_ignored);
89
+ static void parsing_action(grpc_exec_ctx *exec_ctx, void *t,
90
+ bool iomgr_success_ignored);
90
91
 
91
92
  /** Set a transport level setting, and push it to our peer */
92
93
  static void push_setting(grpc_chttp2_transport *t, grpc_chttp2_setting_id id,
93
94
  uint32_t value);
94
95
 
95
- /** Endpoint callback to process incoming data */
96
- static void recv_data(grpc_exec_ctx *exec_ctx, void *tp, bool success);
97
-
98
96
  /** Start disconnection chain */
99
97
  static void drop_connection(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t);
100
98
 
101
99
  /** Perform a transport_op */
102
- static void perform_stream_op_locked(
103
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
104
- grpc_chttp2_stream_global *stream_global, grpc_transport_stream_op *op);
100
+ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx,
101
+ grpc_chttp2_transport *t,
102
+ grpc_chttp2_stream *s, void *transport_op);
105
103
 
106
104
  /** Cancel a stream: coming from the transport API */
107
105
  static void cancel_from_api(grpc_exec_ctx *exec_ctx,
@@ -118,15 +116,19 @@ static void close_from_api(grpc_exec_ctx *exec_ctx,
118
116
  /** Add endpoint from this transport to pollset */
119
117
  static void add_to_pollset_locked(grpc_exec_ctx *exec_ctx,
120
118
  grpc_chttp2_transport *t,
121
- grpc_pollset *pollset);
119
+ grpc_chttp2_stream *s_ignored, void *pollset);
122
120
  static void add_to_pollset_set_locked(grpc_exec_ctx *exec_ctx,
123
121
  grpc_chttp2_transport *t,
124
- grpc_pollset_set *pollset_set);
122
+ grpc_chttp2_stream *s_ignored,
123
+ void *pollset_set);
125
124
 
126
125
  /** Start new streams that have been created if we can */
127
126
  static void maybe_start_some_streams(
128
127
  grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global);
129
128
 
129
+ static void finish_global_actions(grpc_exec_ctx *exec_ctx,
130
+ grpc_chttp2_transport *t);
131
+
130
132
  static void connectivity_state_set(
131
133
  grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
132
134
  grpc_connectivity_state state, const char *reason);
@@ -138,7 +140,10 @@ static void incoming_byte_stream_update_flow_control(
138
140
  grpc_chttp2_transport_global *transport_global,
139
141
  grpc_chttp2_stream_global *stream_global, size_t max_size_hint,
140
142
  size_t have_already);
141
-
143
+ static void incoming_byte_stream_destroy_locked(grpc_exec_ctx *exec_ctx,
144
+ grpc_chttp2_transport *t,
145
+ grpc_chttp2_stream *s,
146
+ void *byte_stream);
142
147
  static void fail_pending_writes(grpc_exec_ctx *exec_ctx,
143
148
  grpc_chttp2_stream_global *stream_global);
144
149
 
@@ -150,7 +155,7 @@ static void destruct_transport(grpc_exec_ctx *exec_ctx,
150
155
  grpc_chttp2_transport *t) {
151
156
  size_t i;
152
157
 
153
- gpr_mu_lock(&t->mu);
158
+ gpr_mu_lock(&t->executor.mu);
154
159
 
155
160
  GPR_ASSERT(t->ep == NULL);
156
161
 
@@ -176,8 +181,8 @@ static void destruct_transport(grpc_exec_ctx *exec_ctx,
176
181
  grpc_chttp2_stream_map_destroy(&t->new_stream_map);
177
182
  grpc_connectivity_state_destroy(exec_ctx, &t->channel_callback.state_tracker);
178
183
 
179
- gpr_mu_unlock(&t->mu);
180
- gpr_mu_destroy(&t->mu);
184
+ gpr_mu_unlock(&t->executor.mu);
185
+ gpr_mu_destroy(&t->executor.mu);
181
186
 
182
187
  /* callback remaining pings: they're not allowed to call into the transpot,
183
188
  and maybe they hold resources that need to be freed */
@@ -238,7 +243,7 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
238
243
  gpr_ref_init(&t->refs, 2);
239
244
  /* ref is dropped at transport close() */
240
245
  gpr_ref_init(&t->shutdown_ep_refs, 1);
241
- gpr_mu_init(&t->mu);
246
+ gpr_mu_init(&t->executor.mu);
242
247
  t->peer_string = grpc_endpoint_get_peer(ep);
243
248
  t->endpoint_reading = 1;
244
249
  t->global.next_stream_id = is_client ? 1 : 2;
@@ -262,6 +267,8 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
262
267
  gpr_slice_buffer_init(&t->writing.outbuf);
263
268
  grpc_chttp2_hpack_compressor_init(&t->writing.hpack_compressor);
264
269
  grpc_closure_init(&t->writing_action, writing_action, t);
270
+ grpc_closure_init(&t->reading_action, reading_action, t);
271
+ grpc_closure_init(&t->parsing_action, parsing_action, t);
265
272
 
266
273
  gpr_slice_buffer_init(&t->parsing.qbuf);
267
274
  grpc_chttp2_goaway_parser_init(&t->parsing.goaway_parser);
@@ -269,7 +276,6 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
269
276
 
270
277
  grpc_closure_init(&t->writing.done_cb, grpc_chttp2_terminate_writing,
271
278
  &t->writing);
272
- grpc_closure_init(&t->recv_data, recv_data, t);
273
279
  gpr_slice_buffer_init(&t->read_buffer);
274
280
 
275
281
  if (is_client) {
@@ -377,14 +383,18 @@ static void init_transport(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
377
383
  }
378
384
  }
379
385
 
380
- static void destroy_transport(grpc_exec_ctx *exec_ctx, grpc_transport *gt) {
381
- grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
382
-
383
- lock(t);
386
+ static void destroy_transport_locked(grpc_exec_ctx *exec_ctx,
387
+ grpc_chttp2_transport *t,
388
+ grpc_chttp2_stream *s_ignored,
389
+ void *arg_ignored) {
384
390
  t->destroying = 1;
385
391
  drop_connection(exec_ctx, t);
386
- unlock(exec_ctx, t);
392
+ }
387
393
 
394
+ static void destroy_transport(grpc_exec_ctx *exec_ctx, grpc_transport *gt) {
395
+ grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
396
+ grpc_chttp2_run_with_global_lock(exec_ctx, t, NULL, destroy_transport_locked,
397
+ NULL, 0);
388
398
  UNREF_TRANSPORT(exec_ctx, t, "destroy");
389
399
  }
390
400
 
@@ -404,17 +414,6 @@ static void allow_endpoint_shutdown_locked(grpc_exec_ctx *exec_ctx,
404
414
  }
405
415
  }
406
416
 
407
- static void allow_endpoint_shutdown_unlocked(grpc_exec_ctx *exec_ctx,
408
- grpc_chttp2_transport *t) {
409
- if (gpr_unref(&t->shutdown_ep_refs)) {
410
- gpr_mu_lock(&t->mu);
411
- if (t->ep) {
412
- grpc_endpoint_shutdown(exec_ctx, t->ep);
413
- }
414
- gpr_mu_unlock(&t->mu);
415
- }
416
- }
417
-
418
417
  static void destroy_endpoint(grpc_exec_ctx *exec_ctx,
419
418
  grpc_chttp2_transport *t) {
420
419
  grpc_endpoint_destroy(exec_ctx, t->ep);
@@ -424,7 +423,9 @@ static void destroy_endpoint(grpc_exec_ctx *exec_ctx,
424
423
  }
425
424
 
426
425
  static void close_transport_locked(grpc_exec_ctx *exec_ctx,
427
- grpc_chttp2_transport *t) {
426
+ grpc_chttp2_transport *t,
427
+ grpc_chttp2_stream *s_ignored,
428
+ void *arg_ignored) {
428
429
  if (!t->closed) {
429
430
  t->closed = 1;
430
431
  connectivity_state_set(exec_ctx, &t->global, GRPC_CHANNEL_FATAL_FAILURE,
@@ -464,6 +465,13 @@ void grpc_chttp2_stream_unref(grpc_exec_ctx *exec_ctx,
464
465
  }
465
466
  #endif
466
467
 
468
+ static void finish_init_stream_locked(grpc_exec_ctx *exec_ctx,
469
+ grpc_chttp2_transport *t,
470
+ grpc_chttp2_stream *s,
471
+ void *arg_ignored) {
472
+ grpc_chttp2_register_stream(t, s);
473
+ }
474
+
467
475
  static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
468
476
  grpc_stream *gs, grpc_stream_refcount *refcount,
469
477
  const void *server_data) {
@@ -473,6 +481,10 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
473
481
  memset(s, 0, sizeof(*s));
474
482
 
475
483
  s->refcount = refcount;
484
+ /* We reserve one 'active stream' that's dropped when the stream is
485
+ read-closed. The others are for incoming_byte_streams that are actively
486
+ reading */
487
+ gpr_ref_init(&s->global.active_streams, 1);
476
488
  GRPC_CHTTP2_STREAM_REF(&s->global, "chttp2");
477
489
 
478
490
  grpc_chttp2_incoming_metadata_buffer_init(&s->parsing.metadata_buffer[0]);
@@ -486,10 +498,8 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
486
498
 
487
499
  REF_TRANSPORT(t, "stream");
488
500
 
489
- lock(t);
490
- grpc_chttp2_register_stream(t, s);
491
501
  if (server_data) {
492
- GPR_ASSERT(t->parsing_active);
502
+ GPR_ASSERT(t->executor.parsing_active);
493
503
  s->global.id = (uint32_t)(uintptr_t)server_data;
494
504
  s->parsing.id = s->global.id;
495
505
  s->global.outgoing_window =
@@ -502,40 +512,42 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
502
512
  grpc_chttp2_stream_map_add(&t->parsing_stream_map, s->global.id, s);
503
513
  s->global.in_stream_map = 1;
504
514
  }
505
- unlock(exec_ctx, t);
515
+
516
+ grpc_chttp2_run_with_global_lock(exec_ctx, t, s, finish_init_stream_locked,
517
+ NULL, 0);
506
518
 
507
519
  return 0;
508
520
  }
509
521
 
510
- static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
511
- grpc_stream *gs) {
512
- grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
513
- grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs;
514
- int i;
522
+ static void destroy_stream_locked(grpc_exec_ctx *exec_ctx,
523
+ grpc_chttp2_transport *t,
524
+ grpc_chttp2_stream *s, void *arg) {
515
525
  grpc_byte_stream *bs;
516
526
 
517
527
  GPR_TIMER_BEGIN("destroy_stream", 0);
518
528
 
519
- gpr_mu_lock(&t->mu);
520
-
521
529
  GPR_ASSERT((s->global.write_closed && s->global.read_closed) ||
522
530
  s->global.id == 0);
523
531
  GPR_ASSERT(!s->global.in_stream_map);
524
532
  if (grpc_chttp2_unregister_stream(t, s) && t->global.sent_goaway) {
525
- close_transport_locked(exec_ctx, t);
533
+ close_transport_locked(exec_ctx, t, NULL, NULL);
526
534
  }
527
- if (!t->parsing_active && s->global.id) {
535
+ if (!t->executor.parsing_active && s->global.id) {
528
536
  GPR_ASSERT(grpc_chttp2_stream_map_find(&t->parsing_stream_map,
529
537
  s->global.id) == NULL);
530
538
  }
531
539
 
540
+ while (
541
+ (bs = grpc_chttp2_incoming_frame_queue_pop(&s->global.incoming_frames))) {
542
+ incoming_byte_stream_destroy_locked(exec_ctx, NULL, NULL, bs);
543
+ }
544
+
532
545
  grpc_chttp2_list_remove_unannounced_incoming_window_available(&t->global,
533
546
  &s->global);
534
547
  grpc_chttp2_list_remove_stalled_by_transport(&t->global, &s->global);
548
+ grpc_chttp2_list_remove_check_read_ops(&t->global, &s->global);
535
549
 
536
- gpr_mu_unlock(&t->mu);
537
-
538
- for (i = 0; i < STREAM_LIST_COUNT; i++) {
550
+ for (int i = 0; i < STREAM_LIST_COUNT; i++) {
539
551
  if (s->included[i]) {
540
552
  gpr_log(GPR_ERROR, "%s stream %d still included in list %d",
541
553
  t->global.is_client ? "client" : "server", s->global.id, i);
@@ -543,11 +555,6 @@ static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
543
555
  }
544
556
  }
545
557
 
546
- while (
547
- (bs = grpc_chttp2_incoming_frame_queue_pop(&s->global.incoming_frames))) {
548
- grpc_byte_stream_destroy(exec_ctx, bs);
549
- }
550
-
551
558
  GPR_ASSERT(s->global.send_initial_metadata_finished == NULL);
552
559
  GPR_ASSERT(s->global.send_message_finished == NULL);
553
560
  GPR_ASSERT(s->global.send_trailing_metadata_finished == NULL);
@@ -566,6 +573,17 @@ static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
566
573
  UNREF_TRANSPORT(exec_ctx, t, "stream");
567
574
 
568
575
  GPR_TIMER_END("destroy_stream", 0);
576
+
577
+ gpr_free(arg);
578
+ }
579
+
580
+ static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
581
+ grpc_stream *gs, void *and_free_memory) {
582
+ grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
583
+ grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs;
584
+
585
+ grpc_chttp2_run_with_global_lock(exec_ctx, t, s, destroy_stream_locked,
586
+ and_free_memory, 0);
569
587
  }
570
588
 
571
589
  grpc_chttp2_stream_parsing *grpc_chttp2_parsing_lookup_stream(
@@ -594,28 +612,96 @@ grpc_chttp2_stream_parsing *grpc_chttp2_parsing_accept_stream(
594
612
  * LOCK MANAGEMENT
595
613
  */
596
614
 
597
- /* We take a grpc_chttp2_transport-global lock in response to calls coming in
598
- from above,
599
- and in response to data being received from below. New data to be written
600
- is always queued, as are callbacks to process data. During unlock() we
601
- check our todo lists and initiate callbacks and flush writes. */
602
-
603
- static void lock(grpc_chttp2_transport *t) { gpr_mu_lock(&t->mu); }
604
-
605
- static void unlock(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t) {
606
- GPR_TIMER_BEGIN("unlock", 0);
607
- if (!t->writing_active && !t->closed &&
608
- grpc_chttp2_unlocking_check_writes(exec_ctx, &t->global, &t->writing,
609
- t->parsing_active)) {
610
- t->writing_active = 1;
611
- REF_TRANSPORT(t, "writing");
612
- grpc_exec_ctx_enqueue(exec_ctx, &t->writing_action, true, NULL);
613
- prevent_endpoint_shutdown(t);
615
+ static void finish_global_actions(grpc_exec_ctx *exec_ctx,
616
+ grpc_chttp2_transport *t) {
617
+ grpc_chttp2_executor_action_header *hdr;
618
+ grpc_chttp2_executor_action_header *next;
619
+
620
+ for (;;) {
621
+ if (!t->executor.writing_active && !t->closed &&
622
+ grpc_chttp2_unlocking_check_writes(exec_ctx, &t->global, &t->writing,
623
+ t->executor.parsing_active)) {
624
+ t->executor.writing_active = 1;
625
+ REF_TRANSPORT(t, "writing");
626
+ prevent_endpoint_shutdown(t);
627
+ grpc_exec_ctx_enqueue(exec_ctx, &t->writing_action, true, NULL);
628
+ }
629
+ check_read_ops(exec_ctx, &t->global);
630
+
631
+ gpr_mu_lock(&t->executor.mu);
632
+ if (t->executor.pending_actions_head != NULL) {
633
+ hdr = t->executor.pending_actions_head;
634
+ t->executor.pending_actions_head = t->executor.pending_actions_tail =
635
+ NULL;
636
+ gpr_mu_unlock(&t->executor.mu);
637
+ while (hdr != NULL) {
638
+ hdr->action(exec_ctx, t, hdr->stream, hdr->arg);
639
+ next = hdr->next;
640
+ gpr_free(hdr);
641
+ UNREF_TRANSPORT(exec_ctx, t, "pending_action");
642
+ hdr = next;
643
+ }
644
+ continue;
645
+ } else {
646
+ t->executor.global_active = false;
647
+ }
648
+ gpr_mu_unlock(&t->executor.mu);
649
+ break;
650
+ }
651
+ }
652
+
653
+ void grpc_chttp2_run_with_global_lock(grpc_exec_ctx *exec_ctx,
654
+ grpc_chttp2_transport *t,
655
+ grpc_chttp2_stream *optional_stream,
656
+ grpc_chttp2_locked_action action,
657
+ void *arg, size_t sizeof_arg) {
658
+ grpc_chttp2_executor_action_header *hdr;
659
+
660
+ REF_TRANSPORT(t, "run_global");
661
+ gpr_mu_lock(&t->executor.mu);
662
+
663
+ for (;;) {
664
+ if (!t->executor.global_active) {
665
+ t->executor.global_active = 1;
666
+ gpr_mu_unlock(&t->executor.mu);
667
+
668
+ action(exec_ctx, t, optional_stream, arg);
669
+
670
+ finish_global_actions(exec_ctx, t);
671
+ } else {
672
+ gpr_mu_unlock(&t->executor.mu);
673
+
674
+ hdr = gpr_malloc(sizeof(*hdr) + sizeof_arg);
675
+ hdr->stream = optional_stream;
676
+ hdr->action = action;
677
+ if (sizeof_arg == 0) {
678
+ hdr->arg = arg;
679
+ } else {
680
+ hdr->arg = hdr + 1;
681
+ memcpy(hdr->arg, arg, sizeof_arg);
682
+ }
683
+
684
+ gpr_mu_lock(&t->executor.mu);
685
+ if (!t->executor.global_active) {
686
+ /* global lock was released while allocating memory: release & retry */
687
+ gpr_free(hdr);
688
+ continue;
689
+ }
690
+ hdr->next = NULL;
691
+ if (t->executor.pending_actions_head != NULL) {
692
+ t->executor.pending_actions_tail =
693
+ t->executor.pending_actions_tail->next = hdr;
694
+ } else {
695
+ t->executor.pending_actions_tail = t->executor.pending_actions_head =
696
+ hdr;
697
+ }
698
+ REF_TRANSPORT(t, "pending_action");
699
+ gpr_mu_unlock(&t->executor.mu);
700
+ }
701
+ break;
614
702
  }
615
- check_read_ops(exec_ctx, &t->global);
616
703
 
617
- gpr_mu_unlock(&t->mu);
618
- GPR_TIMER_END("unlock", 0);
704
+ UNREF_TRANSPORT(exec_ctx, t, "run_global");
619
705
  }
620
706
 
621
707
  /*******************************************************************************
@@ -645,15 +731,11 @@ static void push_setting(grpc_chttp2_transport *t, grpc_chttp2_setting_id id,
645
731
  }
646
732
  }
647
733
 
648
- void grpc_chttp2_terminate_writing(grpc_exec_ctx *exec_ctx,
649
- void *transport_writing_ptr, bool success) {
650
- grpc_chttp2_transport_writing *transport_writing = transport_writing_ptr;
651
- grpc_chttp2_transport *t = TRANSPORT_FROM_WRITING(transport_writing);
652
- grpc_chttp2_stream_global *stream_global;
653
-
654
- GPR_TIMER_BEGIN("grpc_chttp2_terminate_writing", 0);
655
-
656
- lock(t);
734
+ static void terminate_writing_with_lock(grpc_exec_ctx *exec_ctx,
735
+ grpc_chttp2_transport *t,
736
+ grpc_chttp2_stream *s_ignored,
737
+ void *a) {
738
+ bool success = (bool)(uintptr_t)a;
657
739
 
658
740
  allow_endpoint_shutdown_locked(exec_ctx, t);
659
741
 
@@ -663,24 +745,30 @@ void grpc_chttp2_terminate_writing(grpc_exec_ctx *exec_ctx,
663
745
 
664
746
  grpc_chttp2_cleanup_writing(exec_ctx, &t->global, &t->writing);
665
747
 
748
+ grpc_chttp2_stream_global *stream_global;
666
749
  while (grpc_chttp2_list_pop_closed_waiting_for_writing(&t->global,
667
750
  &stream_global)) {
668
751
  fail_pending_writes(exec_ctx, stream_global);
669
752
  GRPC_CHTTP2_STREAM_UNREF(exec_ctx, stream_global, "finish_writes");
670
753
  }
671
754
 
672
- /* leave the writing flag up on shutdown to prevent further writes in unlock()
755
+ /* leave the writing flag up on shutdown to prevent further writes in
756
+ unlock()
673
757
  from starting */
674
- t->writing_active = 0;
758
+ t->executor.writing_active = 0;
675
759
  if (t->ep && !t->endpoint_reading) {
676
760
  destroy_endpoint(exec_ctx, t);
677
761
  }
678
762
 
679
- unlock(exec_ctx, t);
680
-
681
763
  UNREF_TRANSPORT(exec_ctx, t, "writing");
764
+ }
682
765
 
683
- GPR_TIMER_END("grpc_chttp2_terminate_writing", 0);
766
+ void grpc_chttp2_terminate_writing(grpc_exec_ctx *exec_ctx,
767
+ void *transport_writing, bool success) {
768
+ grpc_chttp2_transport *t = TRANSPORT_FROM_WRITING(transport_writing);
769
+ grpc_chttp2_run_with_global_lock(exec_ctx, t, NULL,
770
+ terminate_writing_with_lock,
771
+ (void *)(uintptr_t)success, 0);
684
772
  }
685
773
 
686
774
  static void writing_action(grpc_exec_ctx *exec_ctx, void *gt,
@@ -695,7 +783,8 @@ void grpc_chttp2_add_incoming_goaway(
695
783
  grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
696
784
  uint32_t goaway_error, gpr_slice goaway_text) {
697
785
  char *msg = gpr_dump_slice(goaway_text, GPR_DUMP_HEX | GPR_DUMP_ASCII);
698
- gpr_log(GPR_DEBUG, "got goaway [%d]: %s", goaway_error, msg);
786
+ GRPC_CHTTP2_IF_TRACING(
787
+ gpr_log(GPR_DEBUG, "got goaway [%d]: %s", goaway_error, msg));
699
788
  gpr_free(msg);
700
789
  gpr_slice_unref(goaway_text);
701
790
  transport_global->seen_goaway = 1;
@@ -758,23 +847,35 @@ static void maybe_start_some_streams(
758
847
  }
759
848
  }
760
849
 
850
+ #define CLOSURE_BARRIER_STATS_BIT (1 << 0)
851
+ #define CLOSURE_BARRIER_FAILURE_BIT (1 << 1)
852
+ #define CLOSURE_BARRIER_FIRST_REF_BIT (1 << 16)
853
+
761
854
  static grpc_closure *add_closure_barrier(grpc_closure *closure) {
762
- closure->final_data += 2;
855
+ closure->final_data += CLOSURE_BARRIER_FIRST_REF_BIT;
763
856
  return closure;
764
857
  }
765
858
 
766
859
  void grpc_chttp2_complete_closure_step(grpc_exec_ctx *exec_ctx,
860
+ grpc_chttp2_stream_global *stream_global,
767
861
  grpc_closure **pclosure, int success) {
768
862
  grpc_closure *closure = *pclosure;
769
863
  if (closure == NULL) {
770
864
  return;
771
865
  }
772
- closure->final_data -= 2;
866
+ closure->final_data -= CLOSURE_BARRIER_FIRST_REF_BIT;
773
867
  if (!success) {
774
- closure->final_data |= 1;
868
+ closure->final_data |= CLOSURE_BARRIER_FAILURE_BIT;
775
869
  }
776
- if (closure->final_data < 2) {
777
- grpc_exec_ctx_enqueue(exec_ctx, closure, closure->final_data == 0, NULL);
870
+ if (closure->final_data < CLOSURE_BARRIER_FIRST_REF_BIT) {
871
+ if (closure->final_data & CLOSURE_BARRIER_STATS_BIT) {
872
+ grpc_transport_move_stats(&stream_global->stats,
873
+ stream_global->collecting_stats);
874
+ stream_global->collecting_stats = NULL;
875
+ }
876
+ grpc_exec_ctx_enqueue(
877
+ exec_ctx, closure,
878
+ (closure->final_data & CLOSURE_BARRIER_FAILURE_BIT) == 0, NULL);
778
879
  }
779
880
  *pclosure = NULL;
780
881
  }
@@ -794,20 +895,28 @@ static int contains_non_ok_status(
794
895
 
795
896
  static void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, bool success) {}
796
897
 
797
- static void perform_stream_op_locked(
798
- grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
799
- grpc_chttp2_stream_global *stream_global, grpc_transport_stream_op *op) {
800
- grpc_closure *on_complete;
801
-
898
+ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx,
899
+ grpc_chttp2_transport *t,
900
+ grpc_chttp2_stream *s, void *stream_op) {
802
901
  GPR_TIMER_BEGIN("perform_stream_op_locked", 0);
803
902
 
804
- on_complete = op->on_complete;
903
+ grpc_transport_stream_op *op = stream_op;
904
+ grpc_chttp2_transport_global *transport_global = &t->global;
905
+ grpc_chttp2_stream_global *stream_global = &s->global;
906
+
907
+ grpc_closure *on_complete = op->on_complete;
805
908
  if (on_complete == NULL) {
806
909
  on_complete = grpc_closure_create(do_nothing, NULL);
807
910
  }
808
911
  /* use final_data as a barrier until enqueue time; the inital counter is
809
912
  dropped at the end of this function */
810
- on_complete->final_data = 2;
913
+ on_complete->final_data = CLOSURE_BARRIER_FIRST_REF_BIT;
914
+
915
+ if (op->collect_stats != NULL) {
916
+ GPR_ASSERT(stream_global->collecting_stats == NULL);
917
+ stream_global->collecting_stats = op->collect_stats;
918
+ on_complete->final_data |= CLOSURE_BARRIER_STATS_BIT;
919
+ }
811
920
 
812
921
  if (op->cancel_with_status != GRPC_STATUS_OK) {
813
922
  cancel_from_api(exec_ctx, transport_global, stream_global,
@@ -840,7 +949,8 @@ static void perform_stream_op_locked(
840
949
  }
841
950
  } else {
842
951
  grpc_chttp2_complete_closure_step(
843
- exec_ctx, &stream_global->send_initial_metadata_finished, 0);
952
+ exec_ctx, stream_global,
953
+ &stream_global->send_initial_metadata_finished, 0);
844
954
  }
845
955
  }
846
956
 
@@ -850,10 +960,12 @@ static void perform_stream_op_locked(
850
960
  stream_global->send_message_finished = add_closure_barrier(on_complete);
851
961
  if (stream_global->write_closed) {
852
962
  grpc_chttp2_complete_closure_step(
853
- exec_ctx, &stream_global->send_message_finished, 0);
854
- } else if (stream_global->id != 0) {
963
+ exec_ctx, stream_global, &stream_global->send_message_finished, 0);
964
+ } else {
855
965
  stream_global->send_message = op->send_message;
856
- grpc_chttp2_become_writable(transport_global, stream_global);
966
+ if (stream_global->id != 0) {
967
+ grpc_chttp2_become_writable(transport_global, stream_global);
968
+ }
857
969
  }
858
970
  }
859
971
 
@@ -868,7 +980,8 @@ static void perform_stream_op_locked(
868
980
  }
869
981
  if (stream_global->write_closed) {
870
982
  grpc_chttp2_complete_closure_step(
871
- exec_ctx, &stream_global->send_trailing_metadata_finished,
983
+ exec_ctx, stream_global,
984
+ &stream_global->send_trailing_metadata_finished,
872
985
  grpc_metadata_batch_is_empty(op->send_trailing_metadata));
873
986
  } else if (stream_global->id != 0) {
874
987
  /* TODO(ctiller): check if there's flow control for any outstanding
@@ -907,7 +1020,7 @@ static void perform_stream_op_locked(
907
1020
  grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
908
1021
  }
909
1022
 
910
- grpc_chttp2_complete_closure_step(exec_ctx, &on_complete, 1);
1023
+ grpc_chttp2_complete_closure_step(exec_ctx, stream_global, &on_complete, 1);
911
1024
 
912
1025
  GPR_TIMER_END("perform_stream_op_locked", 0);
913
1026
  }
@@ -916,10 +1029,8 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
916
1029
  grpc_stream *gs, grpc_transport_stream_op *op) {
917
1030
  grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
918
1031
  grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs;
919
-
920
- lock(t);
921
- perform_stream_op_locked(exec_ctx, &t->global, &s->global, op);
922
- unlock(exec_ctx, t);
1032
+ grpc_chttp2_run_with_global_lock(exec_ctx, t, s, perform_stream_op_locked, op,
1033
+ sizeof(*op));
923
1034
  }
924
1035
 
925
1036
  static void send_ping_locked(grpc_chttp2_transport *t, grpc_closure *on_recv) {
@@ -939,13 +1050,10 @@ static void send_ping_locked(grpc_chttp2_transport *t, grpc_closure *on_recv) {
939
1050
  gpr_slice_buffer_add(&t->global.qbuf, grpc_chttp2_ping_create(0, p->id));
940
1051
  }
941
1052
 
942
- void grpc_chttp2_ack_ping(grpc_exec_ctx *exec_ctx,
943
- grpc_chttp2_transport_parsing *transport_parsing,
944
- const uint8_t *opaque_8bytes) {
1053
+ static void ack_ping_locked(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
1054
+ grpc_chttp2_stream *s, void *opaque_8bytes) {
945
1055
  grpc_chttp2_outstanding_ping *ping;
946
- grpc_chttp2_transport *t = TRANSPORT_FROM_PARSING(transport_parsing);
947
1056
  grpc_chttp2_transport_global *transport_global = &t->global;
948
- lock(t);
949
1057
  for (ping = transport_global->pings.next; ping != &transport_global->pings;
950
1058
  ping = ping->next) {
951
1059
  if (0 == memcmp(opaque_8bytes, ping->id, 8)) {
@@ -956,13 +1064,31 @@ void grpc_chttp2_ack_ping(grpc_exec_ctx *exec_ctx,
956
1064
  break;
957
1065
  }
958
1066
  }
959
- unlock(exec_ctx, t);
1067
+ }
1068
+
1069
+ void grpc_chttp2_ack_ping(grpc_exec_ctx *exec_ctx,
1070
+ grpc_chttp2_transport_parsing *transport_parsing,
1071
+ const uint8_t *opaque_8bytes) {
1072
+ grpc_chttp2_run_with_global_lock(
1073
+ exec_ctx, TRANSPORT_FROM_PARSING(transport_parsing), NULL,
1074
+ ack_ping_locked, (void *)opaque_8bytes, 8);
960
1075
  }
961
1076
 
962
1077
  static void perform_transport_op_locked(grpc_exec_ctx *exec_ctx,
963
1078
  grpc_chttp2_transport *t,
964
- grpc_transport_op *op) {
965
- bool close_transport = false;
1079
+ grpc_chttp2_stream *s_unused,
1080
+ void *stream_op) {
1081
+ grpc_transport_op *op = stream_op;
1082
+ bool close_transport = op->disconnect;
1083
+
1084
+ /* If there's a set_accept_stream ensure that we're not parsing
1085
+ to avoid changing things out from underneath */
1086
+ if (t->executor.parsing_active && op->set_accept_stream) {
1087
+ GPR_ASSERT(t->post_parsing_op == NULL);
1088
+ t->post_parsing_op = gpr_malloc(sizeof(*op));
1089
+ memcpy(t->post_parsing_op, op, sizeof(*op));
1090
+ return;
1091
+ }
966
1092
 
967
1093
  grpc_exec_ctx_enqueue(exec_ctx, op->on_consumed, true, NULL);
968
1094
 
@@ -988,47 +1114,31 @@ static void perform_transport_op_locked(grpc_exec_ctx *exec_ctx,
988
1114
  }
989
1115
 
990
1116
  if (op->bind_pollset) {
991
- add_to_pollset_locked(exec_ctx, t, op->bind_pollset);
1117
+ add_to_pollset_locked(exec_ctx, t, NULL, op->bind_pollset);
992
1118
  }
993
1119
 
994
1120
  if (op->bind_pollset_set) {
995
- add_to_pollset_set_locked(exec_ctx, t, op->bind_pollset_set);
1121
+ add_to_pollset_set_locked(exec_ctx, t, NULL, op->bind_pollset_set);
996
1122
  }
997
1123
 
998
1124
  if (op->send_ping) {
999
1125
  send_ping_locked(t, op->send_ping);
1000
1126
  }
1001
1127
 
1002
- if (op->disconnect) {
1003
- close_transport_locked(exec_ctx, t);
1004
- }
1005
-
1006
1128
  if (close_transport) {
1007
- close_transport_locked(exec_ctx, t);
1129
+ close_transport_locked(exec_ctx, t, NULL, NULL);
1008
1130
  }
1009
1131
  }
1010
1132
 
1011
1133
  static void perform_transport_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1012
1134
  grpc_transport_op *op) {
1013
1135
  grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
1014
-
1015
- lock(t);
1016
-
1017
- /* If there's a set_accept_stream ensure that we're not parsing
1018
- to avoid changing things out from underneath */
1019
- if (t->parsing_active && op->set_accept_stream) {
1020
- GPR_ASSERT(t->post_parsing_op == NULL);
1021
- t->post_parsing_op = gpr_malloc(sizeof(*op));
1022
- memcpy(t->post_parsing_op, op, sizeof(*op));
1023
- } else {
1024
- perform_transport_op_locked(exec_ctx, t, op);
1025
- }
1026
-
1027
- unlock(exec_ctx, t);
1136
+ grpc_chttp2_run_with_global_lock(
1137
+ exec_ctx, t, NULL, perform_transport_op_locked, op, sizeof(*op));
1028
1138
  }
1029
1139
 
1030
1140
  /*******************************************************************************
1031
- * INPUT PROCESSING
1141
+ * INPUT PROCESSING - GENERAL
1032
1142
  */
1033
1143
 
1034
1144
  static void check_read_ops(grpc_exec_ctx *exec_ctx,
@@ -1050,7 +1160,7 @@ static void check_read_ops(grpc_exec_ctx *exec_ctx,
1050
1160
  while (stream_global->seen_error &&
1051
1161
  (bs = grpc_chttp2_incoming_frame_queue_pop(
1052
1162
  &stream_global->incoming_frames)) != NULL) {
1053
- grpc_byte_stream_destroy(exec_ctx, bs);
1163
+ incoming_byte_stream_destroy_locked(exec_ctx, NULL, NULL, bs);
1054
1164
  }
1055
1165
  if (stream_global->incoming_frames.head != NULL) {
1056
1166
  *stream_global->recv_message = grpc_chttp2_incoming_frame_queue_pop(
@@ -1071,19 +1181,29 @@ static void check_read_ops(grpc_exec_ctx *exec_ctx,
1071
1181
  while (stream_global->seen_error &&
1072
1182
  (bs = grpc_chttp2_incoming_frame_queue_pop(
1073
1183
  &stream_global->incoming_frames)) != NULL) {
1074
- grpc_byte_stream_destroy(exec_ctx, bs);
1184
+ incoming_byte_stream_destroy_locked(exec_ctx, NULL, NULL, bs);
1075
1185
  }
1076
- if (stream_global->incoming_frames.head == NULL) {
1186
+ if (stream_global->all_incoming_byte_streams_finished) {
1077
1187
  grpc_chttp2_incoming_metadata_buffer_publish(
1078
1188
  &stream_global->received_trailing_metadata,
1079
1189
  stream_global->recv_trailing_metadata);
1080
1190
  grpc_chttp2_complete_closure_step(
1081
- exec_ctx, &stream_global->recv_trailing_metadata_finished, 1);
1191
+ exec_ctx, stream_global,
1192
+ &stream_global->recv_trailing_metadata_finished, 1);
1082
1193
  }
1083
1194
  }
1084
1195
  }
1085
1196
  }
1086
1197
 
1198
+ static void decrement_active_streams_locked(
1199
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport_global *transport_global,
1200
+ grpc_chttp2_stream_global *stream_global) {
1201
+ if ((stream_global->all_incoming_byte_streams_finished =
1202
+ gpr_unref(&stream_global->active_streams))) {
1203
+ grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
1204
+ }
1205
+ }
1206
+
1087
1207
  static void remove_stream(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
1088
1208
  uint32_t id) {
1089
1209
  size_t new_stream_count;
@@ -1105,7 +1225,7 @@ static void remove_stream(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
1105
1225
  }
1106
1226
 
1107
1227
  if (grpc_chttp2_unregister_stream(t, s) && t->global.sent_goaway) {
1108
- close_transport_locked(exec_ctx, t);
1228
+ close_transport_locked(exec_ctx, t, NULL, NULL);
1109
1229
  }
1110
1230
  if (grpc_chttp2_list_remove_writable_stream(&t->global, &s->global)) {
1111
1231
  GRPC_CHTTP2_STREAM_UNREF(exec_ctx, &s->global, "chttp2_writing");
@@ -1124,15 +1244,22 @@ static void cancel_from_api(grpc_exec_ctx *exec_ctx,
1124
1244
  grpc_chttp2_transport_global *transport_global,
1125
1245
  grpc_chttp2_stream_global *stream_global,
1126
1246
  grpc_status_code status) {
1127
- if (stream_global->id != 0) {
1128
- gpr_slice_buffer_add(
1129
- &transport_global->qbuf,
1130
- grpc_chttp2_rst_stream_create(
1131
- stream_global->id,
1132
- (uint32_t)grpc_chttp2_grpc_status_to_http2_error(status)));
1247
+ if (!stream_global->read_closed || !stream_global->write_closed) {
1248
+ if (stream_global->id != 0) {
1249
+ gpr_slice_buffer_add(
1250
+ &transport_global->qbuf,
1251
+ grpc_chttp2_rst_stream_create(
1252
+ stream_global->id,
1253
+ (uint32_t)grpc_chttp2_grpc_status_to_http2_error(status),
1254
+ &stream_global->stats.outgoing));
1255
+ }
1256
+ grpc_chttp2_fake_status(exec_ctx, transport_global, stream_global, status,
1257
+ NULL);
1258
+ }
1259
+ if (status != GRPC_STATUS_OK && !stream_global->seen_error) {
1260
+ stream_global->seen_error = 1;
1261
+ grpc_chttp2_list_add_check_read_ops(transport_global, stream_global);
1133
1262
  }
1134
- grpc_chttp2_fake_status(exec_ctx, transport_global, stream_global, status,
1135
- NULL);
1136
1263
  grpc_chttp2_mark_stream_closed(exec_ctx, transport_global, stream_global, 1,
1137
1264
  1);
1138
1265
  }
@@ -1177,10 +1304,12 @@ void grpc_chttp2_fake_status(grpc_exec_ctx *exec_ctx,
1177
1304
  static void fail_pending_writes(grpc_exec_ctx *exec_ctx,
1178
1305
  grpc_chttp2_stream_global *stream_global) {
1179
1306
  grpc_chttp2_complete_closure_step(
1180
- exec_ctx, &stream_global->send_initial_metadata_finished, 0);
1307
+ exec_ctx, stream_global, &stream_global->send_initial_metadata_finished,
1308
+ 0);
1181
1309
  grpc_chttp2_complete_closure_step(
1182
- exec_ctx, &stream_global->send_trailing_metadata_finished, 0);
1183
- grpc_chttp2_complete_closure_step(exec_ctx,
1310
+ exec_ctx, stream_global, &stream_global->send_trailing_metadata_finished,
1311
+ 0);
1312
+ grpc_chttp2_complete_closure_step(exec_ctx, stream_global,
1184
1313
  &stream_global->send_message_finished, 0);
1185
1314
  }
1186
1315
 
@@ -1197,10 +1326,11 @@ void grpc_chttp2_mark_stream_closed(
1197
1326
  stream_global->read_closed = 1;
1198
1327
  stream_global->published_initial_metadata = 1;
1199
1328
  stream_global->published_trailing_metadata = 1;
1329
+ decrement_active_streams_locked(exec_ctx, transport_global, stream_global);
1200
1330
  }
1201
1331
  if (close_writes && !stream_global->write_closed) {
1202
1332
  stream_global->write_closed = 1;
1203
- if (TRANSPORT_FROM_GLOBAL(transport_global)->writing_active) {
1333
+ if (TRANSPORT_FROM_GLOBAL(transport_global)->executor.writing_active) {
1204
1334
  GRPC_CHTTP2_STREAM_REF(stream_global, "finish_writes");
1205
1335
  grpc_chttp2_list_add_closed_waiting_for_writing(transport_global,
1206
1336
  stream_global);
@@ -1210,7 +1340,7 @@ void grpc_chttp2_mark_stream_closed(
1210
1340
  }
1211
1341
  if (stream_global->read_closed && stream_global->write_closed) {
1212
1342
  if (stream_global->id != 0 &&
1213
- TRANSPORT_FROM_GLOBAL(transport_global)->parsing_active) {
1343
+ TRANSPORT_FROM_GLOBAL(transport_global)->executor.parsing_active) {
1214
1344
  grpc_chttp2_list_add_closed_waiting_for_parsing(transport_global,
1215
1345
  stream_global);
1216
1346
  } else {
@@ -1317,7 +1447,8 @@ static void close_from_api(grpc_exec_ctx *exec_ctx,
1317
1447
 
1318
1448
  gpr_slice_buffer_add(
1319
1449
  &transport_global->qbuf,
1320
- grpc_chttp2_rst_stream_create(stream_global->id, GRPC_CHTTP2_NO_ERROR));
1450
+ grpc_chttp2_rst_stream_create(stream_global->id, GRPC_CHTTP2_NO_ERROR,
1451
+ &stream_global->stats.outgoing));
1321
1452
 
1322
1453
  if (optional_message) {
1323
1454
  gpr_slice_ref(*optional_message);
@@ -1341,7 +1472,7 @@ static void end_all_the_calls(grpc_exec_ctx *exec_ctx,
1341
1472
  }
1342
1473
 
1343
1474
  static void drop_connection(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t) {
1344
- close_transport_locked(exec_ctx, t);
1475
+ close_transport_locked(exec_ctx, t, NULL, NULL);
1345
1476
  end_all_the_calls(exec_ctx, t);
1346
1477
  }
1347
1478
 
@@ -1365,102 +1496,136 @@ static void update_global_window(void *args, uint32_t id, void *stream) {
1365
1496
  }
1366
1497
  }
1367
1498
 
1368
- static void read_error_locked(grpc_exec_ctx *exec_ctx,
1369
- grpc_chttp2_transport *t) {
1370
- t->endpoint_reading = 0;
1371
- if (!t->writing_active && t->ep) {
1372
- destroy_endpoint(exec_ctx, t);
1373
- }
1374
- }
1499
+ /*******************************************************************************
1500
+ * INPUT PROCESSING - PARSING
1501
+ */
1375
1502
 
1376
- /* tcp read callback */
1377
- static void recv_data(grpc_exec_ctx *exec_ctx, void *tp, bool success) {
1378
- size_t i;
1379
- int keep_reading = 0;
1380
- grpc_chttp2_transport *t = tp;
1503
+ static void reading_action_locked(grpc_exec_ctx *exec_ctx,
1504
+ grpc_chttp2_transport *t,
1505
+ grpc_chttp2_stream *s_unused, void *arg);
1506
+ static void parsing_action(grpc_exec_ctx *exec_ctx, void *arg, bool success);
1507
+ static void post_reading_action_locked(grpc_exec_ctx *exec_ctx,
1508
+ grpc_chttp2_transport *t,
1509
+ grpc_chttp2_stream *s_unused, void *arg);
1510
+ static void post_parse_locked(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
1511
+ grpc_chttp2_stream *s_unused, void *arg);
1512
+
1513
+ static void reading_action(grpc_exec_ctx *exec_ctx, void *tp, bool success) {
1514
+ /* Control flow:
1515
+ reading_action_locked ->
1516
+ (parse_unlocked -> post_parse_locked)? ->
1517
+ post_reading_action_locked */
1518
+ grpc_chttp2_run_with_global_lock(exec_ctx, tp, NULL, reading_action_locked,
1519
+ (void *)(uintptr_t)success, 0);
1520
+ }
1521
+
1522
+ static void reading_action_locked(grpc_exec_ctx *exec_ctx,
1523
+ grpc_chttp2_transport *t,
1524
+ grpc_chttp2_stream *s_unused, void *arg) {
1381
1525
  grpc_chttp2_transport_global *transport_global = &t->global;
1382
1526
  grpc_chttp2_transport_parsing *transport_parsing = &t->parsing;
1383
- grpc_chttp2_stream_global *stream_global;
1384
-
1385
- GPR_TIMER_BEGIN("recv_data", 0);
1527
+ bool success = (bool)(uintptr_t)arg;
1386
1528
 
1387
- lock(t);
1388
- i = 0;
1389
- GPR_ASSERT(!t->parsing_active);
1529
+ GPR_ASSERT(!t->executor.parsing_active);
1390
1530
  if (!t->closed) {
1391
- t->parsing_active = 1;
1531
+ t->executor.parsing_active = 1;
1392
1532
  /* merge stream lists */
1393
1533
  grpc_chttp2_stream_map_move_into(&t->new_stream_map,
1394
1534
  &t->parsing_stream_map);
1395
1535
  grpc_chttp2_prepare_to_read(transport_global, transport_parsing);
1396
- gpr_mu_unlock(&t->mu);
1397
- GPR_TIMER_BEGIN("recv_data.parse", 0);
1398
- for (; i < t->read_buffer.count &&
1399
- grpc_chttp2_perform_read(exec_ctx, transport_parsing,
1400
- t->read_buffer.slices[i]);
1401
- i++)
1402
- ;
1403
- GPR_TIMER_END("recv_data.parse", 0);
1404
- gpr_mu_lock(&t->mu);
1405
- /* copy parsing qbuf to global qbuf */
1406
- gpr_slice_buffer_move_into(&t->parsing.qbuf, &t->global.qbuf);
1407
- if (i != t->read_buffer.count) {
1408
- unlock(exec_ctx, t);
1409
- lock(t);
1410
- drop_connection(exec_ctx, t);
1411
- }
1412
- /* merge stream lists */
1413
- grpc_chttp2_stream_map_move_into(&t->new_stream_map,
1414
- &t->parsing_stream_map);
1415
- transport_global->concurrent_stream_count =
1416
- (uint32_t)grpc_chttp2_stream_map_size(&t->parsing_stream_map);
1417
- if (transport_parsing->initial_window_update != 0) {
1418
- grpc_chttp2_stream_map_for_each(&t->parsing_stream_map,
1419
- update_global_window, t);
1420
- transport_parsing->initial_window_update = 0;
1421
- }
1422
- /* handle higher level things */
1423
- grpc_chttp2_publish_reads(exec_ctx, transport_global, transport_parsing);
1424
- t->parsing_active = 0;
1425
- /* handle delayed transport ops (if there is one) */
1426
- if (t->post_parsing_op) {
1427
- grpc_transport_op *op = t->post_parsing_op;
1428
- t->post_parsing_op = NULL;
1429
- perform_transport_op_locked(exec_ctx, t, op);
1430
- gpr_free(op);
1431
- }
1432
- /* if a stream is in the stream map, and gets cancelled, we need to ensure
1433
- * we are not parsing before continuing the cancellation to keep things in
1434
- * a sane state */
1435
- while (grpc_chttp2_list_pop_closed_waiting_for_parsing(transport_global,
1436
- &stream_global)) {
1437
- GPR_ASSERT(stream_global->in_stream_map);
1438
- GPR_ASSERT(stream_global->write_closed);
1439
- GPR_ASSERT(stream_global->read_closed);
1440
- remove_stream(exec_ctx, t, stream_global->id);
1441
- GRPC_CHTTP2_STREAM_UNREF(exec_ctx, stream_global, "chttp2");
1442
- }
1536
+ grpc_exec_ctx_enqueue(exec_ctx, &t->parsing_action, success, NULL);
1537
+ } else {
1538
+ post_reading_action_locked(exec_ctx, t, s_unused, arg);
1539
+ }
1540
+ }
1541
+
1542
+ static void parsing_action(grpc_exec_ctx *exec_ctx, void *arg, bool success) {
1543
+ grpc_chttp2_transport *t = arg;
1544
+ GPR_TIMER_BEGIN("reading_action.parse", 0);
1545
+ size_t i = 0;
1546
+ for (; i < t->read_buffer.count &&
1547
+ grpc_chttp2_perform_read(exec_ctx, &t->parsing,
1548
+ t->read_buffer.slices[i]);
1549
+ i++)
1550
+ ;
1551
+ if (i != t->read_buffer.count) {
1552
+ success = false;
1553
+ }
1554
+ GPR_TIMER_END("reading_action.parse", 0);
1555
+ grpc_chttp2_run_with_global_lock(exec_ctx, t, NULL, post_parse_locked,
1556
+ (void *)(uintptr_t)success, 0);
1557
+ }
1558
+
1559
+ static void post_parse_locked(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t,
1560
+ grpc_chttp2_stream *s_unused, void *arg) {
1561
+ grpc_chttp2_transport_global *transport_global = &t->global;
1562
+ grpc_chttp2_transport_parsing *transport_parsing = &t->parsing;
1563
+ /* copy parsing qbuf to global qbuf */
1564
+ gpr_slice_buffer_move_into(&t->parsing.qbuf, &t->global.qbuf);
1565
+ /* merge stream lists */
1566
+ grpc_chttp2_stream_map_move_into(&t->new_stream_map, &t->parsing_stream_map);
1567
+ transport_global->concurrent_stream_count =
1568
+ (uint32_t)grpc_chttp2_stream_map_size(&t->parsing_stream_map);
1569
+ if (transport_parsing->initial_window_update != 0) {
1570
+ grpc_chttp2_stream_map_for_each(&t->parsing_stream_map,
1571
+ update_global_window, t);
1572
+ transport_parsing->initial_window_update = 0;
1573
+ }
1574
+ /* handle higher level things */
1575
+ grpc_chttp2_publish_reads(exec_ctx, transport_global, transport_parsing);
1576
+ t->executor.parsing_active = 0;
1577
+ /* handle delayed transport ops (if there is one) */
1578
+ if (t->post_parsing_op) {
1579
+ grpc_transport_op *op = t->post_parsing_op;
1580
+ t->post_parsing_op = NULL;
1581
+ perform_transport_op_locked(exec_ctx, t, NULL, op);
1582
+ gpr_free(op);
1583
+ }
1584
+ /* if a stream is in the stream map, and gets cancelled, we need to
1585
+ * ensure we are not parsing before continuing the cancellation to keep
1586
+ * things in a sane state */
1587
+ grpc_chttp2_stream_global *stream_global;
1588
+ while (grpc_chttp2_list_pop_closed_waiting_for_parsing(transport_global,
1589
+ &stream_global)) {
1590
+ GPR_ASSERT(stream_global->in_stream_map);
1591
+ GPR_ASSERT(stream_global->write_closed);
1592
+ GPR_ASSERT(stream_global->read_closed);
1593
+ remove_stream(exec_ctx, t, stream_global->id);
1594
+ GRPC_CHTTP2_STREAM_UNREF(exec_ctx, stream_global, "chttp2");
1443
1595
  }
1444
- if (!success || i != t->read_buffer.count || t->closed) {
1596
+
1597
+ post_reading_action_locked(exec_ctx, t, s_unused, arg);
1598
+ }
1599
+
1600
+ static void post_reading_action_locked(grpc_exec_ctx *exec_ctx,
1601
+ grpc_chttp2_transport *t,
1602
+ grpc_chttp2_stream *s_unused,
1603
+ void *arg) {
1604
+ bool success = (bool)(uintptr_t)arg;
1605
+ bool keep_reading = false;
1606
+ if (!success || t->closed) {
1445
1607
  drop_connection(exec_ctx, t);
1446
- read_error_locked(exec_ctx, t);
1608
+ t->endpoint_reading = 0;
1609
+ if (!t->executor.writing_active && t->ep) {
1610
+ grpc_endpoint_destroy(exec_ctx, t->ep);
1611
+ t->ep = NULL;
1612
+ /* safe as we still have a ref for read */
1613
+ UNREF_TRANSPORT(exec_ctx, t, "disconnect");
1614
+ }
1447
1615
  } else if (!t->closed) {
1448
- keep_reading = 1;
1616
+ keep_reading = true;
1449
1617
  REF_TRANSPORT(t, "keep_reading");
1450
1618
  prevent_endpoint_shutdown(t);
1451
1619
  }
1452
1620
  gpr_slice_buffer_reset_and_unref(&t->read_buffer);
1453
- unlock(exec_ctx, t);
1454
1621
 
1455
1622
  if (keep_reading) {
1456
- grpc_endpoint_read(exec_ctx, t->ep, &t->read_buffer, &t->recv_data);
1457
- allow_endpoint_shutdown_unlocked(exec_ctx, t);
1623
+ grpc_endpoint_read(exec_ctx, t->ep, &t->read_buffer, &t->reading_action);
1624
+ allow_endpoint_shutdown_locked(exec_ctx, t);
1458
1625
  UNREF_TRANSPORT(exec_ctx, t, "keep_reading");
1459
1626
  } else {
1460
- UNREF_TRANSPORT(exec_ctx, t, "recv_data");
1627
+ UNREF_TRANSPORT(exec_ctx, t, "reading_action");
1461
1628
  }
1462
-
1463
- GPR_TIMER_END("recv_data", 0);
1464
1629
  }
1465
1630
 
1466
1631
  /*******************************************************************************
@@ -1472,9 +1637,10 @@ static void connectivity_state_set(
1472
1637
  grpc_connectivity_state state, const char *reason) {
1473
1638
  GRPC_CHTTP2_IF_TRACING(
1474
1639
  gpr_log(GPR_DEBUG, "set connectivity_state=%d", state));
1475
- grpc_connectivity_state_set(exec_ctx, &TRANSPORT_FROM_GLOBAL(transport_global)
1476
- ->channel_callback.state_tracker,
1477
- state, reason);
1640
+ grpc_connectivity_state_set(
1641
+ exec_ctx,
1642
+ &TRANSPORT_FROM_GLOBAL(transport_global)->channel_callback.state_tracker,
1643
+ state, reason);
1478
1644
  }
1479
1645
 
1480
1646
  /*******************************************************************************
@@ -1483,7 +1649,7 @@ static void connectivity_state_set(
1483
1649
 
1484
1650
  static void add_to_pollset_locked(grpc_exec_ctx *exec_ctx,
1485
1651
  grpc_chttp2_transport *t,
1486
- grpc_pollset *pollset) {
1652
+ grpc_chttp2_stream *s_unused, void *pollset) {
1487
1653
  if (t->ep) {
1488
1654
  grpc_endpoint_add_to_pollset(exec_ctx, t->ep, pollset);
1489
1655
  }
@@ -1491,7 +1657,8 @@ static void add_to_pollset_locked(grpc_exec_ctx *exec_ctx,
1491
1657
 
1492
1658
  static void add_to_pollset_set_locked(grpc_exec_ctx *exec_ctx,
1493
1659
  grpc_chttp2_transport *t,
1494
- grpc_pollset_set *pollset_set) {
1660
+ grpc_chttp2_stream *s_unused,
1661
+ void *pollset_set) {
1495
1662
  if (t->ep) {
1496
1663
  grpc_endpoint_add_to_pollset_set(exec_ctx, t->ep, pollset_set);
1497
1664
  }
@@ -1499,16 +1666,24 @@ static void add_to_pollset_set_locked(grpc_exec_ctx *exec_ctx,
1499
1666
 
1500
1667
  static void set_pollset(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1501
1668
  grpc_stream *gs, grpc_pollset *pollset) {
1502
- grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
1503
- lock(t);
1504
- add_to_pollset_locked(exec_ctx, t, pollset);
1505
- unlock(exec_ctx, t);
1669
+ /* TODO(ctiller): keep pollset alive */
1670
+ grpc_chttp2_run_with_global_lock(exec_ctx, (grpc_chttp2_transport *)gt,
1671
+ (grpc_chttp2_stream *)gs,
1672
+ add_to_pollset_locked, pollset, 0);
1506
1673
  }
1507
1674
 
1508
1675
  /*******************************************************************************
1509
1676
  * BYTE STREAM
1510
1677
  */
1511
1678
 
1679
+ static void incoming_byte_stream_unref(grpc_exec_ctx *exec_ctx,
1680
+ grpc_chttp2_incoming_byte_stream *bs) {
1681
+ if (gpr_unref(&bs->refs)) {
1682
+ gpr_slice_buffer_destroy(&bs->slices);
1683
+ gpr_free(bs);
1684
+ }
1685
+ }
1686
+
1512
1687
  static void incoming_byte_stream_update_flow_control(
1513
1688
  grpc_chttp2_transport_global *transport_global,
1514
1689
  grpc_chttp2_stream_global *stream_global, size_t max_size_hint,
@@ -1549,87 +1724,146 @@ static void incoming_byte_stream_update_flow_control(
1549
1724
  }
1550
1725
  }
1551
1726
 
1552
- static int incoming_byte_stream_next(grpc_exec_ctx *exec_ctx,
1553
- grpc_byte_stream *byte_stream,
1554
- gpr_slice *slice, size_t max_size_hint,
1555
- grpc_closure *on_complete) {
1727
+ typedef struct {
1728
+ grpc_chttp2_incoming_byte_stream *byte_stream;
1729
+ gpr_slice *slice;
1730
+ size_t max_size_hint;
1731
+ grpc_closure *on_complete;
1732
+ } incoming_byte_stream_next_arg;
1733
+
1734
+ static void incoming_byte_stream_next_locked(grpc_exec_ctx *exec_ctx,
1735
+ grpc_chttp2_transport *t,
1736
+ grpc_chttp2_stream *s,
1737
+ void *argp) {
1738
+ incoming_byte_stream_next_arg *arg = argp;
1556
1739
  grpc_chttp2_incoming_byte_stream *bs =
1557
- (grpc_chttp2_incoming_byte_stream *)byte_stream;
1740
+ (grpc_chttp2_incoming_byte_stream *)arg->byte_stream;
1558
1741
  grpc_chttp2_transport_global *transport_global = &bs->transport->global;
1559
1742
  grpc_chttp2_stream_global *stream_global = &bs->stream->global;
1560
1743
 
1561
- lock(bs->transport);
1562
1744
  if (bs->is_tail) {
1563
- incoming_byte_stream_update_flow_control(transport_global, stream_global,
1564
- max_size_hint, bs->slices.length);
1745
+ incoming_byte_stream_update_flow_control(
1746
+ transport_global, stream_global, arg->max_size_hint, bs->slices.length);
1565
1747
  }
1566
1748
  if (bs->slices.count > 0) {
1567
- *slice = gpr_slice_buffer_take_first(&bs->slices);
1568
- unlock(exec_ctx, bs->transport);
1569
- return 1;
1749
+ *arg->slice = gpr_slice_buffer_take_first(&bs->slices);
1750
+ grpc_exec_ctx_enqueue(exec_ctx, arg->on_complete, true, NULL);
1570
1751
  } else if (bs->failed) {
1571
- grpc_exec_ctx_enqueue(exec_ctx, on_complete, false, NULL);
1572
- unlock(exec_ctx, bs->transport);
1573
- return 0;
1752
+ grpc_exec_ctx_enqueue(exec_ctx, arg->on_complete, false, NULL);
1574
1753
  } else {
1575
- bs->on_next = on_complete;
1576
- bs->next = slice;
1577
- unlock(exec_ctx, bs->transport);
1578
- return 0;
1754
+ bs->on_next = arg->on_complete;
1755
+ bs->next = arg->slice;
1579
1756
  }
1757
+ incoming_byte_stream_unref(exec_ctx, bs);
1580
1758
  }
1581
1759
 
1582
- static void incoming_byte_stream_unref(grpc_chttp2_incoming_byte_stream *bs) {
1583
- if (gpr_unref(&bs->refs)) {
1584
- gpr_slice_buffer_destroy(&bs->slices);
1585
- gpr_free(bs);
1586
- }
1760
+ static int incoming_byte_stream_next(grpc_exec_ctx *exec_ctx,
1761
+ grpc_byte_stream *byte_stream,
1762
+ gpr_slice *slice, size_t max_size_hint,
1763
+ grpc_closure *on_complete) {
1764
+ grpc_chttp2_incoming_byte_stream *bs =
1765
+ (grpc_chttp2_incoming_byte_stream *)byte_stream;
1766
+ incoming_byte_stream_next_arg arg = {bs, slice, max_size_hint, on_complete};
1767
+ gpr_ref(&bs->refs);
1768
+ grpc_chttp2_run_with_global_lock(exec_ctx, bs->transport, bs->stream,
1769
+ incoming_byte_stream_next_locked, &arg,
1770
+ sizeof(arg));
1771
+ return 0;
1772
+ }
1773
+
1774
+ static void incoming_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
1775
+ grpc_byte_stream *byte_stream);
1776
+
1777
+ static void incoming_byte_stream_destroy_locked(grpc_exec_ctx *exec_ctx,
1778
+ grpc_chttp2_transport *t,
1779
+ grpc_chttp2_stream *s,
1780
+ void *byte_stream) {
1781
+ grpc_chttp2_incoming_byte_stream *bs = byte_stream;
1782
+ GPR_ASSERT(bs->base.destroy == incoming_byte_stream_destroy);
1783
+ decrement_active_streams_locked(exec_ctx, &bs->transport->global,
1784
+ &bs->stream->global);
1785
+ incoming_byte_stream_unref(exec_ctx, bs);
1587
1786
  }
1588
1787
 
1589
1788
  static void incoming_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
1590
1789
  grpc_byte_stream *byte_stream) {
1591
- incoming_byte_stream_unref((grpc_chttp2_incoming_byte_stream *)byte_stream);
1790
+ grpc_chttp2_incoming_byte_stream *bs =
1791
+ (grpc_chttp2_incoming_byte_stream *)byte_stream;
1792
+ grpc_chttp2_run_with_global_lock(exec_ctx, bs->transport, bs->stream,
1793
+ incoming_byte_stream_destroy_locked, bs, 0);
1592
1794
  }
1593
1795
 
1594
- void grpc_chttp2_incoming_byte_stream_push(grpc_exec_ctx *exec_ctx,
1595
- grpc_chttp2_incoming_byte_stream *bs,
1596
- gpr_slice slice) {
1597
- gpr_mu_lock(&bs->transport->mu);
1796
+ typedef struct {
1797
+ grpc_chttp2_incoming_byte_stream *byte_stream;
1798
+ gpr_slice slice;
1799
+ } incoming_byte_stream_push_arg;
1800
+
1801
+ static void incoming_byte_stream_push_locked(grpc_exec_ctx *exec_ctx,
1802
+ grpc_chttp2_transport *t,
1803
+ grpc_chttp2_stream *s,
1804
+ void *argp) {
1805
+ incoming_byte_stream_push_arg *arg = argp;
1806
+ grpc_chttp2_incoming_byte_stream *bs = arg->byte_stream;
1598
1807
  if (bs->on_next != NULL) {
1599
- *bs->next = slice;
1808
+ *bs->next = arg->slice;
1600
1809
  grpc_exec_ctx_enqueue(exec_ctx, bs->on_next, true, NULL);
1601
1810
  bs->on_next = NULL;
1602
1811
  } else {
1603
- gpr_slice_buffer_add(&bs->slices, slice);
1812
+ gpr_slice_buffer_add(&bs->slices, arg->slice);
1604
1813
  }
1605
- gpr_mu_unlock(&bs->transport->mu);
1814
+ incoming_byte_stream_unref(exec_ctx, bs);
1815
+ }
1816
+
1817
+ void grpc_chttp2_incoming_byte_stream_push(grpc_exec_ctx *exec_ctx,
1818
+ grpc_chttp2_incoming_byte_stream *bs,
1819
+ gpr_slice slice) {
1820
+ incoming_byte_stream_push_arg arg = {bs, slice};
1821
+ gpr_ref(&bs->refs);
1822
+ grpc_chttp2_run_with_global_lock(exec_ctx, bs->transport, bs->stream,
1823
+ incoming_byte_stream_push_locked, &arg,
1824
+ sizeof(arg));
1825
+ }
1826
+
1827
+ static void incoming_byte_stream_finished_failed_locked(
1828
+ grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_chttp2_stream *s,
1829
+ void *argp) {
1830
+ grpc_chttp2_incoming_byte_stream *bs = argp;
1831
+ grpc_exec_ctx_enqueue(exec_ctx, bs->on_next, false, NULL);
1832
+ bs->on_next = NULL;
1833
+ bs->failed = 1;
1834
+ incoming_byte_stream_unref(exec_ctx, bs);
1835
+ }
1836
+
1837
+ static void incoming_byte_stream_finished_ok_locked(grpc_exec_ctx *exec_ctx,
1838
+ grpc_chttp2_transport *t,
1839
+ grpc_chttp2_stream *s,
1840
+ void *argp) {
1841
+ grpc_chttp2_incoming_byte_stream *bs = argp;
1842
+ incoming_byte_stream_unref(exec_ctx, bs);
1606
1843
  }
1607
1844
 
1608
1845
  void grpc_chttp2_incoming_byte_stream_finished(
1609
1846
  grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_byte_stream *bs, int success,
1610
1847
  int from_parsing_thread) {
1611
- if (!success) {
1612
- if (from_parsing_thread) {
1613
- gpr_mu_lock(&bs->transport->mu);
1614
- }
1615
- grpc_exec_ctx_enqueue(exec_ctx, bs->on_next, false, NULL);
1616
- bs->on_next = NULL;
1617
- bs->failed = 1;
1618
- if (from_parsing_thread) {
1619
- gpr_mu_unlock(&bs->transport->mu);
1848
+ if (from_parsing_thread) {
1849
+ if (success) {
1850
+ grpc_chttp2_run_with_global_lock(exec_ctx, bs->transport, bs->stream,
1851
+ incoming_byte_stream_finished_ok_locked,
1852
+ bs, 0);
1853
+ } else {
1854
+ incoming_byte_stream_finished_ok_locked(exec_ctx, bs->transport,
1855
+ bs->stream, bs);
1620
1856
  }
1621
1857
  } else {
1622
- #ifndef NDEBUG
1623
- if (from_parsing_thread) {
1624
- gpr_mu_lock(&bs->transport->mu);
1625
- }
1626
- GPR_ASSERT(bs->on_next == NULL);
1627
- if (from_parsing_thread) {
1628
- gpr_mu_unlock(&bs->transport->mu);
1858
+ if (success) {
1859
+ grpc_chttp2_run_with_global_lock(
1860
+ exec_ctx, bs->transport, bs->stream,
1861
+ incoming_byte_stream_finished_failed_locked, bs, 0);
1862
+ } else {
1863
+ incoming_byte_stream_finished_failed_locked(exec_ctx, bs->transport,
1864
+ bs->stream, bs);
1629
1865
  }
1630
- #endif
1631
1866
  }
1632
- incoming_byte_stream_unref(bs);
1633
1867
  }
1634
1868
 
1635
1869
  grpc_chttp2_incoming_byte_stream *grpc_chttp2_incoming_byte_stream_create(
@@ -1646,6 +1880,7 @@ grpc_chttp2_incoming_byte_stream *grpc_chttp2_incoming_byte_stream_create(
1646
1880
  incoming_byte_stream->next_message = NULL;
1647
1881
  incoming_byte_stream->transport = TRANSPORT_FROM_PARSING(transport_parsing);
1648
1882
  incoming_byte_stream->stream = STREAM_FROM_PARSING(stream_parsing);
1883
+ gpr_ref(&incoming_byte_stream->stream->global.active_streams);
1649
1884
  gpr_slice_buffer_init(&incoming_byte_stream->slices);
1650
1885
  incoming_byte_stream->on_next = NULL;
1651
1886
  incoming_byte_stream->is_tail = 1;
@@ -1754,9 +1989,15 @@ static char *chttp2_get_peer(grpc_exec_ctx *exec_ctx, grpc_transport *t) {
1754
1989
  return gpr_strdup(((grpc_chttp2_transport *)t)->peer_string);
1755
1990
  }
1756
1991
 
1757
- static const grpc_transport_vtable vtable = {
1758
- sizeof(grpc_chttp2_stream), init_stream, set_pollset, perform_stream_op,
1759
- perform_transport_op, destroy_stream, destroy_transport, chttp2_get_peer};
1992
+ static const grpc_transport_vtable vtable = {sizeof(grpc_chttp2_stream),
1993
+ "chttp2",
1994
+ init_stream,
1995
+ set_pollset,
1996
+ perform_stream_op,
1997
+ perform_transport_op,
1998
+ destroy_stream,
1999
+ destroy_transport,
2000
+ chttp2_get_peer};
1760
2001
 
1761
2002
  grpc_transport *grpc_create_chttp2_transport(
1762
2003
  grpc_exec_ctx *exec_ctx, const grpc_channel_args *channel_args,
@@ -1770,7 +2011,7 @@ void grpc_chttp2_transport_start_reading(grpc_exec_ctx *exec_ctx,
1770
2011
  grpc_transport *transport,
1771
2012
  gpr_slice *slices, size_t nslices) {
1772
2013
  grpc_chttp2_transport *t = (grpc_chttp2_transport *)transport;
1773
- REF_TRANSPORT(t, "recv_data"); /* matches unref inside recv_data */
2014
+ REF_TRANSPORT(t, "reading_action"); /* matches unref inside reading_action */
1774
2015
  gpr_slice_buffer_addn(&t->read_buffer, slices, nslices);
1775
- recv_data(exec_ctx, t, 1);
2016
+ reading_action(exec_ctx, t, 1);
1776
2017
  }