grpc 1.7.3 → 1.8.0

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

Potentially problematic release.


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

Files changed (616) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +2106 -2116
  3. data/include/grpc/census.h +1 -432
  4. data/include/grpc/compression.h +9 -9
  5. data/include/grpc/grpc.h +115 -98
  6. data/include/grpc/grpc_cronet.h +3 -3
  7. data/include/grpc/grpc_posix.h +4 -4
  8. data/include/grpc/grpc_security.h +160 -88
  9. data/include/grpc/grpc_security_constants.h +7 -0
  10. data/include/grpc/impl/codegen/atm.h +9 -1
  11. data/include/grpc/impl/codegen/atm_gcc_atomic.h +13 -4
  12. data/include/grpc/impl/codegen/atm_gcc_sync.h +6 -5
  13. data/include/grpc/impl/codegen/atm_windows.h +23 -22
  14. data/include/grpc/impl/codegen/byte_buffer.h +14 -14
  15. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -2
  16. data/include/grpc/impl/codegen/connectivity_state.h +0 -2
  17. data/include/grpc/impl/codegen/grpc_types.h +32 -28
  18. data/include/grpc/impl/codegen/port_platform.h +48 -0
  19. data/include/grpc/impl/codegen/slice.h +10 -10
  20. data/include/grpc/impl/codegen/sync_generic.h +9 -3
  21. data/include/grpc/slice.h +16 -17
  22. data/include/grpc/slice_buffer.h +22 -22
  23. data/include/grpc/support/alloc.h +11 -11
  24. data/include/grpc/support/avl.h +28 -20
  25. data/include/grpc/support/cmdline.h +13 -13
  26. data/include/grpc/support/histogram.h +17 -17
  27. data/include/grpc/support/host_port.h +2 -2
  28. data/include/grpc/support/log.h +9 -9
  29. data/include/grpc/support/log_windows.h +1 -1
  30. data/include/grpc/support/string_util.h +2 -2
  31. data/include/grpc/support/subprocess.h +5 -5
  32. data/include/grpc/support/sync.h +43 -27
  33. data/include/grpc/support/thd.h +6 -6
  34. data/include/grpc/support/tls_gcc.h +1 -1
  35. data/include/grpc/support/tls_pthread.h +1 -1
  36. data/src/core/ext/census/{grpc_context.c → grpc_context.cc} +5 -8
  37. data/src/core/ext/filters/client_channel/backup_poller.cc +165 -0
  38. data/src/core/ext/{census/grpc_filter.h → filters/client_channel/backup_poller.h} +12 -7
  39. data/src/core/ext/filters/client_channel/{channel_connectivity.c → channel_connectivity.cc} +45 -42
  40. data/src/core/ext/filters/client_channel/{client_channel.c → client_channel.cc} +452 -417
  41. data/src/core/ext/filters/client_channel/client_channel.h +16 -8
  42. data/src/core/ext/filters/client_channel/{client_channel_factory.c → client_channel_factory.cc} +0 -0
  43. data/src/core/ext/filters/client_channel/client_channel_factory.h +29 -21
  44. data/src/core/ext/filters/client_channel/{client_channel_plugin.c → client_channel_plugin.cc} +15 -19
  45. data/src/core/ext/filters/client_channel/{connector.c → connector.cc} +0 -0
  46. data/src/core/ext/filters/client_channel/connector.h +29 -21
  47. data/src/core/ext/filters/client_channel/{http_connect_handshaker.c → http_connect_handshaker.cc} +10 -10
  48. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +8 -0
  49. data/src/core/ext/filters/client_channel/{http_proxy.c → http_proxy.cc} +14 -14
  50. data/src/core/ext/filters/client_channel/http_proxy.h +8 -0
  51. data/src/core/ext/filters/client_channel/{lb_policy.c → lb_policy.cc} +47 -48
  52. data/src/core/ext/filters/client_channel/lb_policy.h +76 -70
  53. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{client_load_reporting_filter.c → client_load_reporting_filter.cc} +28 -29
  54. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +9 -1
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb.c → grpclb.cc} +554 -563
  56. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +9 -1
  57. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +17 -9
  58. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb_channel_secure.c → grpclb_channel_secure.cc} +17 -17
  59. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{grpclb_client_stats.c → grpclb_client_stats.cc} +3 -3
  60. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +9 -1
  61. data/src/core/ext/filters/client_channel/lb_policy/grpclb/{load_balancer_api.c → load_balancer_api.cc} +64 -67
  62. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +20 -21
  63. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +599 -0
  64. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +695 -0
  65. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +270 -0
  66. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +153 -0
  67. data/src/core/ext/filters/client_channel/{lb_policy_factory.c → lb_policy_factory.cc} +10 -10
  68. data/src/core/ext/filters/client_channel/lb_policy_factory.h +48 -40
  69. data/src/core/ext/filters/client_channel/{lb_policy_registry.c → lb_policy_registry.cc} +9 -9
  70. data/src/core/ext/filters/client_channel/lb_policy_registry.h +11 -3
  71. data/src/core/ext/filters/client_channel/{parse_address.c → parse_address.cc} +24 -24
  72. data/src/core/ext/filters/client_channel/parse_address.h +14 -6
  73. data/src/core/ext/filters/client_channel/{proxy_mapper.c → proxy_mapper.cc} +0 -0
  74. data/src/core/ext/filters/client_channel/proxy_mapper.h +8 -0
  75. data/src/core/ext/filters/client_channel/{proxy_mapper_registry.c → proxy_mapper_registry.cc} +0 -0
  76. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -0
  77. data/src/core/ext/filters/client_channel/{resolver.c → resolver.cc} +21 -23
  78. data/src/core/ext/filters/client_channel/resolver.h +33 -27
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{dns_resolver_ares.c → dns_resolver_ares.cc} +133 -133
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +18 -9
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{grpc_ares_ev_driver_posix.c → grpc_ares_ev_driver_posix.cc} +58 -56
  82. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/{grpc_ares_wrapper.c → grpc_ares_wrapper.cc} +118 -115
  83. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +23 -15
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +60 -0
  85. data/src/core/ext/filters/client_channel/resolver/dns/native/{dns_resolver.c → dns_resolver.cc} +100 -94
  86. data/src/core/ext/filters/client_channel/resolver/fake/{fake_resolver.c → fake_resolver.cc} +14 -14
  87. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +9 -1
  88. data/src/core/ext/filters/client_channel/resolver/sockaddr/{sockaddr_resolver.c → sockaddr_resolver.cc} +60 -60
  89. data/src/core/ext/filters/client_channel/{resolver_factory.c → resolver_factory.cc} +2 -2
  90. data/src/core/ext/filters/client_channel/resolver_factory.h +27 -19
  91. data/src/core/ext/filters/client_channel/{resolver_registry.c → resolver_registry.cc} +35 -35
  92. data/src/core/ext/filters/client_channel/resolver_registry.h +18 -10
  93. data/src/core/ext/filters/client_channel/{retry_throttle.c → retry_throttle.cc} +10 -10
  94. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -0
  95. data/src/core/ext/filters/client_channel/{subchannel.c → subchannel.cc} +210 -213
  96. data/src/core/ext/filters/client_channel/subchannel.h +68 -60
  97. data/src/core/ext/filters/client_channel/{subchannel_index.c → subchannel_index.cc} +52 -52
  98. data/src/core/ext/filters/client_channel/subchannel_index.h +22 -14
  99. data/src/core/ext/filters/client_channel/{uri_parser.c → uri_parser.cc} +29 -27
  100. data/src/core/ext/filters/client_channel/uri_parser.h +18 -10
  101. data/src/core/ext/filters/deadline/{deadline_filter.c → deadline_filter.cc} +12 -15
  102. data/src/core/ext/filters/deadline/deadline_filter.h +11 -2
  103. data/src/core/ext/filters/http/client/{http_client_filter.c → http_client_filter.cc} +83 -83
  104. data/src/core/ext/filters/http/client/http_client_filter.h +8 -0
  105. data/src/core/ext/filters/http/{http_filters_plugin.c → http_filters_plugin.cc} +20 -21
  106. data/src/core/ext/filters/http/message_compress/{message_compress_filter.c → message_compress_filter.cc} +84 -83
  107. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +9 -1
  108. data/src/core/ext/filters/http/server/{http_server_filter.c → http_server_filter.cc} +80 -78
  109. data/src/core/ext/filters/http/server/http_server_filter.h +8 -0
  110. data/src/core/ext/filters/load_reporting/{server_load_reporting_filter.c → server_load_reporting_filter.cc} +29 -29
  111. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.h +9 -1
  112. data/src/core/ext/filters/load_reporting/{server_load_reporting_plugin.c → server_load_reporting_plugin.cc} +11 -11
  113. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +13 -5
  114. data/src/core/ext/filters/max_age/{max_age_filter.c → max_age_filter.cc} +46 -56
  115. data/src/core/ext/filters/max_age/max_age_filter.h +8 -0
  116. data/src/core/ext/filters/message_size/{message_size_filter.c → message_size_filter.cc} +62 -40
  117. data/src/core/ext/filters/message_size/message_size_filter.h +8 -0
  118. data/src/core/ext/filters/workarounds/{workaround_cronet_compression_filter.c → workaround_cronet_compression_filter.cc} +11 -11
  119. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +8 -0
  120. data/src/core/ext/filters/workarounds/{workaround_utils.c → workaround_utils.cc} +7 -7
  121. data/src/core/ext/filters/workarounds/workaround_utils.h +9 -1
  122. data/src/core/ext/transport/chttp2/alpn/{alpn.c → alpn.cc} +3 -3
  123. data/src/core/ext/transport/chttp2/alpn/alpn.h +10 -2
  124. data/src/core/ext/transport/chttp2/client/{chttp2_connector.c → chttp2_connector.cc} +49 -45
  125. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +8 -0
  126. data/src/core/ext/transport/chttp2/client/insecure/{channel_create.c → channel_create.cc} +28 -27
  127. data/src/core/ext/transport/chttp2/client/insecure/{channel_create_posix.c → channel_create_posix.cc} +14 -13
  128. data/src/core/ext/transport/chttp2/client/secure/{secure_channel_create.c → secure_channel_create.cc} +68 -66
  129. data/src/core/ext/transport/chttp2/server/{chttp2_server.c → chttp2_server.cc} +76 -77
  130. data/src/core/ext/transport/chttp2/server/chttp2_server.h +11 -3
  131. data/src/core/ext/transport/chttp2/server/insecure/{server_chttp2.c → server_chttp2.cc} +3 -3
  132. data/src/core/ext/transport/chttp2/server/insecure/{server_chttp2_posix.c → server_chttp2_posix.cc} +13 -12
  133. data/src/core/ext/transport/chttp2/server/secure/{server_secure_chttp2.c → server_secure_chttp2.cc} +12 -10
  134. data/src/core/ext/transport/chttp2/transport/{bin_decoder.c → bin_decoder.cc} +7 -7
  135. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +15 -7
  136. data/src/core/ext/transport/chttp2/transport/{bin_encoder.c → bin_encoder.cc} +11 -11
  137. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +8 -0
  138. data/src/core/ext/transport/chttp2/transport/{chttp2_plugin.c → chttp2_plugin.cc} +2 -9
  139. data/src/core/ext/transport/chttp2/transport/{chttp2_transport.c → chttp2_transport.cc} +778 -778
  140. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +14 -10
  141. data/src/core/ext/transport/chttp2/transport/flow_control.cc +385 -0
  142. data/src/core/ext/transport/chttp2/transport/flow_control.h +337 -0
  143. data/src/core/ext/transport/chttp2/transport/frame.h +8 -0
  144. data/src/core/ext/transport/chttp2/transport/{frame_data.c → frame_data.cc} +34 -34
  145. data/src/core/ext/transport/chttp2/transport/frame_data.h +25 -17
  146. data/src/core/ext/transport/chttp2/transport/{frame_goaway.c → frame_goaway.cc} +18 -18
  147. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -10
  148. data/src/core/ext/transport/chttp2/transport/{frame_ping.c → frame_ping.cc} +18 -19
  149. data/src/core/ext/transport/chttp2/transport/frame_ping.h +12 -4
  150. data/src/core/ext/transport/chttp2/transport/{frame_rst_stream.c → frame_rst_stream.cc} +16 -16
  151. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +16 -8
  152. data/src/core/ext/transport/chttp2/transport/{frame_settings.c → frame_settings.cc} +23 -24
  153. data/src/core/ext/transport/chttp2/transport/frame_settings.h +17 -9
  154. data/src/core/ext/transport/chttp2/transport/{frame_window_update.c → frame_window_update.cc} +22 -24
  155. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +14 -6
  156. data/src/core/ext/transport/chttp2/transport/{hpack_encoder.c → hpack_encoder.cc} +206 -161
  157. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +23 -13
  158. data/src/core/ext/transport/chttp2/transport/{hpack_parser.c → hpack_parser.cc} +340 -334
  159. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +30 -22
  160. data/src/core/ext/transport/chttp2/transport/{hpack_table.c → hpack_table.cc} +25 -25
  161. data/src/core/ext/transport/chttp2/transport/hpack_table.h +19 -11
  162. data/src/core/ext/transport/chttp2/transport/{http2_settings.c → http2_settings.cc} +1 -1
  163. data/src/core/ext/transport/chttp2/transport/http2_settings.h +10 -2
  164. data/src/core/ext/transport/chttp2/transport/{huffsyms.c → huffsyms.cc} +0 -0
  165. data/src/core/ext/transport/chttp2/transport/huffsyms.h +8 -0
  166. data/src/core/ext/transport/chttp2/transport/{incoming_metadata.c → incoming_metadata.cc} +14 -13
  167. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +18 -10
  168. data/src/core/ext/transport/chttp2/transport/internal.h +214 -340
  169. data/src/core/ext/transport/chttp2/transport/{parsing.c → parsing.cc} +152 -141
  170. data/src/core/ext/transport/chttp2/transport/{stream_lists.c → stream_lists.cc} +53 -53
  171. data/src/core/ext/transport/chttp2/transport/{stream_map.c → stream_map.cc} +35 -34
  172. data/src/core/ext/transport/chttp2/transport/stream_map.h +22 -14
  173. data/src/core/ext/transport/chttp2/transport/{varint.c → varint.cc} +0 -0
  174. data/src/core/ext/transport/chttp2/transport/varint.h +8 -0
  175. data/src/core/ext/transport/chttp2/transport/writing.cc +636 -0
  176. data/src/core/ext/transport/inproc/{inproc_plugin.c → inproc_plugin.cc} +5 -6
  177. data/src/core/ext/transport/inproc/{inproc_transport.c → inproc_transport.cc} +479 -544
  178. data/src/core/ext/transport/inproc/inproc_transport.h +4 -4
  179. data/src/core/lib/backoff/backoff.cc +80 -0
  180. data/src/core/lib/backoff/backoff.h +83 -0
  181. data/src/core/lib/channel/{channel_args.c → channel_args.cc} +92 -92
  182. data/src/core/lib/channel/channel_args.h +45 -37
  183. data/src/core/lib/channel/{channel_stack.c → channel_stack.cc} +67 -68
  184. data/src/core/lib/channel/channel_stack.h +76 -75
  185. data/src/core/lib/channel/{channel_stack_builder.c → channel_stack_builder.cc} +91 -91
  186. data/src/core/lib/channel/channel_stack_builder.h +45 -45
  187. data/src/core/lib/channel/{connected_channel.c → connected_channel.cc} +70 -70
  188. data/src/core/lib/channel/connected_channel.h +12 -4
  189. data/src/core/lib/channel/context.h +2 -2
  190. data/src/core/lib/channel/{handshaker.c → handshaker.cc} +7 -9
  191. data/src/core/lib/channel/handshaker.h +9 -1
  192. data/src/core/lib/channel/{handshaker_factory.c → handshaker_factory.cc} +7 -7
  193. data/src/core/lib/channel/handshaker_factory.h +18 -10
  194. data/src/core/lib/channel/{handshaker_registry.c → handshaker_registry.cc} +0 -0
  195. data/src/core/lib/channel/handshaker_registry.h +8 -0
  196. data/src/core/lib/compression/algorithm_metadata.h +8 -0
  197. data/src/core/lib/compression/{compression.c → compression.cc} +9 -9
  198. data/src/core/lib/compression/{message_compress.c → message_compress.cc} +0 -0
  199. data/src/core/lib/compression/message_compress.h +8 -0
  200. data/src/core/lib/compression/{stream_compression.c → stream_compression.cc} +12 -12
  201. data/src/core/lib/compression/stream_compression.h +27 -19
  202. data/src/core/lib/compression/{stream_compression_gzip.c → stream_compression_gzip.cc} +35 -36
  203. data/src/core/lib/compression/stream_compression_gzip.h +8 -0
  204. data/src/core/lib/compression/{stream_compression_identity.c → stream_compression_identity.cc} +19 -20
  205. data/src/core/lib/compression/stream_compression_identity.h +8 -0
  206. data/src/core/lib/debug/{stats.c → stats.cc} +19 -19
  207. data/src/core/lib/debug/stats.h +17 -9
  208. data/src/core/lib/debug/{stats_data.c → stats_data.cc} +45 -22
  209. data/src/core/lib/debug/stats_data.h +58 -19
  210. data/src/core/lib/debug/trace.cc +142 -0
  211. data/src/core/lib/debug/trace.h +74 -14
  212. data/src/core/lib/http/{format_request.c → format_request.cc} +10 -10
  213. data/src/core/lib/http/format_request.h +12 -4
  214. data/src/core/lib/http/{httpcli.c → httpcli.cc} +80 -80
  215. data/src/core/lib/http/httpcli.h +41 -33
  216. data/src/core/lib/http/{httpcli_security_connector.c → httpcli_security_connector.cc} +69 -55
  217. data/src/core/lib/http/{parser.c → parser.cc} +42 -42
  218. data/src/core/lib/http/parser.h +28 -20
  219. data/src/core/lib/{support → iomgr}/block_annotate.h +17 -8
  220. data/src/core/lib/iomgr/{call_combiner.c → call_combiner.cc} +29 -17
  221. data/src/core/lib/iomgr/call_combiner.h +9 -1
  222. data/src/core/lib/iomgr/closure.h +220 -62
  223. data/src/core/lib/iomgr/{combiner.c → combiner.cc} +63 -62
  224. data/src/core/lib/iomgr/combiner.h +16 -8
  225. data/src/core/lib/iomgr/{endpoint.c → endpoint.cc} +6 -0
  226. data/src/core/lib/iomgr/endpoint.h +47 -32
  227. data/src/core/lib/iomgr/endpoint_pair.h +12 -4
  228. data/src/core/lib/iomgr/{endpoint_pair_posix.c → endpoint_pair_posix.cc} +3 -3
  229. data/src/core/lib/iomgr/{endpoint_pair_uv.c → endpoint_pair_uv.cc} +2 -2
  230. data/src/core/lib/iomgr/{endpoint_pair_windows.c → endpoint_pair_windows.cc} +6 -6
  231. data/src/core/lib/iomgr/{error.c → error.cc} +125 -124
  232. data/src/core/lib/iomgr/error.h +32 -27
  233. data/src/core/lib/iomgr/error_internal.h +11 -2
  234. data/src/core/lib/iomgr/{ev_epoll1_linux.c → ev_epoll1_linux.cc} +214 -215
  235. data/src/core/lib/iomgr/ev_epoll1_linux.h +9 -1
  236. data/src/core/lib/iomgr/ev_epollex_linux.cc +1488 -0
  237. data/src/core/lib/iomgr/ev_epollex_linux.h +9 -1
  238. data/src/core/lib/iomgr/{ev_epollsig_linux.c → ev_epollsig_linux.cc} +304 -305
  239. data/src/core/lib/iomgr/ev_epollsig_linux.h +12 -4
  240. data/src/core/lib/iomgr/{ev_poll_posix.c → ev_poll_posix.cc} +272 -283
  241. data/src/core/lib/iomgr/ev_poll_posix.h +10 -2
  242. data/src/core/lib/iomgr/ev_posix.cc +288 -0
  243. data/src/core/lib/iomgr/ev_posix.h +75 -67
  244. data/src/core/lib/iomgr/{ev_windows.c → ev_windows.cc} +2 -2
  245. data/src/core/lib/iomgr/exec_ctx.cc +177 -0
  246. data/src/core/lib/iomgr/exec_ctx.h +35 -13
  247. data/src/core/lib/iomgr/{executor.c → executor.cc} +34 -35
  248. data/src/core/lib/iomgr/executor.h +12 -4
  249. data/src/core/lib/iomgr/{fork_posix.c → fork_posix.cc} +0 -0
  250. data/src/core/lib/iomgr/{fork_windows.c → fork_windows.cc} +0 -0
  251. data/src/core/lib/iomgr/gethostname.h +9 -1
  252. data/src/core/lib/iomgr/{gethostname_fallback.c → gethostname_fallback.cc} +2 -1
  253. data/src/core/lib/iomgr/{gethostname_host_name_max.c → gethostname_host_name_max.cc} +4 -3
  254. data/src/core/lib/iomgr/{gethostname_sysconf.c → gethostname_sysconf.cc} +3 -2
  255. data/src/core/lib/iomgr/{iocp_windows.c → iocp_windows.cc} +23 -25
  256. data/src/core/lib/iomgr/iocp_windows.h +17 -3
  257. data/src/core/lib/iomgr/{iomgr.c → iomgr.cc} +25 -19
  258. data/src/core/lib/iomgr/iomgr.h +11 -3
  259. data/src/core/lib/iomgr/iomgr_internal.h +13 -5
  260. data/src/core/lib/iomgr/{iomgr_posix.c → iomgr_posix.cc} +0 -1
  261. data/src/core/lib/iomgr/{iomgr_uv.c → iomgr_uv.cc} +1 -1
  262. data/src/core/lib/iomgr/iomgr_uv.h +8 -0
  263. data/src/core/lib/iomgr/{iomgr_windows.c → iomgr_windows.cc} +0 -0
  264. data/src/core/lib/iomgr/{is_epollexclusive_available.c → is_epollexclusive_available.cc} +1 -1
  265. data/src/core/lib/iomgr/is_epollexclusive_available.h +8 -0
  266. data/src/core/lib/iomgr/{load_file.c → load_file.cc} +12 -12
  267. data/src/core/lib/iomgr/load_file.h +2 -2
  268. data/src/core/lib/iomgr/{lockfree_event.c → lockfree_event.cc} +76 -68
  269. data/src/core/lib/iomgr/lockfree_event.h +30 -11
  270. data/src/core/lib/iomgr/{network_status_tracker.c → network_status_tracker.cc} +3 -2
  271. data/src/core/lib/iomgr/network_status_tracker.h +2 -2
  272. data/src/core/lib/iomgr/{polling_entity.c → polling_entity.cc} +18 -18
  273. data/src/core/lib/iomgr/polling_entity.h +21 -13
  274. data/src/core/lib/iomgr/pollset.h +17 -11
  275. data/src/core/lib/iomgr/pollset_set.h +23 -15
  276. data/src/core/lib/iomgr/{pollset_set_uv.c → pollset_set_uv.cc} +0 -0
  277. data/src/core/lib/iomgr/{pollset_set_windows.c → pollset_set_windows.cc} +0 -0
  278. data/src/core/lib/iomgr/{pollset_uv.c → pollset_uv.cc} +31 -29
  279. data/src/core/lib/iomgr/pollset_uv.h +8 -0
  280. data/src/core/lib/iomgr/{pollset_windows.c → pollset_windows.cc} +24 -24
  281. data/src/core/lib/iomgr/pollset_windows.h +17 -4
  282. data/src/core/lib/iomgr/port.h +10 -0
  283. data/src/core/lib/iomgr/resolve_address.h +18 -10
  284. data/src/core/lib/iomgr/{resolve_address_posix.c → resolve_address_posix.cc} +40 -40
  285. data/src/core/lib/iomgr/{resolve_address_uv.c → resolve_address_uv.cc} +61 -56
  286. data/src/core/lib/iomgr/{resolve_address_windows.c → resolve_address_windows.cc} +36 -34
  287. data/src/core/lib/iomgr/{resource_quota.c → resource_quota.cc} +209 -180
  288. data/src/core/lib/iomgr/resource_quota.h +45 -37
  289. data/src/core/lib/iomgr/{sockaddr_utils.c → sockaddr_utils.cc} +61 -61
  290. data/src/core/lib/iomgr/sockaddr_utils.h +23 -15
  291. data/src/core/lib/iomgr/sockaddr_windows.h +6 -0
  292. data/src/core/lib/iomgr/{socket_factory_posix.c → socket_factory_posix.cc} +20 -20
  293. data/src/core/lib/iomgr/socket_factory_posix.h +15 -15
  294. data/src/core/lib/iomgr/{socket_mutator.c → socket_mutator.cc} +18 -18
  295. data/src/core/lib/iomgr/socket_mutator.h +11 -11
  296. data/src/core/lib/iomgr/socket_utils.h +9 -1
  297. data/src/core/lib/iomgr/{socket_utils_common_posix.c → socket_utils_common_posix.cc} +28 -28
  298. data/src/core/lib/iomgr/{socket_utils_linux.c → socket_utils_linux.cc} +3 -3
  299. data/src/core/lib/iomgr/{socket_utils_posix.c → socket_utils_posix.cc} +3 -3
  300. data/src/core/lib/iomgr/socket_utils_posix.h +26 -18
  301. data/src/core/lib/iomgr/{socket_utils_uv.c → socket_utils_uv.cc} +1 -1
  302. data/src/core/lib/iomgr/{socket_utils_windows.c → socket_utils_windows.cc} +2 -2
  303. data/src/core/lib/iomgr/{socket_windows.c → socket_windows.cc} +18 -18
  304. data/src/core/lib/iomgr/socket_windows.h +26 -13
  305. data/src/core/lib/iomgr/tcp_client.h +14 -6
  306. data/src/core/lib/iomgr/{tcp_client_posix.c → tcp_client_posix.cc} +69 -70
  307. data/src/core/lib/iomgr/tcp_client_posix.h +11 -3
  308. data/src/core/lib/iomgr/{tcp_client_uv.c → tcp_client_uv.cc} +47 -48
  309. data/src/core/lib/iomgr/{tcp_client_windows.c → tcp_client_windows.cc} +46 -44
  310. data/src/core/lib/iomgr/{tcp_posix.c → tcp_posix.cc} +198 -175
  311. data/src/core/lib/iomgr/tcp_posix.h +15 -7
  312. data/src/core/lib/iomgr/tcp_server.h +31 -23
  313. data/src/core/lib/iomgr/{tcp_server_posix.c → tcp_server_posix.cc} +78 -77
  314. data/src/core/lib/iomgr/tcp_server_utils_posix.h +27 -19
  315. data/src/core/lib/iomgr/{tcp_server_utils_posix_common.c → tcp_server_utils_posix_common.cc} +27 -27
  316. data/src/core/lib/iomgr/{tcp_server_utils_posix_ifaddrs.c → tcp_server_utils_posix_ifaddrs.cc} +25 -25
  317. data/src/core/lib/iomgr/{tcp_server_utils_posix_noifaddrs.c → tcp_server_utils_posix_noifaddrs.cc} +2 -2
  318. data/src/core/lib/iomgr/{tcp_server_uv.c → tcp_server_uv.cc} +133 -105
  319. data/src/core/lib/iomgr/{tcp_server_windows.c → tcp_server_windows.cc} +81 -77
  320. data/src/core/lib/iomgr/tcp_uv.cc +420 -0
  321. data/src/core/lib/iomgr/tcp_uv.h +18 -4
  322. data/src/core/lib/iomgr/{tcp_windows.c → tcp_windows.cc} +90 -79
  323. data/src/core/lib/iomgr/tcp_windows.h +17 -4
  324. data/src/core/lib/iomgr/{time_averaged_stats.c → time_averaged_stats.cc} +0 -0
  325. data/src/core/lib/iomgr/time_averaged_stats.h +8 -0
  326. data/src/core/lib/iomgr/timer.h +16 -9
  327. data/src/core/lib/iomgr/{timer_generic.c → timer_generic.cc} +130 -171
  328. data/src/core/lib/iomgr/timer_generic.h +4 -4
  329. data/src/core/lib/iomgr/{timer_heap.c → timer_heap.cc} +20 -21
  330. data/src/core/lib/iomgr/timer_heap.h +16 -8
  331. data/src/core/lib/iomgr/{timer_manager.c → timer_manager.cc} +54 -52
  332. data/src/core/lib/iomgr/timer_manager.h +8 -0
  333. data/src/core/lib/iomgr/{timer_uv.c → timer_uv.cc} +22 -24
  334. data/src/core/lib/iomgr/timer_uv.h +2 -2
  335. data/src/core/lib/iomgr/{udp_server.c → udp_server.cc} +75 -75
  336. data/src/core/lib/iomgr/udp_server.h +25 -17
  337. data/src/core/lib/iomgr/{unix_sockets_posix.c → unix_sockets_posix.cc} +22 -21
  338. data/src/core/lib/iomgr/unix_sockets_posix.h +14 -6
  339. data/src/core/lib/iomgr/{unix_sockets_posix_noop.c → unix_sockets_posix_noop.cc} +5 -5
  340. data/src/core/lib/iomgr/{wakeup_fd_cv.c → wakeup_fd_cv.cc} +2 -2
  341. data/src/core/lib/iomgr/wakeup_fd_cv.h +10 -0
  342. data/src/core/lib/iomgr/{wakeup_fd_eventfd.c → wakeup_fd_eventfd.cc} +0 -0
  343. data/src/core/lib/iomgr/{wakeup_fd_nospecial.c → wakeup_fd_nospecial.cc} +0 -0
  344. data/src/core/lib/iomgr/{wakeup_fd_pipe.c → wakeup_fd_pipe.cc} +1 -0
  345. data/src/core/lib/iomgr/wakeup_fd_pipe.h +9 -1
  346. data/src/core/lib/iomgr/{wakeup_fd_posix.c → wakeup_fd_posix.cc} +6 -7
  347. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -0
  348. data/src/core/lib/json/{json.c → json.cc} +0 -0
  349. data/src/core/lib/json/json.h +8 -0
  350. data/src/core/lib/json/{json_reader.c → json_reader.cc} +18 -18
  351. data/src/core/lib/json/json_reader.h +26 -18
  352. data/src/core/lib/json/{json_string.c → json_string.cc} +57 -57
  353. data/src/core/lib/json/{json_writer.c → json_writer.cc} +20 -20
  354. data/src/core/lib/json/json_writer.h +23 -15
  355. data/src/core/lib/profiling/{basic_timers.c → basic_timers.cc} +34 -34
  356. data/src/core/lib/profiling/{stap_timers.c → stap_timers.cc} +5 -5
  357. data/src/core/lib/profiling/timers.h +6 -6
  358. data/src/core/lib/security/context/{security_context.c → security_context.cc} +98 -95
  359. data/src/core/lib/security/context/security_context.h +27 -29
  360. data/src/core/lib/security/credentials/composite/{composite_credentials.c → composite_credentials.cc} +79 -73
  361. data/src/core/lib/security/credentials/composite/composite_credentials.h +17 -9
  362. data/src/core/lib/security/credentials/{credentials.c → credentials.cc} +97 -92
  363. data/src/core/lib/security/credentials/credentials.h +83 -75
  364. data/src/core/lib/security/credentials/{credentials_metadata.c → credentials_metadata.cc} +7 -6
  365. data/src/core/lib/security/credentials/fake/{fake_credentials.c → fake_credentials.cc} +39 -36
  366. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -5
  367. data/src/core/lib/security/credentials/google_default/{credentials_generic.c → credentials_generic.cc} +5 -5
  368. data/src/core/lib/security/credentials/google_default/{google_default_credentials.c → google_default_credentials.cc} +55 -55
  369. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +9 -1
  370. data/src/core/lib/security/credentials/iam/{iam_credentials.c → iam_credentials.cc} +19 -18
  371. data/src/core/lib/security/credentials/jwt/{json_token.c → json_token.cc} +80 -75
  372. data/src/core/lib/security/credentials/jwt/json_token.h +23 -15
  373. data/src/core/lib/security/credentials/jwt/{jwt_credentials.c → jwt_credentials.cc} +45 -41
  374. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +11 -3
  375. data/src/core/lib/security/credentials/jwt/{jwt_verifier.c → jwt_verifier.cc} +262 -252
  376. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +38 -30
  377. data/src/core/lib/security/credentials/oauth2/{oauth2_credentials.c → oauth2_credentials.cc} +138 -141
  378. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +30 -22
  379. data/src/core/lib/security/credentials/plugin/{plugin_credentials.c → plugin_credentials.cc} +52 -53
  380. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +7 -7
  381. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +344 -0
  382. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +27 -0
  383. data/src/core/lib/security/transport/auth_filters.h +16 -0
  384. data/src/core/lib/security/transport/{client_auth_filter.c → client_auth_filter.cc} +127 -115
  385. data/src/core/lib/security/transport/{lb_targets_info.c → lb_targets_info.cc} +16 -13
  386. data/src/core/lib/security/transport/lb_targets_info.h +11 -3
  387. data/src/core/lib/security/transport/{secure_endpoint.c → secure_endpoint.cc} +84 -76
  388. data/src/core/lib/security/transport/secure_endpoint.h +13 -5
  389. data/src/core/lib/security/transport/security_connector.cc +1121 -0
  390. data/src/core/lib/security/transport/security_connector.h +97 -79
  391. data/src/core/lib/security/transport/{security_handshaker.c → security_handshaker.cc} +139 -132
  392. data/src/core/lib/security/transport/security_handshaker.h +11 -3
  393. data/src/core/lib/security/transport/{server_auth_filter.c → server_auth_filter.cc} +68 -68
  394. data/src/core/lib/security/transport/{tsi_error.c → tsi_error.cc} +1 -1
  395. data/src/core/lib/security/transport/tsi_error.h +9 -1
  396. data/src/core/lib/security/util/{json_util.c → json_util.cc} +11 -11
  397. data/src/core/lib/security/util/json_util.h +12 -4
  398. data/src/core/lib/slice/{b64.c → b64.cc} +15 -15
  399. data/src/core/lib/slice/b64.h +12 -4
  400. data/src/core/lib/slice/{percent_encoding.c → percent_encoding.cc} +15 -15
  401. data/src/core/lib/slice/percent_encoding.h +11 -3
  402. data/src/core/lib/slice/{slice.c → slice.cc} +64 -64
  403. data/src/core/lib/slice/{slice_buffer.c → slice_buffer.cc} +38 -38
  404. data/src/core/lib/slice/{slice_hash_table.c → slice_hash_table.cc} +7 -7
  405. data/src/core/lib/slice/slice_hash_table.h +19 -11
  406. data/src/core/lib/slice/{slice_intern.c → slice_intern.cc} +35 -34
  407. data/src/core/lib/slice/slice_internal.h +17 -6
  408. data/src/core/lib/slice/{slice_string_helpers.c → slice_string_helpers.cc} +9 -9
  409. data/src/core/lib/slice/slice_string_helpers.h +3 -3
  410. data/src/core/lib/support/abstract.h +29 -0
  411. data/src/core/lib/support/{alloc.c → alloc.cc} +22 -22
  412. data/src/core/lib/support/{arena.c → arena.cc} +12 -12
  413. data/src/core/lib/support/arena.h +11 -3
  414. data/src/core/lib/support/{atm.c → atm.cc} +1 -1
  415. data/src/core/lib/support/{avl.c → avl.cc} +71 -70
  416. data/src/core/lib/support/{cmdline.c → cmdline.cc} +62 -62
  417. data/src/core/lib/support/{cpu_iphone.c → cpu_iphone.cc} +2 -0
  418. data/src/core/lib/support/{cpu_linux.c → cpu_linux.cc} +10 -0
  419. data/src/core/lib/support/{cpu_posix.c → cpu_posix.cc} +27 -4
  420. data/src/core/lib/support/{cpu_windows.c → cpu_windows.cc} +1 -0
  421. data/src/core/lib/support/env.h +3 -3
  422. data/src/core/lib/support/{env_linux.c → env_linux.cc} +11 -11
  423. data/src/core/lib/support/{env_posix.c → env_posix.cc} +4 -4
  424. data/src/core/lib/support/{env_windows.c → env_windows.cc} +5 -5
  425. data/src/core/lib/support/{fork.c → fork.cc} +2 -2
  426. data/src/core/lib/support/{histogram.c → histogram.cc} +25 -26
  427. data/src/core/lib/support/{host_port.c → host_port.cc} +16 -16
  428. data/src/core/lib/support/{log.c → log.cc} +8 -8
  429. data/src/core/lib/support/{log_android.c → log_android.cc} +7 -7
  430. data/src/core/lib/support/{log_linux.c → log_linux.cc} +8 -8
  431. data/src/core/lib/support/{log_posix.c → log_posix.cc} +9 -10
  432. data/src/core/lib/support/{log_windows.c → log_windows.cc} +7 -7
  433. data/src/core/lib/support/manual_constructor.h +211 -0
  434. data/src/core/lib/support/memory.h +41 -0
  435. data/src/core/lib/support/mpscq.cc +114 -0
  436. data/src/core/lib/support/mpscq.h +45 -7
  437. data/src/core/lib/support/{murmur_hash.c → murmur_hash.cc} +9 -12
  438. data/src/core/lib/support/murmur_hash.h +9 -1
  439. data/src/core/lib/support/spinlock.h +8 -1
  440. data/src/core/lib/support/{string.c → string.cc} +56 -55
  441. data/src/core/lib/support/string.h +21 -21
  442. data/src/core/lib/support/{string_posix.c → string_posix.cc} +5 -4
  443. data/src/core/lib/support/{string_util_windows.c → string_util_windows.cc} +9 -6
  444. data/src/core/lib/support/{string_windows.c → string_windows.cc} +3 -2
  445. data/src/core/lib/support/string_windows.h +8 -0
  446. data/src/core/lib/support/{subprocess_posix.c → subprocess_posix.cc} +13 -13
  447. data/src/core/lib/support/{subprocess_windows.c → subprocess_windows.cc} +9 -9
  448. data/src/core/lib/support/{sync.c → sync.cc} +22 -22
  449. data/src/core/lib/support/{sync_posix.c → sync_posix.cc} +6 -2
  450. data/src/core/lib/support/{sync_windows.c → sync_windows.cc} +14 -14
  451. data/src/core/lib/support/{thd.c → thd.cc} +0 -0
  452. data/src/core/lib/support/{thd_posix.c → thd_posix.cc} +10 -10
  453. data/src/core/lib/support/{thd_windows.c → thd_windows.cc} +10 -10
  454. data/src/core/lib/support/{time.c → time.cc} +0 -0
  455. data/src/core/lib/support/{time_posix.c → time_posix.cc} +5 -6
  456. data/src/core/lib/support/{time_precise.c → time_precise.cc} +6 -4
  457. data/src/core/lib/support/time_precise.h +9 -1
  458. data/src/core/lib/support/{time_windows.c → time_windows.cc} +2 -3
  459. data/src/core/lib/support/{tls_pthread.c → tls_pthread.cc} +2 -2
  460. data/src/core/lib/support/tmpfile.h +1 -1
  461. data/src/core/lib/support/{tmpfile_msys.c → tmpfile_msys.cc} +2 -2
  462. data/src/core/lib/support/{tmpfile_posix.c → tmpfile_posix.cc} +7 -7
  463. data/src/core/lib/support/{tmpfile_windows.c → tmpfile_windows.cc} +2 -2
  464. data/src/core/lib/support/{wrap_memcpy.c → wrap_memcpy.cc} +4 -2
  465. data/src/core/lib/surface/{alarm.c → alarm.cc} +32 -31
  466. data/src/core/lib/surface/alarm_internal.h +10 -2
  467. data/src/core/lib/surface/{api_trace.c → api_trace.cc} +1 -1
  468. data/src/core/lib/surface/api_trace.h +2 -2
  469. data/src/core/lib/surface/{byte_buffer.c → byte_buffer.cc} +13 -13
  470. data/src/core/lib/surface/{byte_buffer_reader.c → byte_buffer_reader.cc} +9 -9
  471. data/src/core/lib/surface/{call.c → call.cc} +379 -372
  472. data/src/core/lib/surface/call.h +37 -38
  473. data/src/core/lib/surface/{call_details.c → call_details.cc} +0 -0
  474. data/src/core/lib/surface/{call_log_batch.c → call_log_batch.cc} +13 -11
  475. data/src/core/lib/surface/call_test_only.h +5 -5
  476. data/src/core/lib/surface/{channel.c → channel.cc} +94 -95
  477. data/src/core/lib/surface/channel.h +29 -21
  478. data/src/core/lib/surface/{channel_init.c → channel_init.cc} +13 -13
  479. data/src/core/lib/surface/channel_init.h +6 -6
  480. data/src/core/lib/surface/{channel_ping.c → channel_ping.cc} +12 -12
  481. data/src/core/lib/surface/{channel_stack_type.c → channel_stack_type.cc} +1 -1
  482. data/src/core/lib/surface/channel_stack_type.h +9 -1
  483. data/src/core/lib/surface/{completion_queue.c → completion_queue.cc} +416 -379
  484. data/src/core/lib/surface/completion_queue.h +29 -29
  485. data/src/core/lib/surface/{completion_queue_factory.c → completion_queue_factory.cc} +1 -1
  486. data/src/core/lib/surface/completion_queue_factory.h +8 -0
  487. data/src/core/lib/surface/{event_string.c → event_string.cc} +9 -9
  488. data/src/core/lib/surface/event_string.h +9 -1
  489. data/src/core/lib/surface/{init.c → init.cc} +16 -39
  490. data/src/core/lib/surface/init.h +8 -0
  491. data/src/core/lib/surface/{init_secure.c → init_secure.cc} +12 -25
  492. data/src/core/lib/surface/lame_client.cc +38 -40
  493. data/src/core/lib/surface/lame_client.h +8 -0
  494. data/src/core/lib/surface/{metadata_array.c → metadata_array.cc} +0 -0
  495. data/src/core/lib/surface/{server.c → server.cc} +340 -404
  496. data/src/core/lib/surface/server.h +22 -14
  497. data/src/core/lib/surface/{validate_metadata.c → validate_metadata.cc} +10 -9
  498. data/src/core/lib/surface/validate_metadata.h +10 -2
  499. data/src/core/lib/surface/{version.c → version.cc} +2 -2
  500. data/src/core/lib/transport/bdp_estimator.cc +84 -0
  501. data/src/core/lib/transport/bdp_estimator.h +67 -42
  502. data/src/core/lib/transport/{byte_stream.c → byte_stream.cc} +51 -51
  503. data/src/core/lib/transport/byte_stream.h +41 -33
  504. data/src/core/lib/transport/{connectivity_state.c → connectivity_state.cc} +36 -40
  505. data/src/core/lib/transport/connectivity_state.h +29 -21
  506. data/src/core/lib/transport/{error_utils.c → error_utils.cc} +26 -22
  507. data/src/core/lib/transport/error_utils.h +18 -6
  508. data/src/core/lib/transport/{metadata.c → metadata.cc} +92 -88
  509. data/src/core/lib/transport/metadata.h +22 -20
  510. data/src/core/lib/transport/{metadata_batch.c → metadata_batch.cc} +78 -79
  511. data/src/core/lib/transport/metadata_batch.h +46 -45
  512. data/src/core/lib/transport/pid_controller.cc +48 -0
  513. data/src/core/lib/transport/pid_controller.h +84 -32
  514. data/src/core/lib/transport/{service_config.c → service_config.cc} +66 -48
  515. data/src/core/lib/transport/service_config.h +11 -2
  516. data/src/core/lib/transport/{static_metadata.c → static_metadata.cc} +2 -2
  517. data/src/core/lib/transport/static_metadata.h +30 -23
  518. data/src/core/lib/transport/{status_conversion.c → status_conversion.cc} +4 -3
  519. data/src/core/lib/transport/status_conversion.h +12 -2
  520. data/src/core/lib/transport/{timeout_encoding.c → timeout_encoding.cc} +28 -61
  521. data/src/core/lib/transport/timeout_encoding.h +11 -2
  522. data/src/core/lib/transport/{transport.c → transport.cc} +79 -79
  523. data/src/core/lib/transport/transport.h +78 -80
  524. data/src/core/lib/transport/transport_impl.h +27 -19
  525. data/src/core/lib/transport/{transport_op_string.c → transport_op_string.cc} +32 -30
  526. data/src/core/plugin_registry/{grpc_plugin_registry.c → grpc_plugin_registry.cc} +34 -38
  527. data/src/core/tsi/{fake_transport_security.c → fake_transport_security.cc} +141 -132
  528. data/src/core/tsi/fake_transport_security.h +5 -5
  529. data/src/core/tsi/{gts_transport_security.c → gts_transport_security.cc} +4 -4
  530. data/src/core/tsi/gts_transport_security.h +11 -3
  531. data/src/core/tsi/{ssl_transport_security.c → ssl_transport_security.cc} +309 -300
  532. data/src/core/tsi/ssl_transport_security.h +25 -25
  533. data/src/core/tsi/ssl_types.h +8 -0
  534. data/src/core/tsi/{transport_security.c → transport_security.cc} +94 -87
  535. data/src/core/tsi/transport_security.h +55 -55
  536. data/src/core/tsi/{transport_security_adapter.c → transport_security_adapter.cc} +58 -55
  537. data/src/core/tsi/transport_security_adapter.h +2 -2
  538. data/src/core/tsi/{transport_security_grpc.c → transport_security_grpc.cc} +21 -21
  539. data/src/core/tsi/transport_security_grpc.h +19 -19
  540. data/src/core/tsi/transport_security_interface.h +41 -41
  541. data/src/ruby/ext/grpc/extconf.rb +4 -2
  542. data/src/ruby/ext/grpc/rb_byte_buffer.c +5 -5
  543. data/src/ruby/ext/grpc/rb_byte_buffer.h +2 -2
  544. data/src/ruby/ext/grpc/rb_call.c +41 -42
  545. data/src/ruby/ext/grpc/rb_call.h +6 -6
  546. data/src/ruby/ext/grpc/rb_call_credentials.c +30 -30
  547. data/src/ruby/ext/grpc/rb_channel.c +87 -87
  548. data/src/ruby/ext/grpc/rb_channel_credentials.c +23 -23
  549. data/src/ruby/ext/grpc/rb_completion_queue.c +11 -11
  550. data/src/ruby/ext/grpc/rb_completion_queue.h +3 -3
  551. data/src/ruby/ext/grpc/rb_compression_options.c +20 -20
  552. data/src/ruby/ext/grpc/rb_event_thread.c +14 -14
  553. data/src/ruby/ext/grpc/rb_event_thread.h +1 -1
  554. data/src/ruby/ext/grpc/rb_grpc.c +8 -8
  555. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +16 -58
  556. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +242 -306
  557. data/src/ruby/ext/grpc/rb_server.c +23 -23
  558. data/src/ruby/ext/grpc/rb_server_credentials.c +13 -13
  559. data/src/ruby/lib/grpc/generic/rpc_server.rb +25 -12
  560. data/src/ruby/lib/grpc/version.rb +1 -1
  561. data/src/ruby/pb/grpc/health/checker.rb +14 -0
  562. data/src/ruby/spec/pb/health/checker_spec.rb +29 -0
  563. data/third_party/cares/config_freebsd/ares_config.h +502 -0
  564. data/third_party/cares/config_openbsd/ares_config.h +502 -0
  565. metadata +302 -328
  566. data/src/core/ext/census/aggregation.h +0 -51
  567. data/src/core/ext/census/base_resources.c +0 -56
  568. data/src/core/ext/census/base_resources.h +0 -24
  569. data/src/core/ext/census/census_interface.h +0 -61
  570. data/src/core/ext/census/census_rpc_stats.h +0 -86
  571. data/src/core/ext/census/context.c +0 -496
  572. data/src/core/ext/census/gen/census.pb.c +0 -161
  573. data/src/core/ext/census/gen/census.pb.h +0 -280
  574. data/src/core/ext/census/gen/trace_context.pb.c +0 -39
  575. data/src/core/ext/census/gen/trace_context.pb.h +0 -78
  576. data/src/core/ext/census/grpc_filter.c +0 -196
  577. data/src/core/ext/census/grpc_plugin.c +0 -70
  578. data/src/core/ext/census/initialize.c +0 -51
  579. data/src/core/ext/census/intrusive_hash_map.c +0 -305
  580. data/src/core/ext/census/intrusive_hash_map.h +0 -152
  581. data/src/core/ext/census/intrusive_hash_map_internal.h +0 -48
  582. data/src/core/ext/census/mlog.c +0 -586
  583. data/src/core/ext/census/mlog.h +0 -80
  584. data/src/core/ext/census/operation.c +0 -48
  585. data/src/core/ext/census/placeholders.c +0 -49
  586. data/src/core/ext/census/resource.c +0 -303
  587. data/src/core/ext/census/resource.h +0 -48
  588. data/src/core/ext/census/rpc_metric_id.h +0 -36
  589. data/src/core/ext/census/trace_context.c +0 -71
  590. data/src/core/ext/census/trace_context.h +0 -56
  591. data/src/core/ext/census/trace_label.h +0 -46
  592. data/src/core/ext/census/trace_propagation.h +0 -48
  593. data/src/core/ext/census/trace_status.h +0 -30
  594. data/src/core/ext/census/trace_string.h +0 -35
  595. data/src/core/ext/census/tracing.c +0 -55
  596. data/src/core/ext/census/tracing.h +0 -109
  597. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +0 -714
  598. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +0 -924
  599. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.c +0 -60
  600. data/src/core/ext/transport/chttp2/transport/flow_control.c +0 -502
  601. data/src/core/ext/transport/chttp2/transport/writing.c +0 -534
  602. data/src/core/lib/debug/trace.c +0 -146
  603. data/src/core/lib/iomgr/closure.c +0 -219
  604. data/src/core/lib/iomgr/ev_epollex_linux.c +0 -1461
  605. data/src/core/lib/iomgr/ev_posix.c +0 -266
  606. data/src/core/lib/iomgr/exec_ctx.c +0 -113
  607. data/src/core/lib/iomgr/tcp_uv.c +0 -381
  608. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +0 -194
  609. data/src/core/lib/security/transport/security_connector.c +0 -914
  610. data/src/core/lib/support/backoff.c +0 -72
  611. data/src/core/lib/support/backoff.h +0 -56
  612. data/src/core/lib/support/mpscq.c +0 -79
  613. data/src/core/lib/support/stack_lockfree.c +0 -137
  614. data/src/core/lib/support/stack_lockfree.h +0 -38
  615. data/src/core/lib/transport/bdp_estimator.c +0 -110
  616. data/src/core/lib/transport/pid_controller.c +0 -63
