Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "absl/flags/flag.h"
00017
00018 #include <cstring>
00019
00020 namespace absl {
00021
00022
00023
00024
00025
00026 #ifndef NDEBUG
00027 #define ABSL_FLAGS_ATOMIC_GET(T) \
00028 T GetFlag(const absl::Flag<T>& flag) { \
00029 T result; \
00030 flag.internal.Read(&result, &flags_internal::FlagOps<T>); \
00031 return result; \
00032 }
00033 #else
00034 #define ABSL_FLAGS_ATOMIC_GET(T) \
00035 T GetFlag(const absl::Flag<T>& flag) { \
00036 const int64_t r = flag.internal.atomic.load(std::memory_order_acquire); \
00037 if (r != flags_internal::CommandLineFlag::kAtomicInit) { \
00038 T t; \
00039 memcpy(&t, &r, sizeof(T)); \
00040 return t; \
00041 } \
00042 T result; \
00043 flag.internal.Read(&result, &flags_internal::FlagOps<T>); \
00044 return result; \
00045 }
00046 #endif
00047
00048 ABSL_FLAGS_INTERNAL_FOR_EACH_LOCK_FREE(ABSL_FLAGS_ATOMIC_GET)
00049
00050 #undef ABSL_FLAGS_ATOMIC_GET
00051
00052 }