channel_args.h
Go to the documentation of this file.
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 #ifndef GRPC_CORE_LIB_CHANNEL_CHANNEL_ARGS_H
20 #define GRPC_CORE_LIB_CHANNEL_CHANNEL_ARGS_H
21 
23 
24 #include <stddef.h>
25 
26 #include <algorithm> // IWYU pragma: keep
27 #include <string>
28 #include <type_traits>
29 #include <utility>
30 
31 #include "absl/meta/type_traits.h"
32 #include "absl/strings/string_view.h"
33 #include "absl/types/optional.h"
34 #include "absl/types/variant.h"
35 
37 
38 #include "src/core/lib/avl/avl.h"
45 
46 // Channel args are intentionally immutable, to avoid the need for locking.
47 
48 namespace grpc_core {
49 
50 // Define a traits object for vtable lookup - allows us to integrate with
51 // existing code easily (just define the trait!) and allows some magic in
52 // ChannelArgs to automatically derive a vtable from a T*.
53 // To participate as a pointer, instances should expose the function:
54 // // Gets the vtable for this type
55 // static const grpc_channel_arg_vtable* VTable();
56 // // Performs any mutations required for channel args to own a pointer
57 // // Only needed if ChannelArgs::Set is to be called with a raw pointer.
58 // static void* TakeUnownedPointer(T* p);
59 template <typename T, typename Ignored = void /* for SFINAE */>
61 
62 // Specialization for ref-counted pointers.
63 // Types should expose:
64 // static int ChannelArgsCompare(const T* a, const T* b);
65 template <typename T>
67  T,
69  std::is_base_of<RefCounted<T>, T>::value ||
70  std::is_base_of<RefCounted<T, NonPolymorphicRefCount>, T>::value ||
71  std::is_base_of<DualRefCounted<T>, T>::value,
72  void>> {
73  static const grpc_arg_pointer_vtable* VTable() {
74  static const grpc_arg_pointer_vtable tbl = {
75  // copy
76  [](void* p) -> void* { return static_cast<T*>(p)->Ref().release(); },
77  // destroy
78  [](void* p) { static_cast<T*>(p)->Unref(); },
79  // compare
80  [](void* p1, void* p2) {
81  return T::ChannelArgsCompare(static_cast<const T*>(p1),
82  static_cast<const T*>(p2));
83  },
84  };
85  return &tbl;
86  };
87 };
88 
89 // If a type declares some member 'struct RawPointerChannelArgTag {}' then
90 // we automatically generate a vtable for it that does not do any ownership
91 // management and compares the type by pointer identity.
92 // This is intended to be relatively ugly because *most types should worry about
93 // ownership*.
94 template <typename T>
96  absl::void_t<typename T::RawPointerChannelArgTag>> {
97  static void* TakeUnownedPointer(T* p) { return p; }
98  static const grpc_arg_pointer_vtable* VTable() {
99  static const grpc_arg_pointer_vtable tbl = {
100  // copy
101  [](void* p) -> void* { return p; },
102  // destroy
103  [](void*) {},
104  // compare
105  [](void* p1, void* p2) { return QsortCompare(p1, p2); },
106  };
107  return &tbl;
108  };
109 };
110 
111 class ChannelArgs {
112  public:
113  class Pointer {
114  public:
116  : p_(p), vtable_(vtable == nullptr ? EmptyVTable() : vtable) {}
118 
119  Pointer(const Pointer& other)
120  : p_(other.vtable_->copy(other.p_)), vtable_(other.vtable_) {}
122  std::swap(p_, other.p_);
123  std::swap(vtable_, other.vtable_);
124  return *this;
125  }
126  Pointer(Pointer&& other) noexcept : p_(other.p_), vtable_(other.vtable_) {
127  other.p_ = nullptr;
128  other.vtable_ = EmptyVTable();
129  }
130  Pointer& operator=(Pointer&& other) noexcept {
131  std::swap(p_, other.p_);
132  std::swap(vtable_, other.vtable_);
133  return *this;
134  }
135 
136  bool operator==(const Pointer& rhs) const;
137  bool operator<(const Pointer& rhs) const;
138  bool operator!=(const Pointer& rhs) const { return !(*this == rhs); }
139 
140  void* c_pointer() const { return p_; }
141 
142  const grpc_arg_pointer_vtable* c_vtable() const { return vtable_; }
143 
144  private:
146  static const grpc_arg_pointer_vtable vtable = {
147  // copy
148  [](void* p) { return p; },
149  // destroy
150  [](void*) {},
151  // cmp
152  [](void* p1, void* p2) -> int { return QsortCompare(p1, p2); },
153  };
154  return &vtable;
155  }
156 
157  void* p_;
159  };
161 
162  ChannelArgs();
163 
164  static ChannelArgs FromC(const grpc_channel_args* args);
165  // Construct a new grpc_channel_args struct which the caller will own.
166  // It should be destroyed with grpc_channel_args_destroy.
167  const grpc_channel_args* ToC() const;
168 
169  const Value* Get(absl::string_view name) const { return args_.Lookup(name); }
171  Value value) const;
173  absl::string_view value) const;
175  std::string value) const;
177  const char* value) const;
179  template <typename T>
181  std::is_same<const grpc_arg_pointer_vtable*,
183  ChannelArgs>
187  }
188  template <typename T>
190  const RefCountedPtr<T>& value) const
192  std::is_same<
195  decltype(*value->Ref())>>::VTable())>::value,
196  ChannelArgs> {
197  auto store_value = value->Ref();
198  return Set(
199  name,
200  Pointer(store_value.release(),
202  absl::remove_cvref_t<decltype(*store_value)>>::VTable()));
203  }
204  template <typename T>
206  if (Contains(name)) return *this;
207  return Set(name, std::move(value));
208  }
210  bool Contains(absl::string_view name) const { return Get(name) != nullptr; }
211 
215  template <typename T>
217  return static_cast<T*>(GetVoidPointer(name));
218  }
220  absl::string_view name) const;
222 
223  // Object based get/set.
224  // Deal with the common case that we set a pointer to an object under
225  // the same name in every usage.
226  // Expects ChannelArgTypeTraits to exist for T, and T to expose:
227  // static string_view ChannelArgName();
228  template <typename T>
230  return Set(T::ChannelArgName(), p);
231  }
232  template <typename T>
234  return Set(T::ChannelArgName(), std::move(p));
235  }
236  template <typename T>
238  return GetPointer<T>(T::ChannelArgName());
239  }
240  template <typename T>
242  auto* p = GetObject<T>();
243  if (p == nullptr) return nullptr;
244  return p->Ref();
245  }
246 
247  bool operator<(const ChannelArgs& other) const { return args_ < other.args_; }
248  bool operator==(const ChannelArgs& other) const {
249  return args_ == other.args_;
250  }
251 
252  // Helpers for commonly accessed things
253 
254  bool WantMinimalStack() const {
255  return GetBool(GRPC_ARG_MINIMAL_STACK).value_or(false);
256  }
257 
258  std::string ToString() const;
259 
260  private:
262 
264 };
265 
266 } // namespace grpc_core
267 
270 
273 
277  const grpc_arg* to_add,
278  size_t num_to_add);
279 
283  const grpc_channel_args* src, const char** to_remove, size_t num_to_remove);
284 
288  const grpc_channel_args* src, const char** to_remove, size_t num_to_remove,
289  const grpc_arg* to_add, size_t num_to_add);
290 
293  const grpc_channel_args* b);
294 
299 }
300 
302  const grpc_channel_args* b);
303 
306  const char* name);
307 
309 
310 typedef struct grpc_integer_options {
311  int default_value; // Return this if value is outside of expected bounds.
315 
322  const char* name,
324 
332  const char* name);
335 bool grpc_channel_arg_get_bool(const grpc_arg* arg, bool default_value);
339  const char* name, bool default_value);
340 
341 template <typename T>
343  const char* name) {
345  if (arg == nullptr || arg->type != GRPC_ARG_POINTER) return nullptr;
346  return static_cast<T*>(arg->value.pointer.p);
347 }
348 
349 // Helpers for creating channel args.
354 
355 // Returns a string representing channel args in human-readable form.
357 
358 namespace grpc_core {
359 // Ensure no duplicate channel args (with some backwards compatibility hacks).
360 // Eliminate any grpc.internal.* args.
361 // Return a C++ object.
362 ChannelArgs ChannelArgsBuiltinPrecondition(const grpc_channel_args* src);
363 } // namespace grpc_core
364 
365 // Takes ownership of the old_args
366 typedef grpc_core::ChannelArgs (
368  const char* target, grpc_core::ChannelArgs old_args,
370 
371 // Should be called only once globaly before grpc is init'ed.
374 // This will be called at the creation of each channel.
377 
378 #endif /* GRPC_CORE_LIB_CHANNEL_CHANNEL_ARGS_H */
grpc_arg
Definition: grpc_types.h:103
grpc_channel_arg_pointer_create
grpc_arg grpc_channel_arg_pointer_create(char *name, void *value, const grpc_arg_pointer_vtable *vtable)
Definition: channel_args.cc:492
grpc_core::ChannelArgs::GetVoidPointer
void * GetVoidPointer(absl::string_view name) const
Definition: channel_args.cc:158
grpc_core::ChannelArgs::Pointer::operator<
bool operator<(const Pointer &rhs) const
Definition: channel_args.cc:63
grpc_core::ChannelArgs::operator==
bool operator==(const ChannelArgs &other) const
Definition: channel_args.h:248
grpc_channel_args_find
const grpc_arg * grpc_channel_args_find(const grpc_channel_args *args, const char *name)
Definition: channel_args.cc:393
vtable
static const grpc_transport_vtable vtable
Definition: binder_transport.cc:680
grpc_core::ChannelArgs::operator<
bool operator<(const ChannelArgs &other) const
Definition: channel_args.h:247
grpc_channel_args_copy_and_add_and_remove
grpc_channel_args * grpc_channel_args_copy_and_add_and_remove(const grpc_channel_args *src, const char **to_remove, size_t num_to_remove, const grpc_arg *to_add, size_t num_to_add)
Definition: channel_args.cc:246
grpc_core::ChannelArgsBuiltinPrecondition
ChannelArgs ChannelArgsBuiltinPrecondition(const grpc_channel_args *src)
Definition: channel_args.cc:507
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
grpc_channel_arg_integer_create
grpc_arg grpc_channel_arg_integer_create(char *name, int value)
Definition: channel_args.cc:484
grpc_core::ChannelArgs::ChannelArgs
ChannelArgs()
grpc_core::ChannelArgs::WantMinimalStack
bool WantMinimalStack() const
Definition: channel_args.h:254
grpc_core::ChannelArgs::SetObject
GRPC_MUST_USE_RESULT ChannelArgs SetObject(RefCountedPtr< T > p) const
Definition: channel_args.h:233
grpc_core
Definition: call_metric_recorder.h:31
grpc_channel_args_find_pointer
T * grpc_channel_args_find_pointer(const grpc_channel_args *args, const char *name)
Definition: channel_args.h:342
re2::Ignored
int Ignored
Definition: bloaty/third_party/re2/re2/regexp.cc:534
options
double_dict options[]
Definition: capstone_test.c:55
copy
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
Definition: message_compress.cc:145
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_integer_options
Definition: channel_args.h:310
useful.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_core::ChannelArgs::FromC
static ChannelArgs FromC(const grpc_channel_args *args)
Definition: channel_args.cc:84
arg::value
void * value
Definition: cmdline.cc:44
grpc_channel_args_union
grpc_channel_args * grpc_channel_args_union(const grpc_channel_args *a, const grpc_channel_args *b)
Definition: channel_args.cc:289
avl.h
grpc_channel_args_normalize
grpc_channel_args * grpc_channel_args_normalize(const grpc_channel_args *src)
Definition: channel_args.cc:338
setup.name
name
Definition: setup.py:542
absl::enable_if_t
typename std::enable_if< B, T >::type enable_if_t
Definition: abseil-cpp/absl/meta/type_traits.h:631
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
grpc_channel_arg_get_bool
bool grpc_channel_arg_get_bool(const grpc_arg *arg, bool default_value)
Definition: channel_args.cc:447
grpc_core::ChannelArgs::SetIfUnset
GRPC_MUST_USE_RESULT ChannelArgs SetIfUnset(absl::string_view name, T value)
Definition: channel_args.h:205
grpc_integer_options::max_value
int max_value
Definition: channel_args.h:313
grpc_core::ChannelArgs::Pointer::operator==
bool operator==(const Pointer &rhs) const
Definition: channel_args.cc:59
grpc_core::ChannelArgs::Pointer::EmptyVTable
static const grpc_arg_pointer_vtable * EmptyVTable()
Definition: channel_args.h:145
grpc_arg_pointer_vtable
Definition: grpc_types.h:85
grpc_channel_args
Definition: grpc_types.h:132
grpc_core::ChannelArgs::Pointer::Pointer
Pointer(Pointer &&other) noexcept
Definition: channel_args.h:126
T
#define T(upbtypeconst, upbtype, ctype, default_value)
grpc_integer_options::min_value
int min_value
Definition: channel_args.h:312
grpc_core::ChannelArgs::Contains
bool Contains(absl::string_view name) const
Definition: channel_args.h:210
grpc_core::ChannelArgTypeTraits< T, absl::void_t< typename T::RawPointerChannelArgTag > >::VTable
static const grpc_arg_pointer_vtable * VTable()
Definition: channel_args.h:98
grpc_core::ChannelArgs::Pointer::operator=
Pointer & operator=(Pointer &&other) noexcept
Definition: channel_args.h:130
grpc_core::ChannelArgs::Set
GRPC_MUST_USE_RESULT auto Set(absl::string_view name, const RefCountedPtr< T > &value) const -> absl::enable_if_t< std::is_same< const grpc_arg_pointer_vtable *, decltype(ChannelArgTypeTraits< absl::remove_cvref_t< decltype(*value->Ref())>>::VTable())>::value, ChannelArgs >
Definition: channel_args.h:189
grpc_types.h
grpc_channel_args_string
std::string grpc_channel_args_string(const grpc_channel_args *args)
Definition: channel_args.cc:502
grpc_core::ChannelArgs::SetObject
GRPC_MUST_USE_RESULT ChannelArgs SetObject(T *p) const
Definition: channel_args.h:229
grpc_core::ChannelArgTypeTraits< T, absl::enable_if_t< std::is_base_of< RefCounted< T >, T >::value||std::is_base_of< RefCounted< T, NonPolymorphicRefCount >, T >::value||std::is_base_of< DualRefCounted< T >, T >::value, void > >::VTable
static const grpc_arg_pointer_vtable * VTable()
Definition: channel_args.h:73
arg::type
argtype type
Definition: cmdline.cc:43
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
grpc_core::ChannelArgs::Pointer::p_
void * p_
Definition: channel_args.h:157
grpc_core::RefCountedPtr
Definition: ref_counted_ptr.h:35
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
grpc_core::ChannelArgs::GetBool
absl::optional< bool > GetBool(absl::string_view name) const
Definition: channel_args.cc:165
grpc_core::ChannelArgTypeTraits
Definition: channel_args.h:60
grpc_core::ChannelArgs::Get
const Value * Get(absl::string_view name) const
Definition: channel_args.h:169
absl::optional::value_or
constexpr T value_or(U &&v) const &
Definition: abseil-cpp/absl/types/optional.h:506
grpc_core::ChannelArgs::args_
AVL< std::string, Value > args_
Definition: channel_args.h:263
grpc_channel_args_client_channel_creation_mutator
grpc_core::ChannelArgs(* grpc_channel_args_client_channel_creation_mutator)(const char *target, grpc_core::ChannelArgs old_args, grpc_channel_stack_type type)
Definition: channel_args.h:367
absl::optional
Definition: abseil-cpp/absl/types/internal/optional.h:61
grpc_core::ChannelArgs::ToC
const grpc_channel_args * ToC() const
Definition: channel_args.cc:94
absl::remove_cvref_t
typename remove_cvref< T >::type remove_cvref_t
Definition: abseil-cpp/absl/meta/type_traits.h:528
grpc_channel_args_get_client_channel_creation_mutator
grpc_channel_args_client_channel_creation_mutator grpc_channel_args_get_client_channel_creation_mutator()
Definition: channel_args.cc:555
absl::inlined_vector_internal::Pointer
typename AllocatorTraits< A >::pointer Pointer
Definition: abseil-cpp/absl/container/internal/inlined_vector.h:52
arg
Definition: cmdline.cc:40
std::swap
void swap(Json::Value &a, Json::Value &b)
Specialize std::swap() for Json::Value.
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:1226
time.h
grpc_arg_pointer_vtable::destroy
void(* destroy)(void *p)
Definition: grpc_types.h:87
grpc_channel_args_set_client_channel_creation_mutator
void grpc_channel_args_set_client_channel_creation_mutator(grpc_channel_args_client_channel_creation_mutator cb)
Definition: channel_args.cc:549
grpc_channel_args_copy_and_remove
grpc_channel_args * grpc_channel_args_copy_and_remove(const grpc_channel_args *src, const char **to_remove, size_t num_to_remove)
Definition: channel_args.cc:231
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
channel_stack_type.h
grpc_core::ChannelArgs::GetPointer
T * GetPointer(absl::string_view name) const
Definition: channel_args.h:216
grpc_channel_arg_get_string
char * grpc_channel_arg_get_string(const grpc_arg *arg)
Definition: channel_args.cc:432
grpc_core::ChannelArgs::Pointer::Pointer
Pointer(void *p, const grpc_arg_pointer_vtable *vtable)
Definition: channel_args.h:115
grpc_channel_args_find_bool
bool grpc_channel_args_find_bool(const grpc_channel_args *args, const char *name, bool default_value)
Definition: channel_args.cc:465
grpc_channel_arg_string_create
grpc_arg grpc_channel_arg_string_create(char *name, char *value)
Definition: channel_args.cc:476
grpc_channel_args_copy
grpc_channel_args * grpc_channel_args_copy(const grpc_channel_args *src)
Definition: channel_args.cc:285
grpc_core::ChannelArgs::Pointer::c_vtable
const grpc_arg_pointer_vtable * c_vtable() const
Definition: channel_args.h:142
grpc_core::ChannelArgs::Pointer::operator!=
bool operator!=(const Pointer &rhs) const
Definition: channel_args.h:138
value
const char * value
Definition: hpack_parser_table.cc:165
grpc_core::AVL
Definition: avl.h:30
grpc_core::ChannelArgs::Set
GRPC_MUST_USE_RESULT ChannelArgs Set(absl::string_view name, Value value) const
Definition: channel_args.cc:113
grpc_channel_args_find_string
char * grpc_channel_args_find_string(const grpc_channel_args *args, const char *name)
Definition: channel_args.cc:441
grpc_core::ChannelArgs::Pointer::operator=
Pointer & operator=(Pointer other)
Definition: channel_args.h:121
grpc_core::ChannelArgs::GetInt
absl::optional< int > GetInt(absl::string_view name) const
Definition: channel_args.cc:134
absl::void_t
typename type_traits_internal::VoidTImpl< Ts... >::type void_t
Definition: abseil-cpp/absl/meta/type_traits.h:218
grpc_core::ChannelArgs::ToString
std::string ToString() const
Definition: channel_args.cc:186
GRPC_MUST_USE_RESULT
#define GRPC_MUST_USE_RESULT
Definition: impl/codegen/port_platform.h:584
grpc_channel_args_copy_and_add
grpc_channel_args * grpc_channel_args_copy_and_add(const grpc_channel_args *src, const grpc_arg *to_add, size_t num_to_add)
Definition: channel_args.cc:224
grpc_core::QsortCompare
int QsortCompare(const T &a, const T &b)
Definition: useful.h:95
grpc_core::ChannelArgs::Pointer
Definition: channel_args.h:113
ref_counted.h
grpc_core::ChannelArgs::GetDurationFromIntMillis
absl::optional< Duration > GetDurationFromIntMillis(absl::string_view name) const
Definition: channel_args.cc:141
grpc_core::ChannelArgs::Set
GRPC_MUST_USE_RESULT absl::enable_if_t< std::is_same< const grpc_arg_pointer_vtable *, decltype(ChannelArgTypeTraits< T >::VTable())>::value, ChannelArgs > Set(absl::string_view name, T *value) const
Definition: channel_args.h:184
grpc_core::ChannelArgs::Pointer::Pointer
Pointer(const Pointer &other)
Definition: channel_args.h:119
grpc_channel_args_compare
int grpc_channel_args_compare(const grpc_channel_args *a, const grpc_channel_args *b)
Definition: channel_args.cc:380
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_core::ChannelArgTypeTraits< T, absl::void_t< typename T::RawPointerChannelArgTag > >::TakeUnownedPointer
static void * TakeUnownedPointer(T *p)
Definition: channel_args.h:97
GRPC_ARG_MINIMAL_STACK
#define GRPC_ARG_MINIMAL_STACK
Definition: grpc_types.h:147
grpc_channel_stack_type
grpc_channel_stack_type
Definition: channel_stack_type.h:24
grpc_channel_args_find_integer
int grpc_channel_args_find_integer(const grpc_channel_args *args, const char *name, const grpc_integer_options options)
Definition: channel_args.cc:425
grpc_core::ChannelArgs::ChannelArgs
ChannelArgs(AVL< std::string, Value > args)
Definition: channel_args.h:261
grpc_core::ChannelArgs
Definition: channel_args.h:111
ref_counted_ptr.h
grpc_channel_arg_get_integer
int grpc_channel_arg_get_integer(const grpc_arg *arg, const grpc_integer_options options)
Definition: channel_args.cc:405
grpc_core::ChannelArgs::Pointer::c_pointer
void * c_pointer() const
Definition: channel_args.h:140
dual_ref_counted.h
grpc_integer_options
struct grpc_integer_options grpc_integer_options
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
grpc_core::ChannelArgs::Pointer::~Pointer
~Pointer()
Definition: channel_args.h:117
GRPC_ARG_POINTER
@ GRPC_ARG_POINTER
Definition: grpc_types.h:82
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
grpc_core::ChannelArgs::Value
absl::variant< int, std::string, Pointer > Value
Definition: channel_args.h:160
testing::Ref
internal::RefMatcher< T & > Ref(T &x)
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:8628
absl::variant
Definition: abseil-cpp/absl/types/internal/variant.h:46
grpc_core::ChannelArgs::Remove
GRPC_MUST_USE_RESULT ChannelArgs Remove(absl::string_view name) const
Definition: channel_args.cc:130
grpc_channel_args_want_minimal_stack
bool grpc_channel_args_want_minimal_stack(const grpc_channel_args *args)
Definition: channel_args.cc:471
grpc_core::ChannelArgs::GetObject
T * GetObject()
Definition: channel_args.h:237
grpc_core::ChannelArgs::Pointer::vtable_
const grpc_arg_pointer_vtable * vtable_
Definition: channel_args.h:158
grpc_core::ChannelArgs::GetObjectRef
RefCountedPtr< T > GetObjectRef()
Definition: channel_args.h:241
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
grpc_integer_options::default_value
int default_value
Definition: channel_args.h:311
grpc_core::ChannelArgs::GetString
absl::optional< absl::string_view > GetString(absl::string_view name) const
Definition: channel_args.cc:150
port_platform.h


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