grpc 1.50.0 → 1.51.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 (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +131 -42
  3. data/include/grpc/event_engine/event_engine.h +10 -3
  4. data/include/grpc/event_engine/slice_buffer.h +17 -0
  5. data/include/grpc/grpc.h +0 -10
  6. data/include/grpc/impl/codegen/grpc_types.h +1 -5
  7. data/include/grpc/impl/codegen/port_platform.h +0 -3
  8. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
  9. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  11. data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
  12. data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
  13. data/src/core/ext/filters/client_channel/client_channel.h +3 -4
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  17. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  18. data/src/core/ext/filters/client_channel/connector.h +1 -1
  19. data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
  20. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  21. data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
  22. data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  24. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
  32. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
  34. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
  36. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
  53. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  54. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
  55. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  56. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  57. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
  59. data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
  60. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  61. data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
  62. data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
  63. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
  64. data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
  65. data/src/core/ext/filters/client_channel/subchannel.h +2 -2
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  70. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  71. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
  73. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  74. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
  75. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
  77. data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
  78. data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
  79. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
  86. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
  92. data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
  93. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
  94. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
  96. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
  97. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
  98. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
  99. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
  100. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  101. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
  102. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
  103. data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
  104. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
  105. data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
  106. data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
  107. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
  108. data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
  109. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  110. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  111. data/src/core/ext/xds/xds_api.cc +15 -68
  112. data/src/core/ext/xds/xds_api.h +3 -7
  113. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  114. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  115. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  116. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  117. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  118. data/src/core/ext/xds/xds_client.cc +122 -90
  119. data/src/core/ext/xds/xds_client.h +7 -2
  120. data/src/core/ext/xds/xds_client_grpc.cc +5 -24
  121. data/src/core/ext/xds/xds_cluster.cc +291 -183
  122. data/src/core/ext/xds/xds_cluster.h +11 -15
  123. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
  124. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
  125. data/src/core/ext/xds/xds_common_types.cc +208 -141
  126. data/src/core/ext/xds/xds_common_types.h +19 -13
  127. data/src/core/ext/xds/xds_endpoint.cc +214 -129
  128. data/src/core/ext/xds/xds_endpoint.h +4 -7
  129. data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
  130. data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
  131. data/src/core/ext/xds/xds_http_filters.cc +60 -73
  132. data/src/core/ext/xds/xds_http_filters.h +67 -19
  133. data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
  134. data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
  135. data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
  136. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  137. data/src/core/ext/xds/xds_listener.cc +459 -417
  138. data/src/core/ext/xds/xds_listener.h +43 -47
  139. data/src/core/ext/xds/xds_resource_type.h +3 -11
  140. data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
  141. data/src/core/ext/xds/xds_route_config.cc +94 -80
  142. data/src/core/ext/xds/xds_route_config.h +10 -10
  143. data/src/core/ext/xds/xds_routing.cc +2 -1
  144. data/src/core/ext/xds/xds_routing.h +2 -0
  145. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
  146. data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
  147. data/src/core/lib/address_utils/parse_address.cc +11 -10
  148. data/src/core/lib/channel/channel_args.h +16 -1
  149. data/src/core/lib/channel/channel_stack.cc +23 -20
  150. data/src/core/lib/channel/channel_stack.h +17 -4
  151. data/src/core/lib/channel/channel_stack_builder.cc +4 -7
  152. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  153. data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
  154. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  155. data/src/core/lib/channel/channel_trace.cc +4 -5
  156. data/src/core/lib/channel/channelz.cc +1 -1
  157. data/src/core/lib/channel/connected_channel.cc +695 -35
  158. data/src/core/lib/channel/connected_channel.h +0 -4
  159. data/src/core/lib/channel/promise_based_filter.cc +1004 -140
  160. data/src/core/lib/channel/promise_based_filter.h +364 -87
  161. data/src/core/lib/compression/message_compress.cc +5 -5
  162. data/src/core/lib/debug/event_log.cc +88 -0
  163. data/src/core/lib/debug/event_log.h +81 -0
  164. data/src/core/lib/debug/histogram_view.cc +69 -0
  165. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  166. data/src/core/lib/debug/stats.cc +22 -119
  167. data/src/core/lib/debug/stats.h +29 -35
  168. data/src/core/lib/debug/stats_data.cc +224 -73
  169. data/src/core/lib/debug/stats_data.h +263 -122
  170. data/src/core/lib/event_engine/common_closures.h +71 -0
  171. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  172. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  173. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  174. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  175. data/src/core/lib/event_engine/poller.h +10 -4
  176. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
  177. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  178. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
  179. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  180. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  181. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  182. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
  183. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  184. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  185. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
  186. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  187. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
  188. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
  189. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
  190. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  191. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  192. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
  193. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
  194. data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
  195. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
  196. data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
  197. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
  198. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
  199. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
  200. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  201. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
  202. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
  203. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  204. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  205. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  206. data/src/core/lib/event_engine/slice.cc +7 -6
  207. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  208. data/src/core/lib/event_engine/thread_pool.cc +106 -25
  209. data/src/core/lib/event_engine/thread_pool.h +32 -9
  210. data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
  211. data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
  212. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  213. data/src/core/lib/experiments/config.cc +1 -1
  214. data/src/core/lib/experiments/experiments.cc +13 -2
  215. data/src/core/lib/experiments/experiments.h +8 -1
  216. data/src/core/lib/gpr/cpu_linux.cc +6 -2
  217. data/src/core/lib/gpr/log_linux.cc +3 -4
  218. data/src/core/lib/gpr/string.h +1 -1
  219. data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
  220. data/src/core/lib/gprpp/load_file.cc +75 -0
  221. data/src/core/lib/gprpp/load_file.h +33 -0
  222. data/src/core/lib/gprpp/per_cpu.h +46 -0
  223. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  224. data/src/core/lib/gprpp/stat_windows.cc +3 -2
  225. data/src/core/lib/gprpp/status_helper.h +1 -3
  226. data/src/core/lib/gprpp/strerror.cc +41 -0
  227. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
  228. data/src/core/lib/gprpp/thd_windows.cc +1 -2
  229. data/src/core/lib/gprpp/time.cc +3 -4
  230. data/src/core/lib/gprpp/time.h +13 -2
  231. data/src/core/lib/gprpp/validation_errors.h +18 -1
  232. data/src/core/lib/http/httpcli.cc +40 -44
  233. data/src/core/lib/http/httpcli.h +6 -5
  234. data/src/core/lib/http/httpcli_security_connector.cc +4 -6
  235. data/src/core/lib/http/parser.cc +54 -65
  236. data/src/core/lib/iomgr/buffer_list.cc +105 -116
  237. data/src/core/lib/iomgr/buffer_list.h +60 -44
  238. data/src/core/lib/iomgr/call_combiner.cc +11 -10
  239. data/src/core/lib/iomgr/call_combiner.h +3 -4
  240. data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
  241. data/src/core/lib/iomgr/closure.h +49 -5
  242. data/src/core/lib/iomgr/combiner.cc +2 -2
  243. data/src/core/lib/iomgr/endpoint.h +1 -1
  244. data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
  245. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  246. data/src/core/lib/iomgr/error.cc +27 -42
  247. data/src/core/lib/iomgr/error.h +22 -152
  248. data/src/core/lib/iomgr/ev_apple.cc +4 -4
  249. data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
  250. data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
  251. data/src/core/lib/iomgr/exec_ctx.cc +3 -4
  252. data/src/core/lib/iomgr/exec_ctx.h +2 -3
  253. data/src/core/lib/iomgr/executor.cc +1 -2
  254. data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
  255. data/src/core/lib/iomgr/iocp_windows.cc +1 -0
  256. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  257. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
  258. data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
  259. data/src/core/lib/iomgr/load_file.cc +5 -9
  260. data/src/core/lib/iomgr/lockfree_event.cc +10 -10
  261. data/src/core/lib/iomgr/pollset_windows.cc +4 -4
  262. data/src/core/lib/iomgr/python_util.h +2 -2
  263. data/src/core/lib/iomgr/resolve_address.cc +8 -3
  264. data/src/core/lib/iomgr/resolve_address.h +3 -4
  265. data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
  266. data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
  267. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  268. data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
  269. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  270. data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
  271. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
  272. data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
  273. data/src/core/lib/iomgr/socket_windows.cc +2 -2
  274. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
  275. data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
  276. data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
  277. data/src/core/lib/iomgr/tcp_posix.cc +92 -108
  278. data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
  279. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  280. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
  281. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
  282. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
  283. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
  284. data/src/core/lib/iomgr/tcp_windows.cc +27 -34
  285. data/src/core/lib/iomgr/timer.h +8 -8
  286. data/src/core/lib/iomgr/timer_generic.cc +9 -15
  287. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
  288. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
  289. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
  290. data/src/core/lib/json/json_channel_args.h +42 -0
  291. data/src/core/lib/json/json_object_loader.cc +7 -2
  292. data/src/core/lib/json/json_object_loader.h +22 -0
  293. data/src/core/lib/json/json_util.cc +5 -5
  294. data/src/core/lib/json/json_util.h +4 -4
  295. data/src/core/lib/load_balancing/lb_policy.cc +1 -1
  296. data/src/core/lib/load_balancing/lb_policy.h +4 -0
  297. data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
  298. data/src/core/lib/matchers/matchers.cc +3 -4
  299. data/src/core/lib/promise/activity.cc +16 -2
  300. data/src/core/lib/promise/activity.h +38 -15
  301. data/src/core/lib/promise/arena_promise.h +80 -51
  302. data/src/core/lib/promise/context.h +13 -6
  303. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  304. data/src/core/lib/promise/detail/promise_factory.h +58 -10
  305. data/src/core/lib/promise/detail/status.h +28 -0
  306. data/src/core/lib/promise/detail/switch.h +1455 -0
  307. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
  308. data/src/core/lib/promise/for_each.h +129 -0
  309. data/src/core/lib/promise/loop.h +7 -5
  310. data/src/core/lib/promise/map_pipe.h +87 -0
  311. data/src/core/lib/promise/pipe.cc +19 -0
  312. data/src/core/lib/promise/pipe.h +505 -0
  313. data/src/core/lib/promise/poll.h +13 -0
  314. data/src/core/lib/promise/seq.h +3 -5
  315. data/src/core/lib/promise/sleep.cc +5 -4
  316. data/src/core/lib/promise/sleep.h +1 -2
  317. data/src/core/lib/promise/try_concurrently.h +341 -0
  318. data/src/core/lib/promise/try_seq.h +10 -13
  319. data/src/core/lib/resolver/server_address.cc +1 -0
  320. data/src/core/lib/resolver/server_address.h +1 -3
  321. data/src/core/lib/resource_quota/api.cc +0 -1
  322. data/src/core/lib/resource_quota/arena.cc +19 -0
  323. data/src/core/lib/resource_quota/arena.h +89 -0
  324. data/src/core/lib/resource_quota/memory_quota.cc +1 -0
  325. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  326. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  327. data/src/core/lib/security/authorization/matchers.cc +25 -22
  328. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  329. data/src/core/lib/security/context/security_context.h +10 -0
  330. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  331. data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
  332. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  333. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  334. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  335. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  336. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  337. data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
  338. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
  339. data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
  341. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  342. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
  343. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
  344. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
  345. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
  346. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
  347. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  348. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
  349. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  350. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
  354. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
  355. data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
  356. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
  357. data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
  358. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
  359. data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
  360. data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
  361. data/src/core/lib/security/transport/security_handshaker.cc +53 -53
  362. data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
  363. data/src/core/lib/security/transport/tsi_error.cc +6 -3
  364. data/src/core/lib/security/util/json_util.cc +4 -5
  365. data/src/core/lib/service_config/service_config.h +1 -1
  366. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  367. data/src/core/lib/service_config/service_config_impl.h +14 -17
  368. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  369. data/src/core/lib/service_config/service_config_parser.h +14 -10
  370. data/src/core/lib/slice/b64.cc +2 -2
  371. data/src/core/lib/slice/slice.cc +7 -1
  372. data/src/core/lib/slice/slice.h +19 -6
  373. data/src/core/lib/slice/slice_buffer.cc +13 -14
  374. data/src/core/lib/slice/slice_internal.h +13 -21
  375. data/src/core/lib/slice/slice_refcount.h +34 -19
  376. data/src/core/lib/surface/byte_buffer.cc +3 -4
  377. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  378. data/src/core/lib/surface/call.cc +1366 -239
  379. data/src/core/lib/surface/call.h +44 -0
  380. data/src/core/lib/surface/call_details.cc +3 -3
  381. data/src/core/lib/surface/call_trace.cc +113 -0
  382. data/src/core/lib/surface/call_trace.h +30 -0
  383. data/src/core/lib/surface/channel.cc +44 -49
  384. data/src/core/lib/surface/channel.h +9 -1
  385. data/src/core/lib/surface/channel_ping.cc +1 -1
  386. data/src/core/lib/surface/channel_stack_type.cc +4 -0
  387. data/src/core/lib/surface/channel_stack_type.h +2 -0
  388. data/src/core/lib/surface/completion_queue.cc +38 -52
  389. data/src/core/lib/surface/init.cc +8 -39
  390. data/src/core/lib/surface/init_internally.h +8 -0
  391. data/src/core/lib/surface/lame_client.cc +10 -8
  392. data/src/core/lib/surface/server.cc +48 -70
  393. data/src/core/lib/surface/server.h +3 -4
  394. data/src/core/lib/surface/validate_metadata.cc +11 -12
  395. data/src/core/lib/surface/version.cc +2 -2
  396. data/src/core/lib/transport/connectivity_state.cc +2 -2
  397. data/src/core/lib/transport/error_utils.cc +34 -28
  398. data/src/core/lib/transport/error_utils.h +3 -3
  399. data/src/core/lib/transport/handshaker.cc +14 -14
  400. data/src/core/lib/transport/handshaker.h +1 -1
  401. data/src/core/lib/transport/handshaker_factory.h +26 -0
  402. data/src/core/lib/transport/handshaker_registry.cc +8 -2
  403. data/src/core/lib/transport/handshaker_registry.h +3 -4
  404. data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
  405. data/src/core/lib/transport/metadata_batch.h +17 -1
  406. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  407. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  408. data/src/core/lib/transport/transport.cc +63 -17
  409. data/src/core/lib/transport/transport.h +64 -68
  410. data/src/core/lib/transport/transport_impl.h +1 -1
  411. data/src/core/lib/transport/transport_op_string.cc +7 -6
  412. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
  413. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
  414. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
  415. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
  416. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
  417. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
  418. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
  419. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  420. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
  421. data/src/core/tsi/fake_transport_security.cc +3 -3
  422. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
  423. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  424. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
  425. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
  426. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
  427. data/src/ruby/lib/grpc/version.rb +1 -1
  428. data/src/ruby/spec/channel_spec.rb +0 -43
  429. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  430. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  431. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  432. data/third_party/zlib/compress.c +3 -3
  433. data/third_party/zlib/crc32.c +21 -12
  434. data/third_party/zlib/deflate.c +112 -106
  435. data/third_party/zlib/deflate.h +2 -2
  436. data/third_party/zlib/gzlib.c +1 -1
  437. data/third_party/zlib/gzread.c +3 -5
  438. data/third_party/zlib/gzwrite.c +1 -1
  439. data/third_party/zlib/infback.c +10 -7
  440. data/third_party/zlib/inflate.c +5 -2
  441. data/third_party/zlib/inftrees.c +2 -2
  442. data/third_party/zlib/inftrees.h +1 -1
  443. data/third_party/zlib/trees.c +61 -62
  444. data/third_party/zlib/uncompr.c +2 -2
  445. data/third_party/zlib/zconf.h +16 -3
  446. data/third_party/zlib/zlib.h +10 -10
  447. data/third_party/zlib/zutil.c +9 -7
  448. data/third_party/zlib/zutil.h +1 -0
  449. metadata +55 -18
  450. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  451. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  452. data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
  453. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  454. data/src/core/lib/gpr/murmur_hash.h +0 -29
  455. data/src/core/lib/gpr/tls.h +0 -156
  456. data/src/core/lib/promise/call_push_pull.h +0 -148
  457. data/src/core/lib/slice/slice_api.cc +0 -39
  458. data/src/core/lib/slice/slice_buffer_api.cc +0 -35
  459. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -18,7 +18,6 @@
18
18
 
19
19
  #include <utility>
20
20
 
21
- #include "absl/memory/memory.h"
22
21
  #include "absl/status/status.h"
23
22
  #include "absl/strings/ascii.h"
24
23
  #include "absl/strings/match.h"
@@ -35,7 +34,7 @@ absl::StatusOr<StringMatcher> StringMatcher::Create(Type type,
35
34
  absl::string_view matcher,
36
35
  bool case_sensitive) {
37
36
  if (type == Type::kSafeRegex) {
38
- auto regex_matcher = absl::make_unique<RE2>(std::string(matcher));
37
+ auto regex_matcher = std::make_unique<RE2>(std::string(matcher));
39
38
  if (!regex_matcher->ok()) {
40
39
  return absl::InvalidArgumentError(
41
40
  "Invalid regex string specified in matcher.");
@@ -56,7 +55,7 @@ StringMatcher::StringMatcher(std::unique_ptr<RE2> regex_matcher)
56
55
  StringMatcher::StringMatcher(const StringMatcher& other)
57
56
  : type_(other.type_), case_sensitive_(other.case_sensitive_) {
58
57
  if (type_ == Type::kSafeRegex) {
59
- regex_matcher_ = absl::make_unique<RE2>(other.regex_matcher_->pattern());
58
+ regex_matcher_ = std::make_unique<RE2>(other.regex_matcher_->pattern());
60
59
  } else {
61
60
  string_matcher_ = other.string_matcher_;
62
61
  }
@@ -65,7 +64,7 @@ StringMatcher::StringMatcher(const StringMatcher& other)
65
64
  StringMatcher& StringMatcher::operator=(const StringMatcher& other) {
66
65
  type_ = other.type_;
67
66
  if (type_ == Type::kSafeRegex) {
68
- regex_matcher_ = absl::make_unique<RE2>(other.regex_matcher_->pattern());
67
+ regex_matcher_ = std::make_unique<RE2>(other.regex_matcher_->pattern());
69
68
  } else {
70
69
  string_matcher_ = other.string_matcher_;
71
70
  }
@@ -18,6 +18,8 @@
18
18
 
19
19
  #include <stddef.h>
20
20
 
21
+ #include "absl/strings/str_format.h"
22
+
21
23
  #include "src/core/lib/gprpp/atomic_utils.h"
22
24
 
23
25
  namespace grpc_core {
@@ -25,13 +27,15 @@ namespace grpc_core {
25
27
  ///////////////////////////////////////////////////////////////////////////////
26
28
  // GLOBALS
27
29
 
28
- GPR_THREAD_LOCAL(Activity*) Activity::g_current_activity_{nullptr};
30
+ thread_local Activity* Activity::g_current_activity_{nullptr};
29
31
 
30
32
  namespace promise_detail {
31
33
 
32
34
  ///////////////////////////////////////////////////////////////////////////////
33
35
  // HELPER TYPES
34
36
 
37
+ std::string Unwakeable::ActivityDebugTag() const { return "<unknown>"; }
38
+
35
39
  // Weak handle to an Activity.
36
40
  // Handle can persist while Activity goes away.
37
41
  class FreestandingActivity::Handle final : public Wakeable {
@@ -74,6 +78,11 @@ class FreestandingActivity::Handle final : public Wakeable {
74
78
 
75
79
  void Drop() override { Unref(); }
76
80
 
81
+ std::string ActivityDebugTag() const override {
82
+ MutexLock lock(&mu_);
83
+ return activity_ == nullptr ? "<unknown>" : activity_->DebugTag();
84
+ }
85
+
77
86
  private:
78
87
  // Unref the Handle (not the activity).
79
88
  void Unref() {
@@ -85,7 +94,7 @@ class FreestandingActivity::Handle final : public Wakeable {
85
94
  // Two initial refs: one for the waiter that caused instantiation, one for the
86
95
  // activity.
87
96
  std::atomic<size_t> refs_{2};
88
- Mutex mu_ ABSL_ACQUIRED_AFTER(activity_->mu_);
97
+ mutable Mutex mu_ ABSL_ACQUIRED_AFTER(activity_->mu_);
89
98
  FreestandingActivity* activity_ ABSL_GUARDED_BY(mu_);
90
99
  };
91
100
 
@@ -117,4 +126,9 @@ Waker FreestandingActivity::MakeNonOwningWaker() {
117
126
  }
118
127
 
119
128
  } // namespace promise_detail
129
+
130
+ std::string Activity::DebugTag() const {
131
+ return absl::StrFormat("ACTIVITY[%p]", this);
132
+ }
133
+
120
134
  } // namespace grpc_core
@@ -22,16 +22,17 @@
22
22
  #include <algorithm>
23
23
  #include <atomic>
24
24
  #include <memory>
25
+ #include <string>
25
26
  #include <utility>
26
27
 
27
28
  #include "absl/base/thread_annotations.h"
28
29
  #include "absl/status/status.h"
29
30
  #include "absl/types/optional.h"
30
31
  #include "absl/types/variant.h"
32
+ #include "absl/utility/utility.h"
31
33
 
32
34
  #include <grpc/support/log.h>
33
35
 
34
- #include "src/core/lib/gpr/tls.h"
35
36
  #include "src/core/lib/gprpp/construct_destruct.h"
36
37
  #include "src/core/lib/gprpp/no_destruct.h"
37
38
  #include "src/core/lib/gprpp/orphanable.h"
@@ -43,6 +44,8 @@
43
44
 
44
45
  namespace grpc_core {
45
46
 
47
+ class Activity;
48
+
46
49
  // A Wakeable object is used by queues to wake activities.
47
50
  class Wakeable {
48
51
  public:
@@ -52,19 +55,23 @@ class Wakeable {
52
55
  // Drop this wakeable without waking up the underlying activity.
53
56
  virtual void Drop() = 0;
54
57
 
58
+ // Return the underlying activity debug tag, or "<unknown>" if not available.
59
+ virtual std::string ActivityDebugTag() const = 0;
60
+
55
61
  protected:
56
62
  inline ~Wakeable() {}
57
63
  };
58
64
 
59
- namespace activity_detail {
65
+ namespace promise_detail {
60
66
  struct Unwakeable final : public Wakeable {
61
67
  void Wakeup() override {}
62
68
  void Drop() override {}
69
+ std::string ActivityDebugTag() const override;
63
70
  };
64
71
  static Unwakeable* unwakeable() {
65
72
  return NoDestructSingleton<Unwakeable>::Get();
66
73
  }
67
- } // namespace activity_detail
74
+ } // namespace promise_detail
68
75
 
69
76
  class AtomicWaker;
70
77
 
@@ -73,7 +80,7 @@ class AtomicWaker;
73
80
  class Waker {
74
81
  public:
75
82
  explicit Waker(Wakeable* wakeable) : wakeable_(wakeable) {}
76
- Waker() : Waker(activity_detail::unwakeable()) {}
83
+ Waker() : Waker(promise_detail::unwakeable()) {}
77
84
  ~Waker() { wakeable_->Drop(); }
78
85
  Waker(const Waker&) = delete;
79
86
  Waker& operator=(const Waker&) = delete;
@@ -95,11 +102,15 @@ class Waker {
95
102
  return wakeable_ == other.wakeable_;
96
103
  }
97
104
 
105
+ std::string ActivityDebugTag() {
106
+ return wakeable_ == nullptr ? "<unknown>" : wakeable_->ActivityDebugTag();
107
+ }
108
+
98
109
  private:
99
110
  friend class AtomicWaker;
100
111
 
101
112
  Wakeable* Take() {
102
- return std::exchange(wakeable_, activity_detail::unwakeable());
113
+ return std::exchange(wakeable_, promise_detail::unwakeable());
103
114
  }
104
115
 
105
116
  Wakeable* wakeable_;
@@ -109,7 +120,7 @@ class Waker {
109
120
  class AtomicWaker {
110
121
  public:
111
122
  explicit AtomicWaker(Wakeable* wakeable) : wakeable_(wakeable) {}
112
- AtomicWaker() : AtomicWaker(activity_detail::unwakeable()) {}
123
+ AtomicWaker() : AtomicWaker(promise_detail::unwakeable()) {}
113
124
  explicit AtomicWaker(Waker waker) : AtomicWaker(waker.Take()) {}
114
125
  ~AtomicWaker() { wakeable_.load(std::memory_order_acquire)->Drop(); }
115
126
  AtomicWaker(const AtomicWaker&) = delete;
@@ -123,7 +134,7 @@ class AtomicWaker {
123
134
  // Return true if there is a not-unwakeable wakeable present.
124
135
  bool Armed() const noexcept {
125
136
  return wakeable_.load(std::memory_order_relaxed) !=
126
- activity_detail::unwakeable();
137
+ promise_detail::unwakeable();
127
138
  }
128
139
 
129
140
  // Set to some new waker
@@ -133,7 +144,7 @@ class AtomicWaker {
133
144
 
134
145
  private:
135
146
  Wakeable* Take() {
136
- return wakeable_.exchange(activity_detail::unwakeable(),
147
+ return wakeable_.exchange(promise_detail::unwakeable(),
137
148
  std::memory_order_acq_rel);
138
149
  }
139
150
 
@@ -179,6 +190,9 @@ class Activity : public Orphanable {
179
190
  // delivered until long after the activity should be destroyed.
180
191
  virtual Waker MakeNonOwningWaker() = 0;
181
192
 
193
+ // Some descriptive text to add to log messages to identify this activity.
194
+ virtual std::string DebugTag() const;
195
+
182
196
  protected:
183
197
  // Check if this activity is the current activity executing on the current
184
198
  // thread.
@@ -203,7 +217,7 @@ class Activity : public Orphanable {
203
217
  private:
204
218
  // Set during RunLoop to the Activity that's executing.
205
219
  // Being set implies that mu_ is held.
206
- static GPR_THREAD_LOCAL(Activity*) g_current_activity_;
220
+ static thread_local Activity* g_current_activity_;
207
221
  };
208
222
 
209
223
  // Owned pointer to one Activity.
@@ -262,7 +276,10 @@ class ActivityContexts : public ContextHolder<Contexts>... {
262
276
  explicit ScopedContext(ActivityContexts* contexts)
263
277
  : Context<ContextTypeFromHeld<Contexts>>(
264
278
  static_cast<ContextHolder<Contexts>*>(contexts)
265
- ->GetContext())... {}
279
+ ->GetContext())... {
280
+ // Silence `unused-but-set-parameter` in case of Contexts = {}
281
+ (void)contexts;
282
+ }
266
283
  };
267
284
  };
268
285
 
@@ -330,6 +347,8 @@ class FreestandingActivity : public Activity, private Wakeable {
330
347
 
331
348
  Mutex* mu() ABSL_LOCK_RETURNED(mu_) { return &mu_; }
332
349
 
350
+ std::string ActivityDebugTag() const override { return DebugTag(); }
351
+
333
352
  private:
334
353
  class Handle;
335
354
 
@@ -386,7 +405,7 @@ template <class F, class WakeupScheduler, class OnDone, typename... Contexts>
386
405
  class PromiseActivity final : public FreestandingActivity,
387
406
  private ActivityContexts<Contexts...> {
388
407
  public:
389
- using Factory = PromiseFactory<void, F>;
408
+ using Factory = OncePromiseFactory<void, F>;
390
409
  using ResultType = typename Factory::Promise::Result;
391
410
 
392
411
  PromiseActivity(F promise_factory, WakeupScheduler wakeup_scheduler,
@@ -435,7 +454,11 @@ class PromiseActivity final : public FreestandingActivity,
435
454
  MutexLock lock(mu());
436
455
  // Check if we were done, and flag done.
437
456
  was_done = done_;
438
- if (!done_) MarkDone();
457
+ if (!done_) {
458
+ ScopedActivity scoped_activity(this);
459
+ ScopedContext contexts(this);
460
+ MarkDone();
461
+ }
439
462
  }
440
463
  // If we were not done, then call the on_done callback.
441
464
  if (!was_done) {
@@ -472,8 +495,8 @@ class PromiseActivity final : public FreestandingActivity,
472
495
  // Notification that we're no longer executing - it's ok to destruct the
473
496
  // promise.
474
497
  void MarkDone() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
475
- GPR_ASSERT(!done_);
476
- done_ = true;
498
+ GPR_ASSERT(!absl::exchange(done_, true));
499
+ ScopedContext contexts(this);
477
500
  Destruct(&promise_holder_.promise);
478
501
  }
479
502
 
@@ -510,7 +533,7 @@ class PromiseActivity final : public FreestandingActivity,
510
533
  ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu()) {
511
534
  ScopedActivity scoped_activity(this);
512
535
  ScopedContext contexts(this);
513
- Construct(&promise_holder_.promise, promise_factory.Once());
536
+ Construct(&promise_holder_.promise, promise_factory.Make());
514
537
  return StepLoop();
515
538
  }
516
539
 
@@ -19,11 +19,12 @@
19
19
 
20
20
  #include <stdlib.h>
21
21
 
22
- #include <new>
22
+ #include <memory>
23
23
  #include <utility>
24
24
 
25
25
  #include "absl/meta/type_traits.h"
26
26
 
27
+ #include "src/core/lib/gprpp/construct_destruct.h"
27
28
  #include "src/core/lib/promise/context.h"
28
29
  #include "src/core/lib/promise/poll.h"
29
30
  #include "src/core/lib/resource_quota/arena.h"
@@ -32,20 +33,28 @@ namespace grpc_core {
32
33
 
33
34
  namespace arena_promise_detail {
34
35
 
36
+ using ArgType = std::aligned_storage_t<sizeof(void*)>;
37
+ template <typename T>
38
+ T*& ArgAsPtr(ArgType* arg) {
39
+ static_assert(sizeof(ArgType) >= sizeof(T**),
40
+ "Must have ArgType of at least one pointer size");
41
+ return *reinterpret_cast<T**>(arg);
42
+ }
43
+
35
44
  template <typename T>
36
45
  struct Vtable {
37
46
  // Poll the promise, once.
38
- Poll<T> (*poll_once)(void** arg);
47
+ Poll<T> (*poll_once)(ArgType* arg);
39
48
  // Destroy the underlying callable object if there is one.
40
49
  // Since we don't delete (the arena owns the memory) but we may need to call a
41
50
  // destructor, we expose this for when the ArenaPromise object is destroyed.
42
- void (*destroy)(void** arg);
51
+ void (*destroy)(ArgType* arg);
43
52
  };
44
53
 
45
54
  template <typename T>
46
55
  struct VtableAndArg {
47
56
  const Vtable<T>* vtable;
48
- void* arg;
57
+ ArgType arg;
49
58
  };
50
59
 
51
60
  // Implementation of Vtable for an empty object.
@@ -53,37 +62,52 @@ struct VtableAndArg {
53
62
  // from. Since in either case these objects should not be polled, we simply
54
63
  // crash if it is.
55
64
  template <typename T>
56
- inline const Vtable<T>* null_impl() {
57
- static const Vtable<T> vtable = {[](void**) -> Poll<T> {
58
- abort();
59
- GPR_UNREACHABLE_CODE(return Pending{});
60
- },
61
- [](void**) {}};
62
- return &vtable;
63
- }
65
+ struct Null {
66
+ static const Vtable<T> vtable;
67
+
68
+ static Poll<T> PollOnce(ArgType*) {
69
+ abort();
70
+ GPR_UNREACHABLE_CODE(return Pending{});
71
+ }
72
+
73
+ static void Destroy(ArgType*) {}
74
+ };
75
+
76
+ template <typename T>
77
+ const Vtable<T> Null<T>::vtable = {PollOnce, Destroy};
64
78
 
65
79
  // Implementation of ImplInterface for a callable object.
66
80
  template <typename T, typename Callable>
67
- inline const Vtable<T>* allocated_callable_impl() {
68
- static const Vtable<T> vtable = {
69
- [](void** arg) -> Poll<T> {
70
- return poll_cast<T>((*static_cast<Callable*>(*arg))());
71
- },
72
- [](void** arg) { static_cast<Callable*>(*arg)->~Callable(); }};
73
- return &vtable;
74
- }
81
+ struct AllocatedCallable {
82
+ static const Vtable<T> vtable;
83
+
84
+ static Poll<T> PollOnce(ArgType* arg) {
85
+ return poll_cast<T>((*ArgAsPtr<Callable>(arg))());
86
+ }
87
+
88
+ static void Destroy(ArgType* arg) { Destruct(ArgAsPtr<Callable>(arg)); }
89
+ };
90
+
91
+ template <typename T, typename Callable>
92
+ const Vtable<T> AllocatedCallable<T, Callable>::vtable = {PollOnce, Destroy};
75
93
 
76
94
  // Implementation of ImplInterface for a small callable object (one that fits
77
- // within the void* arg)
95
+ // within the ArgType arg)
78
96
  template <typename T, typename Callable>
79
- inline const Vtable<T>* inlined_callable_impl() {
80
- static const Vtable<T> vtable = {
81
- [](void** arg) -> Poll<T> {
82
- return poll_cast<T>((*reinterpret_cast<Callable*>(arg))());
83
- },
84
- [](void** arg) { reinterpret_cast<Callable*>(arg)->~Callable(); }};
85
- return &vtable;
86
- }
97
+ struct Inlined {
98
+ static const Vtable<T> vtable;
99
+
100
+ static Poll<T> PollOnce(ArgType* arg) {
101
+ return poll_cast<T>((*reinterpret_cast<Callable*>(arg))());
102
+ }
103
+
104
+ static void Destroy(ArgType* arg) {
105
+ Destruct(reinterpret_cast<Callable*>(arg));
106
+ }
107
+ };
108
+
109
+ template <typename T, typename Callable>
110
+ const Vtable<T> Inlined<T, Callable>::vtable = {PollOnce, Destroy};
87
111
 
88
112
  // If a callable object is empty we can substitute any instance of that callable
89
113
  // for the one we call (for how could we tell the difference)?
@@ -93,12 +117,17 @@ inline const Vtable<T>* inlined_callable_impl() {
93
117
  // (this comes up often when the promise only accesses context data from the
94
118
  // containing activity).
95
119
  template <typename T, typename Callable>
96
- inline const Vtable<T>* shared_callable_impl(Callable&& callable) {
97
- static Callable instance = std::forward<Callable>(callable);
98
- static const Vtable<T> vtable = {[](void**) -> Poll<T> { return instance(); },
99
- [](void**) {}};
100
- return &vtable;
101
- }
120
+ struct SharedCallable {
121
+ static const Vtable<T> vtable;
122
+
123
+ static Poll<T> PollOnce(ArgType* arg) {
124
+ return (*reinterpret_cast<Callable*>(arg))();
125
+ }
126
+ };
127
+
128
+ template <typename T, typename Callable>
129
+ const Vtable<T> SharedCallable<T, Callable>::vtable = {PollOnce,
130
+ Null<T>::Destroy};
102
131
 
103
132
  // Redirector type: given a callable type, expose a Make() function that creates
104
133
  // the appropriate underlying implementation.
@@ -109,11 +138,11 @@ template <typename T, typename Callable>
109
138
  struct ChooseImplForCallable<
110
139
  T, Callable,
111
140
  absl::enable_if_t<!std::is_empty<Callable>::value &&
112
- (sizeof(Callable) > sizeof(void*))>> {
141
+ (sizeof(Callable) > sizeof(ArgType))>> {
113
142
  static void Make(Callable&& callable, VtableAndArg<T>* out) {
114
- *out = {allocated_callable_impl<T, Callable>(),
115
- GetContext<Arena>()->template New<Callable>(
116
- std::forward<Callable>(callable))};
143
+ out->vtable = &AllocatedCallable<T, Callable>::vtable;
144
+ ArgAsPtr<Callable>(&out->arg) = GetContext<Arena>()->template New<Callable>(
145
+ std::forward<Callable>(callable));
117
146
  }
118
147
  };
119
148
 
@@ -121,19 +150,19 @@ template <typename T, typename Callable>
121
150
  struct ChooseImplForCallable<
122
151
  T, Callable,
123
152
  absl::enable_if_t<!std::is_empty<Callable>::value &&
124
- (sizeof(Callable) <= sizeof(void*))>> {
153
+ (sizeof(Callable) <= sizeof(ArgType))>> {
125
154
  static void Make(Callable&& callable, VtableAndArg<T>* out) {
126
- out->vtable = inlined_callable_impl<T, Callable>();
127
- new (&out->arg) Callable(std::forward<Callable>(callable));
155
+ out->vtable = &Inlined<T, Callable>::vtable;
156
+ Construct(reinterpret_cast<Callable*>(&out->arg),
157
+ std::forward<Callable>(callable));
128
158
  }
129
159
  };
130
160
 
131
161
  template <typename T, typename Callable>
132
162
  struct ChooseImplForCallable<
133
163
  T, Callable, absl::enable_if_t<std::is_empty<Callable>::value>> {
134
- static void Make(Callable&& callable, VtableAndArg<T>* out) {
135
- out->vtable =
136
- shared_callable_impl<T, Callable>(std::forward<Callable>(callable));
164
+ static void Make(Callable&&, VtableAndArg<T>* out) {
165
+ out->vtable = &SharedCallable<T, Callable>::vtable;
137
166
  }
138
167
  };
139
168
 
@@ -159,8 +188,8 @@ class ArenaPromise {
159
188
  absl::enable_if_t<!std::is_same<Callable, ArenaPromise>::value>>
160
189
  // NOLINTNEXTLINE(google-explicit-constructor)
161
190
  ArenaPromise(Callable&& callable) {
162
- arena_promise_detail::MakeImplForCallable<T>(
163
- std::forward<Callable>(callable), &vtable_and_arg_);
191
+ arena_promise_detail::MakeImplForCallable(std::forward<Callable>(callable),
192
+ &vtable_and_arg_);
164
193
  }
165
194
 
166
195
  // ArenaPromise is not copyable.
@@ -169,12 +198,12 @@ class ArenaPromise {
169
198
  // ArenaPromise is movable.
170
199
  ArenaPromise(ArenaPromise&& other) noexcept
171
200
  : vtable_and_arg_(other.vtable_and_arg_) {
172
- other.vtable_and_arg_.vtable = arena_promise_detail::null_impl<T>();
201
+ other.vtable_and_arg_.vtable = &arena_promise_detail::Null<T>::vtable;
173
202
  }
174
203
  ArenaPromise& operator=(ArenaPromise&& other) noexcept {
175
204
  vtable_and_arg_.vtable->destroy(&vtable_and_arg_.arg);
176
205
  vtable_and_arg_ = other.vtable_and_arg_;
177
- other.vtable_and_arg_.vtable = arena_promise_detail::null_impl<T>();
206
+ other.vtable_and_arg_.vtable = &arena_promise_detail::Null<T>::vtable;
178
207
  return *this;
179
208
  }
180
209
 
@@ -187,13 +216,13 @@ class ArenaPromise {
187
216
  }
188
217
 
189
218
  bool has_value() const {
190
- return vtable_and_arg_.vtable != arena_promise_detail::null_impl<T>();
219
+ return vtable_and_arg_.vtable != &arena_promise_detail::Null<T>::vtable;
191
220
  }
192
221
 
193
222
  private:
194
223
  // Underlying impl object.
195
224
  arena_promise_detail::VtableAndArg<T> vtable_and_arg_ = {
196
- arena_promise_detail::null_impl<T>(), nullptr};
225
+ &arena_promise_detail::Null<T>::vtable, {}};
197
226
  };
198
227
 
199
228
  } // namespace grpc_core
@@ -19,7 +19,7 @@
19
19
 
20
20
  #include <utility>
21
21
 
22
- #include "src/core/lib/gpr/tls.h"
22
+ #include <grpc/support/log.h>
23
23
 
24
24
  namespace grpc_core {
25
25
 
@@ -44,12 +44,11 @@ class Context : public ContextType<T> {
44
44
 
45
45
  private:
46
46
  T* const old_;
47
- static GPR_THREAD_LOCAL(T*) current_;
47
+ static thread_local T* current_;
48
48
  };
49
49
 
50
50
  template <typename T>
51
- GPR_THREAD_LOCAL(T*)
52
- Context<T>::current_;
51
+ thread_local T* Context<T>::current_;
53
52
 
54
53
  template <typename T, typename F>
55
54
  class WithContext {
@@ -68,10 +67,18 @@ class WithContext {
68
67
 
69
68
  } // namespace promise_detail
70
69
 
71
- // Retrieve the current value of a context.
70
+ // Return true if a context of type T is currently active.
71
+ template <typename T>
72
+ bool HasContext() {
73
+ return promise_detail::Context<T>::get() != nullptr;
74
+ }
75
+
76
+ // Retrieve the current value of a context, or abort if the value is unset.
72
77
  template <typename T>
73
78
  T* GetContext() {
74
- return promise_detail::Context<T>::get();
79
+ auto* p = promise_detail::Context<T>::get();
80
+ GPR_ASSERT(p != nullptr);
81
+ return p;
75
82
  }
76
83
 
77
84
  // Given a promise and a context, return a promise that has that context set.
@@ -17,8 +17,6 @@
17
17
 
18
18
  #include <grpc/support/port_platform.h>
19
19
 
20
- #include <stddef.h>
21
-
22
20
  #include <array>
23
21
  #include <cassert>
24
22
  #include <new>
@@ -32,29 +30,12 @@
32
30
  #include "src/core/lib/gprpp/construct_destruct.h"
33
31
  #include "src/core/lib/promise/detail/promise_factory.h"
34
32
  #include "src/core/lib/promise/detail/promise_like.h"
33
+ #include "src/core/lib/promise/detail/switch.h"
35
34
  #include "src/core/lib/promise/poll.h"
36
35
 
37
36
  namespace grpc_core {
38
37
  namespace promise_detail {
39
38
 
40
- // Given f0, ..., fn, call function idx and return the result.
41
- template <typename R, typename A, R (*... f)(A* arg)>
42
- class JumpTable {
43
- public:
44
- JumpTable() = delete;
45
- JumpTable(const JumpTable&) = delete;
46
-
47
- static R Run(size_t idx, A* arg) { return fs_[idx](arg); }
48
-
49
- private:
50
- using Fn = R (*)(A* arg);
51
- static const Fn fs_[sizeof...(f)];
52
- };
53
-
54
- template <typename R, typename A, R (*... f)(A* arg)>
55
- const typename JumpTable<R, A, f...>::Fn
56
- JumpTable<R, A, f...>::fs_[sizeof...(f)] = {f...};
57
-
58
39
  // Helper for SeqState to evaluate some common types to all partial
59
40
  // specializations.
60
41
  template <template <typename> class Traits, typename FPromise, typename FNext>
@@ -68,7 +49,7 @@ struct SeqStateTypes {
68
49
  // Wrap the factory callable in our factory wrapper to deal with common edge
69
50
  // cases. We use the 'unwrapped type' from the traits, so for instance, TrySeq
70
51
  // can pass back a T from a StatusOr<T>.
71
- using Next = promise_detail::PromiseFactory<
52
+ using Next = promise_detail::OncePromiseFactory<
72
53
  typename PromiseResultTraits::UnwrappedType, FNext>;
73
54
  };
74
55
 
@@ -353,14 +334,16 @@ class BasicSeq {
353
334
  // parameter unpacking can work.
354
335
  template <char I>
355
336
  struct RunStateStruct {
356
- static Poll<Result> Run(BasicSeq* s) { return s->RunState<I>(); }
337
+ BasicSeq* s;
338
+ Poll<Result> operator()() { return s->RunState<I>(); }
357
339
  };
358
340
 
359
341
  // Similarly placate those compilers for
360
342
  // DestructCurrentPromiseAndSubsequentFactories
361
343
  template <char I>
362
344
  struct DestructCurrentPromiseAndSubsequentFactoriesStruct {
363
- static void Run(BasicSeq* s) {
345
+ BasicSeq* s;
346
+ void operator()() {
364
347
  return s->DestructCurrentPromiseAndSubsequentFactories<I>();
365
348
  }
366
349
  };
@@ -373,8 +356,7 @@ class BasicSeq {
373
356
  // Duff's device like mechanic for evaluating sequences.
374
357
  template <char... I>
375
358
  Poll<Result> Run(absl::integer_sequence<char, I...>) {
376
- return JumpTable<Poll<Result>, BasicSeq, RunStateStruct<I>::Run...>::Run(
377
- state_, this);
359
+ return Switch<Poll<Result>>(state_, RunStateStruct<I>{this}...);
378
360
  }
379
361
 
380
362
  // Run the appropriate destructors for a given state.
@@ -384,9 +366,8 @@ class BasicSeq {
384
366
  // which can choose the correct instance at runtime to destroy everything.
385
367
  template <char... I>
386
368
  void RunDestruct(absl::integer_sequence<char, I...>) {
387
- JumpTable<void, BasicSeq,
388
- DestructCurrentPromiseAndSubsequentFactoriesStruct<I>::Run...>::
389
- Run(state_, this);
369
+ Switch<void>(
370
+ state_, DestructCurrentPromiseAndSubsequentFactoriesStruct<I>{this}...);
390
371
  }
391
372
 
392
373
  public: