From 65ef4a2e02fbb89d02024d0c4afcd2c0fdd75e48 Mon Sep 17 00:00:00 2001 From: Witold Baryluk Date: Thu, 28 Jan 2021 17:55:29 +0000 Subject: [PATCH] util: Use explicit relaxed reads for u_queue MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit These are no-op, but make clang thread sanitizer happy. Reviewed-by: Marek Olšák Part-of: --- src/util/u_atomic.h | 4 ++++ src/util/u_queue.c | 4 ++-- src/util/u_queue.h | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/util/u_atomic.h b/src/util/u_atomic.h index db56835..0bd6a4a 100644 --- a/src/util/u_atomic.h +++ b/src/util/u_atomic.h @@ -42,6 +42,7 @@ /* The builtins with explicit memory model are available since GCC 4.7. */ #define p_atomic_set(_v, _i) __atomic_store_n((_v), (_i), __ATOMIC_RELEASE) #define p_atomic_read(_v) __atomic_load_n((_v), __ATOMIC_ACQUIRE) +#define p_atomic_read_relaxed(_v) __atomic_load_n((_v), __ATOMIC_RELAXED) #define p_atomic_dec_zero(v) (__atomic_sub_fetch((v), 1, __ATOMIC_ACQ_REL) == 0) #define p_atomic_inc(v) (void) __atomic_add_fetch((v), 1, __ATOMIC_ACQ_REL) #define p_atomic_dec(v) (void) __atomic_sub_fetch((v), 1, __ATOMIC_ACQ_REL) @@ -56,6 +57,7 @@ #define p_atomic_set(_v, _i) (*(_v) = (_i)) #define p_atomic_read(_v) (*(_v)) +#define p_atomic_read_relaxed(_v) (*(_v)) #define p_atomic_dec_zero(v) (__sync_sub_and_fetch((v), 1) == 0) #define p_atomic_inc(v) (void) __sync_add_and_fetch((v), 1) #define p_atomic_dec(v) (void) __sync_sub_and_fetch((v), 1) @@ -86,6 +88,7 @@ #define p_atomic_set(_v, _i) (*(_v) = (_i)) #define p_atomic_read(_v) (*(_v)) +#define p_atomic_read_relaxed(_v) (*(_v)) #define p_atomic_dec_zero(_v) (p_atomic_dec_return(_v) == 0) #define p_atomic_inc(_v) ((void) p_atomic_inc_return(_v)) #define p_atomic_dec(_v) ((void) p_atomic_dec_return(_v)) @@ -123,6 +126,7 @@ #define p_atomic_set(_v, _i) (*(_v) = (_i)) #define p_atomic_read(_v) (*(_v)) +#define p_atomic_read_relaxed(_v) (*(_v)) #define p_atomic_dec_zero(_v) \ (p_atomic_dec_return(_v) == 0) diff --git a/src/util/u_queue.c b/src/util/u_queue.c index cae4cc3..0cf381b 100644 --- a/src/util/u_queue.c +++ b/src/util/u_queue.c @@ -112,7 +112,7 @@ static bool do_futex_fence_wait(struct util_queue_fence *fence, bool timeout, int64_t abs_timeout) { - uint32_t v = fence->val; + uint32_t v = p_atomic_read_relaxed(&fence->val); struct timespec ts; ts.tv_sec = abs_timeout / (1000*1000*1000); ts.tv_nsec = abs_timeout % (1000*1000*1000); @@ -130,7 +130,7 @@ do_futex_fence_wait(struct util_queue_fence *fence, return false; } - v = fence->val; + v = p_atomic_read_relaxed(&fence->val); } return true; diff --git a/src/util/u_queue.h b/src/util/u_queue.h index 5943df4..e254af4 100644 --- a/src/util/u_queue.h +++ b/src/util/u_queue.h @@ -78,7 +78,7 @@ util_queue_fence_init(struct util_queue_fence *fence) static inline void util_queue_fence_destroy(struct util_queue_fence *fence) { - assert(fence->val == 0); + assert(p_atomic_read_relaxed(&fence->val) == 0); /* no-op */ } @@ -113,7 +113,7 @@ util_queue_fence_reset(struct util_queue_fence *fence) static inline bool util_queue_fence_is_signalled(struct util_queue_fence *fence) { - return fence->val == 0; + return p_atomic_read_relaxed(&fence->val) == 0; } #endif -- 2.7.4