@@ -19,11 +19,10 @@
19
19
  #include "src/core/ext/transport/inproc/inproc_transport.h"
20
20
  #include "src/core/lib/debug/trace.h"
21
21
 
22
- grpc_tracer_flag grpc_inproc_trace = GRPC_TRACER_INITIALIZER(false, "inproc");
22
+ grpc_core::TraceFlag grpc_inproc_trace(false, "inproc");
23
23
 
24
- void grpc_inproc_plugin_init(void) {
25
- grpc_register_tracer(&grpc_inproc_trace);
26
- grpc_inproc_transport_init();
27
- }
24
+ extern "C" void grpc_inproc_plugin_init(void) { grpc_inproc_transport_init(); }
28
25
 
29
- void grpc_inproc_plugin_shutdown(void) { grpc_inproc_transport_shutdown(); }
26
+ extern "C" void grpc_inproc_plugin_shutdown(void) {
27
+ grpc_inproc_transport_shutdown();
28
+ }
@@ -32,9 +32,9 @@
32
32
  #include "src/core/lib/transport/error_utils.h"
33
33
  #include "src/core/lib/transport/transport_impl.h"
34
34
 
35
- #define INPROC_LOG(...) \
36
- do { \
37
- if (GRPC_TRACER_ON(grpc_inproc_trace)) gpr_log(__VA_ARGS__); \
35
+ #define INPROC_LOG(...) \
36
+ do { \
37
+ if (grpc_inproc_trace.enabled()) gpr_log(__VA_ARGS__); \
38
38
  } while (0)
39
39
 
40
40
  static grpc_slice g_empty_slice;
@@ -50,125 +50,55 @@ typedef struct {
50
50
 
51
51
  typedef struct inproc_transport {
52
52
  grpc_transport base;
53
- shared_mu *mu;
53
+ shared_mu* mu;
54
54
  gpr_refcount refs;
55
55
  bool is_client;
56
56
  grpc_connectivity_state_tracker connectivity;
57
- void (*accept_stream_cb)(grpc_exec_ctx *exec_ctx, void *user_data,
58
- grpc_transport *transport, const void *server_data);
59
- void *accept_stream_data;
57
+ void (*accept_stream_cb)(grpc_exec_ctx* exec_ctx, void* user_data,
58
+ grpc_transport* transport, const void* server_data);
59
+ void* accept_stream_data;
60
60
  bool is_closed;
61
- struct inproc_transport *other_side;
62
- struct inproc_stream *stream_list;
61
+ struct inproc_transport* other_side;
62
+ struct inproc_stream* stream_list;
63
63
  } inproc_transport;
64
64
 
65
- typedef struct sb_list_entry {
66
- grpc_slice_buffer sb;
67
- struct sb_list_entry *next;
68
- } sb_list_entry;
69
-
70
- // Specialize grpc_byte_stream for our use case
71
- typedef struct {
72
- grpc_byte_stream base;
73
- sb_list_entry *le;
74
- grpc_error *shutdown_error;
75
- } inproc_slice_byte_stream;
76
-
77
- typedef struct {
78
- // TODO (vjpai): Add some inlined elements to avoid alloc in simple cases
79
- sb_list_entry *head;
80
- sb_list_entry *tail;
81
- } slice_buffer_list;
82
-
83
- static void slice_buffer_list_init(slice_buffer_list *l) {
84
- l->head = NULL;
85
- l->tail = NULL;
86
- }
87
-
88
- static void sb_list_entry_destroy(grpc_exec_ctx *exec_ctx, sb_list_entry *le) {
89
- grpc_slice_buffer_destroy_internal(exec_ctx, &le->sb);
90
- gpr_free(le);
91
- }
92
-
93
- static void slice_buffer_list_destroy(grpc_exec_ctx *exec_ctx,
94
- slice_buffer_list *l) {
95
- sb_list_entry *curr = l->head;
96
- while (curr != NULL) {
97
- sb_list_entry *le = curr;
98
- curr = curr->next;
99
- sb_list_entry_destroy(exec_ctx, le);
100
- }
101
- l->head = NULL;
102
- l->tail = NULL;
103
- }
104
-
105
- static bool slice_buffer_list_empty(slice_buffer_list *l) {
106
- return l->head == NULL;
107
- }
108
-
109
- static void slice_buffer_list_append_entry(slice_buffer_list *l,
110
- sb_list_entry *next) {
111
- next->next = NULL;
112
- if (l->tail) {
113
- l->tail->next = next;
114
- l->tail = next;
115
- } else {
116
- l->head = next;
117
- l->tail = next;
118
- }
119
- }
120
-
121
- static grpc_slice_buffer *slice_buffer_list_append(slice_buffer_list *l) {
122
- sb_list_entry *next = (sb_list_entry *)gpr_malloc(sizeof(*next));
123
- grpc_slice_buffer_init(&next->sb);
124
- slice_buffer_list_append_entry(l, next);
125
- return &next->sb;
126
- }
127
-
128
- static sb_list_entry *slice_buffer_list_pophead(slice_buffer_list *l) {
129
- sb_list_entry *ret = l->head;
130
- l->head = l->head->next;
131
- if (l->head == NULL) {
132
- l->tail = NULL;
133
- }
134
- return ret;
135
- }
136
-
137
65
  typedef struct inproc_stream {
138
- inproc_transport *t;
66
+ inproc_transport* t;
139
67
  grpc_metadata_batch to_read_initial_md;
140
68
  uint32_t to_read_initial_md_flags;
141
69
  bool to_read_initial_md_filled;
142
- slice_buffer_list to_read_message;
143
70
  grpc_metadata_batch to_read_trailing_md;
144
71
  bool to_read_trailing_md_filled;
145
- bool reads_needed;
146
- bool read_closure_scheduled;
147
- grpc_closure read_closure;
72
+ bool ops_needed;
73
+ bool op_closure_scheduled;
74
+ grpc_closure op_closure;
148
75
  // Write buffer used only during gap at init time when client-side
149
76
  // stream is set up but server side stream is not yet set up
150
77
  grpc_metadata_batch write_buffer_initial_md;
151
78
  bool write_buffer_initial_md_filled;
152
79
  uint32_t write_buffer_initial_md_flags;
153
- gpr_timespec write_buffer_deadline;
154
- slice_buffer_list write_buffer_message;
80
+ grpc_millis write_buffer_deadline;
155
81
  grpc_metadata_batch write_buffer_trailing_md;
156
82
  bool write_buffer_trailing_md_filled;
157
- grpc_error *write_buffer_cancel_error;
83
+ grpc_error* write_buffer_cancel_error;
158
84
 
159
- struct inproc_stream *other_side;
85
+ struct inproc_stream* other_side;
160
86
  bool other_side_closed; // won't talk anymore
161
87
  bool write_buffer_other_side_closed; // on hold
162
- grpc_stream_refcount *refs;
163
- grpc_closure *closure_at_destroy;
88
+ grpc_stream_refcount* refs;
89
+ grpc_closure* closure_at_destroy;
164
90
 
165
- gpr_arena *arena;
91
+ gpr_arena* arena;
166
92
 
167
- grpc_transport_stream_op_batch *recv_initial_md_op;
168
- grpc_transport_stream_op_batch *recv_message_op;
169
- grpc_transport_stream_op_batch *recv_trailing_md_op;
93
+ grpc_transport_stream_op_batch* send_message_op;
94
+ grpc_transport_stream_op_batch* send_trailing_md_op;
95
+ grpc_transport_stream_op_batch* recv_initial_md_op;
96
+ grpc_transport_stream_op_batch* recv_message_op;
97
+ grpc_transport_stream_op_batch* recv_trailing_md_op;
170
98
 
171
- inproc_slice_byte_stream recv_message_stream;
99
+ grpc_slice_buffer recv_message;
100
+ grpc_slice_buffer_stream recv_stream;
101
+ bool recv_inited;
172
102
 
173
103
  bool initial_md_sent;
174
104
  bool trailing_md_sent;
@@ -177,72 +107,29 @@ typedef struct inproc_stream {
177
107
 
178
108
  bool closed;
179
109
 
180
- grpc_error *cancel_self_error;
181
- grpc_error *cancel_other_error;
110
+ grpc_error* cancel_self_error;
111
+ grpc_error* cancel_other_error;
182
112
 
183
- gpr_timespec deadline;
113
+ grpc_millis deadline;
184
114
 
185
115
  bool listed;
186
- struct inproc_stream *stream_list_prev;
187
- struct inproc_stream *stream_list_next;
116
+ struct inproc_stream* stream_list_prev;
117
+ struct inproc_stream* stream_list_next;
188
118
  } inproc_stream;
189
119
 
190
- static bool inproc_slice_byte_stream_next(grpc_exec_ctx *exec_ctx,
191
- grpc_byte_stream *bs, size_t max,
192
- grpc_closure *on_complete) {
193
- // Because inproc transport always provides the entire message atomically,
194
- // the byte stream always has data available when this function is called.
195
- // Thus, this function always returns true (unlike other transports) and
196
- // there is never any need to schedule a closure
197
- return true;
198
- }
199
-
200
- static grpc_error *inproc_slice_byte_stream_pull(grpc_exec_ctx *exec_ctx,
201
- grpc_byte_stream *bs,
202
- grpc_slice *slice) {
203
- inproc_slice_byte_stream *stream = (inproc_slice_byte_stream *)bs;
204
- if (stream->shutdown_error != GRPC_ERROR_NONE) {
205
- return GRPC_ERROR_REF(stream->shutdown_error);
206
- }
207
- *slice = grpc_slice_buffer_take_first(&stream->le->sb);
208
- return GRPC_ERROR_NONE;
209
- }
210
-
211
- static void inproc_slice_byte_stream_shutdown(grpc_exec_ctx *exec_ctx,
212
- grpc_byte_stream *bs,
213
- grpc_error *error) {
214
- inproc_slice_byte_stream *stream = (inproc_slice_byte_stream *)bs;
215
- GRPC_ERROR_UNREF(stream->shutdown_error);
216
- stream->shutdown_error = error;
217
- }
218
-
219
- static void inproc_slice_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
220
- grpc_byte_stream *bs) {
221
- inproc_slice_byte_stream *stream = (inproc_slice_byte_stream *)bs;
222
- sb_list_entry_destroy(exec_ctx, stream->le);
223
- GRPC_ERROR_UNREF(stream->shutdown_error);
224
- }
225
-
226
- static const grpc_byte_stream_vtable inproc_slice_byte_stream_vtable = {
227
- inproc_slice_byte_stream_next, inproc_slice_byte_stream_pull,
228
- inproc_slice_byte_stream_shutdown, inproc_slice_byte_stream_destroy};
229
-
230
- void inproc_slice_byte_stream_init(inproc_slice_byte_stream *s,
231
- sb_list_entry *le) {
232
- s->base.length = (uint32_t)le->sb.length;
233
- s->base.flags = 0;
234
- s->base.vtable = &inproc_slice_byte_stream_vtable;
235
- s->le = le;
236
- s->shutdown_error = GRPC_ERROR_NONE;
237
- }
120
+ static grpc_closure do_nothing_closure;
121
+ static bool cancel_stream_locked(grpc_exec_ctx* exec_ctx, inproc_stream* s,
122
+ grpc_error* error);
123
+ static void op_state_machine(grpc_exec_ctx* exec_ctx, void* arg,
124
+ grpc_error* error);
238
125
 
239
- static void ref_transport(inproc_transport *t) {
126
+ static void ref_transport(inproc_transport* t) {
240
127
  INPROC_LOG(GPR_DEBUG, "ref_transport %p", t);
241
128
  gpr_ref(&t->refs);
242
129
  }
243
130
 
244
- static void really_destroy_transport(grpc_exec_ctx *exec_ctx,
245
- inproc_transport *t) {
131
+ static void really_destroy_transport(grpc_exec_ctx* exec_ctx,
132
+ inproc_transport* t) {
246
133
  INPROC_LOG(GPR_DEBUG, "really_destroy_transport %p", t);
247
134
  grpc_connectivity_state_destroy(exec_ctx, &t->connectivity);
248
135
  if (gpr_unref(&t->mu->refs)) {
@@ -251,7 +138,7 @@ static void really_destroy_transport(grpc_exec_ctx *exec_ctx,
251
138
  gpr_free(t);
252
139
  }
253
140
 
254
- static void unref_transport(grpc_exec_ctx *exec_ctx, inproc_transport *t) {
141
+ static void unref_transport(grpc_exec_ctx* exec_ctx, inproc_transport* t) {
255
142
  INPROC_LOG(GPR_DEBUG, "unref_transport %p", t);
256
143
  if (gpr_unref(&t->refs)) {
257
144
  really_destroy_transport(exec_ctx, t);
@@ -266,26 +153,28 @@ static void unref_transport(grpc_exec_ctx *exec_ctx, inproc_transport *t) {
266
153
  #define STREAM_UNREF(e, refs, reason) grpc_stream_unref(e, refs)
267
154
  #endif
268
155
 
269
- static void ref_stream(inproc_stream *s, const char *reason) {
156
+ static void ref_stream(inproc_stream* s, const char* reason) {
270
157
  INPROC_LOG(GPR_DEBUG, "ref_stream %p %s", s, reason);
271
158
  STREAM_REF(s->refs, reason);
272
159
  }
273
160
 
274
- static void unref_stream(grpc_exec_ctx *exec_ctx, inproc_stream *s,
275
- const char *reason) {
161
+ static void unref_stream(grpc_exec_ctx* exec_ctx, inproc_stream* s,
162
+ const char* reason) {
276
163
  INPROC_LOG(GPR_DEBUG, "unref_stream %p %s", s, reason);
277
164
  STREAM_UNREF(exec_ctx, s->refs, reason);
278
165
  }
279
166
 
280
- static void really_destroy_stream(grpc_exec_ctx *exec_ctx, inproc_stream *s) {
167
+ static void really_destroy_stream(grpc_exec_ctx* exec_ctx, inproc_stream* s) {
281
168
  INPROC_LOG(GPR_DEBUG, "really_destroy_stream %p", s);
282
169
 
283
- slice_buffer_list_destroy(exec_ctx, &s->to_read_message);
284
- slice_buffer_list_destroy(exec_ctx, &s->write_buffer_message);
285
170
  GRPC_ERROR_UNREF(s->write_buffer_cancel_error);
286
171
  GRPC_ERROR_UNREF(s->cancel_self_error);
287
172
  GRPC_ERROR_UNREF(s->cancel_other_error);
288
173
 
174
+ if (s->recv_inited) {
175
+ grpc_slice_buffer_destroy_internal(exec_ctx, &s->recv_message);
176
+ }
177
+
289
178
  unref_transport(exec_ctx, s->t);
290
179
 
291
180
  if (s->closure_at_destroy) {
@@ -293,15 +182,12 @@ static void really_destroy_stream(grpc_exec_ctx *exec_ctx, inproc_stream *s) {
293
182
  }
294
183
  }
295
184
 
296
- static void read_state_machine(grpc_exec_ctx *exec_ctx, void *arg,
297
- grpc_error *error);
298
-
299
- static void log_metadata(const grpc_metadata_batch *md_batch, bool is_client,
185
+ static void log_metadata(const grpc_metadata_batch* md_batch, bool is_client,
300
186
  bool is_initial) {
301
- for (grpc_linked_mdelem *md = md_batch->list.head; md != NULL;
187
+ for (grpc_linked_mdelem* md = md_batch->list.head; md != nullptr;
302
188
  md = md->next) {
303
- char *key = grpc_slice_to_c_string(GRPC_MDKEY(md->md));
304
- char *value = grpc_slice_to_c_string(GRPC_MDVALUE(md->md));
189
+ char* key = grpc_slice_to_c_string(GRPC_MDKEY(md->md));
190
+ char* value = grpc_slice_to_c_string(GRPC_MDVALUE(md->md));
305
191
  gpr_log(GPR_INFO, "INPROC:%s:%s: %s: %s", is_initial ? "HDR" : "TRL",
306
192
  is_client ? "CLI" : "SVR", key, value);
307
193
  gpr_free(key);
@@ -309,25 +195,25 @@ static void log_metadata(const grpc_metadata_batch *md_batch, bool is_client,
309
195
  }
310
196
  }
311
197
 
312
- static grpc_error *fill_in_metadata(grpc_exec_ctx *exec_ctx, inproc_stream *s,
313
- const grpc_metadata_batch *metadata,
314
- uint32_t flags, grpc_metadata_batch *out_md,
315
- uint32_t *outflags, bool *markfilled) {
316
- if (GRPC_TRACER_ON(grpc_inproc_trace)) {
317
- log_metadata(metadata, s->t->is_client, outflags != NULL);
198
+ static grpc_error* fill_in_metadata(grpc_exec_ctx* exec_ctx, inproc_stream* s,
199
+ const grpc_metadata_batch* metadata,
200
+ uint32_t flags, grpc_metadata_batch* out_md,
201
+ uint32_t* outflags, bool* markfilled) {
202
+ if (grpc_inproc_trace.enabled()) {
203
+ log_metadata(metadata, s->t->is_client, outflags != nullptr);
318
204
  }
319
205
 
320
- if (outflags != NULL) {
206
+ if (outflags != nullptr) {
321
207
  *outflags = flags;
322
208
  }
323
- if (markfilled != NULL) {
209
+ if (markfilled != nullptr) {
324
210
  *markfilled = true;
325
211
  }
326
- grpc_error *error = GRPC_ERROR_NONE;
327
- for (grpc_linked_mdelem *elem = metadata->list.head;
328
- (elem != NULL) && (error == GRPC_ERROR_NONE); elem = elem->next) {
329
- grpc_linked_mdelem *nelem =
330
- (grpc_linked_mdelem *)gpr_arena_alloc(s->arena, sizeof(*nelem));
212
+ grpc_error* error = GRPC_ERROR_NONE;
213
+ for (grpc_linked_mdelem* elem = metadata->list.head;
214
+ (elem != nullptr) && (error == GRPC_ERROR_NONE); elem = elem->next) {
215
+ grpc_linked_mdelem* nelem =
216
+ (grpc_linked_mdelem*)gpr_arena_alloc(s->arena, sizeof(*nelem));
331
217
  nelem->md = grpc_mdelem_from_slices(
332
218
  exec_ctx, grpc_slice_intern(GRPC_MDKEY(elem->md)),
333
219
  grpc_slice_intern(GRPC_MDVALUE(elem->md)));
@@ -337,12 +223,12 @@ static grpc_error *fill_in_metadata(grpc_exec_ctx *exec_ctx, inproc_stream *s,
337
223
  return error;
338
224
  }
339
225
 
340
- static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
341
- grpc_stream *gs, grpc_stream_refcount *refcount,
342
- const void *server_data, gpr_arena *arena) {
226
+ static int init_stream(grpc_exec_ctx* exec_ctx, grpc_transport* gt,
227
+ grpc_stream* gs, grpc_stream_refcount* refcount,
228
+ const void* server_data, gpr_arena* arena) {
343
229
  INPROC_LOG(GPR_DEBUG, "init_stream %p %p %p", gt, gs, server_data);
344
- inproc_transport *t = (inproc_transport *)gt;
345
- inproc_stream *s = (inproc_stream *)gs;
230
+ inproc_transport* t = (inproc_transport*)gt;
231
+ inproc_stream* s = (inproc_stream*)gs;
346
232
  s->arena = arena;
347
233
 
348
234
  s->refs = refcount;
@@ -359,14 +245,12 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
359
245
  s->write_buffer_initial_md_filled = false;
360
246
  grpc_metadata_batch_init(&s->write_buffer_trailing_md);
361
247
  s->write_buffer_trailing_md_filled = false;
362
- slice_buffer_list_init(&s->to_read_message);
363
- slice_buffer_list_init(&s->write_buffer_message);
364
- s->reads_needed = false;
365
- s->read_closure_scheduled = false;
366
- GRPC_CLOSURE_INIT(&s->read_closure, read_state_machine, s,
248
+ s->ops_needed = false;
249
+ s->op_closure_scheduled = false;
250
+ GRPC_CLOSURE_INIT(&s->op_closure, op_state_machine, s,
367
251
  grpc_schedule_on_exec_ctx);
368
252
  s->t = t;
369
- s->closure_at_destroy = NULL;
253
+ s->closure_at_destroy = nullptr;
370
254
  s->other_side_closed = false;
371
255
 
372
256
  s->initial_md_sent = s->trailing_md_sent = s->initial_md_recvd =
@@ -377,10 +261,10 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
377
261
  s->cancel_self_error = GRPC_ERROR_NONE;
378
262
  s->cancel_other_error = GRPC_ERROR_NONE;
379
263
  s->write_buffer_cancel_error = GRPC_ERROR_NONE;
380
- s->deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
381
- s->write_buffer_deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC);
264
+ s->deadline = GRPC_MILLIS_INF_FUTURE;
265
+ s->write_buffer_deadline = GRPC_MILLIS_INF_FUTURE;
382
266
 
383
- s->stream_list_prev = NULL;
267
+ s->stream_list_prev = nullptr;
384
268
  gpr_mu_lock(&t->mu->mu);
385
269
  s->listed = true;
386
270
  ref_stream(s, "inproc_init_stream:list");
@@ -393,19 +277,19 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
393
277
 
394
278
  if (!server_data) {
395
279
  ref_transport(t);
396
- inproc_transport *st = t->other_side;
280
+ inproc_transport* st = t->other_side;
397
281
  ref_transport(st);
398
- s->other_side = NULL; // will get filled in soon
282
+ s->other_side = nullptr; // will get filled in soon
399
283
  // Pass the client-side stream address to the server-side for a ref
400
284
  ref_stream(s, "inproc_init_stream:clt"); // ref it now on behalf of server
401
285
  // side to avoid destruction
402
286
  INPROC_LOG(GPR_DEBUG, "calling accept stream cb %p %p",
403
287
  st->accept_stream_cb, st->accept_stream_data);
404
288
  (*st->accept_stream_cb)(exec_ctx, st->accept_stream_data, &st->base,
405
- (void *)s);
289
+ (void*)s);
406
290
  } else {
407
291
  // This is the server-side and is being called through accept_stream_cb
408
- inproc_stream *cs = (inproc_stream *)server_data;
292
+ inproc_stream* cs = (inproc_stream*)server_data;
409
293
  s->other_side = cs;
410
294
  // Ref the server-side stream on behalf of the client now
411
295
  ref_stream(s, "inproc_init_stream:srv");
@@ -421,18 +305,13 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
421
305
  cs->write_buffer_initial_md_flags,
422
306
  &s->to_read_initial_md, &s->to_read_initial_md_flags,
423
307
  &s->to_read_initial_md_filled);
424
- s->deadline = gpr_time_min(s->deadline, cs->write_buffer_deadline);
308
+ s->deadline = GPR_MIN(s->deadline, cs->write_buffer_deadline);
425
309
  grpc_metadata_batch_clear(exec_ctx, &cs->write_buffer_initial_md);
426
310
  cs->write_buffer_initial_md_filled = false;
427
311
  }
428
- while (!slice_buffer_list_empty(&cs->write_buffer_message)) {
429
- slice_buffer_list_append_entry(
430
- &s->to_read_message,
431
- slice_buffer_list_pophead(&cs->write_buffer_message));
432
- }
433
312
  if (cs->write_buffer_trailing_md_filled) {
434
313
  fill_in_metadata(exec_ctx, s, &cs->write_buffer_trailing_md, 0,
435
- &s->to_read_trailing_md, NULL,
314
+ &s->to_read_trailing_md, nullptr,
436
315
  &s->to_read_trailing_md_filled);
437
316
  grpc_metadata_batch_clear(exec_ctx, &cs->write_buffer_trailing_md);
438
317
  cs->write_buffer_trailing_md_filled = false;
@@ -447,21 +326,21 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
447
326
  return 0; // return value is not important
448
327
  }
449
328
 
450
- static void close_stream_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s) {
329
+ static void close_stream_locked(grpc_exec_ctx* exec_ctx, inproc_stream* s) {
451
330
  if (!s->closed) {
452
331
  // Release the metadata that we would have written out
453
332
  grpc_metadata_batch_destroy(exec_ctx, &s->write_buffer_initial_md);
454
333
  grpc_metadata_batch_destroy(exec_ctx, &s->write_buffer_trailing_md);
455
334
 
456
335
  if (s->listed) {
457
- inproc_stream *p = s->stream_list_prev;
458
- inproc_stream *n = s->stream_list_next;
459
- if (p != NULL) {
336
+ inproc_stream* p = s->stream_list_prev;
337
+ inproc_stream* n = s->stream_list_next;
338
+ if (p != nullptr) {
460
339
  p->stream_list_next = n;
461
340
  } else {
462
341
  s->t->stream_list = n;
463
342
  }
464
- if (n != NULL) {
343
+ if (n != nullptr) {
465
344
  n->stream_list_prev = p;
466
345
  }
467
346
  s->listed = false;
@@ -473,24 +352,54 @@ static void close_stream_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s) {
473
352
  }
474
353
 
475
354
  // This function means that we are done talking/listening to the other side
476
- static void close_other_side_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
477
- const char *reason) {
478
- if (s->other_side != NULL) {
355
+ static void close_other_side_locked(grpc_exec_ctx* exec_ctx, inproc_stream* s,
356
+ const char* reason) {
357
+ if (s->other_side != nullptr) {
479
358
  // First release the metadata that came from the other side's arena
480
359
  grpc_metadata_batch_destroy(exec_ctx, &s->to_read_initial_md);
481
360
  grpc_metadata_batch_destroy(exec_ctx, &s->to_read_trailing_md);
482
361
 
483
362
  unref_stream(exec_ctx, s->other_side, reason);
484
363
  s->other_side_closed = true;
485
- s->other_side = NULL;
364
+ s->other_side = nullptr;
486
365
  } else if (!s->other_side_closed) {
487
366
  s->write_buffer_other_side_closed = true;
488
367
  }
489
368
  }
490
369
 
491
- static void fail_helper_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
492
- grpc_error *error) {
493
- INPROC_LOG(GPR_DEBUG, "read_state_machine %p fail_helper", s);
370
+ // Call the on_complete closure associated with this stream_op_batch if
371
+ // this stream_op_batch is only one of the pending operations for this
372
+ // stream. This is called when one of the pending operations for the stream
373
+ // is done and about to be NULLed out
374
+ static void complete_if_batch_end_locked(grpc_exec_ctx* exec_ctx,
375
+ inproc_stream* s, grpc_error* error,
376
+ grpc_transport_stream_op_batch* op,
377
+ const char* msg) {
378
+ int is_sm = (int)(op == s->send_message_op);
379
+ int is_stm = (int)(op == s->send_trailing_md_op);
380
+ int is_rim = (int)(op == s->recv_initial_md_op);
381
+ int is_rm = (int)(op == s->recv_message_op);
382
+ int is_rtm = (int)(op == s->recv_trailing_md_op);
383
+
384
+ if ((is_sm + is_stm + is_rim + is_rm + is_rtm) == 1) {
385
+ INPROC_LOG(GPR_DEBUG, "%s %p %p %p", msg, s, op, error);
386
+ GRPC_CLOSURE_SCHED(exec_ctx, op->on_complete, GRPC_ERROR_REF(error));
387
+ }
388
+ }
389
+
390
+ static void maybe_schedule_op_closure_locked(grpc_exec_ctx* exec_ctx,
391
+ inproc_stream* s,
392
+ grpc_error* error) {
393
+ if (s && s->ops_needed && !s->op_closure_scheduled) {
394
+ GRPC_CLOSURE_SCHED(exec_ctx, &s->op_closure, GRPC_ERROR_REF(error));
395
+ s->op_closure_scheduled = true;
396
+ s->ops_needed = false;
397
+ }
398
+ }
399
+
400
+ static void fail_helper_locked(grpc_exec_ctx* exec_ctx, inproc_stream* s,
401
+ grpc_error* error) {
402
+ INPROC_LOG(GPR_DEBUG, "op_state_machine %p fail_helper", s);
494
403
  // If we're failing this side, we need to make sure that
495
404
  // we also send or have already sent trailing metadata
496
405
  if (!s->trailing_md_sent) {
@@ -500,45 +409,39 @@ static void fail_helper_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
500
409
  grpc_metadata_batch fake_md;
501
410
  grpc_metadata_batch_init(&fake_md);
502
411
 
503
- inproc_stream *other = s->other_side;
504
- grpc_metadata_batch *dest = (other == NULL) ? &s->write_buffer_trailing_md
505
- : &other->to_read_trailing_md;
506
- bool *destfilled = (other == NULL) ? &s->write_buffer_trailing_md_filled
507
- : &other->to_read_trailing_md_filled;
508
- fill_in_metadata(exec_ctx, s, &fake_md, 0, dest, NULL, destfilled);
412
+ inproc_stream* other = s->other_side;
413
+ grpc_metadata_batch* dest = (other == nullptr)
414
+ ? &s->write_buffer_trailing_md
415
+ : &other->to_read_trailing_md;
416
+ bool* destfilled = (other == nullptr) ? &s->write_buffer_trailing_md_filled
417
+ : &other->to_read_trailing_md_filled;
418
+ fill_in_metadata(exec_ctx, s, &fake_md, 0, dest, nullptr, destfilled);
509
419
  grpc_metadata_batch_destroy(exec_ctx, &fake_md);
510
420
 
511
- if (other != NULL) {
421
+ if (other != nullptr) {
512
422
  if (other->cancel_other_error == GRPC_ERROR_NONE) {
513
423
  other->cancel_other_error = GRPC_ERROR_REF(error);
514
424
  }
515
- if (other->reads_needed) {
516
- if (!other->read_closure_scheduled) {
517
- GRPC_CLOSURE_SCHED(exec_ctx, &other->read_closure,
518
- GRPC_ERROR_REF(error));
519
- other->read_closure_scheduled = true;
520
- }
521
- other->reads_needed = false;
522
- }
425
+ maybe_schedule_op_closure_locked(exec_ctx, other, error);
523
426
  } else if (s->write_buffer_cancel_error == GRPC_ERROR_NONE) {
524
427
  s->write_buffer_cancel_error = GRPC_ERROR_REF(error);
525
428
  }
526
429
  }
527
430
  if (s->recv_initial_md_op) {
528
- grpc_error *err;
431
+ grpc_error* err;
529
432
  if (!s->t->is_client) {
530
433
  // If this is a server, provide initial metadata with a path and authority
531
434
  // since it expects that as well as no error yet
532
435
  grpc_metadata_batch fake_md;
533
436
  grpc_metadata_batch_init(&fake_md);
534
- grpc_linked_mdelem *path_md =
535
- (grpc_linked_mdelem *)gpr_arena_alloc(s->arena, sizeof(*path_md));
437
+ grpc_linked_mdelem* path_md =
438
+ (grpc_linked_mdelem*)gpr_arena_alloc(s->arena, sizeof(*path_md));
536
439
  path_md->md =
537
440
  grpc_mdelem_from_slices(exec_ctx, g_fake_path_key, g_fake_path_value);
538
441
  GPR_ASSERT(grpc_metadata_batch_link_tail(exec_ctx, &fake_md, path_md) ==
539
442
  GRPC_ERROR_NONE);
540
- grpc_linked_mdelem *auth_md =
541
- (grpc_linked_mdelem *)gpr_arena_alloc(s->arena, sizeof(*auth_md));
443
+ grpc_linked_mdelem* auth_md =
444
+ (grpc_linked_mdelem*)gpr_arena_alloc(s->arena, sizeof(*auth_md));
542
445
  auth_md->md =
543
446
  grpc_mdelem_from_slices(exec_ctx, g_fake_auth_key, g_fake_auth_value);
544
447
  GPR_ASSERT(grpc_metadata_batch_link_tail(exec_ctx, &fake_md, auth_md) ==
@@ -549,7 +452,7 @@ static void fail_helper_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
549
452
  s->recv_initial_md_op->payload->recv_initial_metadata
550
453
  .recv_initial_metadata,
551
454
  s->recv_initial_md_op->payload->recv_initial_metadata.recv_flags,
552
- NULL);
455
+ nullptr);
553
456
  grpc_metadata_batch_destroy(exec_ctx, &fake_md);
554
457
  err = GRPC_ERROR_NONE;
555
458
  } else {
@@ -564,15 +467,10 @@ static void fail_helper_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
564
467
  err);
565
468
  // Last use of err so no need to REF and then UNREF it
566
469
 
567
- if ((s->recv_initial_md_op != s->recv_message_op) &&
568
- (s->recv_initial_md_op != s->recv_trailing_md_op)) {
569
- INPROC_LOG(GPR_DEBUG,
570
- "fail_helper %p scheduling initial-metadata-on-complete %p",
571
- error, s);
572
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_initial_md_op->on_complete,
573
- GRPC_ERROR_REF(error));
574
- }
575
- s->recv_initial_md_op = NULL;
470
+ complete_if_batch_end_locked(
471
+ exec_ctx, s, error, s->recv_initial_md_op,
472
+ "fail_helper scheduling recv-initial-metadata-on-complete");
473
+ s->recv_initial_md_op = nullptr;
576
474
  }
577
475
  if (s->recv_message_op) {
578
476
  INPROC_LOG(GPR_DEBUG, "fail_helper %p scheduling message-ready %p", s,
@@ -580,21 +478,31 @@ static void fail_helper_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
580
478
  GRPC_CLOSURE_SCHED(
581
479
  exec_ctx, s->recv_message_op->payload->recv_message.recv_message_ready,
582
480
  GRPC_ERROR_REF(error));
583
- if (s->recv_message_op != s->recv_trailing_md_op) {
584
- INPROC_LOG(GPR_DEBUG, "fail_helper %p scheduling message-on-complete %p",
585
- s, error);
586
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_message_op->on_complete,
587
- GRPC_ERROR_REF(error));
588
- }
589
- s->recv_message_op = NULL;
481
+ complete_if_batch_end_locked(
482
+ exec_ctx, s, error, s->recv_message_op,
483
+ "fail_helper scheduling recv-message-on-complete");
484
+ s->recv_message_op = nullptr;
485
+ }
486
+ if (s->send_message_op) {
487
+ complete_if_batch_end_locked(
488
+ exec_ctx, s, error, s->send_message_op,
489
+ "fail_helper scheduling send-message-on-complete");
490
+ s->send_message_op = nullptr;
491
+ }
492
+ if (s->send_trailing_md_op) {
493
+ complete_if_batch_end_locked(
494
+ exec_ctx, s, error, s->send_trailing_md_op,
495
+ "fail_helper scheduling send-trailng-md-on-complete");
496
+ s->send_trailing_md_op = nullptr;
590
497
  }
591
498
  if (s->recv_trailing_md_op) {
592
499
  INPROC_LOG(GPR_DEBUG,
593
500
  "fail_helper %p scheduling trailing-md-on-complete %p", s,
594
501
  error);
595
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_trailing_md_op->on_complete,
596
- GRPC_ERROR_REF(error));
597
- s->recv_trailing_md_op = NULL;
502
+ complete_if_batch_end_locked(
503
+ exec_ctx, s, error, s->recv_trailing_md_op,
504
+ "fail_helper scheduling recv-trailing-metadata-on-complete");
505
+ s->recv_trailing_md_op = nullptr;
598
506
  }
599
507
  close_other_side_locked(exec_ctx, s, "fail_helper:other_side");
600
508
  close_stream_locked(exec_ctx, s);
@@ -602,25 +510,76 @@ static void fail_helper_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
602
510
  GRPC_ERROR_UNREF(error);
603
511
  }
604
512
 
605
- static void read_state_machine(grpc_exec_ctx *exec_ctx, void *arg,
606
- grpc_error *error) {
513
+ static void message_transfer_locked(grpc_exec_ctx* exec_ctx,
514
+ inproc_stream* sender,
515
+ inproc_stream* receiver) {
516
+ size_t remaining =
517
+ sender->send_message_op->payload->send_message.send_message->length;
518
+ if (receiver->recv_inited) {
519
+ grpc_slice_buffer_destroy_internal(exec_ctx, &receiver->recv_message);
520
+ }
521
+ grpc_slice_buffer_init(&receiver->recv_message);
522
+ receiver->recv_inited = true;
523
+ do {
524
+ grpc_slice message_slice;
525
+ grpc_closure unused;
526
+ GPR_ASSERT(grpc_byte_stream_next(
527
+ exec_ctx, sender->send_message_op->payload->send_message.send_message,
528
+ SIZE_MAX, &unused));
529
+ grpc_error* error = grpc_byte_stream_pull(
530
+ exec_ctx, sender->send_message_op->payload->send_message.send_message,
531
+ &message_slice);
532
+ if (error != GRPC_ERROR_NONE) {
533
+ cancel_stream_locked(exec_ctx, sender, GRPC_ERROR_REF(error));
534
+ break;
535
+ }
536
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
537
+ remaining -= GRPC_SLICE_LENGTH(message_slice);
538
+ grpc_slice_buffer_add(&receiver->recv_message, message_slice);
539
+ } while (remaining > 0);
540
+
541
+ grpc_slice_buffer_stream_init(&receiver->recv_stream, &receiver->recv_message,
542
+ 0);
543
+ *receiver->recv_message_op->payload->recv_message.recv_message =
544
+ &receiver->recv_stream.base;
545
+ INPROC_LOG(GPR_DEBUG, "message_transfer_locked %p scheduling message-ready",
546
+ receiver);
547
+ GRPC_CLOSURE_SCHED(
548
+ exec_ctx,
549
+ receiver->recv_message_op->payload->recv_message.recv_message_ready,
550
+ GRPC_ERROR_NONE);
551
+ complete_if_batch_end_locked(
552
+ exec_ctx, sender, GRPC_ERROR_NONE, sender->send_message_op,
553
+ "message_transfer scheduling sender on_complete");
554
+ complete_if_batch_end_locked(
555
+ exec_ctx, receiver, GRPC_ERROR_NONE, receiver->recv_message_op,
556
+ "message_transfer scheduling receiver on_complete");
557
+
558
+ receiver->recv_message_op = nullptr;
559
+ sender->send_message_op = nullptr;
560
+ }
561
+
562
+ static void op_state_machine(grpc_exec_ctx* exec_ctx, void* arg,
563
+ grpc_error* error) {
607
564
  // This function gets called when we have contents in the unprocessed reads
608
565
  // Get what we want based on our ops wanted
609
566
  // Schedule our appropriate closures
610
- // and then return to reads_needed state if still needed
567
+ // and then return to ops_needed state if still needed
611
568
 
612
569
  // Since this is a closure directly invoked by the combiner, it should not
613
570
  // unref the error parameter explicitly; the combiner will do that implicitly
614
- grpc_error *new_err = GRPC_ERROR_NONE;
571
+ grpc_error* new_err = GRPC_ERROR_NONE;
615
572
 
616
573
  bool needs_close = false;
617
574
 
618
- INPROC_LOG(GPR_DEBUG, "read_state_machine %p", arg);
619
- inproc_stream *s = (inproc_stream *)arg;
620
- gpr_mu *mu = &s->t->mu->mu; // keep aside in case s gets closed
575
+ INPROC_LOG(GPR_DEBUG, "op_state_machine %p", arg);
576
+ inproc_stream* s = (inproc_stream*)arg;
577
+ gpr_mu* mu = &s->t->mu->mu; // keep aside in case s gets closed
621
578
  gpr_mu_lock(mu);
622
- s->read_closure_scheduled = false;
579
+ s->op_closure_scheduled = false;
623
580
  // cancellation takes precedence
581
+ inproc_stream* other = s->other_side;
582
+
624
583
  if (s->cancel_self_error != GRPC_ERROR_NONE) {
625
584
  fail_helper_locked(exec_ctx, s, GRPC_ERROR_REF(s->cancel_self_error));
626
585
  goto done;
@@ -632,89 +591,117 @@ static void read_state_machine(grpc_exec_ctx *exec_ctx, void *arg,
632
591
  goto done;
633
592
  }
634
593
 
635
- if (s->recv_initial_md_op) {
636
- if (!s->to_read_initial_md_filled) {
637
- // We entered the state machine on some other kind of read even though
638
- // we still haven't satisfied initial md . That's an error.
639
- new_err =
640
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unexpected frame sequencing");
641
- INPROC_LOG(GPR_DEBUG,
642
- "read_state_machine %p scheduling on_complete errors for no "
643
- "initial md %p",
644
- s, new_err);
594
+ if (s->send_message_op && other) {
595
+ if (other->recv_message_op) {
596
+ message_transfer_locked(exec_ctx, s, other);
597
+ maybe_schedule_op_closure_locked(exec_ctx, other, GRPC_ERROR_NONE);
598
+ } else if (!s->t->is_client &&
599
+ (s->trailing_md_sent || other->recv_trailing_md_op)) {
600
+ // A server send will never be matched if the client is waiting
601
+ // for trailing metadata already
602
+ complete_if_batch_end_locked(
603
+ exec_ctx, s, GRPC_ERROR_NONE, s->send_message_op,
604
+ "op_state_machine scheduling send-message-on-complete");
605
+ s->send_message_op = nullptr;
606
+ }
607
+ }
608
+ // Pause a send trailing metadata if there is still an outstanding
609
+ // send message unless we know that the send message will never get
610
+ // matched to a receive. This happens on the client if the server has
611
+ // already sent status.
612
+ if (s->send_trailing_md_op &&
613
+ (!s->send_message_op ||
614
+ (s->t->is_client &&
615
+ (s->trailing_md_recvd || s->to_read_trailing_md_filled)))) {
616
+ grpc_metadata_batch* dest = (other == nullptr)
617
+ ? &s->write_buffer_trailing_md
618
+ : &other->to_read_trailing_md;
619
+ bool* destfilled = (other == nullptr) ? &s->write_buffer_trailing_md_filled
620
+ : &other->to_read_trailing_md_filled;
621
+ if (*destfilled || s->trailing_md_sent) {
622
+ // The buffer is already in use; that's an error!
623
+ INPROC_LOG(GPR_DEBUG, "Extra trailing metadata %p", s);
624
+ new_err = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Extra trailing metadata");
645
625
  fail_helper_locked(exec_ctx, s, GRPC_ERROR_REF(new_err));
646
626
  goto done;
647
- } else if (s->initial_md_recvd) {
627
+ } else {
628
+ if (!other || !other->closed) {
629
+ fill_in_metadata(exec_ctx, s,
630
+ s->send_trailing_md_op->payload->send_trailing_metadata
631
+ .send_trailing_metadata,
632
+ 0, dest, nullptr, destfilled);
633
+ }
634
+ s->trailing_md_sent = true;
635
+ if (!s->t->is_client && s->trailing_md_recvd && s->recv_trailing_md_op) {
636
+ INPROC_LOG(GPR_DEBUG,
637
+ "op_state_machine %p scheduling trailing-md-on-complete", s);
638
+ GRPC_CLOSURE_SCHED(exec_ctx, s->recv_trailing_md_op->on_complete,
639
+ GRPC_ERROR_NONE);
640
+ s->recv_trailing_md_op = nullptr;
641
+ needs_close = true;
642
+ }
643
+ }
644
+ maybe_schedule_op_closure_locked(exec_ctx, other, GRPC_ERROR_NONE);
645
+ complete_if_batch_end_locked(
646
+ exec_ctx, s, GRPC_ERROR_NONE, s->send_trailing_md_op,
647
+ "op_state_machine scheduling send-trailing-metadata-on-complete");
648
+ s->send_trailing_md_op = nullptr;
649
+ }
650
+ if (s->recv_initial_md_op) {
651
+ if (s->initial_md_recvd) {
648
652
  new_err =
649
653
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Already recvd initial md");
650
654
  INPROC_LOG(
651
655
  GPR_DEBUG,
652
- "read_state_machine %p scheduling on_complete errors for already "
656
+ "op_state_machine %p scheduling on_complete errors for already "
653
657
  "recvd initial md %p",
654
658
  s, new_err);
655
659
  fail_helper_locked(exec_ctx, s, GRPC_ERROR_REF(new_err));
656
660
  goto done;
657
661
  }
658
662
 
659
- s->initial_md_recvd = true;
660
- new_err = fill_in_metadata(
661
- exec_ctx, s, &s->to_read_initial_md, s->to_read_initial_md_flags,
662
- s->recv_initial_md_op->payload->recv_initial_metadata
663
- .recv_initial_metadata,
664
- s->recv_initial_md_op->payload->recv_initial_metadata.recv_flags, NULL);
665
- s->recv_initial_md_op->payload->recv_initial_metadata.recv_initial_metadata
666
- ->deadline = s->deadline;
667
- grpc_metadata_batch_clear(exec_ctx, &s->to_read_initial_md);
668
- s->to_read_initial_md_filled = false;
669
- INPROC_LOG(GPR_DEBUG,
670
- "read_state_machine %p scheduling initial-metadata-ready %p", s,
671
- new_err);
672
- GRPC_CLOSURE_SCHED(exec_ctx,
673
- s->recv_initial_md_op->payload->recv_initial_metadata
674
- .recv_initial_metadata_ready,
675
- GRPC_ERROR_REF(new_err));
676
- if ((s->recv_initial_md_op != s->recv_message_op) &&
677
- (s->recv_initial_md_op != s->recv_trailing_md_op)) {
678
- INPROC_LOG(
679
- GPR_DEBUG,
680
- "read_state_machine %p scheduling initial-metadata-on-complete %p", s,
681
- new_err);
682
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_initial_md_op->on_complete,
683
- GRPC_ERROR_REF(new_err));
684
- }
685
- s->recv_initial_md_op = NULL;
686
-
687
- if (new_err != GRPC_ERROR_NONE) {
663
+ if (s->to_read_initial_md_filled) {
664
+ s->initial_md_recvd = true;
665
+ new_err = fill_in_metadata(
666
+ exec_ctx, s, &s->to_read_initial_md, s->to_read_initial_md_flags,
667
+ s->recv_initial_md_op->payload->recv_initial_metadata
668
+ .recv_initial_metadata,
669
+ s->recv_initial_md_op->payload->recv_initial_metadata.recv_flags,
670
+ nullptr);
671
+ s->recv_initial_md_op->payload->recv_initial_metadata
672
+ .recv_initial_metadata->deadline = s->deadline;
673
+ grpc_metadata_batch_clear(exec_ctx, &s->to_read_initial_md);
674
+ s->to_read_initial_md_filled = false;
688
675
  INPROC_LOG(GPR_DEBUG,
689
- "read_state_machine %p scheduling on_complete errors2 %p", s,
676
+ "op_state_machine %p scheduling initial-metadata-ready %p", s,
690
677
  new_err);
691
- fail_helper_locked(exec_ctx, s, GRPC_ERROR_REF(new_err));
692
- goto done;
678
+ GRPC_CLOSURE_SCHED(exec_ctx,
679
+ s->recv_initial_md_op->payload->recv_initial_metadata
680
+ .recv_initial_metadata_ready,
681
+ GRPC_ERROR_REF(new_err));
682
+ complete_if_batch_end_locked(
683
+ exec_ctx, s, new_err, s->recv_initial_md_op,
684
+ "op_state_machine scheduling recv-initial-metadata-on-complete");
685
+ s->recv_initial_md_op = nullptr;
686
+
687
+ if (new_err != GRPC_ERROR_NONE) {
688
+ INPROC_LOG(GPR_DEBUG,
689
+ "op_state_machine %p scheduling on_complete errors2 %p", s,
690
+ new_err);
691
+ fail_helper_locked(exec_ctx, s, GRPC_ERROR_REF(new_err));
692
+ goto done;
693
+ }
693
694
  }
694
695
  }
695
- if (s->to_read_initial_md_filled) {
696
- new_err = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unexpected recv frame");
697
- fail_helper_locked(exec_ctx, s, GRPC_ERROR_REF(new_err));
698
- goto done;
699
- }
700
- if (!slice_buffer_list_empty(&s->to_read_message) && s->recv_message_op) {
701
- inproc_slice_byte_stream_init(
702
- &s->recv_message_stream,
703
- slice_buffer_list_pophead(&s->to_read_message));
704
- *s->recv_message_op->payload->recv_message.recv_message =
705
- &s->recv_message_stream.base;
706
- INPROC_LOG(GPR_DEBUG, "read_state_machine %p scheduling message-ready", s);
707
- GRPC_CLOSURE_SCHED(
708
- exec_ctx, s->recv_message_op->payload->recv_message.recv_message_ready,
709
- GRPC_ERROR_NONE);
710
- if (s->recv_message_op != s->recv_trailing_md_op) {
711
- INPROC_LOG(GPR_DEBUG,
712
- "read_state_machine %p scheduling message-on-complete %p", s,
713
- new_err);
714
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_message_op->on_complete,
715
- GRPC_ERROR_REF(new_err));
696
+ if (s->recv_message_op) {
697
+ if (other && other->send_message_op) {
698
+ message_transfer_locked(exec_ctx, other, s);
699
+ maybe_schedule_op_closure_locked(exec_ctx, other, GRPC_ERROR_NONE);
716
700
  }
717
- s->recv_message_op = NULL;
701
+ }
702
+ if (s->recv_trailing_md_op && s->t->is_client && other &&
703
+ other->send_message_op) {
704
+ maybe_schedule_op_closure_locked(exec_ctx, other, GRPC_ERROR_NONE);
718
705
  }
719
706
  if (s->to_read_trailing_md_filled) {
720
707
  if (s->trailing_md_recvd) {
@@ -722,38 +709,41 @@ static void read_state_machine(grpc_exec_ctx *exec_ctx, void *arg,
722
709
  GRPC_ERROR_CREATE_FROM_STATIC_STRING("Already recvd trailing md");
723
710
  INPROC_LOG(
724
711
  GPR_DEBUG,
725
- "read_state_machine %p scheduling on_complete errors for already "
712
+ "op_state_machine %p scheduling on_complete errors for already "
726
713
  "recvd trailing md %p",
727
714
  s, new_err);
728
715
  fail_helper_locked(exec_ctx, s, GRPC_ERROR_REF(new_err));
729
716
  goto done;
730
717
  }
731
- if (s->recv_message_op != NULL) {
718
+ if (s->recv_message_op != nullptr) {
732
719
  // This message needs to be wrapped up because it will never be
733
720
  // satisfied
734
- INPROC_LOG(GPR_DEBUG, "read_state_machine %p scheduling message-ready",
735
- s);
721
+ INPROC_LOG(GPR_DEBUG, "op_state_machine %p scheduling message-ready", s);
736
722
  GRPC_CLOSURE_SCHED(
737
723
  exec_ctx,
738
724
  s->recv_message_op->payload->recv_message.recv_message_ready,
739
725
  GRPC_ERROR_NONE);
740
- if (s->recv_message_op != s->recv_trailing_md_op) {
741
- INPROC_LOG(GPR_DEBUG,
742
- "read_state_machine %p scheduling message-on-complete %p", s,
743
- new_err);
744
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_message_op->on_complete,
745
- GRPC_ERROR_REF(new_err));
746
- }
747
- s->recv_message_op = NULL;
726
+ complete_if_batch_end_locked(
727
+ exec_ctx, s, new_err, s->recv_message_op,
728
+ "op_state_machine scheduling recv-message-on-complete");
729
+ s->recv_message_op = nullptr;
730
+ }
731
+ if ((s->trailing_md_sent || s->t->is_client) && s->send_message_op) {
732
+ // Nothing further will try to receive from this stream, so finish off
733
+ // any outstanding send_message op
734
+ complete_if_batch_end_locked(
735
+ exec_ctx, s, new_err, s->send_message_op,
736
+ "op_state_machine scheduling send-message-on-complete");
737
+ s->send_message_op = nullptr;
748
738
  }
749
- if (s->recv_trailing_md_op != NULL) {
739
+ if (s->recv_trailing_md_op != nullptr) {
750
740
  // We wanted trailing metadata and we got it
751
741
  s->trailing_md_recvd = true;
752
742
  new_err =
753
743
  fill_in_metadata(exec_ctx, s, &s->to_read_trailing_md, 0,
754
744
  s->recv_trailing_md_op->payload
755
745
  ->recv_trailing_metadata.recv_trailing_metadata,
756
- NULL, NULL);
746
+ nullptr, nullptr);
757
747
  grpc_metadata_batch_clear(exec_ctx, &s->to_read_trailing_md);
758
748
  s->to_read_trailing_md_filled = false;
759
749
 
@@ -763,77 +753,74 @@ static void read_state_machine(grpc_exec_ctx *exec_ctx, void *arg,
763
753
  // (If the server hasn't already sent its trailing md, it doesn't have
764
754
  // a final status, so don't mark this op complete)
765
755
  if (s->t->is_client || s->trailing_md_sent) {
766
- INPROC_LOG(
767
- GPR_DEBUG,
768
- "read_state_machine %p scheduling trailing-md-on-complete %p", s,
769
- new_err);
756
+ INPROC_LOG(GPR_DEBUG,
757
+ "op_state_machine %p scheduling trailing-md-on-complete %p",
758
+ s, new_err);
770
759
  GRPC_CLOSURE_SCHED(exec_ctx, s->recv_trailing_md_op->on_complete,
771
760
  GRPC_ERROR_REF(new_err));
772
- s->recv_trailing_md_op = NULL;
761
+ s->recv_trailing_md_op = nullptr;
773
762
  needs_close = true;
774
763
  } else {
775
764
  INPROC_LOG(GPR_DEBUG,
776
- "read_state_machine %p server needs to delay handling "
765
+ "op_state_machine %p server needs to delay handling "
777
766
  "trailing-md-on-complete %p",
778
767
  s, new_err);
779
768
  }
780
769
  } else {
781
770
  INPROC_LOG(
782
771
  GPR_DEBUG,
783
- "read_state_machine %p has trailing md but not yet waiting for it",
784
- s);
772
+ "op_state_machine %p has trailing md but not yet waiting for it", s);
785
773
  }
786
774
  }
787
775
  if (s->trailing_md_recvd && s->recv_message_op) {
788
776
  // No further message will come on this stream, so finish off the
789
777
  // recv_message_op
790
- INPROC_LOG(GPR_DEBUG, "read_state_machine %p scheduling message-ready", s);
778
+ INPROC_LOG(GPR_DEBUG, "op_state_machine %p scheduling message-ready", s);
791
779
  GRPC_CLOSURE_SCHED(
792
780
  exec_ctx, s->recv_message_op->payload->recv_message.recv_message_ready,
793
781
  GRPC_ERROR_NONE);
794
- if (s->recv_message_op != s->recv_trailing_md_op) {
795
- INPROC_LOG(GPR_DEBUG,
796
- "read_state_machine %p scheduling message-on-complete %p", s,
797
- new_err);
798
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_message_op->on_complete,
799
- GRPC_ERROR_REF(new_err));
800
- }
801
- s->recv_message_op = NULL;
782
+ complete_if_batch_end_locked(
783
+ exec_ctx, s, new_err, s->recv_message_op,
784
+ "op_state_machine scheduling recv-message-on-complete");
785
+ s->recv_message_op = nullptr;
786
+ }
787
+ if (s->trailing_md_recvd && (s->trailing_md_sent || s->t->is_client) &&
788
+ s->send_message_op) {
789
+ // Nothing further will try to receive from this stream, so finish off
790
+ // any outstanding send_message op
791
+ complete_if_batch_end_locked(
792
+ exec_ctx, s, new_err, s->send_message_op,
793
+ "op_state_machine scheduling send-message-on-complete");
794
+ s->send_message_op = nullptr;
802
795
  }
803
- if (s->recv_message_op || s->recv_trailing_md_op) {
796
+ if (s->send_message_op || s->send_trailing_md_op || s->recv_initial_md_op ||
797
+ s->recv_message_op || s->recv_trailing_md_op) {
804
798
  // Didn't get the item we wanted so we still need to get
805
799
  // rescheduled
806
- INPROC_LOG(GPR_DEBUG, "read_state_machine %p still needs closure %p %p", s,
807
- s->recv_message_op, s->recv_trailing_md_op);
808
- s->reads_needed = true;
800
+ INPROC_LOG(
801
+ GPR_DEBUG, "op_state_machine %p still needs closure %p %p %p %p %p", s,
802
+ s->send_message_op, s->send_trailing_md_op, s->recv_initial_md_op,
803
+ s->recv_message_op, s->recv_trailing_md_op);
804
+ s->ops_needed = true;
809
805
  }
810
806
  done:
811
807
  if (needs_close) {
812
- close_other_side_locked(exec_ctx, s, "read_state_machine");
808
+ close_other_side_locked(exec_ctx, s, "op_state_machine");
813
809
  close_stream_locked(exec_ctx, s);
814
810
  }
815
811
  gpr_mu_unlock(mu);
816
812
  GRPC_ERROR_UNREF(new_err);
817
813
  }
818
814
 
819
- static grpc_closure do_nothing_closure;
820
-
821
- static bool cancel_stream_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
822
- grpc_error *error) {
815
+ static bool cancel_stream_locked(grpc_exec_ctx* exec_ctx, inproc_stream* s,
816
+ grpc_error* error) {
823
817
  bool ret = false; // was the cancel accepted
824
818
  INPROC_LOG(GPR_DEBUG, "cancel_stream %p with %s", s,
825
819
  grpc_error_string(error));
826
820
  if (s->cancel_self_error == GRPC_ERROR_NONE) {
827
821
  ret = true;
828
822
  s->cancel_self_error = GRPC_ERROR_REF(error);
829
- if (s->reads_needed) {
830
- if (!s->read_closure_scheduled) {
831
- GRPC_CLOSURE_SCHED(exec_ctx, &s->read_closure,
832
- GRPC_ERROR_REF(s->cancel_self_error));
833
- s->read_closure_scheduled = true;
834
- }
835
- s->reads_needed = false;
836
- }
823
+ maybe_schedule_op_closure_locked(exec_ctx, s, s->cancel_self_error);
837
824
  // Send trailing md to the other side indicating cancellation, even if we
838
825
  // already have
839
826
  s->trailing_md_sent = true;
@@ -841,26 +828,21 @@ static bool cancel_stream_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
841
828
  grpc_metadata_batch cancel_md;
842
829
  grpc_metadata_batch_init(&cancel_md);
843
830
 
844
- inproc_stream *other = s->other_side;
845
- grpc_metadata_batch *dest = (other == NULL) ? &s->write_buffer_trailing_md
846
- : &other->to_read_trailing_md;
847
- bool *destfilled = (other == NULL) ? &s->write_buffer_trailing_md_filled
848
- : &other->to_read_trailing_md_filled;
849
- fill_in_metadata(exec_ctx, s, &cancel_md, 0, dest, NULL, destfilled);
831
+ inproc_stream* other = s->other_side;
832
+ grpc_metadata_batch* dest = (other == nullptr)
833
+ ? &s->write_buffer_trailing_md
834
+ : &other->to_read_trailing_md;
835
+ bool* destfilled = (other == nullptr) ? &s->write_buffer_trailing_md_filled
836
+ : &other->to_read_trailing_md_filled;
837
+ fill_in_metadata(exec_ctx, s, &cancel_md, 0, dest, nullptr, destfilled);
850
838
  grpc_metadata_batch_destroy(exec_ctx, &cancel_md);
851
839
 
852
- if (other != NULL) {
840
+ if (other != nullptr) {
853
841
  if (other->cancel_other_error == GRPC_ERROR_NONE) {
854
842
  other->cancel_other_error = GRPC_ERROR_REF(s->cancel_self_error);
855
843
  }
856
- if (other->reads_needed) {
857
- if (!other->read_closure_scheduled) {
858
- GRPC_CLOSURE_SCHED(exec_ctx, &other->read_closure,
859
- GRPC_ERROR_REF(other->cancel_other_error));
860
- other->read_closure_scheduled = true;
861
- }
862
- other->reads_needed = false;
863
- }
844
+ maybe_schedule_op_closure_locked(exec_ctx, other,
845
+ other->cancel_other_error);
864
846
  } else if (s->write_buffer_cancel_error == GRPC_ERROR_NONE) {
865
847
  s->write_buffer_cancel_error = GRPC_ERROR_REF(s->cancel_self_error);
866
848
  }
@@ -869,12 +851,10 @@ static bool cancel_stream_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
869
851
  // couldn't complete that because we hadn't yet sent out trailing
870
852
  // md, now's the chance
871
853
  if (!s->t->is_client && s->trailing_md_recvd && s->recv_trailing_md_op) {
872
- INPROC_LOG(GPR_DEBUG,
873
- "cancel_stream %p scheduling trailing-md-on-complete %p", s,
874
- s->cancel_self_error);
875
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_trailing_md_op->on_complete,
876
- GRPC_ERROR_REF(s->cancel_self_error));
877
- s->recv_trailing_md_op = NULL;
854
+ complete_if_batch_end_locked(
855
+ exec_ctx, s, s->cancel_self_error, s->recv_trailing_md_op,
856
+ "cancel_stream scheduling trailing-md-on-complete");
857
+ s->recv_trailing_md_op = nullptr;
878
858
  }
879
859
  }
880
860
 
@@ -885,15 +865,15 @@ static bool cancel_stream_locked(grpc_exec_ctx *exec_ctx, inproc_stream *s,
885
865
  return ret;
886
866
  }
887
867
 
888
- static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
889
- grpc_stream *gs,
890
- grpc_transport_stream_op_batch *op) {
868
+ static void perform_stream_op(grpc_exec_ctx* exec_ctx, grpc_transport* gt,
869
+ grpc_stream* gs,
870
+ grpc_transport_stream_op_batch* op) {
891
871
  INPROC_LOG(GPR_DEBUG, "perform_stream_op %p %p %p", gt, gs, op);
892
- inproc_stream *s = (inproc_stream *)gs;
893
- gpr_mu *mu = &s->t->mu->mu; // save aside in case s gets closed
872
+ inproc_stream* s = (inproc_stream*)gs;
873
+ gpr_mu* mu = &s->t->mu->mu; // save aside in case s gets closed
894
874
  gpr_mu_lock(mu);
895
875
 
896
- if (GRPC_TRACER_ON(grpc_inproc_trace)) {
876
+ if (grpc_inproc_trace.enabled()) {
897
877
  if (op->send_initial_metadata) {
898
878
  log_metadata(op->payload->send_initial_metadata.send_initial_metadata,
899
879
  s->t->is_client, true);
@@ -903,9 +883,9 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
903
883
  s->t->is_client, false);
904
884
  }
905
885
  }
906
- grpc_error *error = GRPC_ERROR_NONE;
907
- grpc_closure *on_complete = op->on_complete;
908
- if (on_complete == NULL) {
886
+ grpc_error* error = GRPC_ERROR_NONE;
887
+ grpc_closure* on_complete = op->on_complete;
888
+ if (on_complete == nullptr) {
909
889
  on_complete = &do_nothing_closure;
910
890
  }
911
891
 
@@ -918,7 +898,8 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
918
898
  // already self-canceled so still give it an error
919
899
  error = GRPC_ERROR_REF(s->cancel_self_error);
920
900
  } else {
921
- INPROC_LOG(GPR_DEBUG, "perform_stream_op %p%s%s%s%s%s%s", s,
901
+ INPROC_LOG(GPR_DEBUG, "perform_stream_op %p %s%s%s%s%s%s%s", s,
902
+ s->t->is_client ? "client" : "server",
922
903
  op->send_initial_metadata ? " send_initial_metadata" : "",
923
904
  op->send_message ? " send_message" : "",
924
905
  op->send_trailing_metadata ? " send_trailing_metadata" : "",
@@ -929,26 +910,27 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
929
910
 
930
911
  bool needs_close = false;
931
912
 
913
+ inproc_stream* other = s->other_side;
932
914
  if (error == GRPC_ERROR_NONE &&
933
- (op->send_initial_metadata || op->send_message ||
934
- op->send_trailing_metadata)) {
935
- inproc_stream *other = s->other_side;
915
+ (op->send_initial_metadata || op->send_trailing_metadata)) {
936
916
  if (s->t->is_closed) {
937
917
  error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Endpoint already shutdown");
938
918
  }
939
919
  if (error == GRPC_ERROR_NONE && op->send_initial_metadata) {
940
- grpc_metadata_batch *dest = (other == NULL) ? &s->write_buffer_initial_md
941
- : &other->to_read_initial_md;
942
- uint32_t *destflags = (other == NULL) ? &s->write_buffer_initial_md_flags
943
- : &other->to_read_initial_md_flags;
944
- bool *destfilled = (other == NULL) ? &s->write_buffer_initial_md_filled
945
- : &other->to_read_initial_md_filled;
920
+ grpc_metadata_batch* dest = (other == nullptr)
921
+ ? &s->write_buffer_initial_md
922
+ : &other->to_read_initial_md;
923
+ uint32_t* destflags = (other == nullptr)
924
+ ? &s->write_buffer_initial_md_flags
925
+ : &other->to_read_initial_md_flags;
926
+ bool* destfilled = (other == nullptr) ? &s->write_buffer_initial_md_filled
927
+ : &other->to_read_initial_md_filled;
946
928
  if (*destfilled || s->initial_md_sent) {
947
929
  // The buffer is already in use; that's an error!
948
930
  INPROC_LOG(GPR_DEBUG, "Extra initial metadata %p", s);
949
931
  error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Extra initial metadata");
950
932
  } else {
951
- if (!other->closed) {
933
+ if (!other || !other->closed) {
952
934
  fill_in_metadata(
953
935
  exec_ctx, s,
954
936
  op->payload->send_initial_metadata.send_initial_metadata,
@@ -956,79 +938,28 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
956
938
  dest, destflags, destfilled);
957
939
  }
958
940
  if (s->t->is_client) {
959
- gpr_timespec *dl =
960
- (other == NULL) ? &s->write_buffer_deadline : &other->deadline;
961
- *dl = gpr_time_min(*dl, op->payload->send_initial_metadata
962
- .send_initial_metadata->deadline);
941
+ grpc_millis* dl =
942
+ (other == nullptr) ? &s->write_buffer_deadline : &other->deadline;
943
+ *dl = GPR_MIN(*dl, op->payload->send_initial_metadata
944
+ .send_initial_metadata->deadline);
963
945
  s->initial_md_sent = true;
964
946
  }
965
947
  }
966
- }
967
- if (error == GRPC_ERROR_NONE && op->send_message) {
968
- size_t remaining = op->payload->send_message.send_message->length;
969
- grpc_slice_buffer *dest = slice_buffer_list_append(
970
- (other == NULL) ? &s->write_buffer_message : &other->to_read_message);
971
- do {
972
- grpc_slice message_slice;
973
- grpc_closure unused;
974
- GPR_ASSERT(grpc_byte_stream_next(exec_ctx,
975
- op->payload->send_message.send_message,
976
- SIZE_MAX, &unused));
977
- error = grpc_byte_stream_pull(
978
- exec_ctx, op->payload->send_message.send_message, &message_slice);
979
- if (error != GRPC_ERROR_NONE) {
980
- cancel_stream_locked(exec_ctx, s, GRPC_ERROR_REF(error));
981
- break;
982
- }
983
- GPR_ASSERT(error == GRPC_ERROR_NONE);
984
- remaining -= GRPC_SLICE_LENGTH(message_slice);
985
- grpc_slice_buffer_add(dest, message_slice);
986
- } while (remaining != 0);
987
- grpc_byte_stream_destroy(exec_ctx,
988
- op->payload->send_message.send_message);
989
- }
990
- if (error == GRPC_ERROR_NONE && op->send_trailing_metadata) {
991
- grpc_metadata_batch *dest = (other == NULL) ? &s->write_buffer_trailing_md
992
- : &other->to_read_trailing_md;
993
- bool *destfilled = (other == NULL) ? &s->write_buffer_trailing_md_filled
994
- : &other->to_read_trailing_md_filled;
995
- if (*destfilled || s->trailing_md_sent) {
996
- // The buffer is already in use; that's an error!
997
- INPROC_LOG(GPR_DEBUG, "Extra trailing metadata %p", s);
998
- error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Extra trailing metadata");
999
- } else {
1000
- if (!other->closed) {
1001
- fill_in_metadata(
1002
- exec_ctx, s,
1003
- op->payload->send_trailing_metadata.send_trailing_metadata, 0,
1004
- dest, NULL, destfilled);
1005
- }
1006
- s->trailing_md_sent = true;
1007
- if (!s->t->is_client && s->trailing_md_recvd &&
1008
- s->recv_trailing_md_op) {
1009
- INPROC_LOG(GPR_DEBUG,
1010
- "perform_stream_op %p scheduling trailing-md-on-complete",
1011
- s);
1012
- GRPC_CLOSURE_SCHED(exec_ctx, s->recv_trailing_md_op->on_complete,
1013
- GRPC_ERROR_NONE);
1014
- s->recv_trailing_md_op = NULL;
1015
- needs_close = true;
1016
- }
1017
- }
1018
- }
1019
- if (other != NULL && other->reads_needed) {
1020
- if (!other->read_closure_scheduled) {
1021
- GRPC_CLOSURE_SCHED(exec_ctx, &other->read_closure, error);
1022
- other->read_closure_scheduled = true;
1023
- }
1024
- other->reads_needed = false;
948
+ maybe_schedule_op_closure_locked(exec_ctx, other, error);
1025
949
  }
1026
950
  }
951
+
1027
952
  if (error == GRPC_ERROR_NONE &&
1028
- (op->recv_initial_metadata || op->recv_message ||
953
+ (op->send_message || op->send_trailing_metadata ||
954
+ op->recv_initial_metadata || op->recv_message ||
1029
955
  op->recv_trailing_metadata)) {
1030
- // If there are any reads, mark it so that the read closure will react to
1031
- // them
956
+ // Mark ops that need to be processed by the closure
957
+ if (op->send_message) {
958
+ s->send_message_op = op;
959
+ }
960
+ if (op->send_trailing_metadata) {
961
+ s->send_trailing_md_op = op;
962
+ }
1032
963
  if (op->recv_initial_metadata) {
1033
964
  s->recv_initial_md_op = op;
1034
965
  }
@@ -1040,25 +971,29 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1040
971
  }
1041
972
 
1042
973
  // We want to initiate the closure if:
1043
- // 1. There is initial metadata and something ready to take that
1044
- // 2. There is a message and something ready to take it
1045
- // 3. There is trailing metadata, even if nothing specifically wants
1046
- // that because that can shut down the message as well
1047
- if ((s->to_read_initial_md_filled && op->recv_initial_metadata) ||
1048
- ((!slice_buffer_list_empty(&s->to_read_message) ||
1049
- s->trailing_md_recvd) &&
1050
- op->recv_message) ||
1051
- (s->to_read_trailing_md_filled)) {
1052
- if (!s->read_closure_scheduled) {
1053
- GRPC_CLOSURE_SCHED(exec_ctx, &s->read_closure, GRPC_ERROR_NONE);
1054
- s->read_closure_scheduled = true;
974
+ // 1. We want to send a message and the other side wants to receive or end
975
+ // 2. We want to send trailing metadata and there isn't an unmatched send
976
+ // 3. We want initial metadata and the other side has sent it
977
+ // 4. We want to receive a message and there is a message ready
978
+ // 5. There is trailing metadata, even if nothing specifically wants
979
+ // that because that can shut down the receive message as well
980
+ if ((op->send_message && other &&
981
+ ((other->recv_message_op != nullptr) ||
982
+ (other->recv_trailing_md_op != nullptr))) ||
983
+ (op->send_trailing_metadata && !op->send_message) ||
984
+ (op->recv_initial_metadata && s->to_read_initial_md_filled) ||
985
+ (op->recv_message && other && (other->send_message_op != nullptr)) ||
986
+ (s->to_read_trailing_md_filled || s->trailing_md_recvd)) {
987
+ if (!s->op_closure_scheduled) {
988
+ GRPC_CLOSURE_SCHED(exec_ctx, &s->op_closure, GRPC_ERROR_NONE);
989
+ s->op_closure_scheduled = true;
1055
990
  }
1056
991
  } else {
1057
- s->reads_needed = true;
992
+ s->ops_needed = true;
1058
993
  }
1059
994
  } else {
1060
995
  if (error != GRPC_ERROR_NONE) {
1061
- // Schedule op's read closures that we didn't push to read state machine
996
+ // Schedule op's closures that we didn't push to op state machine
1062
997
  if (op->recv_initial_metadata) {
1063
998
  INPROC_LOG(
1064
999
  GPR_DEBUG,
@@ -1091,8 +1026,8 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1091
1026
  GRPC_ERROR_UNREF(error);
1092
1027
  }
1093
1028
 
1094
- static void close_transport_locked(grpc_exec_ctx *exec_ctx,
1095
- inproc_transport *t) {
1029
+ static void close_transport_locked(grpc_exec_ctx* exec_ctx,
1030
+ inproc_transport* t) {
1096
1031
  INPROC_LOG(GPR_DEBUG, "close_transport %p %d", t, t->is_closed);
1097
1032
  grpc_connectivity_state_set(
1098
1033
  exec_ctx, &t->connectivity, GRPC_CHANNEL_SHUTDOWN,
@@ -1101,7 +1036,7 @@ static void close_transport_locked(grpc_exec_ctx *exec_ctx,
1101
1036
  if (!t->is_closed) {
1102
1037
  t->is_closed = true;
1103
1038
  /* Also end all streams on this transport */
1104
- while (t->stream_list != NULL) {
1039
+ while (t->stream_list != nullptr) {
1105
1040
  // cancel_stream_locked also adjusts stream list
1106
1041
  cancel_stream_locked(
1107
1042
  exec_ctx, t->stream_list,
@@ -1112,9 +1047,9 @@ static void close_transport_locked(grpc_exec_ctx *exec_ctx,
1112
1047
  }
1113
1048
  }
1114
1049
 
1115
- static void perform_transport_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1116
- grpc_transport_op *op) {
1117
- inproc_transport *t = (inproc_transport *)gt;
1050
+ static void perform_transport_op(grpc_exec_ctx* exec_ctx, grpc_transport* gt,
1051
+ grpc_transport_op* op) {
1052
+ inproc_transport* t = (inproc_transport*)gt;
1118
1053
  INPROC_LOG(GPR_DEBUG, "perform_transport_op %p %p", t, op);
1119
1054
  gpr_mu_lock(&t->mu->mu);
1120
1055
  if (op->on_connectivity_state_change) {
@@ -1146,17 +1081,17 @@ static void perform_transport_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1146
1081
  gpr_mu_unlock(&t->mu->mu);
1147
1082
  }
1148
1083
 
1149
- static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1150
- grpc_stream *gs,
1151
- grpc_closure *then_schedule_closure) {
1084
+ static void destroy_stream(grpc_exec_ctx* exec_ctx, grpc_transport* gt,
1085
+ grpc_stream* gs,
1086
+ grpc_closure* then_schedule_closure) {
1152
1087
  INPROC_LOG(GPR_DEBUG, "destroy_stream %p %p", gs, then_schedule_closure);
1153
- inproc_stream *s = (inproc_stream *)gs;
1088
+ inproc_stream* s = (inproc_stream*)gs;
1154
1089
  s->closure_at_destroy = then_schedule_closure;
1155
1090
  really_destroy_stream(exec_ctx, s);
1156
1091
  }
1157
1092
 
1158
- static void destroy_transport(grpc_exec_ctx *exec_ctx, grpc_transport *gt) {
1159
- inproc_transport *t = (inproc_transport *)gt;
1093
+ static void destroy_transport(grpc_exec_ctx* exec_ctx, grpc_transport* gt) {
1094
+ inproc_transport* t = (inproc_transport*)gt;
1160
1095
  INPROC_LOG(GPR_DEBUG, "destroy_transport %p", t);
1161
1096
  gpr_mu_lock(&t->mu->mu);
1162
1097
  close_transport_locked(exec_ctx, t);
@@ -1169,30 +1104,30 @@ static void destroy_transport(grpc_exec_ctx *exec_ctx, grpc_transport *gt) {
1169
1104
  * INTEGRATION GLUE
1170
1105
  */
1171
1106
 
1172
- static void set_pollset(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1173
- grpc_stream *gs, grpc_pollset *pollset) {
1107
+ static void set_pollset(grpc_exec_ctx* exec_ctx, grpc_transport* gt,
1108
+ grpc_stream* gs, grpc_pollset* pollset) {
1174
1109
  // Nothing to do here
1175
1110
  }
1176
1111
 
1177
- static void set_pollset_set(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
1178
- grpc_stream *gs, grpc_pollset_set *pollset_set) {
1112
+ static void set_pollset_set(grpc_exec_ctx* exec_ctx, grpc_transport* gt,
1113
+ grpc_stream* gs, grpc_pollset_set* pollset_set) {
1179
1114
  // Nothing to do here
1180
1115
  }
1181
1116
 
1182
- static grpc_endpoint *get_endpoint(grpc_exec_ctx *exec_ctx, grpc_transport *t) {
1183
- return NULL;
1117
+ static grpc_endpoint* get_endpoint(grpc_exec_ctx* exec_ctx, grpc_transport* t) {
1118
+ return nullptr;
1184
1119
  }
1185
1120
 
1186
1121
  /*******************************************************************************
1187
1122
  * GLOBAL INIT AND DESTROY
1188
1123
  */
1189
- static void do_nothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {}
1124
+ static void do_nothing(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) {}
1190
1125
 
1191
1126
  void grpc_inproc_transport_init(void) {
1192
1127
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1193
- GRPC_CLOSURE_INIT(&do_nothing_closure, do_nothing, NULL,
1128
+ GRPC_CLOSURE_INIT(&do_nothing_closure, do_nothing, nullptr,
1194
1129
  grpc_schedule_on_exec_ctx);
1195
- g_empty_slice = grpc_slice_from_static_buffer(NULL, 0);
1130
+ g_empty_slice = grpc_slice_from_static_buffer(nullptr, 0);
1196
1131
 
1197
1132
  grpc_slice key_tmp = grpc_slice_from_static_string(":path");
1198
1133
  g_fake_path_key = grpc_slice_intern(key_tmp);
@@ -1217,16 +1152,16 @@ static const grpc_transport_vtable inproc_vtable = {
1217
1152
  /*******************************************************************************
1218
1153
  * Main inproc transport functions
1219
1154
  */
1220
- static void inproc_transports_create(grpc_exec_ctx *exec_ctx,
1221
- grpc_transport **server_transport,
1222
- const grpc_channel_args *server_args,
1223
- grpc_transport **client_transport,
1224
- const grpc_channel_args *client_args) {
1155
+ static void inproc_transports_create(grpc_exec_ctx* exec_ctx,
1156
+ grpc_transport** server_transport,
1157
+ const grpc_channel_args* server_args,
1158
+ grpc_transport** client_transport,
1159
+ const grpc_channel_args* client_args) {
1225
1160
  INPROC_LOG(GPR_DEBUG, "inproc_transports_create");
1226
- inproc_transport *st = (inproc_transport *)gpr_zalloc(sizeof(*st));
1227
- inproc_transport *ct = (inproc_transport *)gpr_zalloc(sizeof(*ct));
1161
+ inproc_transport* st = (inproc_transport*)gpr_zalloc(sizeof(*st));
1162
+ inproc_transport* ct = (inproc_transport*)gpr_zalloc(sizeof(*ct));
1228
1163
  // Share one lock between both sides since both sides get affected
1229
- st->mu = ct->mu = (shared_mu *)gpr_malloc(sizeof(*st->mu));
1164
+ st->mu = ct->mu = (shared_mu*)gpr_malloc(sizeof(*st->mu));
1230
1165
  gpr_mu_init(&st->mu->mu);
1231
1166
  gpr_ref_init(&st->mu->refs, 2);
1232
1167
  st->base.vtable = &inproc_vtable;
@@ -1243,39 +1178,39 @@ static void inproc_transports_create(grpc_exec_ctx *exec_ctx,
1243
1178
  "inproc_client");
1244
1179
  st->other_side = ct;
1245
1180
  ct->other_side = st;
1246
- st->stream_list = NULL;
1247
- ct->stream_list = NULL;
1248
- *server_transport = (grpc_transport *)st;
1249
- *client_transport = (grpc_transport *)ct;
1181
+ st->stream_list = nullptr;
1182
+ ct->stream_list = nullptr;
1183
+ *server_transport = (grpc_transport*)st;
1184
+ *client_transport = (grpc_transport*)ct;
1250
1185
  }
1251
1186
 
1252
- grpc_channel *grpc_inproc_channel_create(grpc_server *server,
1253
- grpc_channel_args *args,
1254
- void *reserved) {
1187
+ grpc_channel* grpc_inproc_channel_create(grpc_server* server,
1188
+ grpc_channel_args* args,
1189
+ void* reserved) {
1255
1190
  GRPC_API_TRACE("grpc_inproc_channel_create(server=%p, args=%p)", 2,
1256
1191
  (server, args));
1257
1192
 
1258
1193
  grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
1259
1194
 
1260
- const grpc_channel_args *server_args = grpc_server_get_channel_args(server);
1195
+ const grpc_channel_args* server_args = grpc_server_get_channel_args(server);
1261
1196
 
1262
1197
  // Add a default authority channel argument for the client
1263
1198
 
1264
1199
  grpc_arg default_authority_arg;
1265
1200
  default_authority_arg.type = GRPC_ARG_STRING;
1266
- default_authority_arg.key = (char *)GRPC_ARG_DEFAULT_AUTHORITY;
1267
- default_authority_arg.value.string = (char *)"inproc.authority";
1268
- grpc_channel_args *client_args =
1201
+ default_authority_arg.key = (char*)GRPC_ARG_DEFAULT_AUTHORITY;
1202
+ default_authority_arg.value.string = (char*)"inproc.authority";
1203
+ grpc_channel_args* client_args =
1269
1204
  grpc_channel_args_copy_and_add(args, &default_authority_arg, 1);
1270
1205
 
1271
- grpc_transport *server_transport;
1272
- grpc_transport *client_transport;
1206
+ grpc_transport* server_transport;
1207
+ grpc_transport* client_transport;
1273
1208
  inproc_transports_create(&exec_ctx, &server_transport, server_args,
1274
1209
  &client_transport, client_args);
1275
1210
 
1276
- grpc_server_setup_transport(&exec_ctx, server, server_transport, NULL,
1211
+ grpc_server_setup_transport(&exec_ctx, server, server_transport, nullptr,
1277
1212
  server_args);
1278
- grpc_channel *channel =
1213
+ grpc_channel* channel =
1279
1214
  grpc_channel_create(&exec_ctx, "inproc", client_args,
1280
1215
  GRPC_CLIENT_DIRECT_CHANNEL, client_transport);
1281
1216