diff --git a/configure.ac b/configure.ac index 29709561b..396d978ee 100644 --- a/configure.ac +++ b/configure.ac @@ -412,6 +412,7 @@ AC_CHECK_HEADERS([\ signal.h \ strings.h \ stropts.h \ + stdatomic.h \ sys/bitypes.h \ sys/category.h \ sys/file.h \ diff --git a/lib/base/heimbase-atomics.h b/lib/base/heimbase-atomics.h index 043f31169..86e4ab91f 100644 --- a/lib/base/heimbase-atomics.h +++ b/lib/base/heimbase-atomics.h @@ -42,7 +42,20 @@ * Atomic operations */ -#if defined(__GNUC__) && defined(HAVE___SYNC_ADD_AND_FETCH) +#if defined(HAVE_STDATOMIC_H) + +#include + +#define heim_base_atomic_inc(x) (atomic_fetch_add((x), 1) + 1) +#define heim_base_atomic_dec(x) (atomic_fetch_sub((x), 1) - 1) +#define heim_base_atomic_type atomic_uint +#define heim_base_atomic_max UINT_MAX + +#define heim_base_exchange_pointer(t,v) atomic_exchange((t), (v)) +#define heim_base_exchange_32(t,v) atomic_exchange((t), (v)) +#define heim_base_exchange_64(t,v) atomic_exchange((t), (v)) + +#elif defined(__GNUC__) && defined(HAVE___SYNC_ADD_AND_FETCH) #define heim_base_atomic_inc(x) __sync_add_and_fetch((x), 1) #define heim_base_atomic_dec(x) __sync_sub_and_fetch((x), 1)