From 457f95fe52539f9af23fb05a5a14bc81dd32d081 Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Fri, 4 Sep 2020 16:10:22 -0700 Subject: [PATCH] Mark s_cancellation_signal a relaxed atomic Thread sanitizer is salty about this even though it's volatile sig_atomic_t. Make it atomic too. --- src/global_safety.h | 3 ++- src/signal.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/global_safety.h b/src/global_safety.h index ec2c3ba46..514706516 100644 --- a/src/global_safety.h +++ b/src/global_safety.h @@ -93,9 +93,10 @@ class relaxed_atomic_t { relaxed_atomic_t() = default; relaxed_atomic_t(T value) : value_(value) {} - operator T() const { return value_.load(std::memory_order_relaxed); } + operator T() const volatile { return value_.load(std::memory_order_relaxed); } void operator=(T v) { return value_.store(v, std::memory_order_relaxed); } + void operator=(T v) volatile { return value_.store(v, std::memory_order_relaxed); } // Perform a CAS operation, returning whether it succeeded. bool compare_exchange(T expected, T desired) { diff --git a/src/signal.cpp b/src/signal.cpp index 04d091d5c..6bc1f12a8 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -201,7 +201,7 @@ static bool reraise_if_forked_child(int sig) { /// The cancellation signal we have received. /// Of course this is modified from a signal handler. -static volatile sig_atomic_t s_cancellation_signal = 0; +static volatile relaxed_atomic_t s_cancellation_signal{0}; void signal_clear_cancel() { s_cancellation_signal = 0; }