bloaty/third_party/abseil-cpp/absl/flags/internal/flag.cc
Go to the documentation of this file.
1 //
2 // Copyright 2019 The Abseil Authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // https://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #include "absl/flags/internal/flag.h"
17 
18 #include <assert.h>
19 #include <stddef.h>
20 #include <stdint.h>
21 #include <string.h>
22 
23 #include <array>
24 #include <atomic>
25 #include <memory>
26 #include <new>
27 #include <string>
28 #include <typeinfo>
29 
30 #include "absl/base/call_once.h"
31 #include "absl/base/casts.h"
32 #include "absl/base/config.h"
33 #include "absl/base/optimization.h"
34 #include "absl/flags/config.h"
35 #include "absl/flags/internal/commandlineflag.h"
36 #include "absl/flags/usage_config.h"
37 #include "absl/memory/memory.h"
38 #include "absl/strings/str_cat.h"
39 #include "absl/strings/string_view.h"
40 #include "absl/synchronization/mutex.h"
41 
42 namespace absl {
44 namespace flags_internal {
45 
46 // The help message indicating that the commandline flag has been
47 // 'stripped'. It will not show up when doing "-help" and its
48 // variants. The flag is stripped if ABSL_FLAGS_STRIP_HELP is set to 1
49 // before including absl/flags/flag.h
50 const char kStrippedFlagHelp[] = "\001\002\003\004 (unknown) \004\003\002\001";
51 
52 namespace {
53 
54 // Currently we only validate flag values for user-defined flag types.
55 bool ShouldValidateFlagValue(FlagFastTypeId flag_type_id) {
56 #define DONT_VALIDATE(T, _) \
57  if (flag_type_id == base_internal::FastTypeId<T>()) return false;
59 #undef DONT_VALIDATE
60 
61  return true;
62 }
63 
64 // RAII helper used to temporarily unlock and relock `absl::Mutex`.
65 // This is used when we need to ensure that locks are released while
66 // invoking user supplied callbacks and then reacquired, since callbacks may
67 // need to acquire these locks themselves.
68 class MutexRelock {
69  public:
70  explicit MutexRelock(absl::Mutex& mu) : mu_(mu) { mu_.Unlock(); }
71  ~MutexRelock() { mu_.Lock(); }
72 
73  MutexRelock(const MutexRelock&) = delete;
74  MutexRelock& operator=(const MutexRelock&) = delete;
75 
76  private:
78 };
79 
80 } // namespace
81 
83 // Persistent state of the flag data.
84 
85 class FlagImpl;
86 
87 class FlagState : public flags_internal::FlagStateInterface {
88  public:
89  template <typename V>
90  FlagState(FlagImpl& flag_impl, const V& v, bool modified,
91  bool on_command_line, int64_t counter)
92  : flag_impl_(flag_impl),
93  value_(v),
94  modified_(modified),
95  on_command_line_(on_command_line),
96  counter_(counter) {}
97 
98  ~FlagState() override {
101  return;
103  }
104 
105  private:
106  friend class FlagImpl;
107 
108  // Restores the flag to the saved state.
109  void Restore() const override {
110  if (!flag_impl_.RestoreState(*this)) return;
111 
113  absl::StrCat("Restore saved value of ", flag_impl_.Name(),
114  " to: ", flag_impl_.CurrentValue()));
115  }
116 
117  // Flag and saved flag data.
119  union SavedValue {
120  explicit SavedValue(void* v) : heap_allocated(v) {}
121  explicit SavedValue(int64_t v) : one_word(v) {}
122 
123  void* heap_allocated;
125  } value_;
126  bool modified_;
127  bool on_command_line_;
129 };
130 
132 // Flag implementation, which does not depend on flag value type.
133 
134 DynValueDeleter::DynValueDeleter(FlagOpFn op_arg) : op(op_arg) {}
135 
136 void DynValueDeleter::operator()(void* ptr) const {
137  if (op == nullptr) return;
138 
139  Delete(op, ptr);
140 }
141 
142 void FlagImpl::Init() {
143  new (&data_guard_) absl::Mutex;
144 
145  auto def_kind = static_cast<FlagDefaultKind>(def_kind_);
146 
147  switch (ValueStorageKind()) {
149  // For this storage kind the default_value_ always points to gen_func
150  // during initialization.
151  assert(def_kind == FlagDefaultKind::kGenFunc);
152  (*default_value_.gen_func)(AlignedBufferValue());
153  break;
155  alignas(int64_t) std::array<char, sizeof(int64_t)> buf{};
156  if (def_kind == FlagDefaultKind::kGenFunc) {
157  (*default_value_.gen_func)(buf.data());
158  } else {
159  assert(def_kind != FlagDefaultKind::kDynamicValue);
160  std::memcpy(buf.data(), &default_value_, Sizeof(op_));
161  }
162  OneWordValue().store(absl::bit_cast<int64_t>(buf),
163  std::memory_order_release);
164  break;
165  }
167  // For this storage kind the default_value_ always points to gen_func
168  // during initialization.
169  assert(def_kind == FlagDefaultKind::kGenFunc);
170  (*default_value_.gen_func)(AtomicBufferValue());
171  break;
172  }
173  }
174  seq_lock_.MarkInitialized();
175 }
176 
178  absl::call_once(const_cast<FlagImpl*>(this)->init_control_, &FlagImpl::Init,
179  const_cast<FlagImpl*>(this));
180 
181  // data_guard_ is initialized inside Init.
182  return reinterpret_cast<absl::Mutex*>(&data_guard_);
183 }
184 
186  const std::type_info* (*gen_rtti)()) const {
188 
189  // `rhs_type_id` is the fast type id corresponding to the declaration
190  // visibile at the call site. `lhs_type_id` is the fast type id
191  // corresponding to the type specified in flag definition. They must match
192  // for this operation to be well-defined.
193  if (ABSL_PREDICT_TRUE(lhs_type_id == rhs_type_id)) return;
194 
195  const std::type_info* lhs_runtime_type_id =
197  const std::type_info* rhs_runtime_type_id = (*gen_rtti)();
198 
199  if (lhs_runtime_type_id == rhs_runtime_type_id) return;
200 
201 #if defined(ABSL_FLAGS_INTERNAL_HAS_RTTI)
202  if (*lhs_runtime_type_id == *rhs_runtime_type_id) return;
203 #endif
204 
206  FATAL, absl::StrCat("Flag '", Name(),
207  "' is defined as one type and declared as another"));
208 }
209 
210 std::unique_ptr<void, DynValueDeleter> FlagImpl::MakeInitValue() const {
211  void* res = nullptr;
212  switch (DefaultKind()) {
214  res = flags_internal::Clone(op_, default_value_.dynamic_value);
215  break;
217  res = flags_internal::Alloc(op_);
218  (*default_value_.gen_func)(res);
219  break;
220  default:
221  res = flags_internal::Clone(op_, &default_value_);
222  break;
223  }
224  return {res, DynValueDeleter{op_}};
225 }
226 
227 void FlagImpl::StoreValue(const void* src) {
228  switch (ValueStorageKind()) {
230  Copy(op_, src, AlignedBufferValue());
231  seq_lock_.IncrementModificationCount();
232  break;
234  int64_t one_word_val = 0;
235  std::memcpy(&one_word_val, src, Sizeof(op_));
236  OneWordValue().store(one_word_val, std::memory_order_release);
237  seq_lock_.IncrementModificationCount();
238  break;
239  }
241  seq_lock_.Write(AtomicBufferValue(), src, Sizeof(op_));
242  break;
243  }
244  }
245  modified_ = true;
246  InvokeCallback();
247 }
248 
249 absl::string_view FlagImpl::Name() const { return name_; }
250 
253 }
254 
255 std::string FlagImpl::Help() const {
256  return HelpSourceKind() == FlagHelpKind::kLiteral ? help_.literal
257  : help_.gen_func();
258 }
259 
262 }
263 
265  return seq_lock_.ModificationCount();
266 }
267 
269  absl::MutexLock l(DataGuard());
270  return on_command_line_;
271 }
272 
274  absl::MutexLock l(DataGuard());
275 
276  auto obj = MakeInitValue();
277  return flags_internal::Unparse(op_, obj.get());
278 }
279 
281  auto* guard = DataGuard(); // Make sure flag initialized
282  switch (ValueStorageKind()) {
284  absl::MutexLock l(guard);
285  return flags_internal::Unparse(op_, AlignedBufferValue());
286  }
288  const auto one_word_val =
289  absl::bit_cast<std::array<char, sizeof(int64_t)>>(
290  OneWordValue().load(std::memory_order_acquire));
291  return flags_internal::Unparse(op_, one_word_val.data());
292  }
294  std::unique_ptr<void, DynValueDeleter> cloned(flags_internal::Alloc(op_),
295  DynValueDeleter{op_});
296  ReadSequenceLockedData(cloned.get());
297  return flags_internal::Unparse(op_, cloned.get());
298  }
299  }
300 
301  return "";
302 }
303 
304 void FlagImpl::SetCallback(const FlagCallbackFunc mutation_callback) {
305  absl::MutexLock l(DataGuard());
306 
307  if (callback_ == nullptr) {
308  callback_ = new FlagCallback;
309  }
310  callback_->func = mutation_callback;
311 
312  InvokeCallback();
313 }
314 
315 void FlagImpl::InvokeCallback() const {
316  if (!callback_) return;
317 
318  // Make a copy of the C-style function pointer that we are about to invoke
319  // before we release the lock guarding it.
320  FlagCallbackFunc cb = callback_->func;
321 
322  // If the flag has a mutation callback this function invokes it. While the
323  // callback is being invoked the primary flag's mutex is unlocked and it is
324  // re-locked back after call to callback is completed. Callback invocation is
325  // guarded by flag's secondary mutex instead which prevents concurrent
326  // callback invocation. Note that it is possible for other thread to grab the
327  // primary lock and update flag's value at any time during the callback
328  // invocation. This is by design. Callback can get a value of the flag if
329  // necessary, but it might be different from the value initiated the callback
330  // and it also can be different by the time the callback invocation is
331  // completed. Requires that *primary_lock be held in exclusive mode; it may be
332  // released and reacquired by the implementation.
333  MutexRelock relock(*DataGuard());
334  absl::MutexLock lock(&callback_->guard);
335  cb();
336 }
337 
338 std::unique_ptr<FlagStateInterface> FlagImpl::SaveState() {
339  absl::MutexLock l(DataGuard());
340 
341  bool modified = modified_;
342  bool on_command_line = on_command_line_;
343  switch (ValueStorageKind()) {
345  return absl::make_unique<FlagState>(
346  *this, flags_internal::Clone(op_, AlignedBufferValue()), modified,
347  on_command_line, ModificationCount());
348  }
350  return absl::make_unique<FlagState>(
351  *this, OneWordValue().load(std::memory_order_acquire), modified,
352  on_command_line, ModificationCount());
353  }
355  void* cloned = flags_internal::Alloc(op_);
356  // Read is guaranteed to be successful because we hold the lock.
357  bool success =
358  seq_lock_.TryRead(cloned, AtomicBufferValue(), Sizeof(op_));
359  assert(success);
360  static_cast<void>(success);
361  return absl::make_unique<FlagState>(*this, cloned, modified,
362  on_command_line, ModificationCount());
363  }
364  }
365  return nullptr;
366 }
367 
368 bool FlagImpl::RestoreState(const FlagState& flag_state) {
369  absl::MutexLock l(DataGuard());
370  if (flag_state.counter_ == ModificationCount()) {
371  return false;
372  }
373 
374  switch (ValueStorageKind()) {
377  StoreValue(flag_state.value_.heap_allocated);
378  break;
380  StoreValue(&flag_state.value_.one_word);
381  break;
382  }
383 
384  modified_ = flag_state.modified_;
385  on_command_line_ = flag_state.on_command_line_;
386 
387  return true;
388 }
389 
390 template <typename StorageT>
391 StorageT* FlagImpl::OffsetValue() const {
392  char* p = reinterpret_cast<char*>(const_cast<FlagImpl*>(this));
393  // The offset is deduced via Flag value type specific op_.
395 
396  return reinterpret_cast<StorageT*>(p + offset);
397 }
398 
399 void* FlagImpl::AlignedBufferValue() const {
400  assert(ValueStorageKind() == FlagValueStorageKind::kAlignedBuffer);
401  return OffsetValue<void>();
402 }
403 
404 std::atomic<uint64_t>* FlagImpl::AtomicBufferValue() const {
405  assert(ValueStorageKind() == FlagValueStorageKind::kSequenceLocked);
406  return OffsetValue<std::atomic<uint64_t>>();
407 }
408 
409 std::atomic<int64_t>& FlagImpl::OneWordValue() const {
410  assert(ValueStorageKind() == FlagValueStorageKind::kOneWordAtomic);
411  return OffsetValue<FlagOneWordValue>()->value;
412 }
413 
414 // Attempts to parse supplied `value` string using parsing routine in the `flag`
415 // argument. If parsing successful, this function replaces the dst with newly
416 // parsed value. In case if any error is encountered in either step, the error
417 // message is stored in 'err'
418 std::unique_ptr<void, DynValueDeleter> FlagImpl::TryParse(
420  std::unique_ptr<void, DynValueDeleter> tentative_value = MakeInitValue();
421 
422  std::string parse_err;
423  if (!flags_internal::Parse(op_, value, tentative_value.get(), &parse_err)) {
424  absl::string_view err_sep = parse_err.empty() ? "" : "; ";
425  err = absl::StrCat("Illegal value '", value, "' specified for flag '",
426  Name(), "'", err_sep, parse_err);
427  return nullptr;
428  }
429 
430  return tentative_value;
431 }
432 
433 void FlagImpl::Read(void* dst) const {
434  auto* guard = DataGuard(); // Make sure flag initialized
435  switch (ValueStorageKind()) {
437  absl::MutexLock l(guard);
438  flags_internal::CopyConstruct(op_, AlignedBufferValue(), dst);
439  break;
440  }
442  const int64_t one_word_val =
443  OneWordValue().load(std::memory_order_acquire);
444  std::memcpy(dst, &one_word_val, Sizeof(op_));
445  break;
446  }
448  ReadSequenceLockedData(dst);
449  break;
450  }
451  }
452 }
453 
454 void FlagImpl::ReadSequenceLockedData(void* dst) const {
455  int size = Sizeof(op_);
456  // Attempt to read using the sequence lock.
457  if (ABSL_PREDICT_TRUE(seq_lock_.TryRead(dst, AtomicBufferValue(), size))) {
458  return;
459  }
460  // We failed due to contention. Acquire the lock to prevent contention
461  // and try again.
462  absl::ReaderMutexLock l(DataGuard());
463  bool success = seq_lock_.TryRead(dst, AtomicBufferValue(), size);
464  assert(success);
465  static_cast<void>(success);
466 }
467 
468 void FlagImpl::Write(const void* src) {
469  absl::MutexLock l(DataGuard());
470 
471  if (ShouldValidateFlagValue(flags_internal::FastTypeId(op_))) {
472  std::unique_ptr<void, DynValueDeleter> obj{flags_internal::Clone(op_, src),
473  DynValueDeleter{op_}};
474  std::string ignored_error;
475  std::string src_as_str = flags_internal::Unparse(op_, src);
476  if (!flags_internal::Parse(op_, src_as_str, obj.get(), &ignored_error)) {
477  ABSL_INTERNAL_LOG(ERROR, absl::StrCat("Attempt to set flag '", Name(),
478  "' to invalid value ", src_as_str));
479  }
480  }
481 
482  StoreValue(src);
483 }
484 
485 // Sets the value of the flag based on specified string `value`. If the flag
486 // was successfully set to new value, it returns true. Otherwise, sets `err`
487 // to indicate the error, leaves the flag unchanged, and returns false. There
488 // are three ways to set the flag's value:
489 // * Update the current flag value
490 // * Update the flag's default value
491 // * Update the current flag value if it was never set before
492 // The mode is selected based on 'set_mode' parameter.
494  ValueSource source, std::string& err) {
495  absl::MutexLock l(DataGuard());
496 
497  switch (set_mode) {
498  case SET_FLAGS_VALUE: {
499  // set or modify the flag's value
500  auto tentative_value = TryParse(value, err);
501  if (!tentative_value) return false;
502 
503  StoreValue(tentative_value.get());
504 
505  if (source == kCommandLine) {
506  on_command_line_ = true;
507  }
508  break;
509  }
510  case SET_FLAG_IF_DEFAULT: {
511  // set the flag's value, but only if it hasn't been set by someone else
512  if (modified_) {
513  // TODO(rogeeff): review and fix this semantic. Currently we do not fail
514  // in this case if flag is modified. This is misleading since the flag's
515  // value is not updated even though we return true.
516  // *err = absl::StrCat(Name(), " is already set to ",
517  // CurrentValue(), "\n");
518  // return false;
519  return true;
520  }
521  auto tentative_value = TryParse(value, err);
522  if (!tentative_value) return false;
523 
524  StoreValue(tentative_value.get());
525  break;
526  }
527  case SET_FLAGS_DEFAULT: {
528  auto tentative_value = TryParse(value, err);
529  if (!tentative_value) return false;
530 
531  if (DefaultKind() == FlagDefaultKind::kDynamicValue) {
532  void* old_value = default_value_.dynamic_value;
533  default_value_.dynamic_value = tentative_value.release();
534  tentative_value.reset(old_value);
535  } else {
536  default_value_.dynamic_value = tentative_value.release();
537  def_kind_ = static_cast<uint8_t>(FlagDefaultKind::kDynamicValue);
538  }
539 
540  if (!modified_) {
541  // Need to set both default value *and* current, in this case.
542  StoreValue(default_value_.dynamic_value);
543  modified_ = false;
544  }
545  break;
546  }
547  }
548 
549  return true;
550 }
551 
554 
555  absl::MutexLock lock(DataGuard());
556 
557  auto dst = MakeInitValue();
559  if (!flags_internal::Parse(op_, v, dst.get(), &error)) {
561  FATAL,
562  absl::StrCat("Flag ", Name(), " (from ", Filename(),
563  "): string form of default value '", v,
564  "' could not be parsed; error=", error));
565  }
566 
567  // We do not compare dst to def since parsing/unparsing may make
568  // small changes, e.g., precision loss for floating point types.
569 }
570 
572  absl::MutexLock l(DataGuard());
573 
574  auto obj = MakeInitValue();
575  std::string ignored_error;
576  return flags_internal::Parse(op_, value, obj.get(), &ignored_error);
577 }
578 
579 } // namespace flags_internal
581 } // namespace absl
absl::flags_internal::FlagSettingMode
FlagSettingMode
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:34
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
absl::flags_internal::FlagImpl::CheckDefaultValueParsingRoundtrip
void CheckDefaultValueParsingRoundtrip() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:586
obj
OPENSSL_EXPORT const ASN1_OBJECT * obj
Definition: x509.h:1671
absl::flags_internal::Sizeof
size_t Sizeof(FlagOpFn op)
Definition: abseil-cpp/absl/flags/internal/flag.h:136
absl::flags_internal::FlagImpl::ModificationCount
int64_t ModificationCount() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:276
absl::flags_internal::FlagValueStorageKind::kOneWordAtomic
@ kOneWordAtomic
dst
static const char dst[]
Definition: test-fs-copyfile.c:37
Filename
static std::string Filename(const protobuf::FileDescriptor *file)
Definition: upbc.cc:53
absl::flags_internal::FlagImpl::DefaultValue
std::string DefaultValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:285
absl::flags_internal::FlagState::FlagImpl
friend class FlagImpl
Definition: abseil-cpp/absl/flags/internal/flag.cc:107
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
absl::flags_internal::FlagImpl::SetCallback
void SetCallback(const FlagCallbackFunc mutation_callback) ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:317
absl::flags_internal::FlagImpl::Help
std::string Help() const override
Definition: abseil-cpp/absl/flags/internal/flag.cc:267
absl::flags_internal::FlagImpl::CurrentValue
std::string CurrentValue() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:292
absl::flags_internal::FlagState::~FlagState
~FlagState() override
Definition: bloaty/third_party/abseil-cpp/absl/flags/internal/flag.cc:98
absl::flags_internal::FlagImpl::Name
absl::string_view Name() const override
Definition: abseil-cpp/absl/flags/internal/flag.cc:261
absl::Mutex
Definition: abseil-cpp/absl/synchronization/mutex.h:131
absl::flags_internal::FlagImpl::RestoreState
bool RestoreState(const FlagState &flag_state) ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:382
absl::flags_internal::FlagFastTypeId
absl::base_internal::FastTypeIdType FlagFastTypeId
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:31
string.h
absl::flags_internal::Unparse
std::string Unparse(FlagOpFn op, const void *val)
Definition: abseil-cpp/absl/flags/internal/flag.h:130
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
array
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern array
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/array.c:111
absl::Mutex::Unlock
void Unlock() ABSL_UNLOCK_FUNCTION()
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
error_ref_leak.err
err
Definition: error_ref_leak.py:35
absl::flags_internal::FlagDefaultKind::kGenFunc
@ kGenFunc
absl::bit_cast
Dest bit_cast(const Source &source)
Definition: abseil-cpp/absl/base/casts.h:167
absl::flags_internal::kStrippedFlagHelp
const char kStrippedFlagHelp[]
Definition: abseil-cpp/absl/flags/internal/flag.cc:51
absl::flags_internal::FlagCallbackFunc
void(*)() FlagCallbackFunc
Definition: abseil-cpp/absl/flags/internal/flag.h:412
absl::flags_internal::FlagState::modified_
bool modified_
Definition: abseil-cpp/absl/flags/internal/flag.cc:127
absl::flags_internal::FlagDefaultKind
FlagDefaultKind
Definition: abseil-cpp/absl/flags/internal/flag.h:265
absl::flags_internal::FlagImpl::Init
void Init()
Definition: abseil-cpp/absl/flags/internal/flag.cc:143
absl::flags_internal::SET_FLAG_IF_DEFAULT
@ SET_FLAG_IF_DEFAULT
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:39
xds_manager.p
p
Definition: xds_manager.py:60
absl::FlagsUsageConfig::normalize_filename
std::function< std::string(absl::string_view)> normalize_filename
Definition: abseil-cpp/absl/flags/usage_config.h:106
name_
const std::string name_
Definition: priority.cc:233
ABSL_NAMESPACE_END
#define ABSL_NAMESPACE_END
Definition: third_party/abseil-cpp/absl/base/config.h:171
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
absl::flags_internal::FlagImpl::ValueStorageKind
FlagValueStorageKind ValueStorageKind() const
Definition: abseil-cpp/absl/flags/internal/flag.h:541
absl::flags_internal::FlagDefaultKind::kDynamicValue
@ kDynamicValue
DONT_VALIDATE
#define DONT_VALIDATE(T, _)
absl::flags_internal::FlagImpl::SaveState
std::unique_ptr< FlagStateInterface > SaveState() override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:351
absl::call_once
void call_once(absl::once_flag &flag, Callable &&fn, Args &&... args)
Definition: abseil-cpp/absl/base/call_once.h:206
absl::flags_internal::FlagImpl::ParseFrom
bool ParseFrom(absl::string_view value, FlagSettingMode set_mode, ValueSource source, std::string &error) override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:527
absl::flags_internal::FlagImpl
Definition: abseil-cpp/absl/flags/internal/flag.h:432
absl::MutexLock
Definition: abseil-cpp/absl/synchronization/mutex.h:525
memcpy
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
ABSL_NAMESPACE_BEGIN
#define ABSL_NAMESPACE_BEGIN
Definition: third_party/abseil-cpp/absl/base/config.h:170
absl::flags_internal::FastTypeId
FlagFastTypeId FastTypeId(FlagOpFn op)
Definition: abseil-cpp/absl/flags/internal/flag.h:143
absl::flags_internal::FlagImpl::Filename
std::string Filename() const override
Definition: abseil-cpp/absl/flags/internal/flag.cc:263
absl::flags_internal::FlagImpl::op_
const FlagOpFn op_
Definition: abseil-cpp/absl/flags/internal/flag.h:587
absl::flags_internal::FlagImpl::Write
void Write(const void *src) ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:502
absl::flags_internal::FlagState::SavedValue::one_word
int64_t one_word
Definition: abseil-cpp/absl/flags/internal/flag.cc:125
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
absl::flags_internal::Clone
void * Clone(FlagOpFn op, const void *obj)
Definition: abseil-cpp/absl/flags/internal/flag.h:119
python_utils.jobset.INFO
INFO
Definition: jobset.py:111
mu
Mutex mu
Definition: server_config_selector_filter.cc:74
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
op_
uint8 op_
Definition: bloaty/third_party/protobuf/src/google/protobuf/compiler/objectivec/objectivec_helpers.cc:1342
absl::Mutex::Lock
void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION()
absl::flags_internal::FlagImpl::AssertValidType
void AssertValidType(FlagFastTypeId type_id, const std::type_info *(*gen_rtti)()) const
Definition: abseil-cpp/absl/flags/internal/flag.cc:195
absl::flags_internal::SET_FLAGS_VALUE
@ SET_FLAGS_VALUE
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:36
counter
static int counter
Definition: abseil-cpp/absl/flags/reflection_test.cc:131
absl::flags_internal::FlagImpl::OneWordValue
std::atomic< int64_t > & OneWordValue() const
Definition: abseil-cpp/absl/flags/internal/flag.cc:424
absl::flags_internal::FlagImpl::TryParse
std::unique_ptr< void, DynValueDeleter > TryParse(absl::string_view value, std::string &err) const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:434
gen_build_yaml.load
def load(*args)
Definition: test/core/end2end/gen_build_yaml.py:25
absl::flags_internal::FlagState::SavedValue::heap_allocated
void * heap_allocated
Definition: abseil-cpp/absl/flags/internal/flag.cc:124
absl::flags_internal::Parse
bool Parse(FlagOpFn op, absl::string_view text, void *dst, std::string *error)
Definition: abseil-cpp/absl/flags/internal/flag.h:125
google::protobuf::compiler::cpp::DefaultValue
std::string DefaultValue(const FieldDescriptor *field)
Definition: bloaty/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc:622
absl::flags_internal::Alloc
void * Alloc(FlagOpFn op)
Definition: abseil-cpp/absl/flags/internal/flag.h:102
absl::flags_internal::FlagHelpKind::kLiteral
@ kLiteral
absl::flags_internal::FlagImpl::DataGuard
FlagCallback *callback_ ABSL_GUARDED_BY * DataGuard()
Definition: abseil-cpp/absl/flags/internal/flag.cc:187
ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES
#define ABSL_FLAGS_INTERNAL_SUPPORTED_TYPES(A)
Definition: third_party/abseil-cpp/absl/flags/config.h:63
google::protobuf::ERROR
static const LogLevel ERROR
Definition: bloaty/third_party/protobuf/src/google/protobuf/testing/googletest.h:70
stdint.h
absl::flags_internal::ValueSource
ValueSource
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:47
ABSL_PREDICT_TRUE
#define ABSL_PREDICT_TRUE(x)
Definition: abseil-cpp/absl/base/optimization.h:181
absl::flags_internal::FlagState::flag_impl_
FlagImpl & flag_impl_
Definition: abseil-cpp/absl/flags/internal/flag.cc:119
absl::flags_internal::FlagState::SavedValue::SavedValue
SavedValue(int64_t v)
Definition: bloaty/third_party/abseil-cpp/absl/flags/internal/flag.cc:121
value
const char * value
Definition: hpack_parser_table.cc:165
absl::flags_internal::FlagImpl::IsSpecifiedOnCommandLine
bool IsSpecifiedOnCommandLine() const override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:280
absl::flags_internal::FlagState::SavedValue::SavedValue
SavedValue(void *v)
Definition: bloaty/third_party/abseil-cpp/absl/flags/internal/flag.cc:120
absl::flags_internal::FlagImpl::AtomicBufferValue
std::atomic< uint64_t > * AtomicBufferValue() const
Definition: abseil-cpp/absl/flags/internal/flag.cc:419
FATAL
#define FATAL(msg)
Definition: task.h:88
absl::flags_internal::Delete
void Delete(FlagOpFn op, void *obj)
Definition: abseil-cpp/absl/flags/internal/flag.h:106
absl::flags_internal::CopyConstruct
void CopyConstruct(FlagOpFn op, const void *src, void *dst)
Definition: abseil-cpp/absl/flags/internal/flag.h:115
absl::flags_internal::FlagState::counter_
int64_t counter_
Definition: abseil-cpp/absl/flags/internal/flag.cc:129
absl::ReaderMutexLock
Definition: abseil-cpp/absl/synchronization/mutex.h:560
absl::flags_internal::FlagImpl::TypeId
FlagFastTypeId TypeId() const override
Definition: abseil-cpp/absl/flags/internal/flag.cc:272
absl::flags_internal::FlagImpl::Read
void Read(void *dst) const override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:449
absl::flags_internal::SET_FLAGS_DEFAULT
@ SET_FLAGS_DEFAULT
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:43
absl::flags_internal::FlagImpl::ReadSequenceLockedData
void ReadSequenceLockedData(void *dst) const ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:488
absl::flags_internal::FlagImpl::ValidateInputValue
bool ValidateInputValue(absl::string_view value) const override ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:605
absl::flags_internal::ValueOffset
ptrdiff_t ValueOffset(FlagOpFn op)
Definition: abseil-cpp/absl/flags/internal/flag.h:156
absl::flags_internal::GetUsageConfig
FlagsUsageConfig GetUsageConfig()
Definition: abseil-cpp/absl/flags/usage_config.cc:113
absl::flags_internal::FlagState::on_command_line_
bool on_command_line_
Definition: abseil-cpp/absl/flags/internal/flag.cc:128
absl::flags_internal::FlagState::FlagState
FlagState(FlagImpl &flag_impl, const V &v, bool modified, bool on_command_line, int64_t counter)
Definition: bloaty/third_party/abseil-cpp/absl/flags/internal/flag.cc:90
absl::flags_internal::FlagImpl::MakeInitValue
absl::Mutex *DataGuard() const ABSL_LOCK_RETURNED(reinterpret_cast< absl std::unique_ptr< void, DynValueDeleter > MakeInitValue() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:220
absl::flags_internal::DynValueDeleter::DynValueDeleter
DynValueDeleter(FlagOpFn op_arg=nullptr)
Definition: abseil-cpp/absl/flags/internal/flag.cc:135
absl::flags_internal::FlagOpFn
void *(*)(FlagOp, const void *, void *, void *) FlagOpFn
Definition: abseil-cpp/absl/flags/internal/flag.h:95
absl::flags_internal::FlagState::value_
union absl::flags_internal::FlagState::SavedValue value_
absl::flags_internal::kCommandLine
@ kCommandLine
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:49
absl::string_view::empty
constexpr bool empty() const noexcept
Definition: abseil-cpp/absl/strings/string_view.h:292
absl::flags_internal::FlagImpl::OffsetValue
StorageT * OffsetValue() const
Definition: abseil-cpp/absl/flags/internal/flag.cc:406
absl::flags_internal::RuntimeTypeId
const std::type_info * RuntimeTypeId(FlagOpFn op)
Definition: abseil-cpp/absl/flags/internal/flag.h:148
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
absl::flags_internal::DynValueDeleter::operator()
void operator()(void *ptr) const
Definition: abseil-cpp/absl/flags/internal/flag.cc:137
absl::flags_internal::FlagState::Restore
void Restore() const override
Definition: bloaty/third_party/abseil-cpp/absl/flags/internal/flag.cc:109
absl::flags_internal::FlagImpl::AlignedBufferValue
void * AlignedBufferValue() const
Definition: abseil-cpp/absl/flags/internal/flag.cc:414
run_grpclb_interop_tests.l
dictionary l
Definition: run_grpclb_interop_tests.py:410
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
absl::flags_internal::FlagValueStorageKind::kAlignedBuffer
@ kAlignedBuffer
ABSL_INTERNAL_LOG
#define ABSL_INTERNAL_LOG(severity, message)
Definition: abseil-cpp/absl/base/internal/raw_logging.h:75
absl::flags_internal::FlagValueStorageKind::kSequenceLocked
@ kSequenceLocked
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
absl::flags_internal::FlagImpl::StoreValue
void StoreValue(const void *src) ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:237
mu_
absl::Mutex & mu_
Definition: bloaty/third_party/abseil-cpp/absl/flags/internal/flag.cc:77
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
absl::flags_internal::Copy
void Copy(FlagOpFn op, const void *src, void *dst)
Definition: abseil-cpp/absl/flags/internal/flag.h:110
old_value
int old_value
Definition: abseil-cpp/absl/strings/internal/str_format/output.cc:30
offset
voidpf uLong offset
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:142
absl::flags_internal::FlagImpl::InvokeCallback
void InvokeCallback() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:328


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:24