From a4e361b5e543b1d164f45acab847eea9955acde3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Sun, 23 Apr 2017 02:44:11 +0300 Subject: [PATCH] Add atomic load/store operations on pointers Added atomic operations on pointers. Also removed extra return statements on void functions. --- include/maxscale/atomic.h | 2 ++ server/core/atomic.cc | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/maxscale/atomic.h b/include/maxscale/atomic.h index 72172c270..639faa216 100644 --- a/include/maxscale/atomic.h +++ b/include/maxscale/atomic.h @@ -60,6 +60,7 @@ uint64_t atomic_add_uint64(uint64_t *variable, int64_t value); int atomic_load_int32(int *variable); int64_t atomic_load_int64(int64_t *variable); uint64_t atomic_load_uint64(uint64_t *variable); +void* atomic_load_ptr(void **variable); /** * Implementation of an atomic store operation for the GCC environment. @@ -73,6 +74,7 @@ uint64_t atomic_load_uint64(uint64_t *variable); void atomic_store_int32(int *variable, int value); void atomic_store_int64(int64_t *variable, int64_t value); void atomic_store_uint64(uint64_t *variable, uint64_t value); +void atomic_store_ptr(void **variable, void *value); /** * @brief Impose a full memory barrier diff --git a/server/core/atomic.cc b/server/core/atomic.cc index d2a6cac40..979756555 100644 --- a/server/core/atomic.cc +++ b/server/core/atomic.cc @@ -80,6 +80,15 @@ uint64_t atomic_load_uint64(uint64_t *variable) #endif } +void* atomic_load_ptr(void **variable) +{ +#ifdef MXS_USE_ATOMIC_BUILTINS + return __atomic_load_n(variable, __ATOMIC_SEQ_CST); +#else + return __sync_fetch_and_or(variable, 0); +#endif +} + void atomic_store_int32(int *variable, int value) { #ifdef MXS_USE_ATOMIC_BUILTINS @@ -106,3 +115,12 @@ void atomic_store_uint64(uint64_t *variable, uint64_t value) __sync_lock_test_and_set(variable, value); #endif } + +void atomic_store_ptr(void **variable, void *value) +{ +#ifdef MXS_USE_ATOMIC_BUILTINS + __atomic_store_n(variable, value, __ATOMIC_SEQ_CST); +#else + __sync_lock_test_and_set(variable, value); +#endif +}