From acad7be65ec3dd504470f8f8a4d6f353718e93bc Mon Sep 17 00:00:00 2001 From: Luke Howard Date: Wed, 9 Dec 2015 11:00:11 +1100 Subject: [PATCH] base: Solaris and AIX atomic increment/exchange Implement heim_base_atomic_XXX and heim_base_exchange_pointer for Solaris and AIX. (AIX not tested.) --- lib/base/baselocl.h | 48 +++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/lib/base/baselocl.h b/lib/base/baselocl.h index 2c984eaab..b24c13d4f 100644 --- a/lib/base/baselocl.h +++ b/lib/base/baselocl.h @@ -35,23 +35,12 @@ #include "config.h" -#ifdef HAVE_SYS_TYPES_H -#include -#endif +#include + #ifdef HAVE_SYS_SELECT_H #include #endif -#include -#include -#include -#include -#include - -#ifdef HAVE_UNISTD_H -#include -#endif - #define HEIMDAL_TEXTDOMAIN "heimdal_krb5" #ifdef LIBINTL @@ -62,8 +51,6 @@ #define bindtextdomain(package, localedir) #endif -#include - #include "heimqueue.h" #include "heim_threads.h" #include "heimbase.h" @@ -90,6 +77,37 @@ #define heim_base_exchange_pointer(t,v) __sync_lock_test_and_set((t), (v)) #endif +#elif defined(__sun) + +#include + +#define heim_base_atomic_inc(x) atomic_inc_uint_nv((volatile uint_t *)(x)) +#define heim_base_atomic_dec(x) atomic_dec_uint_nv((volatile uint_t *)(x)) +#define heim_base_atomic_type uint_t +#define heim_base_atomic_max UINT_MAX + +#define heim_base_exchange_pointer(t,v) atomic_swap_ptr((volatile void *)(t), (void *)(v)) + +#elif defined(_AIX) + +#include + +#define heim_base_atomic_inc(x) (fetch_and_add((atomic_p)(x)) + 1) +#define heim_base_atomic_dec(x) (fetch_and_add((atomic_p)(x)) - 1) +#define heim_base_atomic_type unsigned int +#define heim_base_atomic_max UINT_MAX + +static inline void * +heim_base_exchange_pointer(void *p, void *newval) +{ + void *val = *(void **)p; + + while (!compare_and_swaplp((atomic_l)p, (long *)&val, (long)newval)) + ; + + return val; +} + #elif defined(_WIN32) #define heim_base_atomic_inc(x) InterlockedIncrement(x)