diff --git a/src/util/u_atomic.h b/src/util/u_atomic.h index db56835e9d4..0bd6a4aaa19 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 cae4cc316d2..0cf381b18aa 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 5943df4fcbb..e254af46b0a 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