Revert "[promises] Eliminate switch.h (#30317)" (#31523)

This reverts commit c866d65966.
pull/31536/head
Craig Tiller 2 years ago committed by GitHub
parent da65d4777f
commit 107beb7435
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      build_autogenerated.yaml
  2. 2
      gRPC-C++.podspec
  3. 2
      gRPC-Core.podspec
  4. 1
      grpc.gemspec
  5. 1
      package.xml
  6. 10
      src/core/BUILD
  7. 35
      src/core/lib/promise/detail/basic_seq.h
  8. 1455
      src/core/lib/promise/detail/switch.h
  9. 75
      tools/codegen/core/gen_switch.py
  10. 1
      tools/doxygen/Doxyfile.c++.internal
  11. 1
      tools/doxygen/Doxyfile.core.internal

@ -884,6 +884,7 @@ libs:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- src/core/lib/promise/intra_activity_waiter.h
@ -2141,6 +2142,7 @@ libs:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- src/core/lib/promise/intra_activity_waiter.h
@ -3775,6 +3777,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/join.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/promise.h
@ -5058,6 +5061,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
@ -6327,6 +6331,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/map.h
@ -6418,6 +6423,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- src/core/lib/promise/intra_activity_waiter.h
@ -7740,6 +7746,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/join.h
- src/core/lib/promise/latch.h
@ -7811,6 +7818,7 @@ targets:
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/loop.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/seq.h
@ -7857,6 +7865,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- src/core/lib/promise/intra_activity_waiter.h
@ -8195,6 +8204,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/observable.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/promise.h
@ -8507,6 +8517,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/intra_activity_waiter.h
- src/core/lib/promise/join.h
@ -9222,6 +9233,7 @@ targets:
- src/core/lib/promise/detail/basic_seq.h
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/seq.h
src:
@ -10817,6 +10829,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/exec_ctx_wakeup_scheduler.h
- src/core/lib/promise/for_each.h
- src/core/lib/promise/intra_activity_waiter.h
@ -10914,6 +10927,7 @@ targets:
- src/core/lib/promise/detail/promise_factory.h
- src/core/lib/promise/detail/promise_like.h
- src/core/lib/promise/detail/status.h
- src/core/lib/promise/detail/switch.h
- src/core/lib/promise/poll.h
- src/core/lib/promise/try_seq.h
src:

2
gRPC-C++.podspec generated

@ -850,6 +850,7 @@ Pod::Spec.new do |s|
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',
@ -1729,6 +1730,7 @@ Pod::Spec.new do |s|
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',

2
gRPC-Core.podspec generated

@ -1376,6 +1376,7 @@ Pod::Spec.new do |s|
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',
@ -2364,6 +2365,7 @@ Pod::Spec.new do |s|
'src/core/lib/promise/detail/promise_factory.h',
'src/core/lib/promise/detail/promise_like.h',
'src/core/lib/promise/detail/status.h',
'src/core/lib/promise/detail/switch.h',
'src/core/lib/promise/exec_ctx_wakeup_scheduler.h',
'src/core/lib/promise/for_each.h',
'src/core/lib/promise/intra_activity_waiter.h',

1
grpc.gemspec generated

@ -1287,6 +1287,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/promise/detail/promise_factory.h )
s.files += %w( src/core/lib/promise/detail/promise_like.h )
s.files += %w( src/core/lib/promise/detail/status.h )
s.files += %w( src/core/lib/promise/detail/switch.h )
s.files += %w( src/core/lib/promise/exec_ctx_wakeup_scheduler.h )
s.files += %w( src/core/lib/promise/for_each.h )
s.files += %w( src/core/lib/promise/intra_activity_waiter.h )

1
package.xml generated

@ -1269,6 +1269,7 @@
<file baseinstalldir="/" name="src/core/lib/promise/detail/promise_factory.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/promise/detail/promise_like.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/promise/detail/status.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/promise/detail/switch.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/promise/exec_ctx_wakeup_scheduler.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/promise/for_each.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/promise/intra_activity_waiter.h" role="src" />

