grpc 1.41.0 → 1.42.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 (519) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +57 -44
  3. data/etc/roots.pem +335 -326
  4. data/include/grpc/event_engine/event_engine.h +82 -42
  5. data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
  6. data/include/grpc/event_engine/memory_allocator.h +210 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +18 -0
  9. data/include/grpc/grpc_security_constants.h +1 -0
  10. data/include/grpc/impl/codegen/port_platform.h +7 -0
  11. data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
  12. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  13. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  14. data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
  15. data/src/core/ext/filters/client_channel/client_channel.h +74 -27
  16. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  17. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
  19. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +4 -5
  21. data/src/core/ext/filters/client_channel/connector.h +18 -18
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
  23. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
  37. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
  43. data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  45. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
  53. data/src/core/ext/filters/client_channel/resolver.h +1 -1
  54. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
  55. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
  59. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  60. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  61. data/src/core/ext/filters/client_channel/server_address.h +1 -1
  62. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  63. data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
  64. data/src/core/ext/filters/client_channel/subchannel.h +29 -49
  65. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  66. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  67. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  68. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  69. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  70. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
  72. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
  73. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  74. data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
  75. data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
  76. data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
  77. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
  78. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
  79. data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
  80. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  81. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  82. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  83. data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
  84. data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
  85. data/src/core/ext/service_config/service_config_call_data.h +72 -0
  86. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
  87. data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
  89. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
  90. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
  91. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
  92. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
  93. data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
  94. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
  95. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
  96. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  97. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  98. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  99. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  100. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
  102. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
  103. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
  107. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
  108. data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
  109. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
  110. data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
  111. data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
  112. data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
  113. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
  114. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
  115. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
  116. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
  117. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
  118. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
  119. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
  120. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
  121. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
  122. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
  123. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
  124. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
  125. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
  126. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
  127. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
  128. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
  129. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
  130. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
  131. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  132. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
  133. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  134. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  135. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  136. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  137. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
  138. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
  139. data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
  140. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
  141. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
  142. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  143. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
  144. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  145. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
  146. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
  147. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
  148. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
  149. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
  150. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
  151. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
  152. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
  153. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
  154. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
  155. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  156. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
  157. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
  158. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
  159. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
  160. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
  161. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
  162. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
  163. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  164. data/src/core/ext/xds/xds_api.cc +325 -362
  165. data/src/core/ext/xds/xds_api.h +134 -82
  166. data/src/core/ext/xds/xds_bootstrap.h +10 -0
  167. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  168. data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
  169. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  170. data/src/core/ext/xds/xds_client.cc +527 -314
  171. data/src/core/ext/xds/xds_client.h +42 -37
  172. data/src/core/ext/xds/xds_client_stats.h +1 -1
  173. data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
  174. data/src/core/lib/address_utils/parse_address.cc +2 -0
  175. data/src/core/lib/avl/avl.cc +5 -5
  176. data/src/core/lib/backoff/backoff.cc +1 -1
  177. data/src/core/lib/channel/channel_args.cc +24 -6
  178. data/src/core/lib/channel/channel_args.h +9 -0
  179. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  180. data/src/core/lib/channel/channel_trace.cc +1 -1
  181. data/src/core/lib/channel/channel_trace.h +1 -1
  182. data/src/core/lib/channel/channelz.cc +3 -3
  183. data/src/core/lib/channel/channelz.h +2 -2
  184. data/src/core/lib/channel/channelz_registry.cc +1 -1
  185. data/src/core/lib/channel/channelz_registry.h +1 -1
  186. data/src/core/lib/channel/connected_channel.cc +1 -3
  187. data/src/core/lib/channel/connected_channel.h +1 -2
  188. data/src/core/lib/compression/compression.cc +2 -2
  189. data/src/core/lib/compression/compression_args.cc +6 -4
  190. data/src/core/lib/compression/compression_internal.cc +2 -2
  191. data/src/core/lib/compression/compression_internal.h +1 -1
  192. data/src/core/lib/config/core_configuration.cc +44 -2
  193. data/src/core/lib/config/core_configuration.h +39 -1
  194. data/src/core/lib/debug/stats.cc +1 -1
  195. data/src/core/lib/debug/stats_data.cc +13 -13
  196. data/src/core/lib/gpr/atm.cc +1 -1
  197. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  198. data/src/core/lib/gpr/string.cc +2 -2
  199. data/src/core/lib/gpr/tls.h +1 -1
  200. data/src/core/lib/gpr/useful.h +79 -32
  201. data/src/core/lib/gprpp/arena.h +10 -0
  202. data/src/core/lib/gprpp/bitset.h +38 -16
  203. data/src/core/lib/gprpp/chunked_vector.h +211 -0
  204. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  205. data/src/core/lib/gprpp/match.h +1 -1
  206. data/src/core/lib/gprpp/memory.h +6 -0
  207. data/src/core/lib/gprpp/overload.h +1 -1
  208. data/src/core/lib/gprpp/status_helper.cc +23 -3
  209. data/src/core/lib/gprpp/status_helper.h +12 -1
  210. data/src/core/lib/gprpp/table.h +411 -0
  211. data/src/core/lib/http/httpcli.cc +200 -182
  212. data/src/core/lib/http/parser.cc +2 -2
  213. data/src/core/lib/iomgr/call_combiner.cc +28 -10
  214. data/src/core/lib/iomgr/combiner.cc +6 -21
  215. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
  216. data/src/core/lib/iomgr/error.cc +113 -52
  217. data/src/core/lib/iomgr/error.h +50 -9
  218. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  219. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  220. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  221. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  222. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  223. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  224. data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
  225. data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
  226. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  227. data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
  228. data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
  229. data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
  230. data/src/core/lib/iomgr/exec_ctx.cc +1 -9
  231. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  232. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  233. data/src/core/lib/iomgr/executor.cc +6 -20
  234. data/src/core/lib/iomgr/iomgr.cc +3 -1
  235. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  236. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  237. data/src/core/lib/iomgr/load_file.cc +2 -2
  238. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  239. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  240. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
  242. data/src/core/lib/iomgr/resource_quota.cc +13 -11
  243. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  244. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  245. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  246. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
  247. data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
  248. data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
  249. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  250. data/src/core/lib/iomgr/tcp_posix.cc +4 -5
  251. data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
  252. data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
  254. data/src/core/lib/iomgr/tcp_windows.cc +2 -2
  255. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  256. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  257. data/src/core/lib/json/json_util.cc +68 -0
  258. data/src/core/lib/json/json_util.h +57 -99
  259. data/src/core/lib/json/json_writer.cc +0 -3
  260. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  261. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  262. data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
  263. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
  264. data/src/core/lib/security/context/security_context.cc +4 -2
  265. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  266. data/src/core/lib/security/credentials/credentials.cc +4 -2
  267. data/src/core/lib/security/credentials/credentials.h +6 -1
  268. data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
  269. data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
  270. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
  272. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
  273. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
  274. data/src/core/lib/security/security_connector/security_connector.cc +9 -4
  275. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  276. data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
  277. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
  278. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
  279. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  280. data/src/core/lib/security/transport/security_handshaker.cc +73 -43
  281. data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
  282. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  283. data/src/core/lib/slice/slice.cc +0 -16
  284. data/src/core/lib/slice/slice_api.cc +39 -0
  285. data/src/core/lib/slice/slice_buffer.cc +5 -5
  286. data/src/core/lib/slice/slice_intern.cc +8 -13
  287. data/src/core/lib/slice/slice_internal.h +1 -244
  288. data/src/core/lib/slice/slice_refcount.cc +17 -0
  289. data/src/core/lib/slice/slice_refcount.h +121 -0
  290. data/src/core/lib/slice/slice_refcount_base.h +173 -0
  291. data/src/core/lib/slice/slice_split.cc +100 -0
  292. data/src/core/lib/slice/slice_split.h +40 -0
  293. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  294. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  295. data/src/core/lib/slice/static_slice.cc +529 -0
  296. data/src/core/lib/slice/static_slice.h +331 -0
  297. data/src/core/lib/surface/builtins.cc +49 -0
  298. data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
  299. data/src/core/lib/surface/call.cc +103 -120
  300. data/src/core/lib/surface/call.h +0 -6
  301. data/src/core/lib/surface/channel.cc +19 -32
  302. data/src/core/lib/surface/channel.h +0 -9
  303. data/src/core/lib/surface/channel_init.cc +23 -76
  304. data/src/core/lib/surface/channel_init.h +52 -44
  305. data/src/core/lib/surface/completion_queue.cc +6 -5
  306. data/src/core/lib/surface/init.cc +0 -39
  307. data/src/core/lib/surface/init_secure.cc +17 -14
  308. data/src/core/lib/surface/lame_client.cc +18 -11
  309. data/src/core/lib/surface/lame_client.h +1 -1
  310. data/src/core/lib/surface/server.cc +25 -17
  311. data/src/core/lib/surface/server.h +17 -10
  312. data/src/core/lib/surface/validate_metadata.cc +5 -2
  313. data/src/core/lib/surface/version.cc +2 -2
  314. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  315. data/src/core/lib/transport/error_utils.cc +42 -17
  316. data/src/core/lib/transport/error_utils.h +1 -1
  317. data/src/core/lib/transport/metadata.cc +31 -10
  318. data/src/core/lib/transport/metadata.h +2 -1
  319. data/src/core/lib/transport/metadata_batch.cc +35 -371
  320. data/src/core/lib/transport/metadata_batch.h +905 -71
  321. data/src/core/lib/transport/parsed_metadata.h +263 -0
  322. data/src/core/lib/transport/pid_controller.cc +4 -4
  323. data/src/core/lib/transport/static_metadata.cc +714 -846
  324. data/src/core/lib/transport/static_metadata.h +115 -379
  325. data/src/core/lib/transport/status_metadata.cc +1 -0
  326. data/src/core/lib/transport/transport.cc +4 -5
  327. data/src/core/lib/transport/transport_op_string.cc +40 -20
  328. data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
  329. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  330. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  331. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  332. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
  333. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  336. data/src/core/tsi/fake_transport_security.cc +15 -7
  337. data/src/core/tsi/local_transport_security.cc +36 -73
  338. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  339. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
  340. data/src/core/tsi/ssl_transport_security.cc +10 -2
  341. data/src/core/tsi/transport_security.cc +12 -0
  342. data/src/core/tsi/transport_security.h +16 -1
  343. data/src/core/tsi/transport_security_interface.h +26 -0
  344. data/src/ruby/ext/grpc/extconf.rb +12 -9
  345. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  346. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  347. data/src/ruby/lib/grpc/version.rb +1 -1
  348. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
  349. data/src/ruby/spec/client_server_spec.rb +1 -1
  350. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  351. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
  352. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  353. data/third_party/boringssl-with-bazel/err_data.c +278 -272
  354. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +21 -22
  355. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  356. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +5 -0
  357. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +15 -22
  358. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +13 -7
  359. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  360. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/a_strex.c +268 -271
  361. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  362. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +2 -2
  363. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +0 -39
  364. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  365. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  366. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +38 -0
  367. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +8 -8
  368. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +289 -198
  369. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +8 -8
  370. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +9 -13
  371. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +1 -0
  372. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +11 -8
  373. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  374. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  375. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  376. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  377. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  378. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  379. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  380. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  381. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +8 -0
  382. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  383. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +45 -65
  384. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +1 -0
  385. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  386. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +21 -3
  387. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  388. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +5 -2
  389. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  390. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +10 -0
  391. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  392. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  393. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +4 -7
  394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  395. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +1 -1
  397. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +24 -9
  398. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +4 -2
  399. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  400. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  401. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  402. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  403. data/third_party/boringssl-with-bazel/src/crypto/mem.c +12 -9
  404. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  405. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  406. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  408. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  409. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  410. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +9 -4
  411. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +151 -12
  412. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  413. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  414. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  415. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +181 -1
  416. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  417. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +11 -2
  418. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +0 -2
  419. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +0 -179
  420. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +4 -2
  421. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +0 -5
  422. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +1 -0
  423. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +11 -50
  424. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +1 -1
  425. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +2 -4
  426. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +0 -16
  427. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +22 -18
  428. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +11 -8
  429. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +16 -0
  430. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -0
  431. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  432. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +1 -1
  433. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +4 -3
  435. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +24 -5
  436. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +17 -8
  437. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +3 -0
  438. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +6 -6
  439. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -0
  440. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +5 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  442. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  443. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +0 -2
  444. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  445. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +71 -26
  446. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +366 -227
  447. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +2 -9
  448. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +10 -4
  449. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +3 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  451. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +9 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +8 -2
  453. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +9 -3
  455. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -20
  456. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -5
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +5 -0
  458. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +37 -15
  459. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +28 -14
  460. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +31 -32
  461. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +529 -91
  462. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -695
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +48 -8
  464. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +266 -357
  465. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +90 -152
  466. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +15 -13
  467. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +75 -79
  468. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +96 -97
  469. data/third_party/boringssl-with-bazel/src/ssl/internal.h +63 -43
  470. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +2 -2
  471. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +2 -2
  472. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +6 -12
  473. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +14 -17
  474. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +14 -27
  475. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +203 -203
  476. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +30 -41
  477. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +47 -33
  478. data/third_party/re2/re2/compile.cc +91 -109
  479. data/third_party/re2/re2/dfa.cc +27 -39
  480. data/third_party/re2/re2/filtered_re2.cc +18 -2
  481. data/third_party/re2/re2/filtered_re2.h +10 -5
  482. data/third_party/re2/re2/nfa.cc +1 -1
  483. data/third_party/re2/re2/parse.cc +42 -23
  484. data/third_party/re2/re2/perl_groups.cc +34 -34
  485. data/third_party/re2/re2/prefilter.cc +3 -2
  486. data/third_party/re2/re2/prog.cc +182 -4
  487. data/third_party/re2/re2/prog.h +28 -9
  488. data/third_party/re2/re2/re2.cc +87 -118
  489. data/third_party/re2/re2/re2.h +156 -141
  490. data/third_party/re2/re2/regexp.cc +12 -5
  491. data/third_party/re2/re2/regexp.h +8 -2
  492. data/third_party/re2/re2/set.cc +31 -9
  493. data/third_party/re2/re2/set.h +9 -4
  494. data/third_party/re2/re2/simplify.cc +11 -3
  495. data/third_party/re2/re2/tostring.cc +1 -1
  496. data/third_party/re2/re2/walker-inl.h +1 -1
  497. data/third_party/re2/util/mutex.h +2 -2
  498. data/third_party/re2/util/pcre.h +3 -3
  499. metadata +77 -64
  500. data/include/grpc/event_engine/slice_allocator.h +0 -71
  501. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  502. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  503. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  504. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  505. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  506. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  507. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  508. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  509. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  510. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  511. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  512. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  513. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  514. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  515. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  516. data/src/core/lib/iomgr/udp_server.cc +0 -747
  517. data/src/core/lib/iomgr/udp_server.h +0 -103
  518. data/src/core/lib/transport/authority_override.cc +0 -40
  519. data/src/core/lib/transport/authority_override.h +0 -37
