diff options
author | Derek Mauro <dmauro@google.com> | 2022-11-09 18:06:05 -0800 |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2022-11-09 18:06:53 -0800 |
commit | b4a4a6b01fde193fde1be77bcec1712e82faf6a5 (patch) | |
tree | 2da3e64d3add776172f636d9140ff801b0443679 | |
parent | db8cd47898082fa47bff41fd76575630132669d3 (diff) |
Replace std::atomic_flag with std::atomic<bool> to avoid the C++20
deprecation of ATOMIC_FLAG_INIT.
Another option would have been to use macros to only initialize
std::atomic_flag before C++20, but I decided to use one compilation
path instead.
The major difference between std::atomic_flag and std::atomic<bool> is
that the former is guaranteed to be lock-free, but we already assume
std::atomic<bool> is lock-free in many places.
https://en.cppreference.com/w/cpp/atomic/atomic_flag
PiperOrigin-RevId: 487397075
Change-Id: I3f1c539ec8b2ca58547282e69ed73e93243e8efe
-rw-r--r-- | absl/debugging/internal/stacktrace_x86-inl.inc | 1 | ||||
-rw-r--r-- | absl/log/internal/log_message.cc | 8 |
2 files changed, 7 insertions, 2 deletions
diff --git a/absl/debugging/internal/stacktrace_x86-inl.inc b/absl/debugging/internal/stacktrace_x86-inl.inc index 9fbfcf76..2f8bf428 100644 --- a/absl/debugging/internal/stacktrace_x86-inl.inc +++ b/absl/debugging/internal/stacktrace_x86-inl.inc @@ -29,6 +29,7 @@ #include <cstdint> #include <limits> +#include "absl/base/attributes.h" #include "absl/base/macros.h" #include "absl/base/port.h" #include "absl/debugging/internal/address_is_readable.h" diff --git a/absl/log/internal/log_message.cc b/absl/log/internal/log_message.cc index a044a5a7..20050a04 100644 --- a/absl/log/internal/log_message.cc +++ b/absl/log/internal/log_message.cc @@ -372,12 +372,16 @@ void LogMessage::Flush() { } // Have we already seen a fatal message? - ABSL_CONST_INIT static std::atomic_flag seen_fatal = ATOMIC_FLAG_INIT; + ABSL_CONST_INIT static std::atomic<bool> seen_fatal(false); if (data_->entry.log_severity() == absl::LogSeverity::kFatal && absl::log_internal::ExitOnDFatal()) { // Exactly one LOG(FATAL) message is responsible for aborting the process, // even if multiple threads LOG(FATAL) concurrently. - data_->first_fatal = !seen_fatal.test_and_set(std::memory_order_relaxed); + bool expected_seen_fatal = false; + if (seen_fatal.compare_exchange_strong(expected_seen_fatal, true, + std::memory_order_relaxed)) { + data_->first_fatal = true; + } } data_->entry.text_message_with_prefix_and_newline_and_nul_ = |