@ -594,6 +594,15 @@ grpc_cc_library(
],
)
grpc_cc_library(
name = "switch",
language = "c++",
public_hdrs = [
"lib/promise/detail/switch.h",
],
deps = ["//:gpr_platform"],
)
grpc_cc_library(
name = "basic_seq",
external_deps = [
@ -610,6 +619,7 @@ grpc_cc_library(
"poll",
"promise_factory",
"promise_like",
"switch",
"//:gpr_platform",
],
)

@ -17,8 +17,6 @@
#include <grpc/support/port_platform.h>
#include <stddef.h>
#include <array>
#include <cassert>
#include <new>
@ -32,29 +30,12 @@
#include "src/core/lib/gprpp/construct_destruct.h"
#include "src/core/lib/promise/detail/promise_factory.h"
#include "src/core/lib/promise/detail/promise_like.h"
#include "src/core/lib/promise/detail/switch.h"
#include "src/core/lib/promise/poll.h"
namespace grpc_core {
namespace promise_detail {
// Given f0, ..., fn, call function idx and return the result.
template <typename R, typename A, R (*... f)(A* arg)>
class JumpTable {
public:
JumpTable() = delete;
JumpTable(const JumpTable&) = delete;
static R Run(size_t idx, A* arg) { return fs_[idx](arg); }
private:
using Fn = R (*)(A* arg);
static const Fn fs_[sizeof...(f)];
};
template <typename R, typename A, R (*... f)(A* arg)>
const typename JumpTable<R, A, f...>::Fn
JumpTable<R, A, f...>::fs_[sizeof...(f)] = {f...};
// Helper for SeqState to evaluate some common types to all partial
// specializations.
template <template <typename> class Traits, typename FPromise, typename FNext>
@ -353,14 +334,16 @@ class BasicSeq {
// parameter unpacking can work.
template <char I>
struct RunStateStruct {
static Poll<Result> Run(BasicSeq* s) { return s->RunState<I>(); }
BasicSeq* s;
Poll<Result> operator()() { return s->RunState<I>(); }
};
// Similarly placate those compilers for
// DestructCurrentPromiseAndSubsequentFactories
template <char I>
struct DestructCurrentPromiseAndSubsequentFactoriesStruct {
static void Run(BasicSeq* s) {
BasicSeq* s;
void operator()() {
return s->DestructCurrentPromiseAndSubsequentFactories<I>();
}
};
@ -373,8 +356,7 @@ class BasicSeq {
// Duff's device like mechanic for evaluating sequences.
template <char... I>
Poll<Result> Run(absl::integer_sequence<char, I...>) {
return JumpTable<Poll<Result>, BasicSeq, RunStateStruct<I>::Run...>::Run(
state_, this);
return Switch<Poll<Result>>(state_, RunStateStruct<I>{this}...);
}
// Run the appropriate destructors for a given state.
@ -384,9 +366,8 @@ class BasicSeq {
// which can choose the correct instance at runtime to destroy everything.
template <char... I>
void RunDestruct(absl::integer_sequence<char, I...>) {
JumpTable<void, BasicSeq,
DestructCurrentPromiseAndSubsequentFactoriesStruct<I>::Run...>::
Run(state_, this);
Switch<void>(
state_, DestructCurrentPromiseAndSubsequentFactoriesStruct<I>{this}...);
}
public:

File diff suppressed because it is too large Load Diff

@ -0,0 +1,75 @@
#!/usr/bin/env python3
# Copyright 2021 gRPC authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
# utility: print a big comment block into a set of files
def put_banner(files, banner):
for f in files:
print('/*', file=f)
for line in banner:
print(' * %s' % line, file=f)
print(' */', file=f)
print('', file=f)
with open('src/core/lib/promise/detail/switch.h', 'w') as H:
# copy-paste copyright notice from this file
with open(sys.argv[0]) as my_source:
copyright = []
for line in my_source:
if line[0] != '#':
break
for line in my_source:
if line[0] == '#':
copyright.append(line)
break
for line in my_source:
if line[0] != '#':
break
copyright.append(line)
put_banner([H], [line[2:].rstrip() for line in copyright])
put_banner([H], ["Automatically generated by %s" % sys.argv[0]])
print("#ifndef GRPC_CORE_LIB_PROMISE_DETAIL_SWITCH_H", file=H)
print("#define GRPC_CORE_LIB_PROMISE_DETAIL_SWITCH_H", file=H)
print('', file=H)
print('#include <grpc/impl/codegen/port_platform.h>', file=H)
print('', file=H)
print("#include <stdlib.h>", file=H)
print('', file=H)
print("namespace grpc_core {", file=H)
for n in range(1, 33):
print('', file=H)
print("template <typename R, %s> R Switch(char idx, %s) {" % (
", ".join("typename F%d" % i for i in range(0, n)),
", ".join("F%d f%d" % (i, i) for i in range(0, n)),
),
file=H)
print(" switch (idx) {", file=H)
for i in range(0, n):
print(" case %d: return f%d();" % (i, i), file=H)
print(" }", file=H)
print(" abort();", file=H)
print("}", file=H)
print('', file=H)
print("}", file=H)
print('', file=H)
print("#endif // GRPC_CORE_LIB_PROMISE_DETAIL_SWITCH_H", file=H)

@ -2275,6 +2275,7 @@ src/core/lib/promise/detail/basic_seq.h \
src/core/lib/promise/detail/promise_factory.h \
src/core/lib/promise/detail/promise_like.h \
src/core/lib/promise/detail/status.h \
src/core/lib/promise/detail/switch.h \
src/core/lib/promise/exec_ctx_wakeup_scheduler.h \
src/core/lib/promise/for_each.h \
src/core/lib/promise/intra_activity_waiter.h \

@ -2063,6 +2063,7 @@ src/core/lib/promise/detail/basic_seq.h \
src/core/lib/promise/detail/promise_factory.h \
src/core/lib/promise/detail/promise_like.h \
src/core/lib/promise/detail/status.h \
src/core/lib/promise/detail/switch.h \
src/core/lib/promise/exec_ctx_wakeup_scheduler.h \
src/core/lib/promise/for_each.h \
src/core/lib/promise/intra_activity_waiter.h \

Loading…
Cancel
Save