@@ -50,6 +50,7 @@
50
50
  #include "src/core/lib/gprpp/ref_counted.h"
51
51
  #include "src/core/lib/iomgr/timer.h"
52
52
  #include "src/core/lib/profiling/timers.h"
53
+ #include "src/core/lib/slice/slice_split.h"
53
54
  #include "src/core/lib/slice/slice_string_helpers.h"
54
55
  #include "src/core/lib/slice/slice_utils.h"
55
56
  #include "src/core/lib/surface/api_trace.h"
@@ -107,7 +108,7 @@ struct batch_control {
107
108
  grpc_closure start_batch;
108
109
  grpc_closure finish_batch;
109
110
  std::atomic<intptr_t> steps_to_complete{0};
110
- gpr_atm batch_error = reinterpret_cast<gpr_atm>(GRPC_ERROR_NONE);
111
+ AtomicError batch_error;
111
112
  void set_num_steps_to_complete(uintptr_t steps) {
112
113
  steps_to_complete.store(steps, std::memory_order_release);
113
114
  }
@@ -143,13 +144,7 @@ struct grpc_call {
143
144
  cq(args.cq),
144
145
  channel(args.channel),
145
146
  is_client(args.server_transport_data == nullptr),
146
- stream_op_payload(context) {
147
- for (int i = 0; i < 2; i++) {
148
- for (int j = 0; j < 2; j++) {
149
- metadata_batch[i][j].deadline = GRPC_MILLIS_INF_FUTURE;
150
- }
151
- }
152
- }
147
+ stream_op_payload(context) {}
153
148
 
154
149
  ~grpc_call() {
155
150
  for (int i = 0; i < GRPC_CONTEXT_COUNT; ++i) {
@@ -192,7 +187,10 @@ struct grpc_call {
192
187
  grpc_transport_stream_op_batch_payload stream_op_payload;
193
188
 
194
189
  /* first idx: is_receiving, second idx: is_trailing */
195
- grpc_metadata_batch metadata_batch[2][2] = {};
190
+ grpc_metadata_batch send_initial_metadata{arena};
191
+ grpc_metadata_batch send_trailing_metadata{arena};
192
+ grpc_metadata_batch recv_initial_metadata{arena};
193
+ grpc_metadata_batch recv_trailing_metadata{arena};
196
194
 
197
195
  /* Buffered read metadata waiting to be returned to the application.
198
196
  Element 0 is initial metadata, element 1 is trailing metadata. */
@@ -257,7 +255,7 @@ struct grpc_call {
257
255
  grpc_core::Server* core_server;
258
256
  } server;
259
257
  } final_op;
260
- gpr_atm status_error = 0;
258
+ AtomicError status_error;
261
259
 
262
260
  /* recv_state can contain one of the following values:
263
261
  RECV_NONE : : no initial metadata and messages received
@@ -407,7 +405,7 @@ grpc_error_handle grpc_call_create(const grpc_call_create_args* args,
407
405
  GPR_ASSERT(!args->parent->is_client);
408
406
 
409
407
  if (args->propagation_mask & GRPC_PROPAGATE_DEADLINE) {
410
- send_deadline = GPR_MIN(send_deadline, args->parent->send_deadline);
408
+ send_deadline = std::min(send_deadline, args->parent->send_deadline);
411
409
  }
412
410
  /* for now GRPC_PROPAGATE_TRACING_CONTEXT *MUST* be passed with
413
411
  * GRPC_PROPAGATE_STATS_CONTEXT */
@@ -545,31 +543,26 @@ static void release_call(void* call, grpc_error_handle /*error*/) {
545
543
 
546
544
  static void destroy_call(void* call, grpc_error_handle /*error*/) {
547
545
  GPR_TIMER_SCOPE("destroy_call", 0);
548
- size_t i;
549
- int ii;
550
546
  grpc_call* c = static_cast<grpc_call*>(call);
551
- for (i = 0; i < 2; i++) {
552
- grpc_metadata_batch_destroy(
553
- &c->metadata_batch[1 /* is_receiving */][i /* is_initial */]);
554
- }
547
+ c->recv_initial_metadata.Clear();
548
+ c->recv_trailing_metadata.Clear();
555
549
  c->receiving_stream.reset();
556
550
  parent_call* pc = get_parent_call(c);
557
551
  if (pc != nullptr) {
558
552
  pc->~parent_call();
559
553
  }
560
- for (ii = 0; ii < c->send_extra_metadata_count; ii++) {
561
- GRPC_MDELEM_UNREF(c->send_extra_metadata[ii].md);
554
+ for (int i = 0; i < c->send_extra_metadata_count; i++) {
555
+ GRPC_MDELEM_UNREF(c->send_extra_metadata[i].md);
562
556
  }
563
557
  if (c->cq) {
564
558
  GRPC_CQ_INTERNAL_UNREF(c->cq, "bind");
565
559
  }
566
560
 
567
- grpc_error_handle status_error =
568
- reinterpret_cast<grpc_error_handle>(gpr_atm_acq_load(&c->status_error));
561
+ grpc_error_handle status_error = c->status_error.get();
569
562
  grpc_error_get_status(status_error, c->send_deadline,
570
563
  &c->final_info.final_status, nullptr, nullptr,
571
564
  &(c->final_info.error_string));
572
- GRPC_ERROR_UNREF(status_error);
565
+ c->status_error.set(GRPC_ERROR_NONE);
573
566
  c->final_info.stats.latency =
574
567
  gpr_cycle_counter_sub(gpr_get_cycle_counter(), c->start_time);
575
568
  grpc_call_stack_destroy(CALL_STACK_FROM_CALL(c), &c->final_info,
@@ -734,8 +727,7 @@ static grpc_error_handle error_from_status(grpc_status_code status,
734
727
  // guarantee that can be short-lived.
735
728
  return grpc_error_set_int(
736
729
  grpc_error_set_str(GRPC_ERROR_CREATE_FROM_COPIED_STRING(description),
737
- GRPC_ERROR_STR_GRPC_MESSAGE,
738
- grpc_slice_from_copied_string(description)),
730
+ GRPC_ERROR_STR_GRPC_MESSAGE, description),
739
731
  GRPC_ERROR_INT_GRPC_STATUS, status);
740
732
  }
741
733
 
@@ -750,13 +742,14 @@ static void set_final_status(grpc_call* call, grpc_error_handle error) {
750
742
  gpr_log(GPR_DEBUG, "%s", grpc_error_std_string(error).c_str());
751
743
  }
752
744
  if (call->is_client) {
745
+ std::string status_details;
753
746
  grpc_error_get_status(error, call->send_deadline,
754
- call->final_op.client.status,
755
- call->final_op.client.status_details, nullptr,
756
- call->final_op.client.error_string);
757
- // explicitly take a ref
758
- grpc_slice_ref_internal(*call->final_op.client.status_details);
759
- gpr_atm_rel_store(&call->status_error, reinterpret_cast<gpr_atm>(error));
747
+ call->final_op.client.status, &status_details,
748
+ nullptr, call->final_op.client.error_string);
749
+ *call->final_op.client.status_details =
750
+ grpc_slice_from_cpp_string(std::move(status_details));
751
+ call->status_error.set(error);
752
+ GRPC_ERROR_UNREF(error);
760
753
  grpc_core::channelz::ChannelNode* channelz_channel =
761
754
  grpc_channel_get_channelz_node(call->channel);
762
755
  if (channelz_channel != nullptr) {
@@ -772,9 +765,7 @@ static void set_final_status(grpc_call* call, grpc_error_handle error) {
772
765
  grpc_core::channelz::ServerNode* channelz_node =
773
766
  call->final_op.server.core_server->channelz_node();
774
767
  if (channelz_node != nullptr) {
775
- if (*call->final_op.server.cancelled ||
776
- reinterpret_cast<grpc_error_handle>(
777
- gpr_atm_acq_load(&call->status_error)) != GRPC_ERROR_NONE) {
768
+ if (*call->final_op.server.cancelled || !call->status_error.ok()) {
778
769
  channelz_node->RecordCallFailed();
779
770
  } else {
780
771
  channelz_node->RecordCallSucceeded();
@@ -848,7 +839,7 @@ static void set_encodings_accepted_by_peer(grpc_call* /*call*/,
848
839
  grpc_slice_split_without_space(accept_encoding_slice, ",",
849
840
  &accept_encoding_parts);
850
841
 
851
- GPR_BITSET(encodings_accepted_by_peer, GRPC_COMPRESS_NONE);
842
+ grpc_core::SetBit(encodings_accepted_by_peer, GRPC_COMPRESS_NONE);
852
843
  for (i = 0; i < accept_encoding_parts.count; i++) {
853
844
  int r;
854
845
  grpc_slice accept_encoding_entry_slice = accept_encoding_parts.slices[i];
@@ -862,7 +853,7 @@ static void set_encodings_accepted_by_peer(grpc_call* /*call*/,
862
853
  reinterpret_cast<grpc_stream_compression_algorithm*>(&algorithm));
863
854
  }
864
855
  if (r) {
865
- GPR_BITSET(encodings_accepted_by_peer, algorithm);
856
+ grpc_core::SetBit(encodings_accepted_by_peer, algorithm);
866
857
  } else {
867
858
  char* accept_encoding_entry_str =
868
859
  grpc_slice_to_c_string(accept_encoding_entry_slice);
@@ -913,8 +904,8 @@ static int prepare_application_metadata(grpc_call* call, int count,
913
904
  int additional_metadata_count) {
914
905
  int total_count = count + additional_metadata_count;
915
906
  int i;
916
- grpc_metadata_batch* batch =
917
- &call->metadata_batch[0 /* is_receiving */][is_trailing];
907
+ grpc_metadata_batch* batch = is_trailing ? &call->send_trailing_metadata
908
+ : &call->send_initial_metadata;
918
909
  for (i = 0; i < total_count; i++) {
919
910
  grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count);
920
911
  grpc_linked_mdelem* l = linked_from_md(md);
@@ -947,15 +938,14 @@ static int prepare_application_metadata(grpc_call* call, int count,
947
938
  } else {
948
939
  for (i = 0; i < call->send_extra_metadata_count; i++) {
949
940
  GRPC_LOG_IF_ERROR("prepare_application_metadata",
950
- grpc_metadata_batch_link_tail(
951
- batch, &call->send_extra_metadata[i]));
941
+ batch->LinkTail(&call->send_extra_metadata[i]));
952
942
  }
953
943
  }
954
944
  }
955
945
  for (i = 0; i < total_count; i++) {
956
946
  grpc_metadata* md = get_md_elem(metadata, additional_metadata, i, count);
957
947
  grpc_linked_mdelem* l = linked_from_md(md);
958
- grpc_error_handle error = grpc_metadata_batch_link_tail(batch, l);
948
+ grpc_error_handle error = batch->LinkTail(l);
959
949
  if (error != GRPC_ERROR_NONE) {
960
950
  GRPC_MDELEM_UNREF(l->md);
961
951
  }
@@ -1000,53 +990,57 @@ static grpc_stream_compression_algorithm decode_stream_compression(
1000
990
 
1001
991
  static void publish_app_metadata(grpc_call* call, grpc_metadata_batch* b,
1002
992
  int is_trailing) {
1003
- if (b->list.count == 0) return;
993
+ if (b->non_deadline_count() == 0) return;
1004
994
  if (!call->is_client && is_trailing) return;
1005
995
  if (is_trailing && call->buffered_metadata[1] == nullptr) return;
1006
996
  GPR_TIMER_SCOPE("publish_app_metadata", 0);
1007
997
  grpc_metadata_array* dest;
1008
998
  grpc_metadata* mdusr;
1009
999
  dest = call->buffered_metadata[is_trailing];
1010
- if (dest->count + b->list.count > dest->capacity) {
1011
- dest->capacity =
1012
- GPR_MAX(dest->capacity + b->list.count, dest->capacity * 3 / 2);
1000
+ if (dest->count + b->non_deadline_count() > dest->capacity) {
1001
+ dest->capacity = std::max(dest->capacity + b->non_deadline_count(),
1002
+ dest->capacity * 3 / 2);
1013
1003
  dest->metadata = static_cast<grpc_metadata*>(
1014
1004
  gpr_realloc(dest->metadata, sizeof(grpc_metadata) * dest->capacity));
1015
1005
  }
1016
- for (grpc_linked_mdelem* l = b->list.head; l != nullptr; l = l->next) {
1006
+ b->ForEach([&](grpc_mdelem md) {
1017
1007
  mdusr = &dest->metadata[dest->count++];
1018
1008
  /* we pass back borrowed slices that are valid whilst the call is valid */
1019
- mdusr->key = GRPC_MDKEY(l->md);
1020
- mdusr->value = GRPC_MDVALUE(l->md);
1021
- }
1009
+ mdusr->key = GRPC_MDKEY(md);
1010
+ mdusr->value = GRPC_MDVALUE(md);
1011
+ });
1022
1012
  }
1023
1013
 
1024
1014
  static void recv_initial_filter(grpc_call* call, grpc_metadata_batch* b) {
1025
- if (b->idx.named.content_encoding != nullptr) {
1015
+ if (b->legacy_index()->named.content_encoding != nullptr) {
1026
1016
  GPR_TIMER_SCOPE("incoming_stream_compression_algorithm", 0);
1027
1017
  set_incoming_stream_compression_algorithm(
1028
- call, decode_stream_compression(b->idx.named.content_encoding->md));
1029
- grpc_metadata_batch_remove(b, GRPC_BATCH_CONTENT_ENCODING);
1018
+ call, decode_stream_compression(
1019
+ b->legacy_index()->named.content_encoding->md));
1020
+ b->Remove(GRPC_BATCH_CONTENT_ENCODING);
1030
1021
  }
1031
- if (b->idx.named.grpc_encoding != nullptr) {
1022
+ if (b->legacy_index()->named.grpc_encoding != nullptr) {
1032
1023
  GPR_TIMER_SCOPE("incoming_message_compression_algorithm", 0);
1033
1024
  set_incoming_message_compression_algorithm(
1034
- call, decode_message_compression(b->idx.named.grpc_encoding->md));
1035
- grpc_metadata_batch_remove(b, GRPC_BATCH_GRPC_ENCODING);
1025
+ call,
1026
+ decode_message_compression(b->legacy_index()->named.grpc_encoding->md));
1027
+ b->Remove(GRPC_BATCH_GRPC_ENCODING);
1036
1028
  }
1037
1029
  uint32_t message_encodings_accepted_by_peer = 1u;
1038
1030
  uint32_t stream_encodings_accepted_by_peer = 1u;
1039
- if (b->idx.named.grpc_accept_encoding != nullptr) {
1031
+ if (b->legacy_index()->named.grpc_accept_encoding != nullptr) {
1040
1032
  GPR_TIMER_SCOPE("encodings_accepted_by_peer", 0);
1041
- set_encodings_accepted_by_peer(call, b->idx.named.grpc_accept_encoding->md,
1042
- &message_encodings_accepted_by_peer, false);
1043
- grpc_metadata_batch_remove(b, GRPC_BATCH_GRPC_ACCEPT_ENCODING);
1033
+ set_encodings_accepted_by_peer(
1034
+ call, b->legacy_index()->named.grpc_accept_encoding->md,
1035
+ &message_encodings_accepted_by_peer, false);
1036
+ b->Remove(GRPC_BATCH_GRPC_ACCEPT_ENCODING);
1044
1037
  }
1045
- if (b->idx.named.accept_encoding != nullptr) {
1038
+ if (b->legacy_index()->named.accept_encoding != nullptr) {
1046
1039
  GPR_TIMER_SCOPE("stream_encodings_accepted_by_peer", 0);
1047
- set_encodings_accepted_by_peer(call, b->idx.named.accept_encoding->md,
1040
+ set_encodings_accepted_by_peer(call,
1041
+ b->legacy_index()->named.accept_encoding->md,
1048
1042
  &stream_encodings_accepted_by_peer, true);
1049
- grpc_metadata_batch_remove(b, GRPC_BATCH_ACCEPT_ENCODING);
1043
+ b->Remove(GRPC_BATCH_ACCEPT_ENCODING);
1050
1044
  }
1051
1045
  call->encodings_accepted_by_peer =
1052
1046
  grpc_compression_bitset_from_message_stream_compression_bitset(
@@ -1060,9 +1054,9 @@ static void recv_trailing_filter(void* args, grpc_metadata_batch* b,
1060
1054
  grpc_call* call = static_cast<grpc_call*>(args);
1061
1055
  if (batch_error != GRPC_ERROR_NONE) {
1062
1056
  set_final_status(call, batch_error);
1063
- } else if (b->idx.named.grpc_status != nullptr) {
1064
- grpc_status_code status_code =
1065
- grpc_get_status_code_from_metadata(b->idx.named.grpc_status->md);
1057
+ } else if (b->legacy_index()->named.grpc_status != nullptr) {
1058
+ grpc_status_code status_code = grpc_get_status_code_from_metadata(
1059
+ b->legacy_index()->named.grpc_status->md);
1066
1060
  grpc_error_handle error = GRPC_ERROR_NONE;
1067
1061
  if (status_code != GRPC_STATUS_OK) {
1068
1062
  char* peer = grpc_call_get_peer(call);
@@ -1072,17 +1066,17 @@ static void recv_trailing_filter(void* args, grpc_metadata_batch* b,
1072
1066
  static_cast<intptr_t>(status_code));
1073
1067
  gpr_free(peer);
1074
1068
  }
1075
- if (b->idx.named.grpc_message != nullptr) {
1069
+ if (b->legacy_index()->named.grpc_message != nullptr) {
1076
1070
  error = grpc_error_set_str(
1077
1071
  error, GRPC_ERROR_STR_GRPC_MESSAGE,
1078
- grpc_slice_ref_internal(GRPC_MDVALUE(b->idx.named.grpc_message->md)));
1079
- grpc_metadata_batch_remove(b, GRPC_BATCH_GRPC_MESSAGE);
1072
+ grpc_core::StringViewFromSlice(
1073
+ GRPC_MDVALUE(b->legacy_index()->named.grpc_message->md)));
1074
+ b->Remove(GRPC_BATCH_GRPC_MESSAGE);
1080
1075
  } else if (error != GRPC_ERROR_NONE) {
1081
- error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE,
1082
- grpc_empty_slice());
1076
+ error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "");
1083
1077
  }
1084
1078
  set_final_status(call, GRPC_ERROR_REF(error));
1085
- grpc_metadata_batch_remove(b, GRPC_BATCH_GRPC_STATUS);
1079
+ b->Remove(GRPC_BATCH_GRPC_STATUS);
1086
1080
  GRPC_ERROR_UNREF(error);
1087
1081
  } else if (!call->is_client) {
1088
1082
  set_final_status(call, GRPC_ERROR_NONE);
@@ -1156,6 +1150,7 @@ static batch_control* reuse_or_allocate_batch_control(grpc_call* call,
1156
1150
  }
1157
1151
  bctl->~batch_control();
1158
1152
  bctl->op = {};
1153
+ new (&bctl->batch_error) AtomicError();
1159
1154
  } else {
1160
1155
  bctl = call->arena->New<batch_control>();
1161
1156
  *pslot = bctl;
@@ -1174,21 +1169,16 @@ static void finish_batch_completion(void* user_data,
1174
1169
  }
1175
1170
 
1176
1171
  static void reset_batch_errors(batch_control* bctl) {
1177
- GRPC_ERROR_UNREF(reinterpret_cast<grpc_error_handle>(
1178
- gpr_atm_acq_load(&bctl->batch_error)));
1179
- gpr_atm_rel_store(&bctl->batch_error,
1180
- reinterpret_cast<gpr_atm>(GRPC_ERROR_NONE));
1172
+ bctl->batch_error.set(GRPC_ERROR_NONE);
1181
1173
  }
1182
1174
 
1183
1175
  static void post_batch_completion(batch_control* bctl) {
1184
1176
  grpc_call* next_child_call;
1185
1177
  grpc_call* call = bctl->call;
1186
- grpc_error_handle error = GRPC_ERROR_REF(reinterpret_cast<grpc_error_handle>(
1187
- gpr_atm_acq_load(&bctl->batch_error)));
1178
+ grpc_error_handle error = GRPC_ERROR_REF(bctl->batch_error.get());
1188
1179
 
1189
1180
  if (bctl->op.send_initial_metadata) {
1190
- grpc_metadata_batch_destroy(
1191
- &call->metadata_batch[0 /* is_receiving */][0 /* is_trailing */]);
1181
+ call->send_initial_metadata.Clear();
1192
1182
  }
1193
1183
  if (bctl->op.send_message) {
1194
1184
  if (bctl->op.payload->send_message.stream_write_closed &&
@@ -1200,8 +1190,7 @@ static void post_batch_completion(batch_control* bctl) {
1200
1190
  call->sending_message = false;
1201
1191
  }
1202
1192
  if (bctl->op.send_trailing_metadata) {
1203
- grpc_metadata_batch_destroy(
1204
- &call->metadata_batch[0 /* is_receiving */][1 /* is_trailing */]);
1193
+ call->send_trailing_metadata.Clear();
1205
1194
  }
1206
1195
  if (bctl->op.recv_trailing_metadata) {
1207
1196
  /* propagate cancellation to any interested children */
@@ -1353,10 +1342,8 @@ static void receiving_stream_ready(void* bctlp, grpc_error_handle error) {
1353
1342
  grpc_call* call = bctl->call;
1354
1343
  if (error != GRPC_ERROR_NONE) {
1355
1344
  call->receiving_stream.reset();
1356
- if (reinterpret_cast<grpc_error_handle>(
1357
- gpr_atm_acq_load(&bctl->batch_error)) == GRPC_ERROR_NONE) {
1358
- gpr_atm_rel_store(&bctl->batch_error,
1359
- reinterpret_cast<gpr_atm>(GRPC_ERROR_REF(error)));
1345
+ if (bctl->batch_error.ok()) {
1346
+ bctl->batch_error.set(error);
1360
1347
  }
1361
1348
  cancel_with_error(call, GRPC_ERROR_REF(error));
1362
1349
  }
@@ -1458,8 +1445,8 @@ static void validate_filtered_metadata(batch_control* bctl) {
1458
1445
  }
1459
1446
  /* GRPC_COMPRESS_NONE is always set. */
1460
1447
  GPR_DEBUG_ASSERT(call->encodings_accepted_by_peer != 0);
1461
- if (GPR_UNLIKELY(!GPR_BITGET(call->encodings_accepted_by_peer,
1462
- compression_algorithm))) {
1448
+ if (GPR_UNLIKELY(!grpc_core::GetBit(call->encodings_accepted_by_peer,
1449
+ compression_algorithm))) {
1463
1450
  if (GRPC_TRACE_FLAG_ENABLED(grpc_compression_trace)) {
1464
1451
  handle_compression_algorithm_not_accepted(call, compression_algorithm);
1465
1452
  }
@@ -1475,22 +1462,21 @@ static void receiving_initial_metadata_ready(void* bctlp,
1475
1462
  GRPC_CALL_COMBINER_STOP(&call->call_combiner, "recv_initial_metadata_ready");
1476
1463
 
1477
1464
  if (error == GRPC_ERROR_NONE) {
1478
- grpc_metadata_batch* md =
1479
- &call->metadata_batch[1 /* is_receiving */][0 /* is_trailing */];
1465
+ grpc_metadata_batch* md = &call->recv_initial_metadata;
1480
1466
  recv_initial_filter(call, md);
1481
1467
 
1482
1468
  /* TODO(ctiller): this could be moved into recv_initial_filter now */
1483
1469
  GPR_TIMER_SCOPE("validate_filtered_metadata", 0);
1484
1470
  validate_filtered_metadata(bctl);
1485
1471
 
1486
- if (md->deadline != GRPC_MILLIS_INF_FUTURE && !call->is_client) {
1487
- call->send_deadline = md->deadline;
1472
+ absl::optional<grpc_millis> deadline =
1473
+ md->get(grpc_core::GrpcTimeoutMetadata());
1474
+ if (deadline.has_value() && !call->is_client) {
1475
+ call->send_deadline = *deadline;
1488
1476
  }
1489
1477
  } else {
1490
- if (reinterpret_cast<grpc_error_handle>(
1491
- gpr_atm_acq_load(&bctl->batch_error)) == GRPC_ERROR_NONE) {
1492
- gpr_atm_rel_store(&bctl->batch_error,
1493
- reinterpret_cast<gpr_atm>(GRPC_ERROR_REF(error)));
1478
+ if (bctl->batch_error.ok()) {
1479
+ bctl->batch_error.set(error);
1494
1480
  }
1495
1481
  cancel_with_error(call, GRPC_ERROR_REF(error));
1496
1482
  }
@@ -1532,8 +1518,7 @@ static void receiving_trailing_metadata_ready(void* bctlp,
1532
1518
  batch_control* bctl = static_cast<batch_control*>(bctlp);
1533
1519
  grpc_call* call = bctl->call;
1534
1520
  GRPC_CALL_COMBINER_STOP(&call->call_combiner, "recv_trailing_metadata_ready");
1535
- grpc_metadata_batch* md =
1536
- &call->metadata_batch[1 /* is_receiving */][1 /* is_trailing */];
1521
+ grpc_metadata_batch* md = &call->recv_trailing_metadata;
1537
1522
  recv_trailing_filter(call, md, GRPC_ERROR_REF(error));
1538
1523
  finish_batch_step(bctl);
1539
1524
  }
@@ -1542,10 +1527,8 @@ static void finish_batch(void* bctlp, grpc_error_handle error) {
1542
1527
  batch_control* bctl = static_cast<batch_control*>(bctlp);
1543
1528
  grpc_call* call = bctl->call;
1544
1529
  GRPC_CALL_COMBINER_STOP(&call->call_combiner, "on_complete");
1545
- if (reinterpret_cast<grpc_error_handle>(
1546
- gpr_atm_acq_load(&bctl->batch_error)) == GRPC_ERROR_NONE) {
1547
- gpr_atm_rel_store(&bctl->batch_error,
1548
- reinterpret_cast<gpr_atm>(GRPC_ERROR_REF(error)));
1530
+ if (bctl->batch_error.ok()) {
1531
+ bctl->batch_error.set(error);
1549
1532
  }
1550
1533
  if (error != GRPC_ERROR_NONE) {
1551
1534
  cancel_with_error(call, GRPC_ERROR_REF(error));
@@ -1669,11 +1652,12 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1669
1652
  goto done_with_error;
1670
1653
  }
1671
1654
  /* TODO(ctiller): just make these the same variable? */
1672
- if (call->is_client) {
1673
- call->metadata_batch[0][0].deadline = call->send_deadline;
1655
+ if (call->is_client && call->send_deadline != GRPC_MILLIS_INF_FUTURE) {
1656
+ call->send_initial_metadata.Set(grpc_core::GrpcTimeoutMetadata(),
1657
+ call->send_deadline);
1674
1658
  }
1675
1659
  stream_op_payload->send_initial_metadata.send_initial_metadata =
1676
- &call->metadata_batch[0 /* is_receiving */][0 /* is_trailing */];
1660
+ &call->send_initial_metadata;
1677
1661
  stream_op_payload->send_initial_metadata.send_initial_metadata_flags =
1678
1662
  op->flags;
1679
1663
  if (call->is_client) {
@@ -1730,7 +1714,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1730
1714
  stream_op->send_trailing_metadata = true;
1731
1715
  call->sent_final_op = true;
1732
1716
  stream_op_payload->send_trailing_metadata.send_trailing_metadata =
1733
- &call->metadata_batch[0 /* is_receiving */][1 /* is_trailing */];
1717
+ &call->send_trailing_metadata;
1734
1718
  has_send_ops = true;
1735
1719
  break;
1736
1720
  }
@@ -1771,21 +1755,21 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1771
1755
  if (op->data.send_status_from_server.status_details != nullptr) {
1772
1756
  call->send_extra_metadata[1].md = grpc_mdelem_from_slices(
1773
1757
  GRPC_MDSTR_GRPC_MESSAGE,
1774
- grpc_slice_ref_internal(
1758
+ grpc_slice_copy(
1775
1759
  *op->data.send_status_from_server.status_details));
1776
1760
  call->send_extra_metadata_count++;
1777
1761
  if (status_error != GRPC_ERROR_NONE) {
1778
1762
  char* msg = grpc_slice_to_c_string(
1779
1763
  GRPC_MDVALUE(call->send_extra_metadata[1].md));
1780
- status_error =
1781
- grpc_error_set_str(status_error, GRPC_ERROR_STR_GRPC_MESSAGE,
1782
- grpc_slice_from_copied_string(msg));
1764
+ status_error = grpc_error_set_str(status_error,
1765
+ GRPC_ERROR_STR_GRPC_MESSAGE, msg);
1783
1766
  gpr_free(msg);
1784
1767
  }
1785
1768
  }
1786
1769
 
1787
- gpr_atm_rel_store(&call->status_error,
1788
- reinterpret_cast<gpr_atm>(status_error));
1770
+ call->status_error.set(status_error);
1771
+ GRPC_ERROR_UNREF(status_error);
1772
+
1789
1773
  if (!prepare_application_metadata(
1790
1774
  call,
1791
1775
  static_cast<int>(
@@ -1800,7 +1784,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1800
1784
  goto done_with_error;
1801
1785
  }
1802
1786
  stream_op_payload->send_trailing_metadata.send_trailing_metadata =
1803
- &call->metadata_batch[0 /* is_receiving */][1 /* is_trailing */];
1787
+ &call->send_trailing_metadata;
1804
1788
  stream_op_payload->send_trailing_metadata.sent =
1805
1789
  &call->sent_server_trailing_metadata;
1806
1790
  has_send_ops = true;
@@ -1824,7 +1808,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1824
1808
  grpc_schedule_on_exec_ctx);
1825
1809
  stream_op->recv_initial_metadata = true;
1826
1810
  stream_op_payload->recv_initial_metadata.recv_initial_metadata =
1827
- &call->metadata_batch[1 /* is_receiving */][0 /* is_trailing */];
1811
+ &call->recv_initial_metadata;
1828
1812
  stream_op_payload->recv_initial_metadata.recv_initial_metadata_ready =
1829
1813
  &call->receiving_initial_metadata_ready;
1830
1814
  if (call->is_client) {
@@ -1885,7 +1869,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1885
1869
  op->data.recv_status_on_client.error_string;
1886
1870
  stream_op->recv_trailing_metadata = true;
1887
1871
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata =
1888
- &call->metadata_batch[1 /* is_receiving */][1 /* is_trailing */];
1872
+ &call->recv_trailing_metadata;
1889
1873
  stream_op_payload->recv_trailing_metadata.collect_stats =
1890
1874
  &call->final_info.stats.transport_stream_stats;
1891
1875
  GRPC_CLOSURE_INIT(&call->receiving_trailing_metadata_ready,
@@ -1915,7 +1899,7 @@ static grpc_call_error call_start_batch(grpc_call* call, const grpc_op* ops,
1915
1899
  op->data.recv_close_on_server.cancelled;
1916
1900
  stream_op->recv_trailing_metadata = true;
1917
1901
  stream_op_payload->recv_trailing_metadata.recv_trailing_metadata =
1918
- &call->metadata_batch[1 /* is_receiving */][1 /* is_trailing */];
1902
+ &call->recv_trailing_metadata;
1919
1903
  stream_op_payload->recv_trailing_metadata.collect_stats =
1920
1904
  &call->final_info.stats.transport_stream_stats;
1921
1905
  GRPC_CLOSURE_INIT(&call->receiving_trailing_metadata_ready,
@@ -1951,15 +1935,16 @@ done_with_error:
1951
1935
  /* reverse any mutations that occurred */
1952
1936
  if (stream_op->send_initial_metadata) {
1953
1937
  call->sent_initial_metadata = false;
1954
- grpc_metadata_batch_clear(&call->metadata_batch[0][0]);
1938
+ call->send_initial_metadata.Clear();
1955
1939
  }
1956
1940
  if (stream_op->send_message) {
1957
1941
  call->sending_message = false;
1958
1942
  call->sending_stream->Orphan();
1943
+ stream_op_payload->send_message.send_message.reset();
1959
1944
  }
1960
1945
  if (stream_op->send_trailing_metadata) {
1961
1946
  call->sent_final_op = false;
1962
- grpc_metadata_batch_clear(&call->metadata_batch[0][1]);
1947
+ call->send_trailing_metadata.Clear();
1963
1948
  }
1964
1949
  if (stream_op->recv_initial_metadata) {
1965
1950
  call->received_initial_metadata = false;
@@ -2024,13 +2009,11 @@ grpc_compression_algorithm grpc_call_compression_for_level(
2024
2009
 
2025
2010
  bool grpc_call_is_trailers_only(const grpc_call* call) {
2026
2011
  bool result = call->is_trailers_only;
2027
- GPR_DEBUG_ASSERT(
2028
- !result || call->metadata_batch[1 /* is_receiving */][0 /* is_trailing */]
2029
- .list.count == 0);
2012
+ GPR_DEBUG_ASSERT(!result || call->recv_initial_metadata.empty());
2030
2013
  return result;
2031
2014
  }
2032
2015
 
2033
- bool grpc_call_failed_before_recv_message(const grpc_call* c) {
2016
+ int grpc_call_failed_before_recv_message(const grpc_call* c) {
2034
2017
  return c->call_failed_before_recv_message;
2035
2018
  }
2036
2019
 
@@ -125,12 +125,6 @@ grpc_compression_algorithm grpc_call_compression_for_level(
125
125
  Move to surface API if requested by other languages. */
126
126
  bool grpc_call_is_trailers_only(const grpc_call* call);
127
127
 
128
- /* Returns whether or not the call's receive message operation failed because of
129
- * an error (as opposed to a graceful end-of-stream) */
130
- /* TODO(markdroth): This is currently available only to the C++ API.
131
- Move to surface API if requested by other languages. */
132
- bool grpc_call_failed_before_recv_message(const grpc_call* c);
133
-
134
128
  extern grpc_core::TraceFlag grpc_call_error_trace;
135
129
  extern grpc_core::TraceFlag grpc_compression_trace;
136
130
 
@@ -34,6 +34,7 @@
34
34
  #include "src/core/lib/channel/channel_trace.h"
35
35
  #include "src/core/lib/channel/channelz.h"
36
36
  #include "src/core/lib/channel/channelz_registry.h"
37
+ #include "src/core/lib/config/core_configuration.h"
37
38
  #include "src/core/lib/debug/stats.h"
38
39
  #include "src/core/lib/gpr/string.h"
39
40
  #include "src/core/lib/gprpp/manual_constructor.h"
@@ -44,7 +45,6 @@
44
45
  #include "src/core/lib/slice/slice_internal.h"
45
46
  #include "src/core/lib/surface/api_trace.h"
46
47
  #include "src/core/lib/surface/call.h"
47
- #include "src/core/lib/surface/channel_init.h"
48
48
  #include "src/core/lib/transport/static_metadata.h"
49
49
 
50
50
  /** Cache grpc-status: X mdelems for X = 0..NUM_CACHED_STATUS_ELEMS.
@@ -187,7 +187,9 @@ void channelz_node_destroy(void* p) {
187
187
  static_cast<grpc_core::channelz::ChannelNode*>(p);
188
188
  node->Unref();
189
189
  }
190
- int channelz_node_cmp(void* p1, void* p2) { return GPR_ICMP(p1, p2); }
190
+ int channelz_node_cmp(void* p1, void* p2) {
191
+ return grpc_core::QsortCompare(p1, p2);
192
+ }
191
193
  const grpc_arg_pointer_vtable channelz_node_arg_vtable = {
192
194
  channelz_node_copy, channelz_node_destroy, channelz_node_cmp};
193
195
 
@@ -267,7 +269,8 @@ grpc_channel* grpc_channel_create(const char* target,
267
269
  grpc_channel_args_destroy(args);
268
270
  grpc_channel_stack_builder_set_target(builder, target);
269
271
  grpc_channel_stack_builder_set_transport(builder, optional_transport);
270
- if (!grpc_channel_init_create_stack(builder, channel_stack_type)) {
272
+ if (!grpc_core::CoreConfiguration::Get().channel_init().CreateStack(
273
+ builder, channel_stack_type)) {
271
274
  grpc_channel_stack_builder_destroy(builder);
272
275
  if (resource_user != nullptr) {
273
276
  if (preallocated_bytes > 0) {
@@ -321,7 +324,7 @@ void grpc_channel_update_call_size_estimate(grpc_channel* channel,
321
324
  /* size shrank: decrease estimate */
322
325
  gpr_atm_no_barrier_cas(
323
326
  &channel->call_size_estimate, static_cast<gpr_atm>(cur),
324
- static_cast<gpr_atm>(GPR_MIN(cur - 1, (255 * cur + size) / 256)));
327
+ static_cast<gpr_atm>(std::min(cur - 1, (255 * cur + size) / 256)));
325
328
  /* if we lose: never mind, something else will likely update soon enough */
326
329
  }
327
330
  }
@@ -420,35 +423,19 @@ grpc_call* grpc_channel_create_pollset_set_call(
420
423
  namespace grpc_core {
421
424
 
422
425
  RegisteredCall::RegisteredCall(const char* method_arg, const char* host_arg)
423
- : method(method_arg != nullptr ? method_arg : ""),
424
- host(host_arg != nullptr ? host_arg : ""),
425
- path(grpc_mdelem_from_slices(
426
- GRPC_MDSTR_PATH, grpc_core::ExternallyManagedSlice(method.c_str()))),
427
- authority(!host.empty()
428
- ? grpc_mdelem_from_slices(
429
- GRPC_MDSTR_AUTHORITY,
430
- grpc_core::ExternallyManagedSlice(host.c_str()))
431
- : GRPC_MDNULL) {}
432
-
433
- // TODO(vjpai): Delete copy-constructor when allowed by all supported compilers.
426
+ : path(method_arg != nullptr && method_arg[0] != 0
427
+ ? grpc_mdelem_from_slices(
428
+ GRPC_MDSTR_PATH, grpc_slice_from_copied_string(method_arg))
429
+ : GRPC_MDNULL),
430
+ authority(
431
+ host_arg != nullptr && host_arg[0] != 0
432
+ ? grpc_mdelem_from_slices(GRPC_MDSTR_AUTHORITY,
433
+ grpc_slice_from_copied_string(host_arg))
434
+ : GRPC_MDNULL) {}
435
+
434
436
  RegisteredCall::RegisteredCall(const RegisteredCall& other)
435
- : RegisteredCall(other.method.c_str(), other.host.c_str()) {}
436
-
437
- RegisteredCall::RegisteredCall(RegisteredCall&& other) noexcept
438
- : method(std::move(other.method)),
439
- host(std::move(other.host)),
440
- path(grpc_mdelem_from_slices(
441
- GRPC_MDSTR_PATH, grpc_core::ExternallyManagedSlice(method.c_str()))),
442
- authority(!host.empty()
443
- ? grpc_mdelem_from_slices(
444
- GRPC_MDSTR_AUTHORITY,
445
- grpc_core::ExternallyManagedSlice(host.c_str()))
446
- : GRPC_MDNULL) {
447
- GRPC_MDELEM_UNREF(other.path);
448
- GRPC_MDELEM_UNREF(other.authority);
449
- other.path = GRPC_MDNULL;
450
- other.authority = GRPC_MDNULL;
451
- }
437
+ : path(GRPC_MDELEM_REF(other.path)),
438
+ authority(GRPC_MDELEM_REF(other.authority)) {}
452
439
 
453
440
  RegisteredCall::~RegisteredCall() {
454
441
  GRPC_MDELEM_UNREF(path);