channel_args.cc
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 
20 
22 
23 #include <limits.h>
24 #include <stdlib.h>
25 #include <string.h>
26 
27 #include <algorithm>
28 #include <map>
29 #include <vector>
30 
31 #include "absl/strings/match.h"
32 #include "absl/strings/str_cat.h"
33 #include "absl/strings/str_format.h"
34 #include "absl/strings/str_join.h"
35 
37 #include <grpc/support/alloc.h>
38 #include <grpc/support/log.h>
40 
43 
44 namespace {
45 
46 int PointerCompare(void* a_ptr, const grpc_arg_pointer_vtable* a_vtable,
47  void* b_ptr, const grpc_arg_pointer_vtable* b_vtable) {
48  int c = grpc_core::QsortCompare(a_ptr, b_ptr);
49  if (c == 0) return 0;
50  c = grpc_core::QsortCompare(a_vtable, b_vtable);
51  if (c != 0) return c;
52  return a_vtable->cmp(a_ptr, b_ptr);
53 }
54 
55 } // namespace
56 
57 namespace grpc_core {
58 
59 bool ChannelArgs::Pointer::operator==(const Pointer& rhs) const {
60  return PointerCompare(p_, vtable_, rhs.p_, rhs.vtable_) == 0;
61 }
62 
63 bool ChannelArgs::Pointer::operator<(const Pointer& rhs) const {
64  return PointerCompare(p_, vtable_, rhs.p_, rhs.vtable_) < 0;
65 }
66 
67 ChannelArgs::ChannelArgs() = default;
68 
70  switch (arg.type) {
71  case GRPC_ARG_INTEGER:
72  return Set(arg.key, arg.value.integer);
73  case GRPC_ARG_STRING:
74  if (arg.value.string != nullptr) return Set(arg.key, arg.value.string);
75  return Set(arg.key, "");
76  case GRPC_ARG_POINTER:
77  return Set(arg.key,
78  Pointer(arg.value.pointer.vtable->copy(arg.value.pointer.p),
79  arg.value.pointer.vtable));
80  }
82 }
83 
86  if (args != nullptr) {
87  for (size_t i = 0; i < args->num_args; i++) {
88  result = result.Set(args->args[i]);
89  }
90  }
91  return result;
92 }
93 
95  std::vector<grpc_arg> c_args;
96  args_.ForEach([&c_args](const std::string& key, const Value& value) {
97  char* name = const_cast<char*>(key.c_str());
98  c_args.push_back(Match(
99  value,
100  [name](int i) { return grpc_channel_arg_integer_create(name, i); },
101  [name](const std::string& s) {
103  const_cast<char*>(s.c_str()));
104  },
105  [name](const Pointer& p) {
106  return grpc_channel_arg_pointer_create(name, p.c_pointer(),
107  p.c_vtable());
108  }));
109  });
110  return grpc_channel_args_copy_and_add(nullptr, c_args.data(), c_args.size());
111 }
112 
115 }
116 
118  absl::string_view value) const {
119  return Set(key, std::string(value));
120 }
121 
123  return Set(key, std::string(value));
124 }
125 
127  return Set(key, Value(std::move(value)));
128 }
129 
131  return ChannelArgs(args_.Remove(key));
132 }
133 
135  auto* v = Get(name);
136  if (v == nullptr) return absl::nullopt;
137  if (!absl::holds_alternative<int>(*v)) return absl::nullopt;
138  return absl::get<int>(*v);
139 }
140 
142  absl::string_view name) const {
143  auto ms = GetInt(name);
144  if (!ms.has_value()) return absl::nullopt;
145  if (*ms == INT_MAX) return Duration::Infinity();
146  if (*ms == INT_MIN) return Duration::NegativeInfinity();
147  return Duration::Milliseconds(*ms);
148 }
149 
151  absl::string_view name) const {
152  auto* v = Get(name);
153  if (v == nullptr) return absl::nullopt;
154  if (!absl::holds_alternative<std::string>(*v)) return absl::nullopt;
155  return absl::get<std::string>(*v);
156 }
157 
159  auto* v = Get(name);
160  if (v == nullptr) return nullptr;
161  if (!absl::holds_alternative<Pointer>(*v)) return nullptr;
162  return absl::get<Pointer>(*v).c_pointer();
163 }
164 
166  auto* v = Get(name);
167  if (v == nullptr) return absl::nullopt;
168  auto* i = absl::get_if<int>(v);
169  if (i == nullptr) {
170  gpr_log(GPR_ERROR, "%s ignored: it must be an integer",
171  std::string(name).c_str());
172  return absl::nullopt;
173  }
174  switch (*i) {
175  case 0:
176  return false;
177  case 1:
178  return true;
179  default:
180  gpr_log(GPR_ERROR, "%s treated as bool but set to %d (assuming true)",
181  std::string(name).c_str(), *i);
182  return true;
183  }
184 }
185 
187  std::vector<std::string> arg_strings;
188  args_.ForEach([&arg_strings](const std::string& key, const Value& value) {
189  std::string value_str;
190  if (auto* i = absl::get_if<int>(&value)) {
191  value_str = std::to_string(*i);
192  } else if (auto* s = absl::get_if<std::string>(&value)) {
193  value_str = *s;
194  } else if (auto* p = absl::get_if<Pointer>(&value)) {
195  value_str = absl::StrFormat("%p", p->c_pointer());
196  }
197  arg_strings.push_back(absl::StrCat(key, "=", value_str));
198  });
199  return absl::StrCat("{", absl::StrJoin(arg_strings, ", "), "}");
200 }
201 
202 } // namespace grpc_core
203 
204 static grpc_arg copy_arg(const grpc_arg* src) {
205  grpc_arg dst;
206  dst.type = src->type;
207  dst.key = gpr_strdup(src->key);
208  switch (dst.type) {
209  case GRPC_ARG_STRING:
210  dst.value.string = gpr_strdup(src->value.string);
211  break;
212  case GRPC_ARG_INTEGER:
213  dst.value.integer = src->value.integer;
214  break;
215  case GRPC_ARG_POINTER:
216  dst.value.pointer = src->value.pointer;
217  dst.value.pointer.p =
218  src->value.pointer.vtable->copy(src->value.pointer.p);
219  break;
220  }
221  return dst;
222 }
223 
225  const grpc_arg* to_add,
226  size_t num_to_add) {
227  return grpc_channel_args_copy_and_add_and_remove(src, nullptr, 0, to_add,
228  num_to_add);
229 }
230 
232  const grpc_channel_args* src, const char** to_remove,
233  size_t num_to_remove) {
234  return grpc_channel_args_copy_and_add_and_remove(src, to_remove,
235  num_to_remove, nullptr, 0);
236 }
237 
238 static bool should_remove_arg(const grpc_arg* arg, const char** to_remove,
239  size_t num_to_remove) {
240  for (size_t i = 0; i < num_to_remove; ++i) {
241  if (strcmp(arg->key, to_remove[i]) == 0) return true;
242  }
243  return false;
244 }
245 
247  const grpc_channel_args* src, const char** to_remove, size_t num_to_remove,
248  const grpc_arg* to_add, size_t num_to_add) {
249  // Figure out how many args we'll be copying.
250  size_t num_args_to_copy = 0;
251  if (src != nullptr) {
252  for (size_t i = 0; i < src->num_args; ++i) {
253  if (!should_remove_arg(&src->args[i], to_remove, num_to_remove)) {
254  ++num_args_to_copy;
255  }
256  }
257  }
258  // Create result.
260  static_cast<grpc_channel_args*>(gpr_malloc(sizeof(grpc_channel_args)));
261  dst->num_args = num_args_to_copy + num_to_add;
262  if (dst->num_args == 0) {
263  dst->args = nullptr;
264  return dst;
265  }
266  dst->args =
267  static_cast<grpc_arg*>(gpr_malloc(sizeof(grpc_arg) * dst->num_args));
268  // Copy args from src that are not being removed.
269  size_t dst_idx = 0;
270  if (src != nullptr) {
271  for (size_t i = 0; i < src->num_args; ++i) {
272  if (!should_remove_arg(&src->args[i], to_remove, num_to_remove)) {
273  dst->args[dst_idx++] = copy_arg(&src->args[i]);
274  }
275  }
276  }
277  // Add args from to_add.
278  for (size_t i = 0; i < num_to_add; ++i) {
279  dst->args[dst_idx++] = copy_arg(&to_add[i]);
280  }
281  GPR_ASSERT(dst_idx == dst->num_args);
282  return dst;
283 }
284 
286  return grpc_channel_args_copy_and_add(src, nullptr, 0);
287 }
288 
290  const grpc_channel_args* b) {
291  if (a == nullptr) return grpc_channel_args_copy(b);
292  if (b == nullptr) return grpc_channel_args_copy(a);
293  const size_t max_out = (a->num_args + b->num_args);
294  grpc_arg* uniques =
295  static_cast<grpc_arg*>(gpr_malloc(sizeof(*uniques) * max_out));
296  for (size_t i = 0; i < a->num_args; ++i) uniques[i] = a->args[i];
297 
298  size_t uniques_idx = a->num_args;
299  for (size_t i = 0; i < b->num_args; ++i) {
300  const char* b_key = b->args[i].key;
301  if (grpc_channel_args_find(a, b_key) == nullptr) { // not found
302  uniques[uniques_idx++] = b->args[i];
303  }
304  }
306  grpc_channel_args_copy_and_add(nullptr, uniques, uniques_idx);
307  gpr_free(uniques);
308  return result;
309 }
310 
311 static int cmp_arg(const grpc_arg* a, const grpc_arg* b) {
312  int c = grpc_core::QsortCompare(a->type, b->type);
313  if (c != 0) return c;
314  c = strcmp(a->key, b->key);
315  if (c != 0) return c;
316  switch (a->type) {
317  case GRPC_ARG_STRING:
318  return strcmp(a->value.string, b->value.string);
319  case GRPC_ARG_INTEGER:
320  return grpc_core::QsortCompare(a->value.integer, b->value.integer);
321  case GRPC_ARG_POINTER:
322  return PointerCompare(a->value.pointer.p, a->value.pointer.vtable,
323  b->value.pointer.p, b->value.pointer.vtable);
324  }
325  GPR_UNREACHABLE_CODE(return 0);
326 }
327 
328 /* stabilizing comparison function: since channel_args ordering matters for
329  * keys with the same name, we need to preserve that ordering */
330 static int cmp_key_stable(const void* ap, const void* bp) {
331  const grpc_arg* const* a = static_cast<const grpc_arg* const*>(ap);
332  const grpc_arg* const* b = static_cast<const grpc_arg* const*>(bp);
333  int c = strcmp((*a)->key, (*b)->key);
334  if (c == 0) c = grpc_core::QsortCompare(*a, *b);
335  return c;
336 }
337 
339  grpc_arg** args =
340  static_cast<grpc_arg**>(gpr_malloc(sizeof(grpc_arg*) * src->num_args));
341  for (size_t i = 0; i < src->num_args; i++) {
342  args[i] = &src->args[i];
343  }
344  if (src->num_args > 1) {
345  qsort(args, src->num_args, sizeof(grpc_arg*), cmp_key_stable);
346  }
347 
349  static_cast<grpc_channel_args*>(gpr_malloc(sizeof(grpc_channel_args)));
350  b->num_args = src->num_args;
351  b->args = static_cast<grpc_arg*>(gpr_malloc(sizeof(grpc_arg) * b->num_args));
352  for (size_t i = 0; i < src->num_args; i++) {
353  b->args[i] = copy_arg(args[i]);
354  }
355 
356  gpr_free(args);
357  return b;
358 }
359 
361  size_t i;
362  if (!a) return;
363  for (i = 0; i < a->num_args; i++) {
364  switch (a->args[i].type) {
365  case GRPC_ARG_STRING:
366  gpr_free(a->args[i].value.string);
367  break;
368  case GRPC_ARG_INTEGER:
369  break;
370  case GRPC_ARG_POINTER:
371  a->args[i].value.pointer.vtable->destroy(a->args[i].value.pointer.p);
372  break;
373  }
374  gpr_free(a->args[i].key);
375  }
376  gpr_free(a->args);
377  gpr_free(a);
378 }
379 
381  const grpc_channel_args* b) {
382  if (a == nullptr && b == nullptr) return 0;
383  if (a == nullptr || b == nullptr) return a == nullptr ? -1 : 1;
384  int c = grpc_core::QsortCompare(a->num_args, b->num_args);
385  if (c != 0) return c;
386  for (size_t i = 0; i < a->num_args; i++) {
387  c = cmp_arg(&a->args[i], &b->args[i]);
388  if (c != 0) return c;
389  }
390  return 0;
391 }
392 
394  const char* name) {
395  if (args != nullptr) {
396  for (size_t i = 0; i < args->num_args; ++i) {
397  if (strcmp(args->args[i].key, name) == 0) {
398  return &args->args[i];
399  }
400  }
401  }
402  return nullptr;
403 }
404 
407  if (arg == nullptr) return options.default_value;
408  if (arg->type != GRPC_ARG_INTEGER) {
409  gpr_log(GPR_ERROR, "%s ignored: it must be an integer", arg->key);
410  return options.default_value;
411  }
412  if (arg->value.integer < options.min_value) {
413  gpr_log(GPR_ERROR, "%s ignored: it must be >= %d", arg->key,
414  options.min_value);
415  return options.default_value;
416  }
417  if (arg->value.integer > options.max_value) {
418  gpr_log(GPR_ERROR, "%s ignored: it must be <= %d", arg->key,
419  options.max_value);
420  return options.default_value;
421  }
422  return arg->value.integer;
423 }
424 
426  const char* name,
430 }
431 
433  if (arg == nullptr) return nullptr;
434  if (arg->type != GRPC_ARG_STRING) {
435  gpr_log(GPR_ERROR, "%s ignored: it must be an string", arg->key);
436  return nullptr;
437  }
438  return arg->value.string;
439 }
440 
442  const char* name) {
445 }
446 
447 bool grpc_channel_arg_get_bool(const grpc_arg* arg, bool default_value) {
448  if (arg == nullptr) return default_value;
449  if (arg->type != GRPC_ARG_INTEGER) {
450  gpr_log(GPR_ERROR, "%s ignored: it must be an integer", arg->key);
451  return default_value;
452  }
453  switch (arg->value.integer) {
454  case 0:
455  return false;
456  case 1:
457  return true;
458  default:
459  gpr_log(GPR_ERROR, "%s treated as bool but set to %d (assuming true)",
460  arg->key, arg->value.integer);
461  return true;
462  }
463 }
464 
466  const char* name, bool default_value) {
468  return grpc_channel_arg_get_bool(arg, default_value);
469 }
470 
474 }
475 
477  grpc_arg arg;
479  arg.key = name;
480  arg.value.string = value;
481  return arg;
482 }
483 
485  grpc_arg arg;
487  arg.key = name;
488  arg.value.integer = value;
489  return arg;
490 }
491 
493  char* name, void* value, const grpc_arg_pointer_vtable* vtable) {
494  grpc_arg arg;
496  arg.key = name;
497  arg.value.pointer.p = value;
498  arg.value.pointer.vtable = vtable;
499  return arg;
500 }
501 
504 }
505 
506 namespace grpc_core {
508  if (src == nullptr) return ChannelArgs();
510  std::map<absl::string_view, std::vector<absl::string_view>>
511  concatenated_values;
512  for (size_t i = 0; i < src->num_args; i++) {
513  absl::string_view key = src->args[i].key;
514  // User-agent strings were traditionally multi-valued and concatenated.
515  // We preserve this behavior for backwards compatibility.
518  if (src->args[i].type != GRPC_ARG_STRING) {
519  gpr_log(GPR_ERROR, "Channel argument '%s' should be a string",
520  std::string(key).c_str());
521  } else {
522  concatenated_values[key].push_back(src->args[i].value.string);
523  }
524  continue;
525  } else if (absl::StartsWith(key, "grpc.internal.")) {
526  continue;
527  }
528  if (!output.Contains(key)) {
529  output = output.Set(src->args[i]);
530  } else {
531  // Traditional grpc_channel_args_find behavior was to pick the first
532  // value.
533  // For compatibility with existing users, we will do the same here.
534  }
535  }
536  // Concatenate the concatenated values.
537  for (const auto& concatenated_value : concatenated_values) {
538  output = output.Set(concatenated_value.first,
539  absl::StrJoin(concatenated_value.second, " "));
540  }
541  return output;
542 }
543 } // namespace grpc_core
544 
545 namespace {
547 } // namespace
548 
551  GPR_DEBUG_ASSERT(g_mutator == nullptr);
552  g_mutator = cb;
553 }
556  return g_mutator;
557 }
grpc_arg
Definition: grpc_types.h:103
grpc_arg_pointer_vtable::copy
void *(* copy)(void *p)
Definition: grpc_types.h:86
grpc_channel_args_find_string
char * grpc_channel_args_find_string(const grpc_channel_args *args, const char *name)
Definition: channel_args.cc:441
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
grpc_channel_arg_get_string
char * grpc_channel_arg_get_string(const grpc_arg *arg)
Definition: channel_args.cc:432
grpc_core::ChannelArgs::GetVoidPointer
void * GetVoidPointer(absl::string_view name) const
Definition: channel_args.cc:158
GRPC_ARG_PRIMARY_USER_AGENT_STRING
#define GRPC_ARG_PRIMARY_USER_AGENT_STRING
Definition: grpc_types.h:254
grpc_core::ChannelArgs::Pointer::operator<
bool operator<(const Pointer &rhs) const
Definition: channel_args.cc:63
dst
static const char dst[]
Definition: test-fs-copyfile.c:37
vtable
static const grpc_transport_vtable vtable
Definition: binder_transport.cc:680
log.h
const
#define const
Definition: bloaty/third_party/zlib/zconf.h:230
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
grpc_core::ChannelArgsBuiltinPrecondition
ChannelArgs ChannelArgsBuiltinPrecondition(const grpc_channel_args *src)
Definition: channel_args.cc:507
GRPC_ARG_INTEGER
@ GRPC_ARG_INTEGER
Definition: grpc_types.h:81
grpc_arg::value
union grpc_arg::grpc_arg_value value
absl::StrFormat
ABSL_MUST_USE_RESULT std::string StrFormat(const FormatSpec< Args... > &format, const Args &... args)
Definition: abseil-cpp/absl/strings/str_format.h:338
GPR_DEBUG_ASSERT
#define GPR_DEBUG_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:103
grpc_arg::grpc_arg_value::pointer
struct grpc_arg::grpc_arg_value::grpc_arg_pointer pointer
grpc_core::ChannelArgs::ChannelArgs
ChannelArgs()
GRPC_ARG_STRING
@ GRPC_ARG_STRING
Definition: grpc_types.h:80
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_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
grpc_core
Definition: call_metric_recorder.h:31
GRPC_ARG_SECONDARY_USER_AGENT_STRING
#define GRPC_ARG_SECONDARY_USER_AGENT_STRING
Definition: grpc_types.h:257
p_
std::unique_ptr< unsigned char[]> p_
Definition: abseil-cpp/absl/container/internal/layout_test.cc:1627
string.h
options
double_dict options[]
Definition: capstone_test.c:55
absl::StartsWith
bool StartsWith(absl::string_view text, absl::string_view prefix) noexcept
Definition: third_party/abseil-cpp/absl/strings/match.h:58
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_integer_options
Definition: channel_args.h:310
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
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
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
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
setup.name
name
Definition: setup.py:542
grpc_channel_arg_string_create
grpc_arg grpc_channel_arg_string_create(char *name, char *value)
Definition: channel_args.cc:476
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
grpc_core::ChannelArgs::Pointer::operator==
bool operator==(const Pointer &rhs) const
Definition: channel_args.cc:59
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_arg_pointer_vtable
Definition: grpc_types.h:85
grpc_channel_args
Definition: grpc_types.h:132
grpc_types.h
grpc_channel_arg_get_bool
bool grpc_channel_arg_get_bool(const grpc_arg *arg, bool default_value)
Definition: channel_args.cc:447
for
for(map_begin_internal(intern, &it);!map_done(&it);map_next(&it))
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/map.c:207
string_util.h
c
void c(T a)
Definition: miscompile_with_no_unique_address_test.cc:40
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_arg::grpc_arg_value::string
char * string
Definition: grpc_types.h:107
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
absl::StrJoin
std::string StrJoin(Iterator start, Iterator end, absl::string_view sep, Formatter &&fmt)
Definition: abseil-cpp/absl/strings/str_join.h:239
grpc_core::ChannelArgs::GetBool
absl::optional< bool > GetBool(absl::string_view name) const
Definition: channel_args.cc:165
grpc_arg::grpc_arg_value::grpc_arg_pointer::vtable
const grpc_arg_pointer_vtable * vtable
Definition: grpc_types.h:111
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
gmock_output_test.output
output
Definition: bloaty/third_party/googletest/googlemock/test/gmock_output_test.py:175
grpc_core::ChannelArgs::Get
const Value * Get(absl::string_view name) const
Definition: channel_args.h:169
grpc_channel_args_compare
int grpc_channel_args_compare(const grpc_channel_args *a, const grpc_channel_args *b)
Definition: channel_args.cc:380
grpc_core::ChannelArgs::args_
AVL< std::string, Value > args_
Definition: channel_args.h:263
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
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
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
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
grpc_channel_args_destroy
void grpc_channel_args_destroy(grpc_channel_args *a)
Definition: channel_args.cc:360
grpc_channel_args::num_args
size_t num_args
Definition: grpc_types.h:133
arg
Definition: cmdline.cc:40
grpc_arg::grpc_arg_value::grpc_arg_pointer::p
void * p
Definition: grpc_types.h:110
grpc_channel_args_copy
grpc_channel_args * grpc_channel_args_copy(const grpc_channel_args *src)
Definition: channel_args.cc:285
cmp_arg
static int cmp_arg(const grpc_arg *a, const grpc_arg *b)
Definition: channel_args.cc:311
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
GPR_UNREACHABLE_CODE
#define GPR_UNREACHABLE_CODE(STATEMENT)
Definition: impl/codegen/port_platform.h:652
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
qsort
void qsort(void *a, size_t n, size_t es, int(*cmp)(const void *, const void *))
Definition: qsort.h:130
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
cmp_key_stable
static int cmp_key_stable(const void *ap, const void *bp)
Definition: channel_args.cc:330
grpc_core::Duration::NegativeInfinity
static constexpr Duration NegativeInfinity()
Definition: src/core/lib/gprpp/time.h:135
should_remove_arg
static bool should_remove_arg(const grpc_arg *arg, const char **to_remove, size_t num_to_remove)
Definition: channel_args.cc:238
grpc_channel_args_want_minimal_stack
bool grpc_channel_args_want_minimal_stack(const grpc_channel_args *args)
Definition: channel_args.cc:471
value
const char * value
Definition: hpack_parser_table.cc:165
grpc_core::ChannelArgs::Set
GRPC_MUST_USE_RESULT ChannelArgs Set(absl::string_view name, Value value) const
Definition: channel_args.cc:113
grpc_core::ChannelArgs::GetInt
absl::optional< int > GetInt(absl::string_view name) const
Definition: channel_args.cc:134
grpc_core::Duration::Milliseconds
static constexpr Duration Milliseconds(int64_t millis)
Definition: src/core/lib/gprpp/time.h:155
grpc_core::ChannelArgs::ToString
std::string ToString() const
Definition: channel_args.cc:186
key
const char * key
Definition: hpack_parser_table.cc:164
grpc_channel_arg_integer_create
grpc_arg grpc_channel_arg_integer_create(char *name, int value)
Definition: channel_args.cc:484
grpc_core::QsortCompare
int QsortCompare(const T &a, const T &b)
Definition: useful.h:95
grpc_core::ChannelArgs::Pointer
Definition: channel_args.h:113
grpc_core::ChannelArgs::GetDurationFromIntMillis
absl::optional< Duration > GetDurationFromIntMillis(absl::string_view name) const
Definition: channel_args.cc:141
alloc.h
grpc_arg::key
char * key
Definition: grpc_types.h:105
GRPC_ARG_MINIMAL_STACK
#define GRPC_ARG_MINIMAL_STACK
Definition: grpc_types.h:147
arg
struct arg arg
grpc_core::Match
auto Match(const absl::variant< T0, Ts... > &value, Fs... fs) -> decltype(std::declval< OverloadType< Fs... >>()(std::declval< T0 >()))
Definition: src/core/lib/gprpp/match.h:51
grpc_channel_args_normalize
grpc_channel_args * grpc_channel_args_normalize(const grpc_channel_args *src)
Definition: channel_args.cc:338
grpc_core::ChannelArgs
Definition: channel_args.h:111
channel_args.h
gpr_strdup
GPRAPI char * gpr_strdup(const char *src)
Definition: string.cc:39
GRPC_ARG_POINTER
@ GRPC_ARG_POINTER
Definition: grpc_types.h:82
grpc_core::ChannelArgs::Value
absl::variant< int, std::string, Pointer > Value
Definition: channel_args.h:160
grpc_arg::grpc_arg_value::integer
int integer
Definition: grpc_types.h:108
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_arg::type
grpc_arg_type type
Definition: grpc_types.h:104
absl::variant
Definition: abseil-cpp/absl/types/internal/variant.h:46
copy_arg
static grpc_arg copy_arg(const grpc_arg *src)
Definition: channel_args.cc:204
grpc_core::ChannelArgs::Remove
GRPC_MUST_USE_RESULT ChannelArgs Remove(absl::string_view name) const
Definition: channel_args.cc:130
grpc_arg_pointer_vtable::cmp
int(* cmp)(void *p, void *q)
Definition: grpc_types.h:88
match.h
to_string
static bool to_string(zval *from)
Definition: protobuf/php/ext/google/protobuf/convert.c:333
grpc_channel_args::args
grpc_arg * args
Definition: grpc_types.h:134
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_channel_args_find
const grpc_arg * grpc_channel_args_find(const grpc_channel_args *args, const char *name)
Definition: channel_args.cc:393
grpc_core::ChannelArgs::Pointer::vtable_
const grpc_arg_pointer_vtable * vtable_
Definition: channel_args.h:158
grpc_channel_args_string
std::string grpc_channel_args_string(const grpc_channel_args *args)
Definition: channel_args.cc:502
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
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
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::Duration::Infinity
static constexpr Duration Infinity()
Definition: src/core/lib/gprpp/time.h:139
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
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 Fri May 16 2025 02:57:52