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/dynamic_annotations.h"
34 #include "absl/base/optimization.h"
35 #include "absl/flags/config.h"
36 #include "absl/flags/internal/commandlineflag.h"
37 #include "absl/flags/usage_config.h"
38 #include "absl/memory/memory.h"
39 #include "absl/strings/str_cat.h"
40 #include "absl/strings/string_view.h"
41 #include "absl/synchronization/mutex.h"
42 
43 namespace absl {
45 namespace flags_internal {
46 
47 // The help message indicating that the commandline flag has been
48 // 'stripped'. It will not show up when doing "-help" and its
49 // variants. The flag is stripped if ABSL_FLAGS_STRIP_HELP is set to 1
50 // before including absl/flags/flag.h
51 const char kStrippedFlagHelp[] = "\001\002\003\004 (unknown) \004\003\002\001";
52 
53 namespace {
54 
55 // Currently we only validate flag values for user-defined flag types.
56 bool ShouldValidateFlagValue(FlagFastTypeId flag_type_id) {
57 #define DONT_VALIDATE(T, _) \
58  if (flag_type_id == base_internal::FastTypeId<T>()) return false;
60 #undef DONT_VALIDATE
61 
62  return true;
63 }
64 
65 // RAII helper used to temporarily unlock and relock `absl::Mutex`.
66 // This is used when we need to ensure that locks are released while
67 // invoking user supplied callbacks and then reacquired, since callbacks may
68 // need to acquire these locks themselves.
69 class MutexRelock {
70  public:
71  explicit MutexRelock(absl::Mutex& mu) : mu_(mu) { mu_.Unlock(); }
72  ~MutexRelock() { mu_.Lock(); }
73 
74  MutexRelock(const MutexRelock&) = delete;
75  MutexRelock& operator=(const MutexRelock&) = delete;
76 
77  private:
79 };
80 
81 } // namespace
82 
84 // Persistent state of the flag data.
85 
86 class FlagImpl;
87 
89  public:
90  template <typename V>
91  FlagState(FlagImpl& flag_impl, const V& v, bool modified,
92  bool on_command_line, int64_t counter)
93  : flag_impl_(flag_impl),
94  value_(v),
95  modified_(modified),
96  on_command_line_(on_command_line),
97  counter_(counter) {}
98 
99  ~FlagState() override {
102  return;
104  }
105 
106  private:
107  friend class FlagImpl;
108 
109  // Restores the flag to the saved state.
110  void Restore() const override {
111  if (!flag_impl_.RestoreState(*this)) return;
112 
114  absl::StrCat("Restore saved value of ", flag_impl_.Name(),
115  " to: ", flag_impl_.CurrentValue()));
116  }
117 
118  // Flag and saved flag data.
120  union SavedValue {
121  explicit SavedValue(void* v) : heap_allocated(v) {}
122  explicit SavedValue(int64_t v) : one_word(v) {}
123 
126  } value_;
127  bool modified_;
130 };
131 
133 // Flag implementation, which does not depend on flag value type.
134 
136 
137 void DynValueDeleter::operator()(void* ptr) const {
138  if (op == nullptr) return;
139 
140  Delete(op, ptr);
141 }
142 
144  new (&data_guard_) absl::Mutex;
145 
146  auto def_kind = static_cast<FlagDefaultKind>(def_kind_);
147 
148  switch (ValueStorageKind()) {
151  alignas(int64_t) std::array<char, sizeof(int64_t)> buf{};
152  if (def_kind == FlagDefaultKind::kGenFunc) {
153  (*default_value_.gen_func)(buf.data());
154  } else {
155  assert(def_kind != FlagDefaultKind::kDynamicValue);
157  }
159  // We presume here the memory layout of FlagValueAndInitBit struct.
160  uint8_t initialized = 1;
161  std::memcpy(buf.data() + Sizeof(op_), &initialized,
162  sizeof(initialized));
163  }
164  // Type can contain valid uninitialized bits, e.g. padding.
166  OneWordValue().store(absl::bit_cast<int64_t>(buf),
167  std::memory_order_release);
168  break;
169  }
171  // For this storage kind the default_value_ always points to gen_func
172  // during initialization.
173  assert(def_kind == FlagDefaultKind::kGenFunc);
175  break;
176  }
178  // For this storage kind the default_value_ always points to gen_func
179  // during initialization.
180  assert(def_kind == FlagDefaultKind::kGenFunc);
182  break;
183  }
185 }
186 
189  const_cast<FlagImpl*>(this));
190 
191  // data_guard_ is initialized inside Init.
192  return reinterpret_cast<absl::Mutex*>(&data_guard_);
193 }
194 
196  const std::type_info* (*gen_rtti)()) const {
198 
199  // `rhs_type_id` is the fast type id corresponding to the declaration
200  // visibile at the call site. `lhs_type_id` is the fast type id
201  // corresponding to the type specified in flag definition. They must match
202  // for this operation to be well-defined.
203  if (ABSL_PREDICT_TRUE(lhs_type_id == rhs_type_id)) return;
204 
205  const std::type_info* lhs_runtime_type_id =
207  const std::type_info* rhs_runtime_type_id = (*gen_rtti)();
208 
209  if (lhs_runtime_type_id == rhs_runtime_type_id) return;
210 
211 #ifdef ABSL_INTERNAL_HAS_RTTI
212  if (*lhs_runtime_type_id == *rhs_runtime_type_id) return;
213 #endif
214 
216  FATAL, absl::StrCat("Flag '", Name(),
217  "' is defined as one type and declared as another"));
218 }
219 
220 std::unique_ptr<void, DynValueDeleter> FlagImpl::MakeInitValue() const {
221  void* res = nullptr;
222  switch (DefaultKind()) {
225  break;
227  res = flags_internal::Alloc(op_);
228  (*default_value_.gen_func)(res);
229  break;
230  default:
232  break;
233  }
234  return {res, DynValueDeleter{op_}};
235 }
236 
237 void FlagImpl::StoreValue(const void* src) {
238  switch (ValueStorageKind()) {
241  // Load the current value to avoid setting 'init' bit manualy.
242  int64_t one_word_val = OneWordValue().load(std::memory_order_acquire);
243  std::memcpy(&one_word_val, src, Sizeof(op_));
244  OneWordValue().store(one_word_val, std::memory_order_release);
246  break;
247  }
250  break;
251  }
253  Copy(op_, src, AlignedBufferValue());
255  break;
256  }
257  modified_ = true;
258  InvokeCallback();
259 }
260 
262 
265 }
266 
269  : help_.gen_func();
270 }
271 
274 }
275 
277  return seq_lock_.ModificationCount();
278 }
279 
282  return on_command_line_;
283 }
284 
287 
288  auto obj = MakeInitValue();
289  return flags_internal::Unparse(op_, obj.get());
290 }
291 
293  auto* guard = DataGuard(); // Make sure flag initialized
294  switch (ValueStorageKind()) {
297  const auto one_word_val =
298  absl::bit_cast<std::array<char, sizeof(int64_t)>>(
299  OneWordValue().load(std::memory_order_acquire));
300  return flags_internal::Unparse(op_, one_word_val.data());
301  }
303  std::unique_ptr<void, DynValueDeleter> cloned(flags_internal::Alloc(op_),
305  ReadSequenceLockedData(cloned.get());
306  return flags_internal::Unparse(op_, cloned.get());
307  }
309  absl::MutexLock l(guard);
311  }
312  }
313 
314  return "";
315 }
316 
317 void FlagImpl::SetCallback(const FlagCallbackFunc mutation_callback) {
319 
320  if (callback_ == nullptr) {
321  callback_ = new FlagCallback;
322  }
323  callback_->func = mutation_callback;
324 
325  InvokeCallback();
326 }
327 
329  if (!callback_) return;
330 
331  // Make a copy of the C-style function pointer that we are about to invoke
332  // before we release the lock guarding it.
333  FlagCallbackFunc cb = callback_->func;
334 
335  // If the flag has a mutation callback this function invokes it. While the
336  // callback is being invoked the primary flag's mutex is unlocked and it is
337  // re-locked back after call to callback is completed. Callback invocation is
338  // guarded by flag's secondary mutex instead which prevents concurrent
339  // callback invocation. Note that it is possible for other thread to grab the
340  // primary lock and update flag's value at any time during the callback
341  // invocation. This is by design. Callback can get a value of the flag if
342  // necessary, but it might be different from the value initiated the callback
343  // and it also can be different by the time the callback invocation is
344  // completed. Requires that *primary_lock be held in exclusive mode; it may be
345  // released and reacquired by the implementation.
346  MutexRelock relock(*DataGuard());
347  absl::MutexLock lock(&callback_->guard);
348  cb();
349 }
350 
351 std::unique_ptr<FlagStateInterface> FlagImpl::SaveState() {
353 
354  bool modified = modified_;
355  bool on_command_line = on_command_line_;
356  switch (ValueStorageKind()) {
359  return absl::make_unique<FlagState>(
360  *this, OneWordValue().load(std::memory_order_acquire), modified,
361  on_command_line, ModificationCount());
362  }
364  void* cloned = flags_internal::Alloc(op_);
365  // Read is guaranteed to be successful because we hold the lock.
366  bool success =
368  assert(success);
369  static_cast<void>(success);
370  return absl::make_unique<FlagState>(*this, cloned, modified,
371  on_command_line, ModificationCount());
372  }
374  return absl::make_unique<FlagState>(
375  *this, flags_internal::Clone(op_, AlignedBufferValue()), modified,
376  on_command_line, ModificationCount());
377  }
378  }
379  return nullptr;
380 }
381 
382 bool FlagImpl::RestoreState(const FlagState& flag_state) {
384  if (flag_state.counter_ == ModificationCount()) {
385  return false;
386  }
387 
388  switch (ValueStorageKind()) {
391  StoreValue(&flag_state.value_.one_word);
392  break;
395  StoreValue(flag_state.value_.heap_allocated);
396  break;
397  }
398 
399  modified_ = flag_state.modified_;
400  on_command_line_ = flag_state.on_command_line_;
401 
402  return true;
403 }
404 
405 template <typename StorageT>
406 StorageT* FlagImpl::OffsetValue() const {
407  char* p = reinterpret_cast<char*>(const_cast<FlagImpl*>(this));
408  // The offset is deduced via Flag value type specific op_.
410 
411  return reinterpret_cast<StorageT*>(p + offset);
412 }
413 
416  return OffsetValue<void>();
417 }
418 
419 std::atomic<uint64_t>* FlagImpl::AtomicBufferValue() const {
421  return OffsetValue<std::atomic<uint64_t>>();
422 }
423 
424 std::atomic<int64_t>& FlagImpl::OneWordValue() const {
427  return OffsetValue<FlagOneWordValue>()->value;
428 }
429 
430 // Attempts to parse supplied `value` string using parsing routine in the `flag`
431 // argument. If parsing successful, this function replaces the dst with newly
432 // parsed value. In case if any error is encountered in either step, the error
433 // message is stored in 'err'
434 std::unique_ptr<void, DynValueDeleter> FlagImpl::TryParse(
436  std::unique_ptr<void, DynValueDeleter> tentative_value = MakeInitValue();
437 
438  std::string parse_err;
439  if (!flags_internal::Parse(op_, value, tentative_value.get(), &parse_err)) {
440  absl::string_view err_sep = parse_err.empty() ? "" : "; ";
441  err = absl::StrCat("Illegal value '", value, "' specified for flag '",
442  Name(), "'", err_sep, parse_err);
443  return nullptr;
444  }
445 
446  return tentative_value;
447 }
448 
449 void FlagImpl::Read(void* dst) const {
450  auto* guard = DataGuard(); // Make sure flag initialized
451  switch (ValueStorageKind()) {
454  const int64_t one_word_val =
455  OneWordValue().load(std::memory_order_acquire);
456  std::memcpy(dst, &one_word_val, Sizeof(op_));
457  break;
458  }
461  break;
462  }
464  absl::MutexLock l(guard);
466  break;
467  }
468  }
469 }
470 
474  auto* guard = DataGuard(); // Make sure flag initialized
475  (void)guard;
476  return OneWordValue().load(std::memory_order_acquire);
477 }
478 
479 bool FlagImpl::ReadOneBool() const {
481  auto* guard = DataGuard(); // Make sure flag initialized
482  (void)guard;
483  return absl::bit_cast<FlagValueAndInitBit<bool>>(
484  OneWordValue().load(std::memory_order_acquire))
485  .value;
486 }
487 
489  int size = Sizeof(op_);
490  // Attempt to read using the sequence lock.
492  return;
493  }
494  // We failed due to contention. Acquire the lock to prevent contention
495  // and try again.
497  bool success = seq_lock_.TryRead(dst, AtomicBufferValue(), size);
498  assert(success);
499  static_cast<void>(success);
500 }
501 
502 void FlagImpl::Write(const void* src) {
504 
505  if (ShouldValidateFlagValue(flags_internal::FastTypeId(op_))) {
506  std::unique_ptr<void, DynValueDeleter> obj{flags_internal::Clone(op_, src),
508  std::string ignored_error;
509  std::string src_as_str = flags_internal::Unparse(op_, src);
510  if (!flags_internal::Parse(op_, src_as_str, obj.get(), &ignored_error)) {
511  ABSL_INTERNAL_LOG(ERROR, absl::StrCat("Attempt to set flag '", Name(),
512  "' to invalid value ", src_as_str));
513  }
514  }
515 
516  StoreValue(src);
517 }
518 
519 // Sets the value of the flag based on specified string `value`. If the flag
520 // was successfully set to new value, it returns true. Otherwise, sets `err`
521 // to indicate the error, leaves the flag unchanged, and returns false. There
522 // are three ways to set the flag's value:
523 // * Update the current flag value
524 // * Update the flag's default value
525 // * Update the current flag value if it was never set before
526 // The mode is selected based on 'set_mode' parameter.
528  ValueSource source, std::string& err) {
530 
531  switch (set_mode) {
532  case SET_FLAGS_VALUE: {
533  // set or modify the flag's value
534  auto tentative_value = TryParse(value, err);
535  if (!tentative_value) return false;
536 
537  StoreValue(tentative_value.get());
538 
539  if (source == kCommandLine) {
540  on_command_line_ = true;
541  }
542  break;
543  }
544  case SET_FLAG_IF_DEFAULT: {
545  // set the flag's value, but only if it hasn't been set by someone else
546  if (modified_) {
547  // TODO(rogeeff): review and fix this semantic. Currently we do not fail
548  // in this case if flag is modified. This is misleading since the flag's
549  // value is not updated even though we return true.
550  // *err = absl::StrCat(Name(), " is already set to ",
551  // CurrentValue(), "\n");
552  // return false;
553  return true;
554  }
555  auto tentative_value = TryParse(value, err);
556  if (!tentative_value) return false;
557 
558  StoreValue(tentative_value.get());
559  break;
560  }
561  case SET_FLAGS_DEFAULT: {
562  auto tentative_value = TryParse(value, err);
563  if (!tentative_value) return false;
564 
567  default_value_.dynamic_value = tentative_value.release();
568  tentative_value.reset(old_value);
569  } else {
570  default_value_.dynamic_value = tentative_value.release();
572  }
573 
574  if (!modified_) {
575  // Need to set both default value *and* current, in this case.
577  modified_ = false;
578  }
579  break;
580  }
581  }
582 
583  return true;
584 }
585 
588 
589  absl::MutexLock lock(DataGuard());
590 
591  auto dst = MakeInitValue();
593  if (!flags_internal::Parse(op_, v, dst.get(), &error)) {
595  FATAL,
596  absl::StrCat("Flag ", Name(), " (from ", Filename(),
597  "): string form of default value '", v,
598  "' could not be parsed; error=", error));
599  }
600 
601  // We do not compare dst to def since parsing/unparsing may make
602  // small changes, e.g., precision loss for floating point types.
603 }
604 
607 
608  auto obj = MakeInitValue();
609  std::string ignored_error;
610  return flags_internal::Parse(op_, value, obj.get(), &ignored_error);
611 }
612 
613 } // namespace flags_internal
615 } // 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
absl::flags_internal::FlagImpl::seq_lock_
flags_internal::SequenceLock seq_lock_
Definition: abseil-cpp/absl/flags/internal/flag.h:612
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
absl::flags_internal::SequenceLock::IncrementModificationCount
void IncrementModificationCount()
Definition: abseil-cpp/absl/flags/internal/sequence_lock.h:134
absl::flags_internal::FlagImpl::ReadOneBool
bool ReadOneBool() const ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:479
absl::flags_internal::DynValueDeleter
Definition: abseil-cpp/absl/flags/internal/flag.h:423
absl::flags_internal::FlagImpl::default_value_
FlagDefaultSrc default_value_
Definition: abseil-cpp/absl/flags/internal/flag.h:620
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::FlagImpl::HelpSourceKind
FlagHelpKind HelpSourceKind() const
Definition: abseil-cpp/absl/flags/internal/flag.h:538
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
ABSL_ANNOTATE_MEMORY_IS_INITIALIZED
#define ABSL_ANNOTATE_MEMORY_IS_INITIALIZED(address, size)
Definition: third_party/abseil-cpp/absl/base/dynamic_annotations.h:264
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: abseil-cpp/absl/flags/internal/flag.cc:99
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
absl::flags_internal::FlagDefaultSrc::gen_func
FlagDfltGenFunc gen_func
Definition: abseil-cpp/absl/flags/internal/flag.h:262
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()
absl::flags_internal::FlagState::SavedValue
Definition: abseil-cpp/absl/flags/internal/flag.cc:120
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
absl::flags_internal::FlagCallback
Definition: abseil-cpp/absl/flags/internal/flag.h:414
absl::flags_internal::FlagImpl::on_command_line_
bool on_command_line_
Definition: abseil-cpp/absl/flags/internal/flag.h:606
absl::FlagsUsageConfig::normalize_filename
std::function< std::string(absl::string_view)> normalize_filename
Definition: abseil-cpp/absl/flags/usage_config.h:106
absl::flags_internal::FlagState
Definition: abseil-cpp/absl/flags/internal/flag.cc:88
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
initialized
bool initialized
Definition: timer_generic.cc:223
absl::flags_internal::FlagImpl::ValueStorageKind
FlagValueStorageKind ValueStorageKind() const
Definition: abseil-cpp/absl/flags/internal/flag.h:541
absl::flags_internal::FlagImpl::modified_
bool modified_
Definition: abseil-cpp/absl/flags/internal/flag.h:604
absl::flags_internal::FlagDefaultKind::kDynamicValue
@ kDynamicValue
absl::flags_internal::FlagImpl::help_
const FlagHelpMsg help_
Definition: abseil-cpp/absl/flags/internal/flag.h:589
absl::flags_internal::SequenceLock::Write
void Write(std::atomic< uint64_t > *dst, const void *src, size_t size)
Definition: abseil-cpp/absl/flags/internal/sequence_lock.h:99
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::flags_internal::FlagImpl::ReadOneWord
int64_t ReadOneWord() const ABSL_LOCKS_EXCLUDED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.cc:471
absl::flags_internal::FlagImpl::DefaultKind
FlagDefaultKind DefaultKind() const ABSL_EXCLUSIVE_LOCKS_REQUIRED(*DataGuard())
Definition: abseil-cpp/absl/flags/internal/flag.h:544
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
absl::flags_internal::FlagStateInterface
Definition: abseil-cpp/absl/flags/internal/commandlineflag.h:56
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
absl::flags_internal::FlagValueStorageKind::kValueAndInitBit
@ kValueAndInitBit
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
absl::Mutex::Lock
void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION()
absl::flags_internal::FlagImpl::def_kind_
uint8_t def_kind_
Definition: abseil-cpp/absl/flags/internal/flag.h:602
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::SequenceLock::TryRead
bool TryRead(void *dst, const std::atomic< uint64_t > *src, size_t size) const
Definition: abseil-cpp/absl/flags/internal/sequence_lock.h:80
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
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::FlagDefaultSrc::dynamic_value
void * dynamic_value
Definition: abseil-cpp/absl/flags/internal/flag.h:261
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: abseil-cpp/absl/flags/internal/flag.cc:122
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: abseil-cpp/absl/flags/internal/flag.cc:121
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::FlagImpl::data_guard_
char data_guard_[sizeof(absl::Mutex)]
Definition: abseil-cpp/absl/flags/internal/flag.h:629
absl::flags_internal::FlagImpl::name_
const char *const name_
Definition: abseil-cpp/absl/flags/internal/flag.h:583
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
mu_
absl::Mutex & mu_
Definition: abseil-cpp/absl/flags/internal/flag.cc:78
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::FlagImpl::filename_
const char *const filename_
Definition: abseil-cpp/absl/flags/internal/flag.h:585
absl::flags_internal::FlagImpl::init_control_
absl::once_flag init_control_
Definition: abseil-cpp/absl/flags/internal/flag.h:609
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::FlagCallback::func
FlagCallbackFunc func
Definition: abseil-cpp/absl/flags/internal/flag.h:415
absl::flags_internal::FlagState::FlagState
FlagState(FlagImpl &flag_impl, const V &v, bool modified, bool on_command_line, int64_t counter)
Definition: abseil-cpp/absl/flags/internal/flag.cc:91
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::op
FlagOpFn op
Definition: abseil-cpp/absl/flags/internal/flag.h:427
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: abseil-cpp/absl/flags/internal/flag.cc:110
absl::flags_internal::FlagImpl::AlignedBufferValue
void * AlignedBufferValue() const
Definition: abseil-cpp/absl/flags/internal/flag.cc:414
absl::flags_internal::FlagHelpMsg::gen_func
HelpGenFunc gen_func
Definition: abseil-cpp/absl/flags/internal/flag.h:208
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::SequenceLock::MarkInitialized
void MarkInitialized()
Definition: abseil-cpp/absl/flags/internal/sequence_lock.h:63
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
absl::flags_internal::FlagHelpMsg::literal
const char * literal
Definition: abseil-cpp/absl/flags/internal/flag.h:207
absl::flags_internal::SequenceLock::ModificationCount
int64_t ModificationCount() const
Definition: abseil-cpp/absl/flags/internal/sequence_lock.h:125
DONT_VALIDATE
#define DONT_VALIDATE(T, _)
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