grpc 1.60.0 → 1.61.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (277) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +208 -165
  3. data/include/grpc/event_engine/event_engine.h +59 -12
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +6 -0
  5. data/include/grpc/event_engine/internal/slice_cast.h +12 -0
  6. data/include/grpc/event_engine/memory_allocator.h +3 -1
  7. data/include/grpc/event_engine/slice.h +5 -0
  8. data/include/grpc/grpc_security.h +22 -1
  9. data/include/grpc/impl/call.h +29 -0
  10. data/include/grpc/impl/channel_arg_names.h +12 -1
  11. data/include/grpc/impl/slice_type.h +1 -1
  12. data/include/grpc/module.modulemap +1 -0
  13. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +54 -7
  14. data/src/core/ext/filters/backend_metrics/backend_metric_filter.h +20 -6
  15. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +10 -13
  16. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +18 -10
  17. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc +326 -0
  18. data/src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h +143 -0
  19. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -2
  20. data/src/core/ext/filters/client_channel/client_channel.cc +32 -6
  21. data/src/core/ext/filters/client_channel/client_channel_internal.h +2 -0
  22. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +54 -21
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +2 -1
  26. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.cc +12 -15
  27. data/src/core/ext/filters/client_channel/lb_policy/endpoint_list.h +8 -5
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +139 -92
  29. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +9 -4
  30. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +9 -4
  31. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +10 -11
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +94 -93
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +5 -3
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +12 -15
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +38 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +25 -28
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +10 -10
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +37 -35
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -9
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +504 -461
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +232 -122
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -6
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +642 -251
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +2 -6
  45. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +2 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +3 -1
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -2
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +6 -8
  51. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.cc +1031 -0
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_dependency_manager.h +277 -0
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +128 -270
  54. data/src/core/ext/filters/client_channel/resolver/xds/{xds_resolver.h → xds_resolver_attributes.h} +5 -4
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.cc +25 -0
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver_trace.h +30 -0
  57. data/src/core/ext/filters/client_channel/retry_filter.cc +1 -0
  58. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +35 -17
  59. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -0
  60. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +17 -13
  61. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +13 -4
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -32
  63. data/src/core/ext/filters/http/client/http_client_filter.h +10 -5
  64. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  65. data/src/core/ext/filters/http/client_authority_filter.h +12 -4
  66. data/src/core/ext/filters/http/http_filters_plugin.cc +42 -20
  67. data/src/core/ext/filters/http/message_compress/compression_filter.cc +55 -80
  68. data/src/core/ext/filters/http/message_compress/compression_filter.h +54 -12
  69. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.cc +325 -0
  70. data/src/core/ext/filters/http/message_compress/legacy_compression_filter.h +139 -0
  71. data/src/core/ext/filters/http/server/http_server_filter.cc +41 -41
  72. data/src/core/ext/filters/http/server/http_server_filter.h +11 -4
  73. data/src/core/ext/filters/message_size/message_size_filter.cc +56 -76
  74. data/src/core/ext/filters/message_size/message_size_filter.h +35 -23
  75. data/src/core/ext/filters/rbac/rbac_filter.cc +15 -11
  76. data/src/core/ext/filters/rbac/rbac_filter.h +11 -4
  77. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +25 -13
  78. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +47 -50
  79. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +21 -4
  80. data/src/core/ext/transport/chttp2/alpn/alpn.cc +1 -1
  81. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -2
  82. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +11 -2
  83. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +67 -145
  84. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -3
  85. data/src/core/ext/transport/chttp2/transport/flow_control.cc +21 -82
  86. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -8
  87. data/src/core/ext/transport/chttp2/transport/frame.cc +506 -0
  88. data/src/core/ext/transport/chttp2/transport/frame.h +214 -0
  89. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +1 -1
  90. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +33 -79
  91. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -7
  92. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +122 -32
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +142 -37
  94. data/src/core/ext/transport/chttp2/transport/internal.h +1 -22
  95. data/src/core/ext/transport/chttp2/transport/parsing.cc +23 -37
  96. data/src/core/ext/transport/chttp2/transport/writing.cc +26 -58
  97. data/src/core/ext/transport/inproc/inproc_transport.cc +172 -13
  98. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +712 -0
  99. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +151 -0
  100. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +33 -0
  101. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +133 -0
  102. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +50 -0
  103. data/src/core/ext/xds/certificate_provider_store.cc +2 -1
  104. data/src/core/ext/xds/certificate_provider_store.h +0 -5
  105. data/src/core/ext/xds/xds_api.cc +31 -18
  106. data/src/core/ext/xds/xds_api.h +2 -2
  107. data/src/core/ext/xds/xds_bootstrap.h +3 -0
  108. data/src/core/ext/xds/xds_certificate_provider.cc +88 -287
  109. data/src/core/ext/xds/xds_certificate_provider.h +44 -111
  110. data/src/core/ext/xds/xds_client.cc +420 -414
  111. data/src/core/ext/xds/xds_client.h +31 -22
  112. data/src/core/ext/xds/xds_client_grpc.cc +3 -1
  113. data/src/core/ext/xds/xds_cluster.cc +104 -11
  114. data/src/core/ext/xds/xds_cluster.h +9 -1
  115. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +9 -5
  116. data/src/core/ext/xds/xds_common_types.cc +14 -10
  117. data/src/core/ext/xds/xds_endpoint.cc +9 -4
  118. data/src/core/ext/xds/xds_endpoint.h +5 -1
  119. data/src/core/ext/xds/xds_health_status.cc +12 -2
  120. data/src/core/ext/xds/xds_health_status.h +4 -2
  121. data/src/core/ext/xds/xds_http_rbac_filter.cc +5 -3
  122. data/src/core/ext/xds/xds_listener.cc +14 -8
  123. data/src/core/ext/xds/xds_resource_type_impl.h +6 -4
  124. data/src/core/ext/xds/xds_route_config.cc +34 -22
  125. data/src/core/ext/xds/xds_route_config.h +1 -0
  126. data/src/core/ext/xds/xds_server_config_fetcher.cc +61 -57
  127. data/src/core/ext/xds/xds_transport.h +3 -0
  128. data/src/core/ext/xds/xds_transport_grpc.cc +47 -50
  129. data/src/core/ext/xds/xds_transport_grpc.h +4 -0
  130. data/src/core/lib/channel/call_tracer.cc +12 -0
  131. data/src/core/lib/channel/call_tracer.h +17 -3
  132. data/src/core/lib/channel/channel_args.cc +24 -14
  133. data/src/core/lib/channel/channel_args.h +74 -13
  134. data/src/core/lib/channel/channel_stack.cc +27 -0
  135. data/src/core/lib/channel/channel_stack.h +10 -10
  136. data/src/core/lib/channel/connected_channel.cc +64 -18
  137. data/src/core/lib/channel/promise_based_filter.h +1041 -1
  138. data/src/core/lib/channel/server_call_tracer_filter.cc +43 -35
  139. data/src/core/lib/compression/compression_internal.cc +0 -3
  140. data/src/core/lib/event_engine/ares_resolver.cc +35 -14
  141. data/src/core/lib/event_engine/ares_resolver.h +9 -10
  142. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.cc +8 -1
  143. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.cc +132 -0
  144. data/src/core/lib/event_engine/posix_engine/native_posix_dns_resolver.h +61 -0
  145. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +52 -36
  146. data/src/core/lib/event_engine/posix_engine/posix_engine.h +4 -9
  147. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +11 -3
  148. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +9 -2
  149. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +7 -0
  150. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +17 -27
  151. data/src/core/lib/event_engine/posix_engine/timer_manager.h +0 -3
  152. data/src/core/lib/event_engine/ref_counted_dns_resolver_interface.h +55 -0
  153. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.cc +114 -0
  154. data/src/core/lib/event_engine/windows/native_windows_dns_resolver.h +51 -0
  155. data/src/core/lib/event_engine/windows/windows_engine.cc +7 -7
  156. data/src/core/lib/experiments/config.cc +13 -0
  157. data/src/core/lib/experiments/config.h +3 -0
  158. data/src/core/lib/experiments/experiments.cc +245 -366
  159. data/src/core/lib/experiments/experiments.h +50 -156
  160. data/src/core/lib/gprpp/debug_location.h +13 -0
  161. data/src/core/lib/gprpp/dual_ref_counted.h +36 -7
  162. data/src/core/lib/gprpp/orphanable.h +27 -0
  163. data/src/core/lib/gprpp/ref_counted.h +63 -22
  164. data/src/core/lib/gprpp/ref_counted_ptr.h +70 -27
  165. data/src/core/lib/gprpp/ref_counted_string.h +13 -0
  166. data/src/core/lib/gprpp/status_helper.cc +1 -2
  167. data/src/core/lib/iomgr/combiner.cc +15 -51
  168. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +31 -0
  169. data/src/core/lib/iomgr/event_engine_shims/endpoint.h +16 -0
  170. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -3
  171. data/src/core/lib/load_balancing/lb_policy.h +1 -1
  172. data/src/core/lib/promise/activity.cc +17 -2
  173. data/src/core/lib/promise/activity.h +5 -4
  174. data/src/core/lib/promise/all_ok.h +80 -0
  175. data/src/core/lib/promise/detail/join_state.h +2077 -0
  176. data/src/core/lib/promise/detail/promise_factory.h +1 -0
  177. data/src/core/lib/promise/detail/promise_like.h +8 -1
  178. data/src/core/lib/promise/detail/seq_state.h +3458 -150
  179. data/src/core/lib/promise/detail/status.h +42 -5
  180. data/src/core/lib/promise/for_each.h +13 -1
  181. data/src/core/lib/promise/if.h +4 -0
  182. data/src/core/lib/promise/latch.h +6 -3
  183. data/src/core/lib/promise/party.cc +33 -31
  184. data/src/core/lib/promise/party.h +142 -6
  185. data/src/core/lib/promise/poll.h +39 -13
  186. data/src/core/lib/promise/promise.h +4 -0
  187. data/src/core/lib/promise/seq.h +107 -7
  188. data/src/core/lib/promise/status_flag.h +196 -0
  189. data/src/core/lib/promise/try_join.h +132 -0
  190. data/src/core/lib/promise/try_seq.h +132 -10
  191. data/src/core/lib/resolver/endpoint_addresses.cc +0 -1
  192. data/src/core/lib/resolver/endpoint_addresses.h +48 -0
  193. data/src/core/lib/resource_quota/arena.h +2 -2
  194. data/src/core/lib/resource_quota/memory_quota.cc +57 -8
  195. data/src/core/lib/resource_quota/memory_quota.h +6 -0
  196. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +14 -11
  197. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +14 -5
  198. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +4 -0
  199. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +4 -0
  200. data/src/core/lib/security/credentials/external/external_account_credentials.cc +28 -20
  201. data/src/core/lib/security/credentials/external/external_account_credentials.h +4 -0
  202. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +4 -0
  203. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -0
  204. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -0
  205. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +4 -0
  206. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -1
  207. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +0 -3
  208. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +12 -0
  209. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.cc +22 -5
  210. data/src/core/lib/security/credentials/tls/grpc_tls_crl_provider.h +1 -5
  211. data/src/core/lib/security/credentials/tls/tls_credentials.cc +16 -0
  212. data/src/core/lib/security/credentials/xds/xds_credentials.cc +21 -28
  213. data/src/core/lib/security/credentials/xds/xds_credentials.h +2 -4
  214. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -3
  215. data/src/core/lib/security/transport/auth_filters.h +71 -4
  216. data/src/core/lib/security/transport/client_auth_filter.cc +2 -4
  217. data/src/core/lib/security/transport/legacy_server_auth_filter.cc +244 -0
  218. data/src/core/lib/security/transport/server_auth_filter.cc +70 -90
  219. data/src/core/lib/slice/slice_buffer.h +3 -0
  220. data/src/core/lib/surface/builtins.cc +1 -1
  221. data/src/core/lib/surface/call.cc +683 -196
  222. data/src/core/lib/surface/call.h +26 -13
  223. data/src/core/lib/surface/call_trace.cc +42 -1
  224. data/src/core/lib/surface/channel.cc +0 -1
  225. data/src/core/lib/surface/channel.h +0 -6
  226. data/src/core/lib/surface/channel_init.h +26 -0
  227. data/src/core/lib/surface/init.cc +14 -8
  228. data/src/core/lib/surface/server.cc +256 -237
  229. data/src/core/lib/surface/server.h +26 -54
  230. data/src/core/lib/surface/version.cc +2 -2
  231. data/src/core/lib/surface/wait_for_cq_end_op.h +94 -0
  232. data/src/core/lib/transport/call_final_info.cc +38 -0
  233. data/src/core/lib/transport/call_final_info.h +54 -0
  234. data/src/core/lib/transport/connectivity_state.cc +3 -2
  235. data/src/core/lib/transport/connectivity_state.h +4 -0
  236. data/src/core/lib/transport/metadata_batch.h +4 -4
  237. data/src/core/lib/transport/transport.cc +70 -19
  238. data/src/core/lib/transport/transport.h +395 -25
  239. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -0
  240. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +0 -3
  241. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  242. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  243. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +1 -1
  244. data/src/core/tsi/ssl_transport_security.cc +65 -43
  245. data/src/ruby/ext/grpc/rb_channel_args.c +3 -1
  246. data/src/ruby/ext/grpc/rb_grpc.c +0 -1
  247. data/src/ruby/ext/grpc/rb_grpc.h +0 -2
  248. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
  249. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
  250. data/src/ruby/lib/grpc/version.rb +1 -1
  251. data/third_party/upb/upb/reflection/def_pool.h +2 -2
  252. data/third_party/zlib/adler32.c +5 -27
  253. data/third_party/zlib/compress.c +5 -16
  254. data/third_party/zlib/crc32.c +86 -162
  255. data/third_party/zlib/deflate.c +233 -336
  256. data/third_party/zlib/deflate.h +8 -8
  257. data/third_party/zlib/gzguts.h +11 -12
  258. data/third_party/zlib/infback.c +7 -23
  259. data/third_party/zlib/inffast.c +1 -4
  260. data/third_party/zlib/inffast.h +1 -1
  261. data/third_party/zlib/inflate.c +30 -99
  262. data/third_party/zlib/inftrees.c +6 -11
  263. data/third_party/zlib/inftrees.h +3 -3
  264. data/third_party/zlib/trees.c +224 -302
  265. data/third_party/zlib/uncompr.c +4 -12
  266. data/third_party/zlib/zconf.h +6 -2
  267. data/third_party/zlib/zlib.h +191 -188
  268. data/third_party/zlib/zutil.c +16 -44
  269. data/third_party/zlib/zutil.h +10 -10
  270. metadata +35 -13
  271. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +0 -1173
  272. data/src/core/lib/event_engine/memory_allocator.cc +0 -74
  273. data/src/core/lib/transport/pid_controller.cc +0 -51
  274. data/src/core/lib/transport/pid_controller.h +0 -116
  275. data/third_party/upb/upb/collections/array.h +0 -17
  276. data/third_party/upb/upb/collections/map.h +0 -17
  277. data/third_party/upb/upb/upb.hpp +0 -18
