• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include <grpc/support/port_platform.h>
20 
21 #include "src/core/ext/filters/client_channel/lb_policy_registry.h"
22 
23 #include <string.h>
24 
25 #include "src/core/lib/gpr/string.h"
26 #include "src/core/lib/gprpp/inlined_vector.h"
27 
28 namespace grpc_core {
29 
30 namespace {
31 
32 class RegistryState {
33  public:
RegistryState()34   RegistryState() {}
35 
RegisterLoadBalancingPolicyFactory(UniquePtr<LoadBalancingPolicyFactory> factory)36   void RegisterLoadBalancingPolicyFactory(
37       UniquePtr<LoadBalancingPolicyFactory> factory) {
38     for (size_t i = 0; i < factories_.size(); ++i) {
39       GPR_ASSERT(strcmp(factories_[i]->name(), factory->name()) != 0);
40     }
41     factories_.push_back(std::move(factory));
42   }
43 
GetLoadBalancingPolicyFactory(const char * name) const44   LoadBalancingPolicyFactory* GetLoadBalancingPolicyFactory(
45       const char* name) const {
46     for (size_t i = 0; i < factories_.size(); ++i) {
47       if (strcmp(name, factories_[i]->name()) == 0) {
48         return factories_[i].get();
49       }
50     }
51     return nullptr;
52   }
53 
54  private:
55   InlinedVector<UniquePtr<LoadBalancingPolicyFactory>, 10> factories_;
56 };
57 
58 RegistryState* g_state = nullptr;
59 
60 }  // namespace
61 
62 //
63 // LoadBalancingPolicyRegistry::Builder
64 //
65 
InitRegistry()66 void LoadBalancingPolicyRegistry::Builder::InitRegistry() {
67   if (g_state == nullptr) g_state = New<RegistryState>();
68 }
69 
ShutdownRegistry()70 void LoadBalancingPolicyRegistry::Builder::ShutdownRegistry() {
71   Delete(g_state);
72   g_state = nullptr;
73 }
74 
RegisterLoadBalancingPolicyFactory(UniquePtr<LoadBalancingPolicyFactory> factory)75 void LoadBalancingPolicyRegistry::Builder::RegisterLoadBalancingPolicyFactory(
76     UniquePtr<LoadBalancingPolicyFactory> factory) {
77   InitRegistry();
78   g_state->RegisterLoadBalancingPolicyFactory(std::move(factory));
79 }
80 
81 //
82 // LoadBalancingPolicyRegistry
83 //
84 
85 OrphanablePtr<LoadBalancingPolicy>
CreateLoadBalancingPolicy(const char * name,const LoadBalancingPolicy::Args & args)86 LoadBalancingPolicyRegistry::CreateLoadBalancingPolicy(
87     const char* name, const LoadBalancingPolicy::Args& args) {
88   GPR_ASSERT(g_state != nullptr);
89   // Find factory.
90   LoadBalancingPolicyFactory* factory =
91       g_state->GetLoadBalancingPolicyFactory(name);
92   if (factory == nullptr) return nullptr;  // Specified name not found.
93   // Create policy via factory.
94   return factory->CreateLoadBalancingPolicy(args);
95 }
96 
97 }  // namespace grpc_core
98