• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *
3  * Copyright 2016 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/lib/channel/handshaker_registry.h"
22 
23 #include <string.h>
24 
25 #include <grpc/support/alloc.h>
26 
27 //
28 // grpc_handshaker_factory_list
29 //
30 
31 typedef struct {
32   grpc_handshaker_factory** list;
33   size_t num_factories;
34 } grpc_handshaker_factory_list;
35 
grpc_handshaker_factory_list_register(grpc_handshaker_factory_list * list,bool at_start,grpc_handshaker_factory * factory)36 static void grpc_handshaker_factory_list_register(
37     grpc_handshaker_factory_list* list, bool at_start,
38     grpc_handshaker_factory* factory) {
39   list->list = static_cast<grpc_handshaker_factory**>(gpr_realloc(
40       list->list,
41       (list->num_factories + 1) * sizeof(grpc_handshaker_factory*)));
42   if (at_start) {
43     memmove(list->list + 1, list->list,
44             sizeof(grpc_handshaker_factory*) * list->num_factories);
45     list->list[0] = factory;
46   } else {
47     list->list[list->num_factories] = factory;
48   }
49   ++list->num_factories;
50 }
51 
grpc_handshaker_factory_list_add_handshakers(grpc_handshaker_factory_list * list,const grpc_channel_args * args,grpc_handshake_manager * handshake_mgr)52 static void grpc_handshaker_factory_list_add_handshakers(
53     grpc_handshaker_factory_list* list, const grpc_channel_args* args,
54     grpc_handshake_manager* handshake_mgr) {
55   for (size_t i = 0; i < list->num_factories; ++i) {
56     grpc_handshaker_factory_add_handshakers(list->list[i], args, handshake_mgr);
57   }
58 }
59 
grpc_handshaker_factory_list_destroy(grpc_handshaker_factory_list * list)60 static void grpc_handshaker_factory_list_destroy(
61     grpc_handshaker_factory_list* list) {
62   for (size_t i = 0; i < list->num_factories; ++i) {
63     grpc_handshaker_factory_destroy(list->list[i]);
64   }
65   gpr_free(list->list);
66 }
67 
68 //
69 // plugin
70 //
71 
72 static grpc_handshaker_factory_list
73     g_handshaker_factory_lists[NUM_HANDSHAKER_TYPES];
74 
grpc_handshaker_factory_registry_init()75 void grpc_handshaker_factory_registry_init() {
76   memset(g_handshaker_factory_lists, 0, sizeof(g_handshaker_factory_lists));
77 }
78 
grpc_handshaker_factory_registry_shutdown()79 void grpc_handshaker_factory_registry_shutdown() {
80   for (size_t i = 0; i < NUM_HANDSHAKER_TYPES; ++i) {
81     grpc_handshaker_factory_list_destroy(&g_handshaker_factory_lists[i]);
82   }
83 }
84 
grpc_handshaker_factory_register(bool at_start,grpc_handshaker_type handshaker_type,grpc_handshaker_factory * factory)85 void grpc_handshaker_factory_register(bool at_start,
86                                       grpc_handshaker_type handshaker_type,
87                                       grpc_handshaker_factory* factory) {
88   grpc_handshaker_factory_list_register(
89       &g_handshaker_factory_lists[handshaker_type], at_start, factory);
90 }
91 
grpc_handshakers_add(grpc_handshaker_type handshaker_type,const grpc_channel_args * args,grpc_handshake_manager * handshake_mgr)92 void grpc_handshakers_add(grpc_handshaker_type handshaker_type,
93                           const grpc_channel_args* args,
94                           grpc_handshake_manager* handshake_mgr) {
95   grpc_handshaker_factory_list_add_handshakers(
96       &g_handshaker_factory_lists[handshaker_type], args, handshake_mgr);
97 }
98