@@ -0,0 +1,2077 @@
1
+ // Copyright 2023 gRPC authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef GRPC_SRC_CORE_LIB_PROMISE_DETAIL_JOIN_STATE_H
16
+ #define GRPC_SRC_CORE_LIB_PROMISE_DETAIL_JOIN_STATE_H
17
+
18
+ // This file is generated by tools/codegen/core/gen_seq.py
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include <tuple>
23
+ #include <type_traits>
24
+ #include <utility>
25
+
26
+ #include <grpc/support/log.h>
27
+
28
+ #include "src/core/lib/gprpp/bitset.h"
29
+ #include "src/core/lib/gprpp/construct_destruct.h"
30
+ #include "src/core/lib/promise/detail/promise_like.h"
31
+ #include "src/core/lib/promise/poll.h"
32
+ #include "src/core/lib/promise/trace.h"
33
+
34
+ namespace grpc_core {
35
+ namespace promise_detail {
36
+ template <class Traits, typename... Ps>
37
+ struct JoinState;
38
+
39
+ template <class Traits, typename P0, typename P1>
40
+ struct JoinState<Traits, P0, P1> {
41
+ template <typename T>
42
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
43
+ using Promise0 = PromiseLike<P0>;
44
+ using Result0 = UnwrappedType<typename Promise0::Result>;
45
+ union {
46
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
47
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
48
+ };
49
+ using Promise1 = PromiseLike<P1>;
50
+ using Result1 = UnwrappedType<typename Promise1::Result>;
51
+ union {
52
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
53
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
54
+ };
55
+ GPR_NO_UNIQUE_ADDRESS BitSet<2> ready;
56
+ JoinState(P0&& p0, P1&& p1) {
57
+ Construct(&promise0, std::forward<P0>(p0));
58
+ Construct(&promise1, std::forward<P1>(p1));
59
+ }
60
+ JoinState(const JoinState& other) {
61
+ GPR_ASSERT(other.ready.none());
62
+ Construct(&promise0, other.promise0);
63
+ Construct(&promise1, other.promise1);
64
+ }
65
+ JoinState& operator=(const JoinState& other) = delete;
66
+ JoinState& operator=(JoinState&& other) = delete;
67
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
68
+ if (ready.is_set(0)) {
69
+ Construct(&result0, std::move(other.result0));
70
+ } else {
71
+ Construct(&promise0, std::move(other.promise0));
72
+ }
73
+ if (ready.is_set(1)) {
74
+ Construct(&result1, std::move(other.result1));
75
+ } else {
76
+ Construct(&promise1, std::move(other.promise1));
77
+ }
78
+ }
79
+ ~JoinState() {
80
+ if (ready.is_set(0)) {
81
+ Destruct(&result0);
82
+ } else {
83
+ Destruct(&promise0);
84
+ }
85
+ if (ready.is_set(1)) {
86
+ Destruct(&result1);
87
+ } else {
88
+ Destruct(&promise1);
89
+ }
90
+ }
91
+ using Result =
92
+ typename Traits::template ResultType<std::tuple<Result0, Result1>>;
93
+ Poll<Result> PollOnce() {
94
+ if (!ready.is_set(0)) {
95
+ if (grpc_trace_promise_primitives.enabled()) {
96
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/2", this);
97
+ }
98
+ auto poll = promise0();
99
+ if (grpc_trace_promise_primitives.enabled()) {
100
+ auto* p = poll.value_if_ready();
101
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/2 %s", this,
102
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
103
+ : "pending");
104
+ }
105
+ if (auto* p = poll.value_if_ready()) {
106
+ if (Traits::IsOk(*p)) {
107
+ ready.set(0);
108
+ Destruct(&promise0);
109
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
110
+ } else {
111
+ return Traits::template EarlyReturn<Result>(std::move(*p));
112
+ }
113
+ }
114
+ } else if (grpc_trace_promise_primitives.enabled()) {
115
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/2 already ready", this);
116
+ }
117
+ if (!ready.is_set(1)) {
118
+ if (grpc_trace_promise_primitives.enabled()) {
119
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/2", this);
120
+ }
121
+ auto poll = promise1();
122
+ if (grpc_trace_promise_primitives.enabled()) {
123
+ auto* p = poll.value_if_ready();
124
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/2 %s", this,
125
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
126
+ : "pending");
127
+ }
128
+ if (auto* p = poll.value_if_ready()) {
129
+ if (Traits::IsOk(*p)) {
130
+ ready.set(1);
131
+ Destruct(&promise1);
132
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
133
+ } else {
134
+ return Traits::template EarlyReturn<Result>(std::move(*p));
135
+ }
136
+ }
137
+ } else if (grpc_trace_promise_primitives.enabled()) {
138
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/2 already ready", this);
139
+ }
140
+ if (ready.all()) {
141
+ return Traits::FinalReturn(std::move(result0), std::move(result1));
142
+ }
143
+ return Pending{};
144
+ }
145
+ };
146
+
147
+ template <class Traits, typename P0, typename P1, typename P2>
148
+ struct JoinState<Traits, P0, P1, P2> {
149
+ template <typename T>
150
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
151
+ using Promise0 = PromiseLike<P0>;
152
+ using Result0 = UnwrappedType<typename Promise0::Result>;
153
+ union {
154
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
155
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
156
+ };
157
+ using Promise1 = PromiseLike<P1>;
158
+ using Result1 = UnwrappedType<typename Promise1::Result>;
159
+ union {
160
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
161
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
162
+ };
163
+ using Promise2 = PromiseLike<P2>;
164
+ using Result2 = UnwrappedType<typename Promise2::Result>;
165
+ union {
166
+ GPR_NO_UNIQUE_ADDRESS Promise2 promise2;
167
+ GPR_NO_UNIQUE_ADDRESS Result2 result2;
168
+ };
169
+ GPR_NO_UNIQUE_ADDRESS BitSet<3> ready;
170
+ JoinState(P0&& p0, P1&& p1, P2&& p2) {
171
+ Construct(&promise0, std::forward<P0>(p0));
172
+ Construct(&promise1, std::forward<P1>(p1));
173
+ Construct(&promise2, std::forward<P2>(p2));
174
+ }
175
+ JoinState(const JoinState& other) {
176
+ GPR_ASSERT(other.ready.none());
177
+ Construct(&promise0, other.promise0);
178
+ Construct(&promise1, other.promise1);
179
+ Construct(&promise2, other.promise2);
180
+ }
181
+ JoinState& operator=(const JoinState& other) = delete;
182
+ JoinState& operator=(JoinState&& other) = delete;
183
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
184
+ if (ready.is_set(0)) {
185
+ Construct(&result0, std::move(other.result0));
186
+ } else {
187
+ Construct(&promise0, std::move(other.promise0));
188
+ }
189
+ if (ready.is_set(1)) {
190
+ Construct(&result1, std::move(other.result1));
191
+ } else {
192
+ Construct(&promise1, std::move(other.promise1));
193
+ }
194
+ if (ready.is_set(2)) {
195
+ Construct(&result2, std::move(other.result2));
196
+ } else {
197
+ Construct(&promise2, std::move(other.promise2));
198
+ }
199
+ }
200
+ ~JoinState() {
201
+ if (ready.is_set(0)) {
202
+ Destruct(&result0);
203
+ } else {
204
+ Destruct(&promise0);
205
+ }
206
+ if (ready.is_set(1)) {
207
+ Destruct(&result1);
208
+ } else {
209
+ Destruct(&promise1);
210
+ }
211
+ if (ready.is_set(2)) {
212
+ Destruct(&result2);
213
+ } else {
214
+ Destruct(&promise2);
215
+ }
216
+ }
217
+ using Result = typename Traits::template ResultType<
218
+ std::tuple<Result0, Result1, Result2>>;
219
+ Poll<Result> PollOnce() {
220
+ if (!ready.is_set(0)) {
221
+ if (grpc_trace_promise_primitives.enabled()) {
222
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/3", this);
223
+ }
224
+ auto poll = promise0();
225
+ if (grpc_trace_promise_primitives.enabled()) {
226
+ auto* p = poll.value_if_ready();
227
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/3 %s", this,
228
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
229
+ : "pending");
230
+ }
231
+ if (auto* p = poll.value_if_ready()) {
232
+ if (Traits::IsOk(*p)) {
233
+ ready.set(0);
234
+ Destruct(&promise0);
235
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
236
+ } else {
237
+ return Traits::template EarlyReturn<Result>(std::move(*p));
238
+ }
239
+ }
240
+ } else if (grpc_trace_promise_primitives.enabled()) {
241
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/3 already ready", this);
242
+ }
243
+ if (!ready.is_set(1)) {
244
+ if (grpc_trace_promise_primitives.enabled()) {
245
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/3", this);
246
+ }
247
+ auto poll = promise1();
248
+ if (grpc_trace_promise_primitives.enabled()) {
249
+ auto* p = poll.value_if_ready();
250
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/3 %s", this,
251
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
252
+ : "pending");
253
+ }
254
+ if (auto* p = poll.value_if_ready()) {
255
+ if (Traits::IsOk(*p)) {
256
+ ready.set(1);
257
+ Destruct(&promise1);
258
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
259
+ } else {
260
+ return Traits::template EarlyReturn<Result>(std::move(*p));
261
+ }
262
+ }
263
+ } else if (grpc_trace_promise_primitives.enabled()) {
264
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/3 already ready", this);
265
+ }
266
+ if (!ready.is_set(2)) {
267
+ if (grpc_trace_promise_primitives.enabled()) {
268
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 3/3", this);
269
+ }
270
+ auto poll = promise2();
271
+ if (grpc_trace_promise_primitives.enabled()) {
272
+ auto* p = poll.value_if_ready();
273
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/3 %s", this,
274
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
275
+ : "pending");
276
+ }
277
+ if (auto* p = poll.value_if_ready()) {
278
+ if (Traits::IsOk(*p)) {
279
+ ready.set(2);
280
+ Destruct(&promise2);
281
+ Construct(&result2, Traits::Unwrapped(std::move(*p)));
282
+ } else {
283
+ return Traits::template EarlyReturn<Result>(std::move(*p));
284
+ }
285
+ }
286
+ } else if (grpc_trace_promise_primitives.enabled()) {
287
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/3 already ready", this);
288
+ }
289
+ if (ready.all()) {
290
+ return Traits::FinalReturn(std::move(result0), std::move(result1),
291
+ std::move(result2));
292
+ }
293
+ return Pending{};
294
+ }
295
+ };
296
+
297
+ template <class Traits, typename P0, typename P1, typename P2, typename P3>
298
+ struct JoinState<Traits, P0, P1, P2, P3> {
299
+ template <typename T>
300
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
301
+ using Promise0 = PromiseLike<P0>;
302
+ using Result0 = UnwrappedType<typename Promise0::Result>;
303
+ union {
304
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
305
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
306
+ };
307
+ using Promise1 = PromiseLike<P1>;
308
+ using Result1 = UnwrappedType<typename Promise1::Result>;
309
+ union {
310
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
311
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
312
+ };
313
+ using Promise2 = PromiseLike<P2>;
314
+ using Result2 = UnwrappedType<typename Promise2::Result>;
315
+ union {
316
+ GPR_NO_UNIQUE_ADDRESS Promise2 promise2;
317
+ GPR_NO_UNIQUE_ADDRESS Result2 result2;
318
+ };
319
+ using Promise3 = PromiseLike<P3>;
320
+ using Result3 = UnwrappedType<typename Promise3::Result>;
321
+ union {
322
+ GPR_NO_UNIQUE_ADDRESS Promise3 promise3;
323
+ GPR_NO_UNIQUE_ADDRESS Result3 result3;
324
+ };
325
+ GPR_NO_UNIQUE_ADDRESS BitSet<4> ready;
326
+ JoinState(P0&& p0, P1&& p1, P2&& p2, P3&& p3) {
327
+ Construct(&promise0, std::forward<P0>(p0));
328
+ Construct(&promise1, std::forward<P1>(p1));
329
+ Construct(&promise2, std::forward<P2>(p2));
330
+ Construct(&promise3, std::forward<P3>(p3));
331
+ }
332
+ JoinState(const JoinState& other) {
333
+ GPR_ASSERT(other.ready.none());
334
+ Construct(&promise0, other.promise0);
335
+ Construct(&promise1, other.promise1);
336
+ Construct(&promise2, other.promise2);
337
+ Construct(&promise3, other.promise3);
338
+ }
339
+ JoinState& operator=(const JoinState& other) = delete;
340
+ JoinState& operator=(JoinState&& other) = delete;
341
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
342
+ if (ready.is_set(0)) {
343
+ Construct(&result0, std::move(other.result0));
344
+ } else {
345
+ Construct(&promise0, std::move(other.promise0));
346
+ }
347
+ if (ready.is_set(1)) {
348
+ Construct(&result1, std::move(other.result1));
349
+ } else {
350
+ Construct(&promise1, std::move(other.promise1));
351
+ }
352
+ if (ready.is_set(2)) {
353
+ Construct(&result2, std::move(other.result2));
354
+ } else {
355
+ Construct(&promise2, std::move(other.promise2));
356
+ }
357
+ if (ready.is_set(3)) {
358
+ Construct(&result3, std::move(other.result3));
359
+ } else {
360
+ Construct(&promise3, std::move(other.promise3));
361
+ }
362
+ }
363
+ ~JoinState() {
364
+ if (ready.is_set(0)) {
365
+ Destruct(&result0);
366
+ } else {
367
+ Destruct(&promise0);
368
+ }
369
+ if (ready.is_set(1)) {
370
+ Destruct(&result1);
371
+ } else {
372
+ Destruct(&promise1);
373
+ }
374
+ if (ready.is_set(2)) {
375
+ Destruct(&result2);
376
+ } else {
377
+ Destruct(&promise2);
378
+ }
379
+ if (ready.is_set(3)) {
380
+ Destruct(&result3);
381
+ } else {
382
+ Destruct(&promise3);
383
+ }
384
+ }
385
+ using Result = typename Traits::template ResultType<
386
+ std::tuple<Result0, Result1, Result2, Result3>>;
387
+ Poll<Result> PollOnce() {
388
+ if (!ready.is_set(0)) {
389
+ if (grpc_trace_promise_primitives.enabled()) {
390
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/4", this);
391
+ }
392
+ auto poll = promise0();
393
+ if (grpc_trace_promise_primitives.enabled()) {
394
+ auto* p = poll.value_if_ready();
395
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/4 %s", this,
396
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
397
+ : "pending");
398
+ }
399
+ if (auto* p = poll.value_if_ready()) {
400
+ if (Traits::IsOk(*p)) {
401
+ ready.set(0);
402
+ Destruct(&promise0);
403
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
404
+ } else {
405
+ return Traits::template EarlyReturn<Result>(std::move(*p));
406
+ }
407
+ }
408
+ } else if (grpc_trace_promise_primitives.enabled()) {
409
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/4 already ready", this);
410
+ }
411
+ if (!ready.is_set(1)) {
412
+ if (grpc_trace_promise_primitives.enabled()) {
413
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/4", this);
414
+ }
415
+ auto poll = promise1();
416
+ if (grpc_trace_promise_primitives.enabled()) {
417
+ auto* p = poll.value_if_ready();
418
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/4 %s", this,
419
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
420
+ : "pending");
421
+ }
422
+ if (auto* p = poll.value_if_ready()) {
423
+ if (Traits::IsOk(*p)) {
424
+ ready.set(1);
425
+ Destruct(&promise1);
426
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
427
+ } else {
428
+ return Traits::template EarlyReturn<Result>(std::move(*p));
429
+ }
430
+ }
431
+ } else if (grpc_trace_promise_primitives.enabled()) {
432
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/4 already ready", this);
433
+ }
434
+ if (!ready.is_set(2)) {
435
+ if (grpc_trace_promise_primitives.enabled()) {
436
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 3/4", this);
437
+ }
438
+ auto poll = promise2();
439
+ if (grpc_trace_promise_primitives.enabled()) {
440
+ auto* p = poll.value_if_ready();
441
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/4 %s", this,
442
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
443
+ : "pending");
444
+ }
445
+ if (auto* p = poll.value_if_ready()) {
446
+ if (Traits::IsOk(*p)) {
447
+ ready.set(2);
448
+ Destruct(&promise2);
449
+ Construct(&result2, Traits::Unwrapped(std::move(*p)));
450
+ } else {
451
+ return Traits::template EarlyReturn<Result>(std::move(*p));
452
+ }
453
+ }
454
+ } else if (grpc_trace_promise_primitives.enabled()) {
455
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/4 already ready", this);
456
+ }
457
+ if (!ready.is_set(3)) {
458
+ if (grpc_trace_promise_primitives.enabled()) {
459
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 4/4", this);
460
+ }
461
+ auto poll = promise3();
462
+ if (grpc_trace_promise_primitives.enabled()) {
463
+ auto* p = poll.value_if_ready();
464
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/4 %s", this,
465
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
466
+ : "pending");
467
+ }
468
+ if (auto* p = poll.value_if_ready()) {
469
+ if (Traits::IsOk(*p)) {
470
+ ready.set(3);
471
+ Destruct(&promise3);
472
+ Construct(&result3, Traits::Unwrapped(std::move(*p)));
473
+ } else {
474
+ return Traits::template EarlyReturn<Result>(std::move(*p));
475
+ }
476
+ }
477
+ } else if (grpc_trace_promise_primitives.enabled()) {
478
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/4 already ready", this);
479
+ }
480
+ if (ready.all()) {
481
+ return Traits::FinalReturn(std::move(result0), std::move(result1),
482
+ std::move(result2), std::move(result3));
483
+ }
484
+ return Pending{};
485
+ }
486
+ };
487
+
488
+ template <class Traits, typename P0, typename P1, typename P2, typename P3,
489
+ typename P4>
490
+ struct JoinState<Traits, P0, P1, P2, P3, P4> {
491
+ template <typename T>
492
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
493
+ using Promise0 = PromiseLike<P0>;
494
+ using Result0 = UnwrappedType<typename Promise0::Result>;
495
+ union {
496
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
497
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
498
+ };
499
+ using Promise1 = PromiseLike<P1>;
500
+ using Result1 = UnwrappedType<typename Promise1::Result>;
501
+ union {
502
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
503
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
504
+ };
505
+ using Promise2 = PromiseLike<P2>;
506
+ using Result2 = UnwrappedType<typename Promise2::Result>;
507
+ union {
508
+ GPR_NO_UNIQUE_ADDRESS Promise2 promise2;
509
+ GPR_NO_UNIQUE_ADDRESS Result2 result2;
510
+ };
511
+ using Promise3 = PromiseLike<P3>;
512
+ using Result3 = UnwrappedType<typename Promise3::Result>;
513
+ union {
514
+ GPR_NO_UNIQUE_ADDRESS Promise3 promise3;
515
+ GPR_NO_UNIQUE_ADDRESS Result3 result3;
516
+ };
517
+ using Promise4 = PromiseLike<P4>;
518
+ using Result4 = UnwrappedType<typename Promise4::Result>;
519
+ union {
520
+ GPR_NO_UNIQUE_ADDRESS Promise4 promise4;
521
+ GPR_NO_UNIQUE_ADDRESS Result4 result4;
522
+ };
523
+ GPR_NO_UNIQUE_ADDRESS BitSet<5> ready;
524
+ JoinState(P0&& p0, P1&& p1, P2&& p2, P3&& p3, P4&& p4) {
525
+ Construct(&promise0, std::forward<P0>(p0));
526
+ Construct(&promise1, std::forward<P1>(p1));
527
+ Construct(&promise2, std::forward<P2>(p2));
528
+ Construct(&promise3, std::forward<P3>(p3));
529
+ Construct(&promise4, std::forward<P4>(p4));
530
+ }
531
+ JoinState(const JoinState& other) {
532
+ GPR_ASSERT(other.ready.none());
533
+ Construct(&promise0, other.promise0);
534
+ Construct(&promise1, other.promise1);
535
+ Construct(&promise2, other.promise2);
536
+ Construct(&promise3, other.promise3);
537
+ Construct(&promise4, other.promise4);
538
+ }
539
+ JoinState& operator=(const JoinState& other) = delete;
540
+ JoinState& operator=(JoinState&& other) = delete;
541
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
542
+ if (ready.is_set(0)) {
543
+ Construct(&result0, std::move(other.result0));
544
+ } else {
545
+ Construct(&promise0, std::move(other.promise0));
546
+ }
547
+ if (ready.is_set(1)) {
548
+ Construct(&result1, std::move(other.result1));
549
+ } else {
550
+ Construct(&promise1, std::move(other.promise1));
551
+ }
552
+ if (ready.is_set(2)) {
553
+ Construct(&result2, std::move(other.result2));
554
+ } else {
555
+ Construct(&promise2, std::move(other.promise2));
556
+ }
557
+ if (ready.is_set(3)) {
558
+ Construct(&result3, std::move(other.result3));
559
+ } else {
560
+ Construct(&promise3, std::move(other.promise3));
561
+ }
562
+ if (ready.is_set(4)) {
563
+ Construct(&result4, std::move(other.result4));
564
+ } else {
565
+ Construct(&promise4, std::move(other.promise4));
566
+ }
567
+ }
568
+ ~JoinState() {
569
+ if (ready.is_set(0)) {
570
+ Destruct(&result0);
571
+ } else {
572
+ Destruct(&promise0);
573
+ }
574
+ if (ready.is_set(1)) {
575
+ Destruct(&result1);
576
+ } else {
577
+ Destruct(&promise1);
578
+ }
579
+ if (ready.is_set(2)) {
580
+ Destruct(&result2);
581
+ } else {
582
+ Destruct(&promise2);
583
+ }
584
+ if (ready.is_set(3)) {
585
+ Destruct(&result3);
586
+ } else {
587
+ Destruct(&promise3);
588
+ }
589
+ if (ready.is_set(4)) {
590
+ Destruct(&result4);
591
+ } else {
592
+ Destruct(&promise4);
593
+ }
594
+ }
595
+ using Result = typename Traits::template ResultType<
596
+ std::tuple<Result0, Result1, Result2, Result3, Result4>>;
597
+ Poll<Result> PollOnce() {
598
+ if (!ready.is_set(0)) {
599
+ if (grpc_trace_promise_primitives.enabled()) {
600
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/5", this);
601
+ }
602
+ auto poll = promise0();
603
+ if (grpc_trace_promise_primitives.enabled()) {
604
+ auto* p = poll.value_if_ready();
605
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/5 %s", this,
606
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
607
+ : "pending");
608
+ }
609
+ if (auto* p = poll.value_if_ready()) {
610
+ if (Traits::IsOk(*p)) {
611
+ ready.set(0);
612
+ Destruct(&promise0);
613
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
614
+ } else {
615
+ return Traits::template EarlyReturn<Result>(std::move(*p));
616
+ }
617
+ }
618
+ } else if (grpc_trace_promise_primitives.enabled()) {
619
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/5 already ready", this);
620
+ }
621
+ if (!ready.is_set(1)) {
622
+ if (grpc_trace_promise_primitives.enabled()) {
623
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/5", this);
624
+ }
625
+ auto poll = promise1();
626
+ if (grpc_trace_promise_primitives.enabled()) {
627
+ auto* p = poll.value_if_ready();
628
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/5 %s", this,
629
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
630
+ : "pending");
631
+ }
632
+ if (auto* p = poll.value_if_ready()) {
633
+ if (Traits::IsOk(*p)) {
634
+ ready.set(1);
635
+ Destruct(&promise1);
636
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
637
+ } else {
638
+ return Traits::template EarlyReturn<Result>(std::move(*p));
639
+ }
640
+ }
641
+ } else if (grpc_trace_promise_primitives.enabled()) {
642
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/5 already ready", this);
643
+ }
644
+ if (!ready.is_set(2)) {
645
+ if (grpc_trace_promise_primitives.enabled()) {
646
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 3/5", this);
647
+ }
648
+ auto poll = promise2();
649
+ if (grpc_trace_promise_primitives.enabled()) {
650
+ auto* p = poll.value_if_ready();
651
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/5 %s", this,
652
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
653
+ : "pending");
654
+ }
655
+ if (auto* p = poll.value_if_ready()) {
656
+ if (Traits::IsOk(*p)) {
657
+ ready.set(2);
658
+ Destruct(&promise2);
659
+ Construct(&result2, Traits::Unwrapped(std::move(*p)));
660
+ } else {
661
+ return Traits::template EarlyReturn<Result>(std::move(*p));
662
+ }
663
+ }
664
+ } else if (grpc_trace_promise_primitives.enabled()) {
665
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/5 already ready", this);
666
+ }
667
+ if (!ready.is_set(3)) {
668
+ if (grpc_trace_promise_primitives.enabled()) {
669
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 4/5", this);
670
+ }
671
+ auto poll = promise3();
672
+ if (grpc_trace_promise_primitives.enabled()) {
673
+ auto* p = poll.value_if_ready();
674
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/5 %s", this,
675
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
676
+ : "pending");
677
+ }
678
+ if (auto* p = poll.value_if_ready()) {
679
+ if (Traits::IsOk(*p)) {
680
+ ready.set(3);
681
+ Destruct(&promise3);
682
+ Construct(&result3, Traits::Unwrapped(std::move(*p)));
683
+ } else {
684
+ return Traits::template EarlyReturn<Result>(std::move(*p));
685
+ }
686
+ }
687
+ } else if (grpc_trace_promise_primitives.enabled()) {
688
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/5 already ready", this);
689
+ }
690
+ if (!ready.is_set(4)) {
691
+ if (grpc_trace_promise_primitives.enabled()) {
692
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 5/5", this);
693
+ }
694
+ auto poll = promise4();
695
+ if (grpc_trace_promise_primitives.enabled()) {
696
+ auto* p = poll.value_if_ready();
697
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/5 %s", this,
698
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
699
+ : "pending");
700
+ }
701
+ if (auto* p = poll.value_if_ready()) {
702
+ if (Traits::IsOk(*p)) {
703
+ ready.set(4);
704
+ Destruct(&promise4);
705
+ Construct(&result4, Traits::Unwrapped(std::move(*p)));
706
+ } else {
707
+ return Traits::template EarlyReturn<Result>(std::move(*p));
708
+ }
709
+ }
710
+ } else if (grpc_trace_promise_primitives.enabled()) {
711
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/5 already ready", this);
712
+ }
713
+ if (ready.all()) {
714
+ return Traits::FinalReturn(std::move(result0), std::move(result1),
715
+ std::move(result2), std::move(result3),
716
+ std::move(result4));
717
+ }
718
+ return Pending{};
719
+ }
720
+ };
721
+
722
+ template <class Traits, typename P0, typename P1, typename P2, typename P3,
723
+ typename P4, typename P5>
724
+ struct JoinState<Traits, P0, P1, P2, P3, P4, P5> {
725
+ template <typename T>
726
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
727
+ using Promise0 = PromiseLike<P0>;
728
+ using Result0 = UnwrappedType<typename Promise0::Result>;
729
+ union {
730
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
731
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
732
+ };
733
+ using Promise1 = PromiseLike<P1>;
734
+ using Result1 = UnwrappedType<typename Promise1::Result>;
735
+ union {
736
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
737
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
738
+ };
739
+ using Promise2 = PromiseLike<P2>;
740
+ using Result2 = UnwrappedType<typename Promise2::Result>;
741
+ union {
742
+ GPR_NO_UNIQUE_ADDRESS Promise2 promise2;
743
+ GPR_NO_UNIQUE_ADDRESS Result2 result2;
744
+ };
745
+ using Promise3 = PromiseLike<P3>;
746
+ using Result3 = UnwrappedType<typename Promise3::Result>;
747
+ union {
748
+ GPR_NO_UNIQUE_ADDRESS Promise3 promise3;
749
+ GPR_NO_UNIQUE_ADDRESS Result3 result3;
750
+ };
751
+ using Promise4 = PromiseLike<P4>;
752
+ using Result4 = UnwrappedType<typename Promise4::Result>;
753
+ union {
754
+ GPR_NO_UNIQUE_ADDRESS Promise4 promise4;
755
+ GPR_NO_UNIQUE_ADDRESS Result4 result4;
756
+ };
757
+ using Promise5 = PromiseLike<P5>;
758
+ using Result5 = UnwrappedType<typename Promise5::Result>;
759
+ union {
760
+ GPR_NO_UNIQUE_ADDRESS Promise5 promise5;
761
+ GPR_NO_UNIQUE_ADDRESS Result5 result5;
762
+ };
763
+ GPR_NO_UNIQUE_ADDRESS BitSet<6> ready;
764
+ JoinState(P0&& p0, P1&& p1, P2&& p2, P3&& p3, P4&& p4, P5&& p5) {
765
+ Construct(&promise0, std::forward<P0>(p0));
766
+ Construct(&promise1, std::forward<P1>(p1));
767
+ Construct(&promise2, std::forward<P2>(p2));
768
+ Construct(&promise3, std::forward<P3>(p3));
769
+ Construct(&promise4, std::forward<P4>(p4));
770
+ Construct(&promise5, std::forward<P5>(p5));
771
+ }
772
+ JoinState(const JoinState& other) {
773
+ GPR_ASSERT(other.ready.none());
774
+ Construct(&promise0, other.promise0);
775
+ Construct(&promise1, other.promise1);
776
+ Construct(&promise2, other.promise2);
777
+ Construct(&promise3, other.promise3);
778
+ Construct(&promise4, other.promise4);
779
+ Construct(&promise5, other.promise5);
780
+ }
781
+ JoinState& operator=(const JoinState& other) = delete;
782
+ JoinState& operator=(JoinState&& other) = delete;
783
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
784
+ if (ready.is_set(0)) {
785
+ Construct(&result0, std::move(other.result0));
786
+ } else {
787
+ Construct(&promise0, std::move(other.promise0));
788
+ }
789
+ if (ready.is_set(1)) {
790
+ Construct(&result1, std::move(other.result1));
791
+ } else {
792
+ Construct(&promise1, std::move(other.promise1));
793
+ }
794
+ if (ready.is_set(2)) {
795
+ Construct(&result2, std::move(other.result2));
796
+ } else {
797
+ Construct(&promise2, std::move(other.promise2));
798
+ }
799
+ if (ready.is_set(3)) {
800
+ Construct(&result3, std::move(other.result3));
801
+ } else {
802
+ Construct(&promise3, std::move(other.promise3));
803
+ }
804
+ if (ready.is_set(4)) {
805
+ Construct(&result4, std::move(other.result4));
806
+ } else {
807
+ Construct(&promise4, std::move(other.promise4));
808
+ }
809
+ if (ready.is_set(5)) {
810
+ Construct(&result5, std::move(other.result5));
811
+ } else {
812
+ Construct(&promise5, std::move(other.promise5));
813
+ }
814
+ }
815
+ ~JoinState() {
816
+ if (ready.is_set(0)) {
817
+ Destruct(&result0);
818
+ } else {
819
+ Destruct(&promise0);
820
+ }
821
+ if (ready.is_set(1)) {
822
+ Destruct(&result1);
823
+ } else {
824
+ Destruct(&promise1);
825
+ }
826
+ if (ready.is_set(2)) {
827
+ Destruct(&result2);
828
+ } else {
829
+ Destruct(&promise2);
830
+ }
831
+ if (ready.is_set(3)) {
832
+ Destruct(&result3);
833
+ } else {
834
+ Destruct(&promise3);
835
+ }
836
+ if (ready.is_set(4)) {
837
+ Destruct(&result4);
838
+ } else {
839
+ Destruct(&promise4);
840
+ }
841
+ if (ready.is_set(5)) {
842
+ Destruct(&result5);
843
+ } else {
844
+ Destruct(&promise5);
845
+ }
846
+ }
847
+ using Result = typename Traits::template ResultType<
848
+ std::tuple<Result0, Result1, Result2, Result3, Result4, Result5>>;
849
+ Poll<Result> PollOnce() {
850
+ if (!ready.is_set(0)) {
851
+ if (grpc_trace_promise_primitives.enabled()) {
852
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/6", this);
853
+ }
854
+ auto poll = promise0();
855
+ if (grpc_trace_promise_primitives.enabled()) {
856
+ auto* p = poll.value_if_ready();
857
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/6 %s", this,
858
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
859
+ : "pending");
860
+ }
861
+ if (auto* p = poll.value_if_ready()) {
862
+ if (Traits::IsOk(*p)) {
863
+ ready.set(0);
864
+ Destruct(&promise0);
865
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
866
+ } else {
867
+ return Traits::template EarlyReturn<Result>(std::move(*p));
868
+ }
869
+ }
870
+ } else if (grpc_trace_promise_primitives.enabled()) {
871
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/6 already ready", this);
872
+ }
873
+ if (!ready.is_set(1)) {
874
+ if (grpc_trace_promise_primitives.enabled()) {
875
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/6", this);
876
+ }
877
+ auto poll = promise1();
878
+ if (grpc_trace_promise_primitives.enabled()) {
879
+ auto* p = poll.value_if_ready();
880
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/6 %s", this,
881
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
882
+ : "pending");
883
+ }
884
+ if (auto* p = poll.value_if_ready()) {
885
+ if (Traits::IsOk(*p)) {
886
+ ready.set(1);
887
+ Destruct(&promise1);
888
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
889
+ } else {
890
+ return Traits::template EarlyReturn<Result>(std::move(*p));
891
+ }
892
+ }
893
+ } else if (grpc_trace_promise_primitives.enabled()) {
894
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/6 already ready", this);
895
+ }
896
+ if (!ready.is_set(2)) {
897
+ if (grpc_trace_promise_primitives.enabled()) {
898
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 3/6", this);
899
+ }
900
+ auto poll = promise2();
901
+ if (grpc_trace_promise_primitives.enabled()) {
902
+ auto* p = poll.value_if_ready();
903
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/6 %s", this,
904
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
905
+ : "pending");
906
+ }
907
+ if (auto* p = poll.value_if_ready()) {
908
+ if (Traits::IsOk(*p)) {
909
+ ready.set(2);
910
+ Destruct(&promise2);
911
+ Construct(&result2, Traits::Unwrapped(std::move(*p)));
912
+ } else {
913
+ return Traits::template EarlyReturn<Result>(std::move(*p));
914
+ }
915
+ }
916
+ } else if (grpc_trace_promise_primitives.enabled()) {
917
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/6 already ready", this);
918
+ }
919
+ if (!ready.is_set(3)) {
920
+ if (grpc_trace_promise_primitives.enabled()) {
921
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 4/6", this);
922
+ }
923
+ auto poll = promise3();
924
+ if (grpc_trace_promise_primitives.enabled()) {
925
+ auto* p = poll.value_if_ready();
926
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/6 %s", this,
927
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
928
+ : "pending");
929
+ }
930
+ if (auto* p = poll.value_if_ready()) {
931
+ if (Traits::IsOk(*p)) {
932
+ ready.set(3);
933
+ Destruct(&promise3);
934
+ Construct(&result3, Traits::Unwrapped(std::move(*p)));
935
+ } else {
936
+ return Traits::template EarlyReturn<Result>(std::move(*p));
937
+ }
938
+ }
939
+ } else if (grpc_trace_promise_primitives.enabled()) {
940
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/6 already ready", this);
941
+ }
942
+ if (!ready.is_set(4)) {
943
+ if (grpc_trace_promise_primitives.enabled()) {
944
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 5/6", this);
945
+ }
946
+ auto poll = promise4();
947
+ if (grpc_trace_promise_primitives.enabled()) {
948
+ auto* p = poll.value_if_ready();
949
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/6 %s", this,
950
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
951
+ : "pending");
952
+ }
953
+ if (auto* p = poll.value_if_ready()) {
954
+ if (Traits::IsOk(*p)) {
955
+ ready.set(4);
956
+ Destruct(&promise4);
957
+ Construct(&result4, Traits::Unwrapped(std::move(*p)));
958
+ } else {
959
+ return Traits::template EarlyReturn<Result>(std::move(*p));
960
+ }
961
+ }
962
+ } else if (grpc_trace_promise_primitives.enabled()) {
963
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/6 already ready", this);
964
+ }
965
+ if (!ready.is_set(5)) {
966
+ if (grpc_trace_promise_primitives.enabled()) {
967
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 6/6", this);
968
+ }
969
+ auto poll = promise5();
970
+ if (grpc_trace_promise_primitives.enabled()) {
971
+ auto* p = poll.value_if_ready();
972
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/6 %s", this,
973
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
974
+ : "pending");
975
+ }
976
+ if (auto* p = poll.value_if_ready()) {
977
+ if (Traits::IsOk(*p)) {
978
+ ready.set(5);
979
+ Destruct(&promise5);
980
+ Construct(&result5, Traits::Unwrapped(std::move(*p)));
981
+ } else {
982
+ return Traits::template EarlyReturn<Result>(std::move(*p));
983
+ }
984
+ }
985
+ } else if (grpc_trace_promise_primitives.enabled()) {
986
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/6 already ready", this);
987
+ }
988
+ if (ready.all()) {
989
+ return Traits::FinalReturn(std::move(result0), std::move(result1),
990
+ std::move(result2), std::move(result3),
991
+ std::move(result4), std::move(result5));
992
+ }
993
+ return Pending{};
994
+ }
995
+ };
996
+
997
+ template <class Traits, typename P0, typename P1, typename P2, typename P3,
998
+ typename P4, typename P5, typename P6>
999
+ struct JoinState<Traits, P0, P1, P2, P3, P4, P5, P6> {
1000
+ template <typename T>
1001
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
1002
+ using Promise0 = PromiseLike<P0>;
1003
+ using Result0 = UnwrappedType<typename Promise0::Result>;
1004
+ union {
1005
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
1006
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
1007
+ };
1008
+ using Promise1 = PromiseLike<P1>;
1009
+ using Result1 = UnwrappedType<typename Promise1::Result>;
1010
+ union {
1011
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
1012
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
1013
+ };
1014
+ using Promise2 = PromiseLike<P2>;
1015
+ using Result2 = UnwrappedType<typename Promise2::Result>;
1016
+ union {
1017
+ GPR_NO_UNIQUE_ADDRESS Promise2 promise2;
1018
+ GPR_NO_UNIQUE_ADDRESS Result2 result2;
1019
+ };
1020
+ using Promise3 = PromiseLike<P3>;
1021
+ using Result3 = UnwrappedType<typename Promise3::Result>;
1022
+ union {
1023
+ GPR_NO_UNIQUE_ADDRESS Promise3 promise3;
1024
+ GPR_NO_UNIQUE_ADDRESS Result3 result3;
1025
+ };
1026
+ using Promise4 = PromiseLike<P4>;
1027
+ using Result4 = UnwrappedType<typename Promise4::Result>;
1028
+ union {
1029
+ GPR_NO_UNIQUE_ADDRESS Promise4 promise4;
1030
+ GPR_NO_UNIQUE_ADDRESS Result4 result4;
1031
+ };
1032
+ using Promise5 = PromiseLike<P5>;
1033
+ using Result5 = UnwrappedType<typename Promise5::Result>;
1034
+ union {
1035
+ GPR_NO_UNIQUE_ADDRESS Promise5 promise5;
1036
+ GPR_NO_UNIQUE_ADDRESS Result5 result5;
1037
+ };
1038
+ using Promise6 = PromiseLike<P6>;
1039
+ using Result6 = UnwrappedType<typename Promise6::Result>;
1040
+ union {
1041
+ GPR_NO_UNIQUE_ADDRESS Promise6 promise6;
1042
+ GPR_NO_UNIQUE_ADDRESS Result6 result6;
1043
+ };
1044
+ GPR_NO_UNIQUE_ADDRESS BitSet<7> ready;
1045
+ JoinState(P0&& p0, P1&& p1, P2&& p2, P3&& p3, P4&& p4, P5&& p5, P6&& p6) {
1046
+ Construct(&promise0, std::forward<P0>(p0));
1047
+ Construct(&promise1, std::forward<P1>(p1));
1048
+ Construct(&promise2, std::forward<P2>(p2));
1049
+ Construct(&promise3, std::forward<P3>(p3));
1050
+ Construct(&promise4, std::forward<P4>(p4));
1051
+ Construct(&promise5, std::forward<P5>(p5));
1052
+ Construct(&promise6, std::forward<P6>(p6));
1053
+ }
1054
+ JoinState(const JoinState& other) {
1055
+ GPR_ASSERT(other.ready.none());
1056
+ Construct(&promise0, other.promise0);
1057
+ Construct(&promise1, other.promise1);
1058
+ Construct(&promise2, other.promise2);
1059
+ Construct(&promise3, other.promise3);
1060
+ Construct(&promise4, other.promise4);
1061
+ Construct(&promise5, other.promise5);
1062
+ Construct(&promise6, other.promise6);
1063
+ }
1064
+ JoinState& operator=(const JoinState& other) = delete;
1065
+ JoinState& operator=(JoinState&& other) = delete;
1066
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
1067
+ if (ready.is_set(0)) {
1068
+ Construct(&result0, std::move(other.result0));
1069
+ } else {
1070
+ Construct(&promise0, std::move(other.promise0));
1071
+ }
1072
+ if (ready.is_set(1)) {
1073
+ Construct(&result1, std::move(other.result1));
1074
+ } else {
1075
+ Construct(&promise1, std::move(other.promise1));
1076
+ }
1077
+ if (ready.is_set(2)) {
1078
+ Construct(&result2, std::move(other.result2));
1079
+ } else {
1080
+ Construct(&promise2, std::move(other.promise2));
1081
+ }
1082
+ if (ready.is_set(3)) {
1083
+ Construct(&result3, std::move(other.result3));
1084
+ } else {
1085
+ Construct(&promise3, std::move(other.promise3));
1086
+ }
1087
+ if (ready.is_set(4)) {
1088
+ Construct(&result4, std::move(other.result4));
1089
+ } else {
1090
+ Construct(&promise4, std::move(other.promise4));
1091
+ }
1092
+ if (ready.is_set(5)) {
1093
+ Construct(&result5, std::move(other.result5));
1094
+ } else {
1095
+ Construct(&promise5, std::move(other.promise5));
1096
+ }
1097
+ if (ready.is_set(6)) {
1098
+ Construct(&result6, std::move(other.result6));
1099
+ } else {
1100
+ Construct(&promise6, std::move(other.promise6));
1101
+ }
1102
+ }
1103
+ ~JoinState() {
1104
+ if (ready.is_set(0)) {
1105
+ Destruct(&result0);
1106
+ } else {
1107
+ Destruct(&promise0);
1108
+ }
1109
+ if (ready.is_set(1)) {
1110
+ Destruct(&result1);
1111
+ } else {
1112
+ Destruct(&promise1);
1113
+ }
1114
+ if (ready.is_set(2)) {
1115
+ Destruct(&result2);
1116
+ } else {
1117
+ Destruct(&promise2);
1118
+ }
1119
+ if (ready.is_set(3)) {
1120
+ Destruct(&result3);
1121
+ } else {
1122
+ Destruct(&promise3);
1123
+ }
1124
+ if (ready.is_set(4)) {
1125
+ Destruct(&result4);
1126
+ } else {
1127
+ Destruct(&promise4);
1128
+ }
1129
+ if (ready.is_set(5)) {
1130
+ Destruct(&result5);
1131
+ } else {
1132
+ Destruct(&promise5);
1133
+ }
1134
+ if (ready.is_set(6)) {
1135
+ Destruct(&result6);
1136
+ } else {
1137
+ Destruct(&promise6);
1138
+ }
1139
+ }
1140
+ using Result = typename Traits::template ResultType<std::tuple<
1141
+ Result0, Result1, Result2, Result3, Result4, Result5, Result6>>;
1142
+ Poll<Result> PollOnce() {
1143
+ if (!ready.is_set(0)) {
1144
+ if (grpc_trace_promise_primitives.enabled()) {
1145
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/7", this);
1146
+ }
1147
+ auto poll = promise0();
1148
+ if (grpc_trace_promise_primitives.enabled()) {
1149
+ auto* p = poll.value_if_ready();
1150
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/7 %s", this,
1151
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1152
+ : "pending");
1153
+ }
1154
+ if (auto* p = poll.value_if_ready()) {
1155
+ if (Traits::IsOk(*p)) {
1156
+ ready.set(0);
1157
+ Destruct(&promise0);
1158
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
1159
+ } else {
1160
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1161
+ }
1162
+ }
1163
+ } else if (grpc_trace_promise_primitives.enabled()) {
1164
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/7 already ready", this);
1165
+ }
1166
+ if (!ready.is_set(1)) {
1167
+ if (grpc_trace_promise_primitives.enabled()) {
1168
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/7", this);
1169
+ }
1170
+ auto poll = promise1();
1171
+ if (grpc_trace_promise_primitives.enabled()) {
1172
+ auto* p = poll.value_if_ready();
1173
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/7 %s", this,
1174
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1175
+ : "pending");
1176
+ }
1177
+ if (auto* p = poll.value_if_ready()) {
1178
+ if (Traits::IsOk(*p)) {
1179
+ ready.set(1);
1180
+ Destruct(&promise1);
1181
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
1182
+ } else {
1183
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1184
+ }
1185
+ }
1186
+ } else if (grpc_trace_promise_primitives.enabled()) {
1187
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/7 already ready", this);
1188
+ }
1189
+ if (!ready.is_set(2)) {
1190
+ if (grpc_trace_promise_primitives.enabled()) {
1191
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 3/7", this);
1192
+ }
1193
+ auto poll = promise2();
1194
+ if (grpc_trace_promise_primitives.enabled()) {
1195
+ auto* p = poll.value_if_ready();
1196
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/7 %s", this,
1197
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1198
+ : "pending");
1199
+ }
1200
+ if (auto* p = poll.value_if_ready()) {
1201
+ if (Traits::IsOk(*p)) {
1202
+ ready.set(2);
1203
+ Destruct(&promise2);
1204
+ Construct(&result2, Traits::Unwrapped(std::move(*p)));
1205
+ } else {
1206
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1207
+ }
1208
+ }
1209
+ } else if (grpc_trace_promise_primitives.enabled()) {
1210
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/7 already ready", this);
1211
+ }
1212
+ if (!ready.is_set(3)) {
1213
+ if (grpc_trace_promise_primitives.enabled()) {
1214
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 4/7", this);
1215
+ }
1216
+ auto poll = promise3();
1217
+ if (grpc_trace_promise_primitives.enabled()) {
1218
+ auto* p = poll.value_if_ready();
1219
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/7 %s", this,
1220
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1221
+ : "pending");
1222
+ }
1223
+ if (auto* p = poll.value_if_ready()) {
1224
+ if (Traits::IsOk(*p)) {
1225
+ ready.set(3);
1226
+ Destruct(&promise3);
1227
+ Construct(&result3, Traits::Unwrapped(std::move(*p)));
1228
+ } else {
1229
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1230
+ }
1231
+ }
1232
+ } else if (grpc_trace_promise_primitives.enabled()) {
1233
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/7 already ready", this);
1234
+ }
1235
+ if (!ready.is_set(4)) {
1236
+ if (grpc_trace_promise_primitives.enabled()) {
1237
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 5/7", this);
1238
+ }
1239
+ auto poll = promise4();
1240
+ if (grpc_trace_promise_primitives.enabled()) {
1241
+ auto* p = poll.value_if_ready();
1242
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/7 %s", this,
1243
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1244
+ : "pending");
1245
+ }
1246
+ if (auto* p = poll.value_if_ready()) {
1247
+ if (Traits::IsOk(*p)) {
1248
+ ready.set(4);
1249
+ Destruct(&promise4);
1250
+ Construct(&result4, Traits::Unwrapped(std::move(*p)));
1251
+ } else {
1252
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1253
+ }
1254
+ }
1255
+ } else if (grpc_trace_promise_primitives.enabled()) {
1256
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/7 already ready", this);
1257
+ }
1258
+ if (!ready.is_set(5)) {
1259
+ if (grpc_trace_promise_primitives.enabled()) {
1260
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 6/7", this);
1261
+ }
1262
+ auto poll = promise5();
1263
+ if (grpc_trace_promise_primitives.enabled()) {
1264
+ auto* p = poll.value_if_ready();
1265
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/7 %s", this,
1266
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1267
+ : "pending");
1268
+ }
1269
+ if (auto* p = poll.value_if_ready()) {
1270
+ if (Traits::IsOk(*p)) {
1271
+ ready.set(5);
1272
+ Destruct(&promise5);
1273
+ Construct(&result5, Traits::Unwrapped(std::move(*p)));
1274
+ } else {
1275
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1276
+ }
1277
+ }
1278
+ } else if (grpc_trace_promise_primitives.enabled()) {
1279
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/7 already ready", this);
1280
+ }
1281
+ if (!ready.is_set(6)) {
1282
+ if (grpc_trace_promise_primitives.enabled()) {
1283
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 7/7", this);
1284
+ }
1285
+ auto poll = promise6();
1286
+ if (grpc_trace_promise_primitives.enabled()) {
1287
+ auto* p = poll.value_if_ready();
1288
+ gpr_log(GPR_DEBUG, "join[%p]: joint 7/7 %s", this,
1289
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1290
+ : "pending");
1291
+ }
1292
+ if (auto* p = poll.value_if_ready()) {
1293
+ if (Traits::IsOk(*p)) {
1294
+ ready.set(6);
1295
+ Destruct(&promise6);
1296
+ Construct(&result6, Traits::Unwrapped(std::move(*p)));
1297
+ } else {
1298
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1299
+ }
1300
+ }
1301
+ } else if (grpc_trace_promise_primitives.enabled()) {
1302
+ gpr_log(GPR_DEBUG, "join[%p]: joint 7/7 already ready", this);
1303
+ }
1304
+ if (ready.all()) {
1305
+ return Traits::FinalReturn(std::move(result0), std::move(result1),
1306
+ std::move(result2), std::move(result3),
1307
+ std::move(result4), std::move(result5),
1308
+ std::move(result6));
1309
+ }
1310
+ return Pending{};
1311
+ }
1312
+ };
1313
+
1314
+ template <class Traits, typename P0, typename P1, typename P2, typename P3,
1315
+ typename P4, typename P5, typename P6, typename P7>
1316
+ struct JoinState<Traits, P0, P1, P2, P3, P4, P5, P6, P7> {
1317
+ template <typename T>
1318
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
1319
+ using Promise0 = PromiseLike<P0>;
1320
+ using Result0 = UnwrappedType<typename Promise0::Result>;
1321
+ union {
1322
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
1323
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
1324
+ };
1325
+ using Promise1 = PromiseLike<P1>;
1326
+ using Result1 = UnwrappedType<typename Promise1::Result>;
1327
+ union {
1328
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
1329
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
1330
+ };
1331
+ using Promise2 = PromiseLike<P2>;
1332
+ using Result2 = UnwrappedType<typename Promise2::Result>;
1333
+ union {
1334
+ GPR_NO_UNIQUE_ADDRESS Promise2 promise2;
1335
+ GPR_NO_UNIQUE_ADDRESS Result2 result2;
1336
+ };
1337
+ using Promise3 = PromiseLike<P3>;
1338
+ using Result3 = UnwrappedType<typename Promise3::Result>;
1339
+ union {
1340
+ GPR_NO_UNIQUE_ADDRESS Promise3 promise3;
1341
+ GPR_NO_UNIQUE_ADDRESS Result3 result3;
1342
+ };
1343
+ using Promise4 = PromiseLike<P4>;
1344
+ using Result4 = UnwrappedType<typename Promise4::Result>;
1345
+ union {
1346
+ GPR_NO_UNIQUE_ADDRESS Promise4 promise4;
1347
+ GPR_NO_UNIQUE_ADDRESS Result4 result4;
1348
+ };
1349
+ using Promise5 = PromiseLike<P5>;
1350
+ using Result5 = UnwrappedType<typename Promise5::Result>;
1351
+ union {
1352
+ GPR_NO_UNIQUE_ADDRESS Promise5 promise5;
1353
+ GPR_NO_UNIQUE_ADDRESS Result5 result5;
1354
+ };
1355
+ using Promise6 = PromiseLike<P6>;
1356
+ using Result6 = UnwrappedType<typename Promise6::Result>;
1357
+ union {
1358
+ GPR_NO_UNIQUE_ADDRESS Promise6 promise6;
1359
+ GPR_NO_UNIQUE_ADDRESS Result6 result6;
1360
+ };
1361
+ using Promise7 = PromiseLike<P7>;
1362
+ using Result7 = UnwrappedType<typename Promise7::Result>;
1363
+ union {
1364
+ GPR_NO_UNIQUE_ADDRESS Promise7 promise7;
1365
+ GPR_NO_UNIQUE_ADDRESS Result7 result7;
1366
+ };
1367
+ GPR_NO_UNIQUE_ADDRESS BitSet<8> ready;
1368
+ JoinState(P0&& p0, P1&& p1, P2&& p2, P3&& p3, P4&& p4, P5&& p5, P6&& p6,
1369
+ P7&& p7) {
1370
+ Construct(&promise0, std::forward<P0>(p0));
1371
+ Construct(&promise1, std::forward<P1>(p1));
1372
+ Construct(&promise2, std::forward<P2>(p2));
1373
+ Construct(&promise3, std::forward<P3>(p3));
1374
+ Construct(&promise4, std::forward<P4>(p4));
1375
+ Construct(&promise5, std::forward<P5>(p5));
1376
+ Construct(&promise6, std::forward<P6>(p6));
1377
+ Construct(&promise7, std::forward<P7>(p7));
1378
+ }
1379
+ JoinState(const JoinState& other) {
1380
+ GPR_ASSERT(other.ready.none());
1381
+ Construct(&promise0, other.promise0);
1382
+ Construct(&promise1, other.promise1);
1383
+ Construct(&promise2, other.promise2);
1384
+ Construct(&promise3, other.promise3);
1385
+ Construct(&promise4, other.promise4);
1386
+ Construct(&promise5, other.promise5);
1387
+ Construct(&promise6, other.promise6);
1388
+ Construct(&promise7, other.promise7);
1389
+ }
1390
+ JoinState& operator=(const JoinState& other) = delete;
1391
+ JoinState& operator=(JoinState&& other) = delete;
1392
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
1393
+ if (ready.is_set(0)) {
1394
+ Construct(&result0, std::move(other.result0));
1395
+ } else {
1396
+ Construct(&promise0, std::move(other.promise0));
1397
+ }
1398
+ if (ready.is_set(1)) {
1399
+ Construct(&result1, std::move(other.result1));
1400
+ } else {
1401
+ Construct(&promise1, std::move(other.promise1));
1402
+ }
1403
+ if (ready.is_set(2)) {
1404
+ Construct(&result2, std::move(other.result2));
1405
+ } else {
1406
+ Construct(&promise2, std::move(other.promise2));
1407
+ }
1408
+ if (ready.is_set(3)) {
1409
+ Construct(&result3, std::move(other.result3));
1410
+ } else {
1411
+ Construct(&promise3, std::move(other.promise3));
1412
+ }
1413
+ if (ready.is_set(4)) {
1414
+ Construct(&result4, std::move(other.result4));
1415
+ } else {
1416
+ Construct(&promise4, std::move(other.promise4));
1417
+ }
1418
+ if (ready.is_set(5)) {
1419
+ Construct(&result5, std::move(other.result5));
1420
+ } else {
1421
+ Construct(&promise5, std::move(other.promise5));
1422
+ }
1423
+ if (ready.is_set(6)) {
1424
+ Construct(&result6, std::move(other.result6));
1425
+ } else {
1426
+ Construct(&promise6, std::move(other.promise6));
1427
+ }
1428
+ if (ready.is_set(7)) {
1429
+ Construct(&result7, std::move(other.result7));
1430
+ } else {
1431
+ Construct(&promise7, std::move(other.promise7));
1432
+ }
1433
+ }
1434
+ ~JoinState() {
1435
+ if (ready.is_set(0)) {
1436
+ Destruct(&result0);
1437
+ } else {
1438
+ Destruct(&promise0);
1439
+ }
1440
+ if (ready.is_set(1)) {
1441
+ Destruct(&result1);
1442
+ } else {
1443
+ Destruct(&promise1);
1444
+ }
1445
+ if (ready.is_set(2)) {
1446
+ Destruct(&result2);
1447
+ } else {
1448
+ Destruct(&promise2);
1449
+ }
1450
+ if (ready.is_set(3)) {
1451
+ Destruct(&result3);
1452
+ } else {
1453
+ Destruct(&promise3);
1454
+ }
1455
+ if (ready.is_set(4)) {
1456
+ Destruct(&result4);
1457
+ } else {
1458
+ Destruct(&promise4);
1459
+ }
1460
+ if (ready.is_set(5)) {
1461
+ Destruct(&result5);
1462
+ } else {
1463
+ Destruct(&promise5);
1464
+ }
1465
+ if (ready.is_set(6)) {
1466
+ Destruct(&result6);
1467
+ } else {
1468
+ Destruct(&promise6);
1469
+ }
1470
+ if (ready.is_set(7)) {
1471
+ Destruct(&result7);
1472
+ } else {
1473
+ Destruct(&promise7);
1474
+ }
1475
+ }
1476
+ using Result = typename Traits::template ResultType<std::tuple<
1477
+ Result0, Result1, Result2, Result3, Result4, Result5, Result6, Result7>>;
1478
+ Poll<Result> PollOnce() {
1479
+ if (!ready.is_set(0)) {
1480
+ if (grpc_trace_promise_primitives.enabled()) {
1481
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/8", this);
1482
+ }
1483
+ auto poll = promise0();
1484
+ if (grpc_trace_promise_primitives.enabled()) {
1485
+ auto* p = poll.value_if_ready();
1486
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/8 %s", this,
1487
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1488
+ : "pending");
1489
+ }
1490
+ if (auto* p = poll.value_if_ready()) {
1491
+ if (Traits::IsOk(*p)) {
1492
+ ready.set(0);
1493
+ Destruct(&promise0);
1494
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
1495
+ } else {
1496
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1497
+ }
1498
+ }
1499
+ } else if (grpc_trace_promise_primitives.enabled()) {
1500
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/8 already ready", this);
1501
+ }
1502
+ if (!ready.is_set(1)) {
1503
+ if (grpc_trace_promise_primitives.enabled()) {
1504
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/8", this);
1505
+ }
1506
+ auto poll = promise1();
1507
+ if (grpc_trace_promise_primitives.enabled()) {
1508
+ auto* p = poll.value_if_ready();
1509
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/8 %s", this,
1510
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1511
+ : "pending");
1512
+ }
1513
+ if (auto* p = poll.value_if_ready()) {
1514
+ if (Traits::IsOk(*p)) {
1515
+ ready.set(1);
1516
+ Destruct(&promise1);
1517
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
1518
+ } else {
1519
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1520
+ }
1521
+ }
1522
+ } else if (grpc_trace_promise_primitives.enabled()) {
1523
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/8 already ready", this);
1524
+ }
1525
+ if (!ready.is_set(2)) {
1526
+ if (grpc_trace_promise_primitives.enabled()) {
1527
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 3/8", this);
1528
+ }
1529
+ auto poll = promise2();
1530
+ if (grpc_trace_promise_primitives.enabled()) {
1531
+ auto* p = poll.value_if_ready();
1532
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/8 %s", this,
1533
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1534
+ : "pending");
1535
+ }
1536
+ if (auto* p = poll.value_if_ready()) {
1537
+ if (Traits::IsOk(*p)) {
1538
+ ready.set(2);
1539
+ Destruct(&promise2);
1540
+ Construct(&result2, Traits::Unwrapped(std::move(*p)));
1541
+ } else {
1542
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1543
+ }
1544
+ }
1545
+ } else if (grpc_trace_promise_primitives.enabled()) {
1546
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/8 already ready", this);
1547
+ }
1548
+ if (!ready.is_set(3)) {
1549
+ if (grpc_trace_promise_primitives.enabled()) {
1550
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 4/8", this);
1551
+ }
1552
+ auto poll = promise3();
1553
+ if (grpc_trace_promise_primitives.enabled()) {
1554
+ auto* p = poll.value_if_ready();
1555
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/8 %s", this,
1556
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1557
+ : "pending");
1558
+ }
1559
+ if (auto* p = poll.value_if_ready()) {
1560
+ if (Traits::IsOk(*p)) {
1561
+ ready.set(3);
1562
+ Destruct(&promise3);
1563
+ Construct(&result3, Traits::Unwrapped(std::move(*p)));
1564
+ } else {
1565
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1566
+ }
1567
+ }
1568
+ } else if (grpc_trace_promise_primitives.enabled()) {
1569
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/8 already ready", this);
1570
+ }
1571
+ if (!ready.is_set(4)) {
1572
+ if (grpc_trace_promise_primitives.enabled()) {
1573
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 5/8", this);
1574
+ }
1575
+ auto poll = promise4();
1576
+ if (grpc_trace_promise_primitives.enabled()) {
1577
+ auto* p = poll.value_if_ready();
1578
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/8 %s", this,
1579
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1580
+ : "pending");
1581
+ }
1582
+ if (auto* p = poll.value_if_ready()) {
1583
+ if (Traits::IsOk(*p)) {
1584
+ ready.set(4);
1585
+ Destruct(&promise4);
1586
+ Construct(&result4, Traits::Unwrapped(std::move(*p)));
1587
+ } else {
1588
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1589
+ }
1590
+ }
1591
+ } else if (grpc_trace_promise_primitives.enabled()) {
1592
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/8 already ready", this);
1593
+ }
1594
+ if (!ready.is_set(5)) {
1595
+ if (grpc_trace_promise_primitives.enabled()) {
1596
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 6/8", this);
1597
+ }
1598
+ auto poll = promise5();
1599
+ if (grpc_trace_promise_primitives.enabled()) {
1600
+ auto* p = poll.value_if_ready();
1601
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/8 %s", this,
1602
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1603
+ : "pending");
1604
+ }
1605
+ if (auto* p = poll.value_if_ready()) {
1606
+ if (Traits::IsOk(*p)) {
1607
+ ready.set(5);
1608
+ Destruct(&promise5);
1609
+ Construct(&result5, Traits::Unwrapped(std::move(*p)));
1610
+ } else {
1611
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1612
+ }
1613
+ }
1614
+ } else if (grpc_trace_promise_primitives.enabled()) {
1615
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/8 already ready", this);
1616
+ }
1617
+ if (!ready.is_set(6)) {
1618
+ if (grpc_trace_promise_primitives.enabled()) {
1619
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 7/8", this);
1620
+ }
1621
+ auto poll = promise6();
1622
+ if (grpc_trace_promise_primitives.enabled()) {
1623
+ auto* p = poll.value_if_ready();
1624
+ gpr_log(GPR_DEBUG, "join[%p]: joint 7/8 %s", this,
1625
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1626
+ : "pending");
1627
+ }
1628
+ if (auto* p = poll.value_if_ready()) {
1629
+ if (Traits::IsOk(*p)) {
1630
+ ready.set(6);
1631
+ Destruct(&promise6);
1632
+ Construct(&result6, Traits::Unwrapped(std::move(*p)));
1633
+ } else {
1634
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1635
+ }
1636
+ }
1637
+ } else if (grpc_trace_promise_primitives.enabled()) {
1638
+ gpr_log(GPR_DEBUG, "join[%p]: joint 7/8 already ready", this);
1639
+ }
1640
+ if (!ready.is_set(7)) {
1641
+ if (grpc_trace_promise_primitives.enabled()) {
1642
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 8/8", this);
1643
+ }
1644
+ auto poll = promise7();
1645
+ if (grpc_trace_promise_primitives.enabled()) {
1646
+ auto* p = poll.value_if_ready();
1647
+ gpr_log(GPR_DEBUG, "join[%p]: joint 8/8 %s", this,
1648
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1649
+ : "pending");
1650
+ }
1651
+ if (auto* p = poll.value_if_ready()) {
1652
+ if (Traits::IsOk(*p)) {
1653
+ ready.set(7);
1654
+ Destruct(&promise7);
1655
+ Construct(&result7, Traits::Unwrapped(std::move(*p)));
1656
+ } else {
1657
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1658
+ }
1659
+ }
1660
+ } else if (grpc_trace_promise_primitives.enabled()) {
1661
+ gpr_log(GPR_DEBUG, "join[%p]: joint 8/8 already ready", this);
1662
+ }
1663
+ if (ready.all()) {
1664
+ return Traits::FinalReturn(std::move(result0), std::move(result1),
1665
+ std::move(result2), std::move(result3),
1666
+ std::move(result4), std::move(result5),
1667
+ std::move(result6), std::move(result7));
1668
+ }
1669
+ return Pending{};
1670
+ }
1671
+ };
1672
+
1673
+ template <class Traits, typename P0, typename P1, typename P2, typename P3,
1674
+ typename P4, typename P5, typename P6, typename P7, typename P8>
1675
+ struct JoinState<Traits, P0, P1, P2, P3, P4, P5, P6, P7, P8> {
1676
+ template <typename T>
1677
+ using UnwrappedType = decltype(Traits::Unwrapped(std::declval<T>()));
1678
+ using Promise0 = PromiseLike<P0>;
1679
+ using Result0 = UnwrappedType<typename Promise0::Result>;
1680
+ union {
1681
+ GPR_NO_UNIQUE_ADDRESS Promise0 promise0;
1682
+ GPR_NO_UNIQUE_ADDRESS Result0 result0;
1683
+ };
1684
+ using Promise1 = PromiseLike<P1>;
1685
+ using Result1 = UnwrappedType<typename Promise1::Result>;
1686
+ union {
1687
+ GPR_NO_UNIQUE_ADDRESS Promise1 promise1;
1688
+ GPR_NO_UNIQUE_ADDRESS Result1 result1;
1689
+ };
1690
+ using Promise2 = PromiseLike<P2>;
1691
+ using Result2 = UnwrappedType<typename Promise2::Result>;
1692
+ union {
1693
+ GPR_NO_UNIQUE_ADDRESS Promise2 promise2;
1694
+ GPR_NO_UNIQUE_ADDRESS Result2 result2;
1695
+ };
1696
+ using Promise3 = PromiseLike<P3>;
1697
+ using Result3 = UnwrappedType<typename Promise3::Result>;
1698
+ union {
1699
+ GPR_NO_UNIQUE_ADDRESS Promise3 promise3;
1700
+ GPR_NO_UNIQUE_ADDRESS Result3 result3;
1701
+ };
1702
+ using Promise4 = PromiseLike<P4>;
1703
+ using Result4 = UnwrappedType<typename Promise4::Result>;
1704
+ union {
1705
+ GPR_NO_UNIQUE_ADDRESS Promise4 promise4;
1706
+ GPR_NO_UNIQUE_ADDRESS Result4 result4;
1707
+ };
1708
+ using Promise5 = PromiseLike<P5>;
1709
+ using Result5 = UnwrappedType<typename Promise5::Result>;
1710
+ union {
1711
+ GPR_NO_UNIQUE_ADDRESS Promise5 promise5;
1712
+ GPR_NO_UNIQUE_ADDRESS Result5 result5;
1713
+ };
1714
+ using Promise6 = PromiseLike<P6>;
1715
+ using Result6 = UnwrappedType<typename Promise6::Result>;
1716
+ union {
1717
+ GPR_NO_UNIQUE_ADDRESS Promise6 promise6;
1718
+ GPR_NO_UNIQUE_ADDRESS Result6 result6;
1719
+ };
1720
+ using Promise7 = PromiseLike<P7>;
1721
+ using Result7 = UnwrappedType<typename Promise7::Result>;
1722
+ union {
1723
+ GPR_NO_UNIQUE_ADDRESS Promise7 promise7;
1724
+ GPR_NO_UNIQUE_ADDRESS Result7 result7;
1725
+ };
1726
+ using Promise8 = PromiseLike<P8>;
1727
+ using Result8 = UnwrappedType<typename Promise8::Result>;
1728
+ union {
1729
+ GPR_NO_UNIQUE_ADDRESS Promise8 promise8;
1730
+ GPR_NO_UNIQUE_ADDRESS Result8 result8;
1731
+ };
1732
+ GPR_NO_UNIQUE_ADDRESS BitSet<9> ready;
1733
+ JoinState(P0&& p0, P1&& p1, P2&& p2, P3&& p3, P4&& p4, P5&& p5, P6&& p6,
1734
+ P7&& p7, P8&& p8) {
1735
+ Construct(&promise0, std::forward<P0>(p0));
1736
+ Construct(&promise1, std::forward<P1>(p1));
1737
+ Construct(&promise2, std::forward<P2>(p2));
1738
+ Construct(&promise3, std::forward<P3>(p3));
1739
+ Construct(&promise4, std::forward<P4>(p4));
1740
+ Construct(&promise5, std::forward<P5>(p5));
1741
+ Construct(&promise6, std::forward<P6>(p6));
1742
+ Construct(&promise7, std::forward<P7>(p7));
1743
+ Construct(&promise8, std::forward<P8>(p8));
1744
+ }
1745
+ JoinState(const JoinState& other) {
1746
+ GPR_ASSERT(other.ready.none());
1747
+ Construct(&promise0, other.promise0);
1748
+ Construct(&promise1, other.promise1);
1749
+ Construct(&promise2, other.promise2);
1750
+ Construct(&promise3, other.promise3);
1751
+ Construct(&promise4, other.promise4);
1752
+ Construct(&promise5, other.promise5);
1753
+ Construct(&promise6, other.promise6);
1754
+ Construct(&promise7, other.promise7);
1755
+ Construct(&promise8, other.promise8);
1756
+ }
1757
+ JoinState& operator=(const JoinState& other) = delete;
1758
+ JoinState& operator=(JoinState&& other) = delete;
1759
+ JoinState(JoinState&& other) noexcept : ready(other.ready) {
1760
+ if (ready.is_set(0)) {
1761
+ Construct(&result0, std::move(other.result0));
1762
+ } else {
1763
+ Construct(&promise0, std::move(other.promise0));
1764
+ }
1765
+ if (ready.is_set(1)) {
1766
+ Construct(&result1, std::move(other.result1));
1767
+ } else {
1768
+ Construct(&promise1, std::move(other.promise1));
1769
+ }
1770
+ if (ready.is_set(2)) {
1771
+ Construct(&result2, std::move(other.result2));
1772
+ } else {
1773
+ Construct(&promise2, std::move(other.promise2));
1774
+ }
1775
+ if (ready.is_set(3)) {
1776
+ Construct(&result3, std::move(other.result3));
1777
+ } else {
1778
+ Construct(&promise3, std::move(other.promise3));
1779
+ }
1780
+ if (ready.is_set(4)) {
1781
+ Construct(&result4, std::move(other.result4));
1782
+ } else {
1783
+ Construct(&promise4, std::move(other.promise4));
1784
+ }
1785
+ if (ready.is_set(5)) {
1786
+ Construct(&result5, std::move(other.result5));
1787
+ } else {
1788
+ Construct(&promise5, std::move(other.promise5));
1789
+ }
1790
+ if (ready.is_set(6)) {
1791
+ Construct(&result6, std::move(other.result6));
1792
+ } else {
1793
+ Construct(&promise6, std::move(other.promise6));
1794
+ }
1795
+ if (ready.is_set(7)) {
1796
+ Construct(&result7, std::move(other.result7));
1797
+ } else {
1798
+ Construct(&promise7, std::move(other.promise7));
1799
+ }
1800
+ if (ready.is_set(8)) {
1801
+ Construct(&result8, std::move(other.result8));
1802
+ } else {
1803
+ Construct(&promise8, std::move(other.promise8));
1804
+ }
1805
+ }
1806
+ ~JoinState() {
1807
+ if (ready.is_set(0)) {
1808
+ Destruct(&result0);
1809
+ } else {
1810
+ Destruct(&promise0);
1811
+ }
1812
+ if (ready.is_set(1)) {
1813
+ Destruct(&result1);
1814
+ } else {
1815
+ Destruct(&promise1);
1816
+ }
1817
+ if (ready.is_set(2)) {
1818
+ Destruct(&result2);
1819
+ } else {
1820
+ Destruct(&promise2);
1821
+ }
1822
+ if (ready.is_set(3)) {
1823
+ Destruct(&result3);
1824
+ } else {
1825
+ Destruct(&promise3);
1826
+ }
1827
+ if (ready.is_set(4)) {
1828
+ Destruct(&result4);
1829
+ } else {
1830
+ Destruct(&promise4);
1831
+ }
1832
+ if (ready.is_set(5)) {
1833
+ Destruct(&result5);
1834
+ } else {
1835
+ Destruct(&promise5);
1836
+ }
1837
+ if (ready.is_set(6)) {
1838
+ Destruct(&result6);
1839
+ } else {
1840
+ Destruct(&promise6);
1841
+ }
1842
+ if (ready.is_set(7)) {
1843
+ Destruct(&result7);
1844
+ } else {
1845
+ Destruct(&promise7);
1846
+ }
1847
+ if (ready.is_set(8)) {
1848
+ Destruct(&result8);
1849
+ } else {
1850
+ Destruct(&promise8);
1851
+ }
1852
+ }
1853
+ using Result = typename Traits::template ResultType<
1854
+ std::tuple<Result0, Result1, Result2, Result3, Result4, Result5, Result6,
1855
+ Result7, Result8>>;
1856
+ Poll<Result> PollOnce() {
1857
+ if (!ready.is_set(0)) {
1858
+ if (grpc_trace_promise_primitives.enabled()) {
1859
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 1/9", this);
1860
+ }
1861
+ auto poll = promise0();
1862
+ if (grpc_trace_promise_primitives.enabled()) {
1863
+ auto* p = poll.value_if_ready();
1864
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/9 %s", this,
1865
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1866
+ : "pending");
1867
+ }
1868
+ if (auto* p = poll.value_if_ready()) {
1869
+ if (Traits::IsOk(*p)) {
1870
+ ready.set(0);
1871
+ Destruct(&promise0);
1872
+ Construct(&result0, Traits::Unwrapped(std::move(*p)));
1873
+ } else {
1874
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1875
+ }
1876
+ }
1877
+ } else if (grpc_trace_promise_primitives.enabled()) {
1878
+ gpr_log(GPR_DEBUG, "join[%p]: joint 1/9 already ready", this);
1879
+ }
1880
+ if (!ready.is_set(1)) {
1881
+ if (grpc_trace_promise_primitives.enabled()) {
1882
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 2/9", this);
1883
+ }
1884
+ auto poll = promise1();
1885
+ if (grpc_trace_promise_primitives.enabled()) {
1886
+ auto* p = poll.value_if_ready();
1887
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/9 %s", this,
1888
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1889
+ : "pending");
1890
+ }
1891
+ if (auto* p = poll.value_if_ready()) {
1892
+ if (Traits::IsOk(*p)) {
1893
+ ready.set(1);
1894
+ Destruct(&promise1);
1895
+ Construct(&result1, Traits::Unwrapped(std::move(*p)));
1896
+ } else {
1897
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1898
+ }
1899
+ }
1900
+ } else if (grpc_trace_promise_primitives.enabled()) {
1901
+ gpr_log(GPR_DEBUG, "join[%p]: joint 2/9 already ready", this);
1902
+ }
1903
+ if (!ready.is_set(2)) {
1904
+ if (grpc_trace_promise_primitives.enabled()) {
1905
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 3/9", this);
1906
+ }
1907
+ auto poll = promise2();
1908
+ if (grpc_trace_promise_primitives.enabled()) {
1909
+ auto* p = poll.value_if_ready();
1910
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/9 %s", this,
1911
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1912
+ : "pending");
1913
+ }
1914
+ if (auto* p = poll.value_if_ready()) {
1915
+ if (Traits::IsOk(*p)) {
1916
+ ready.set(2);
1917
+ Destruct(&promise2);
1918
+ Construct(&result2, Traits::Unwrapped(std::move(*p)));
1919
+ } else {
1920
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1921
+ }
1922
+ }
1923
+ } else if (grpc_trace_promise_primitives.enabled()) {
1924
+ gpr_log(GPR_DEBUG, "join[%p]: joint 3/9 already ready", this);
1925
+ }
1926
+ if (!ready.is_set(3)) {
1927
+ if (grpc_trace_promise_primitives.enabled()) {
1928
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 4/9", this);
1929
+ }
1930
+ auto poll = promise3();
1931
+ if (grpc_trace_promise_primitives.enabled()) {
1932
+ auto* p = poll.value_if_ready();
1933
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/9 %s", this,
1934
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1935
+ : "pending");
1936
+ }
1937
+ if (auto* p = poll.value_if_ready()) {
1938
+ if (Traits::IsOk(*p)) {
1939
+ ready.set(3);
1940
+ Destruct(&promise3);
1941
+ Construct(&result3, Traits::Unwrapped(std::move(*p)));
1942
+ } else {
1943
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1944
+ }
1945
+ }
1946
+ } else if (grpc_trace_promise_primitives.enabled()) {
1947
+ gpr_log(GPR_DEBUG, "join[%p]: joint 4/9 already ready", this);
1948
+ }
1949
+ if (!ready.is_set(4)) {
1950
+ if (grpc_trace_promise_primitives.enabled()) {
1951
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 5/9", this);
1952
+ }
1953
+ auto poll = promise4();
1954
+ if (grpc_trace_promise_primitives.enabled()) {
1955
+ auto* p = poll.value_if_ready();
1956
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/9 %s", this,
1957
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1958
+ : "pending");
1959
+ }
1960
+ if (auto* p = poll.value_if_ready()) {
1961
+ if (Traits::IsOk(*p)) {
1962
+ ready.set(4);
1963
+ Destruct(&promise4);
1964
+ Construct(&result4, Traits::Unwrapped(std::move(*p)));
1965
+ } else {
1966
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1967
+ }
1968
+ }
1969
+ } else if (grpc_trace_promise_primitives.enabled()) {
1970
+ gpr_log(GPR_DEBUG, "join[%p]: joint 5/9 already ready", this);
1971
+ }
1972
+ if (!ready.is_set(5)) {
1973
+ if (grpc_trace_promise_primitives.enabled()) {
1974
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 6/9", this);
1975
+ }
1976
+ auto poll = promise5();
1977
+ if (grpc_trace_promise_primitives.enabled()) {
1978
+ auto* p = poll.value_if_ready();
1979
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/9 %s", this,
1980
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
1981
+ : "pending");
1982
+ }
1983
+ if (auto* p = poll.value_if_ready()) {
1984
+ if (Traits::IsOk(*p)) {
1985
+ ready.set(5);
1986
+ Destruct(&promise5);
1987
+ Construct(&result5, Traits::Unwrapped(std::move(*p)));
1988
+ } else {
1989
+ return Traits::template EarlyReturn<Result>(std::move(*p));
1990
+ }
1991
+ }
1992
+ } else if (grpc_trace_promise_primitives.enabled()) {
1993
+ gpr_log(GPR_DEBUG, "join[%p]: joint 6/9 already ready", this);
1994
+ }
1995
+ if (!ready.is_set(6)) {
1996
+ if (grpc_trace_promise_primitives.enabled()) {
1997
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 7/9", this);
1998
+ }
1999
+ auto poll = promise6();
2000
+ if (grpc_trace_promise_primitives.enabled()) {
2001
+ auto* p = poll.value_if_ready();
2002
+ gpr_log(GPR_DEBUG, "join[%p]: joint 7/9 %s", this,
2003
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
2004
+ : "pending");
2005
+ }
2006
+ if (auto* p = poll.value_if_ready()) {
2007
+ if (Traits::IsOk(*p)) {
2008
+ ready.set(6);
2009
+ Destruct(&promise6);
2010
+ Construct(&result6, Traits::Unwrapped(std::move(*p)));
2011
+ } else {
2012
+ return Traits::template EarlyReturn<Result>(std::move(*p));
2013
+ }
2014
+ }
2015
+ } else if (grpc_trace_promise_primitives.enabled()) {
2016
+ gpr_log(GPR_DEBUG, "join[%p]: joint 7/9 already ready", this);
2017
+ }
2018
+ if (!ready.is_set(7)) {
2019
+ if (grpc_trace_promise_primitives.enabled()) {
2020
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 8/9", this);
2021
+ }
2022
+ auto poll = promise7();
2023
+ if (grpc_trace_promise_primitives.enabled()) {
2024
+ auto* p = poll.value_if_ready();
2025
+ gpr_log(GPR_DEBUG, "join[%p]: joint 8/9 %s", this,
2026
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
2027
+ : "pending");
2028
+ }
2029
+ if (auto* p = poll.value_if_ready()) {
2030
+ if (Traits::IsOk(*p)) {
2031
+ ready.set(7);
2032
+ Destruct(&promise7);
2033
+ Construct(&result7, Traits::Unwrapped(std::move(*p)));
2034
+ } else {
2035
+ return Traits::template EarlyReturn<Result>(std::move(*p));
2036
+ }
2037
+ }
2038
+ } else if (grpc_trace_promise_primitives.enabled()) {
2039
+ gpr_log(GPR_DEBUG, "join[%p]: joint 8/9 already ready", this);
2040
+ }
2041
+ if (!ready.is_set(8)) {
2042
+ if (grpc_trace_promise_primitives.enabled()) {
2043
+ gpr_log(GPR_DEBUG, "join[%p]: begin poll joint 9/9", this);
2044
+ }
2045
+ auto poll = promise8();
2046
+ if (grpc_trace_promise_primitives.enabled()) {
2047
+ auto* p = poll.value_if_ready();
2048
+ gpr_log(GPR_DEBUG, "join[%p]: joint 9/9 %s", this,
2049
+ p != nullptr ? (Traits::IsOk(*p) ? "ready" : "early-error")
2050
+ : "pending");
2051
+ }
2052
+ if (auto* p = poll.value_if_ready()) {
2053
+ if (Traits::IsOk(*p)) {
2054
+ ready.set(8);
2055
+ Destruct(&promise8);
2056
+ Construct(&result8, Traits::Unwrapped(std::move(*p)));
2057
+ } else {
2058
+ return Traits::template EarlyReturn<Result>(std::move(*p));
2059
+ }
2060
+ }
2061
+ } else if (grpc_trace_promise_primitives.enabled()) {
2062
+ gpr_log(GPR_DEBUG, "join[%p]: joint 9/9 already ready", this);
2063
+ }
2064
+ if (ready.all()) {
2065
+ return Traits::FinalReturn(
2066
+ std::move(result0), std::move(result1), std::move(result2),
2067
+ std::move(result3), std::move(result4), std::move(result5),
2068
+ std::move(result6), std::move(result7), std::move(result8));
2069
+ }
2070
+ return Pending{};
2071
+ }
2072
+ };
2073
+
2074
+ } // namespace promise_detail
2075
+ } // namespace grpc_core
2076
+
2077
+ #endif // GRPC_SRC_CORE_LIB_PROMISE_DETAIL_JOIN_STATE_H