diff options
author | Pavel Samolysov <samolisov@gmail.com> | 2020-04-15 00:25:55 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-14 17:25:55 -0400 |
commit | 2946ac0dea49c894215a998aebb19d2f1d942909 (patch) | |
tree | c0fbefaa60b39e767a1fa634334c05f248e25f32 | |
parent | 567bee2f7393fca6ca737ecf061bd9f97302e346 (diff) |
Use base_internal::AtomicHook instead of std::atomic (#661)
* Use base_internal::AtomicHook instead of std::atomic
std::atomic has a broken implementation on the Windows platform and it
is not conform to the ABSL_CONST_INIT macro when clang-cl is used as a
compiler: the macro is expanded to the [[clang::require_constant_initialization]]
attribute and the attribute cannot be applied to the broken std::atomic.
Therefore, std::atomic has been replaced with absl::base_internal::AtomicHook
to fix the compilation error (thank Derek Mauro for the suggestion).
Issue: #659
Signed-off-by: Pavel Samolysov <samolisov@gmail.com>
* Update build files for pull request
Co-authored-by: Derek Mauro <dmauro@google.com>
-rw-r--r-- | absl/status/BUILD.bazel | 1 | ||||
-rw-r--r-- | absl/status/CMakeLists.txt | 1 | ||||
-rw-r--r-- | absl/status/status_payload_printer.cc | 15 |
3 files changed, 7 insertions, 10 deletions
diff --git a/absl/status/BUILD.bazel b/absl/status/BUILD.bazel index 2b83077d..d164252d 100644 --- a/absl/status/BUILD.bazel +++ b/absl/status/BUILD.bazel @@ -40,6 +40,7 @@ cc_library( ], copts = ABSL_DEFAULT_COPTS, deps = [ + "//absl/base:atomic_hook", "//absl/base:config", "//absl/base:core_headers", "//absl/base:raw_logging_internal", diff --git a/absl/status/CMakeLists.txt b/absl/status/CMakeLists.txt index f05cee5e..c041d695 100644 --- a/absl/status/CMakeLists.txt +++ b/absl/status/CMakeLists.txt @@ -25,6 +25,7 @@ absl_cc_library( COPTS ${ABSL_DEFAULT_COPTS} DEPS + absl::atomic_hook absl::config absl::core_headers absl::raw_logging_internal diff --git a/absl/status/status_payload_printer.cc b/absl/status/status_payload_printer.cc index ad96d76a..a47aea11 100644 --- a/absl/status/status_payload_printer.cc +++ b/absl/status/status_payload_printer.cc @@ -16,26 +16,21 @@ #include <atomic> #include "absl/base/attributes.h" +#include "absl/base/internal/atomic_hook.h" namespace absl { ABSL_NAMESPACE_BEGIN namespace status_internal { -namespace { -// Tried constant initialized global variable but it doesn't work with Lexan -// (MSVC's `std::atomic` has trouble constant initializing). -std::atomic<StatusPayloadPrinter>& GetStatusPayloadPrinterStorage() { - ABSL_CONST_INIT static std::atomic<StatusPayloadPrinter> instance{nullptr}; - return instance; -} -} // namespace +ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES +static absl::base_internal::AtomicHook<StatusPayloadPrinter> storage; void SetStatusPayloadPrinter(StatusPayloadPrinter printer) { - GetStatusPayloadPrinterStorage().store(printer, std::memory_order_relaxed); + storage.Store(printer); } StatusPayloadPrinter GetStatusPayloadPrinter() { - return GetStatusPayloadPrinterStorage().load(std::memory_order_relaxed); + return storage.Load(); } } // namespace status_internal |