core_configuration.h
Go to the documentation of this file.
1 // Copyright 2021 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_CORE_LIB_CONFIG_CORE_CONFIGURATION_H
16 #define GRPC_CORE_LIB_CONFIG_CORE_CONFIGURATION_H
17 
19 
20 #include <atomic>
21 #include <functional>
22 
29 
30 namespace grpc_core {
31 
32 // Global singleton that stores library configuration - factories, etc...
33 // that plugins might choose to extend.
35  public:
36  CoreConfiguration(const CoreConfiguration&) = delete;
38 
39  // Builder is passed to plugins, etc... at initialization time to collect
40  // their configuration and assemble the published CoreConfiguration.
41  class Builder {
42  public:
45  }
46 
48 
50  return &handshaker_registry_;
51  }
52 
55  }
56 
58  return &service_config_parser_;
59  }
60 
62  return &resolver_registry_;
63  }
64 
65  private:
66  friend class CoreConfiguration;
67 
74 
75  Builder();
77  };
78 
79  // Lifetime methods
80 
81  // Get the core configuration; if it does not exist, create it.
82  static const CoreConfiguration& Get() {
83  CoreConfiguration* p = config_.load(std::memory_order_acquire);
84  if (p != nullptr) {
85  return *p;
86  }
87  return BuildNewAndMaybeSet();
88  }
89 
90  // Build a special core configuration.
91  // Requires no concurrent Get() be called.
92  // Doesn't call the regular BuildCoreConfiguration function, instead calls
93  // `build`.
94  // BuildFunc is a callable that takes a Builder* and returns void.
95  // We use a template instead of std::function<void(Builder*)> to avoid
96  // including std::function in this widely used header, and to ensure no code
97  // is generated in programs that do not use this function.
98  // This is sometimes useful for testing.
99  template <typename BuildFunc>
100  static void BuildSpecialConfiguration(BuildFunc build) {
101  // Build bespoke configuration
103  build(&builder);
104  CoreConfiguration* p = builder.Build();
105  // Swap in final configuration, deleting anything that was already present.
106  delete config_.exchange(p, std::memory_order_release);
107  }
108 
109  // Attach a registration function globally.
110  // Each registration function is called *in addition to*
111  // BuildCoreConfiguration for the default core configuration. When using
112  // BuildSpecialConfiguration, one can use CallRegisteredBuilders to call them.
113  // Must be called before a configuration is built.
114  static void RegisterBuilder(std::function<void(Builder*)> builder);
115 
116  // Call all registered builders.
117  // See RegisterBuilder for why you might want to call this.
118  static void CallRegisteredBuilders(Builder* builder);
119 
120  // Drop the core configuration. Users must ensure no other threads are
121  // accessing the configuration.
122  // Clears any dynamically registered builders.
123  static void Reset();
124 
125  // Helper for tests: Reset the configuration, build a special one, run some
126  // code, and then reset the configuration again.
127  // Templatized to be sure no codegen in normal builds.
128  template <typename BuildFunc, typename RunFunc>
129  static void RunWithSpecialConfiguration(BuildFunc build_configuration,
130  RunFunc code_to_run) {
131  Reset();
132  BuildSpecialConfiguration(build_configuration);
133  code_to_run();
134  Reset();
135  }
136 
137  // Accessors
138 
141  }
142 
143  const ChannelInit& channel_init() const { return channel_init_; }
144 
146  return handshaker_registry_;
147  }
148 
151  }
152 
154  return service_config_parser_;
155  }
156 
158  return resolver_registry_;
159  }
160 
163  }
164 
165  private:
166  explicit CoreConfiguration(Builder* builder);
167 
168  // Stores a builder for RegisterBuilder
172  };
173 
174  // Create a new CoreConfiguration, and either set it or throw it away.
175  // We allow multiple CoreConfiguration's to be created in parallel.
176  static const CoreConfiguration& BuildNewAndMaybeSet();
177 
178  // The configuration
179  static std::atomic<CoreConfiguration*> config_;
180  // Extra registered builders
181  static std::atomic<RegisteredBuilder*> builders_;
182  // Default builder
184 
191 };
192 
194 
195 } // namespace grpc_core
196 
197 #endif /* GRPC_CORE_LIB_CONFIG_CORE_CONFIGURATION_H */
grpc_core::CoreConfiguration::service_config_parser_
ServiceConfigParser service_config_parser_
Definition: core_configuration.h:189
grpc_core::CoreConfiguration::channel_creds_registry
const ChannelCredsRegistry & channel_creds_registry() const
Definition: core_configuration.h:149
grpc_core::CoreConfiguration::BuildNewAndMaybeSet
static const CoreConfiguration & BuildNewAndMaybeSet()
Definition: core_configuration.cc:63
grpc_core::ServiceConfigParser::Builder
Definition: lib/service_config/service_config_parser.h:79
grpc_core::CoreConfiguration::CallRegisteredBuilders
static void CallRegisteredBuilders(Builder *builder)
grpc_core::ChannelInit::Builder
Definition: channel_init.h:46
grpc_core::CoreConfiguration::Builder::channel_args_preconditioning
ChannelArgsPreconditioning::Builder * channel_args_preconditioning()
Definition: core_configuration.h:43
grpc_core::ChannelArgsPreconditioning::Builder
Definition: channel_args_preconditioning.h:40
grpc_core::CoreConfiguration::service_config_parser
const ServiceConfigParser & service_config_parser() const
Definition: core_configuration.h:153
grpc_core::CoreConfiguration::SetDefaultBuilder
static void SetDefaultBuilder(void(*builder)(CoreConfiguration::Builder *))
Definition: core_configuration.h:161
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::CoreConfiguration::Builder
Definition: core_configuration.h:41
grpc_core::CoreConfiguration::Builder::channel_creds_registry_
ChannelCredsRegistry ::Builder channel_creds_registry_
Definition: core_configuration.h:71
grpc_core::CoreConfiguration::Builder::channel_init
ChannelInit::Builder * channel_init()
Definition: core_configuration.h:47
grpc_core::CoreConfiguration
Definition: core_configuration.h:34
grpc_core::CoreConfiguration::Builder::channel_creds_registry
ChannelCredsRegistry ::Builder * channel_creds_registry()
Definition: core_configuration.h:53
build
Definition: build.py:1
grpc_core::CoreConfiguration::Builder::resolver_registry_
ResolverRegistry::Builder resolver_registry_
Definition: core_configuration.h:73
xds_manager.p
p
Definition: xds_manager.py:60
grpc_core::ChannelArgsPreconditioning
Definition: channel_args_preconditioning.h:33
channel_creds_registry.h
grpc_core::CoreConfiguration::Builder::channel_args_preconditioning_
ChannelArgsPreconditioning::Builder channel_args_preconditioning_
Definition: core_configuration.h:68
channel_args_preconditioning.h
grpc_core::CoreConfiguration::BuildSpecialConfiguration
static void BuildSpecialConfiguration(BuildFunc build)
Definition: core_configuration.h:100
grpc_core::HandshakerRegistry
Definition: handshaker_registry.h:40
profile_analyzer.builder
builder
Definition: profile_analyzer.py:159
channel_init.h
grpc_core::ServiceConfigParser
Definition: lib/service_config/service_config_parser.h:41
grpc_core::CoreConfiguration::Get
static const CoreConfiguration & Get()
Definition: core_configuration.h:82
grpc_core::CoreConfiguration::Builder::service_config_parser_
ServiceConfigParser::Builder service_config_parser_
Definition: core_configuration.h:72
grpc_core::CoreConfiguration::Builder::resolver_registry
ResolverRegistry::Builder * resolver_registry()
Definition: core_configuration.h:61
grpc_core::ChannelInit
Definition: channel_init.h:40
grpc_core::CoreConfiguration::handshaker_registry_
HandshakerRegistry handshaker_registry_
Definition: core_configuration.h:187
handshaker_registry.h
grpc_core::CoreConfiguration::config_
static std::atomic< CoreConfiguration * > config_
Definition: core_configuration.h:179
grpc_core::CoreConfiguration::default_builder_
static void(* default_builder_)(CoreConfiguration::Builder *)
Definition: core_configuration.h:183
grpc_core::CoreConfiguration::handshaker_registry
const HandshakerRegistry & handshaker_registry() const
Definition: core_configuration.h:145
grpc_core::CoreConfiguration::Builder::Build
CoreConfiguration * Build()
Definition: core_configuration.cc:35
grpc_core::CoreConfiguration::Builder::channel_init_
ChannelInit::Builder channel_init_
Definition: core_configuration.h:69
grpc_core::CoreConfiguration::channel_args_preconditioning
const ChannelArgsPreconditioning & channel_args_preconditioning() const
Definition: core_configuration.h:139
resolver_registry.h
service_config_parser.h
grpc_core::ResolverRegistry::Builder
Definition: resolver_registry.h:51
grpc_core::CoreConfiguration::RegisterBuilder
static void RegisterBuilder(std::function< void(Builder *)> builder)
Definition: core_configuration.cc:48
Builder
Definition: bloaty/third_party/protobuf/ruby/ext/google/protobuf_c/protobuf.h:170
RunFunc
static void RunFunc(Benchmark *b, int iters, int arg)
Definition: re2/util/benchmark.cc:58
grpc_core::CoreConfiguration::operator=
CoreConfiguration & operator=(const CoreConfiguration &)=delete
grpc_core::CoreConfiguration::channel_creds_registry_
ChannelCredsRegistry channel_creds_registry_
Definition: core_configuration.h:188
grpc_core::ResolverRegistry
Definition: resolver_registry.h:39
grpc_core::CoreConfiguration::channel_init
const ChannelInit & channel_init() const
Definition: core_configuration.h:143
grpc_core::CoreConfiguration::channel_args_preconditioning_
ChannelArgsPreconditioning channel_args_preconditioning_
Definition: core_configuration.h:185
grpc_core::CoreConfiguration::Builder::service_config_parser
ServiceConfigParser::Builder * service_config_parser()
Definition: core_configuration.h:57
grpc_core::CoreConfiguration::Builder::handshaker_registry_
HandshakerRegistry::Builder handshaker_registry_
Definition: core_configuration.h:70
binary_size.build
def build(where, frameworks)
Definition: binary_size.py:80
grpc_core::BuildCoreConfiguration
void BuildCoreConfiguration(CoreConfiguration::Builder *builder)
Definition: grpc_plugin_registry.cc:109
grpc_core::ChannelCredsRegistry
Definition: channel_creds_registry.h:57
grpc_core::CoreConfiguration::Reset
static void Reset()
Definition: core_configuration.cc:96
grpc_core::CoreConfiguration::resolver_registry
const ResolverRegistry & resolver_registry() const
Definition: core_configuration.h:157
grpc_core::CoreConfiguration::RunWithSpecialConfiguration
static void RunWithSpecialConfiguration(BuildFunc build_configuration, RunFunc code_to_run)
Definition: core_configuration.h:129
grpc_core::CoreConfiguration::Builder::handshaker_registry
HandshakerRegistry::Builder * handshaker_registry()
Definition: core_configuration.h:49
grpc_core::CoreConfiguration::builders_
static std::atomic< RegisteredBuilder * > builders_
Definition: core_configuration.h:181
grpc_core::CoreConfiguration::CoreConfiguration
CoreConfiguration(const CoreConfiguration &)=delete
grpc_core::ChannelCredsRegistry::Builder
Definition: channel_creds_registry.h:62
grpc_core::CoreConfiguration::RegisteredBuilder::next
RegisteredBuilder * next
Definition: core_configuration.h:171
grpc_core::CoreConfiguration::channel_init_
ChannelInit channel_init_
Definition: core_configuration.h:186
function
std::function< bool(GrpcTool *, int, const char **, const CliCredentials &, GrpcToolOutputCallback)> function
Definition: grpc_tool.cc:250
grpc_core::HandshakerRegistry::Builder
Definition: handshaker_registry.h:42
grpc_core::CoreConfiguration::RegisteredBuilder
Definition: core_configuration.h:169
grpc_core::CoreConfiguration::Builder::Builder
Builder()
grpc_core::CoreConfiguration::resolver_registry_
ResolverRegistry resolver_registry_
Definition: core_configuration.h:190
grpc_core::CoreConfiguration::RegisteredBuilder::builder
std::function< void(Builder *)> builder
Definition: core_configuration.h:170
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 02:58:57