X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=clients%2Fms_atomic.h;h=045f0a6146c07e0ea68915b1972fd3f6aabe36ef;hb=4c0ac29dbad968b0a09fe4dc85c555627d3ac35a;hp=0b05bcecd3e29ab8e5b65ed68c4c13a3a84416a2;hpb=3c11b74c0aa013a6afd492d46a8e9c911e12b350;p=m6w6%2Flibmemcached diff --git a/clients/ms_atomic.h b/clients/ms_atomic.h index 0b05bcec..045f0a61 100644 --- a/clients/ms_atomic.h +++ b/clients/ms_atomic.h @@ -45,25 +45,64 @@ # define atomic_dec_16_nv(X) __sync_fetch_and_sub((X), 1) # define atomic_dec_32_nv(X) __sync_fetch_and_sub((X), 1) # define atomic_dec_size_nv(X) __sync_fetch_and_sub((X), 1) +#elif HAVE_C_STDATOMIC +# include +# define atomic_add_8(X, Y) atomic_fetch_add(X, Y) +# define atomic_add_16(X, Y) atomic_fetch_add(X, Y) +# define atomic_add_32(X, Y) atomic_fetch_add(X, Y) +# define atomic_add_size(X, Y) atomic_fetch_add(X, Y) +# define atomic_dec_8(X) atomic_fetch_sub(X, 1) +# define atomic_dec_16(X) atomic_fetch_sub(X, 1) +# define atomic_dec_32(X) atomic_fetch_sub(X, 1) +# define atomic_dec_size(X) atomic_fetch_sub(X, 1) +/* The same as above, but these return the new value instead of void */ +# define ATOMIC_ADD_FETCH_DECL(T) \ +static inline T atomic_add_fetch_##T(volatile T *ptr, T add) { \ + T des, cur = atomic_load(ptr); \ + do { \ + des = cur + add; \ + } while(!atomic_compare_exchange_weak(ptr, &cur, des)); \ + return des; \ +} +# define ATOMIC_SUB_FETCH_DECL(T) \ +T atomic_sub_fetch_##T(volatile T *ptr) { \ + T des, cur = atomic_load(ptr); \ + do { \ + des = cur - 1; \ + } while(!atomic_compare_exchange_weak(ptr, &cur, des)); \ + return des; \ +} +ATOMIC_ADD_FETCH_DECL(uint8_t) +# define atomic_add_8_nv(X, Y) atomic_add_fetch_uint8_t(X, Y) +ATOMIC_ADD_FETCH_DECL(uint16_t) +# define atomic_add_16_nv(X, Y) atomic_add_fetch_uint16_t(X, Y) +ATOMIC_ADD_FETCH_DECL(uint32_t) +# define atomic_add_32_nv(X, Y) atomic_add_fetch_uint32_t(X, Y) +ATOMIC_ADD_FETCH_DECL(size_t) +# define atomic_add_size_nv(X, Y) atomic_add_fetch_size_t(X, Y) +# define atomic_dec_8_nv(X) atomic_sub_fetch(X, Y) +# define atomic_dec_16_nv(X) atomic_sub_fetch(X, Y) +# define atomic_dec_32_nv(X) atomic_sub_fetch(X, Y) +# define atomic_dec_size_nv(X) atomic_sub_fetch(X, Y) #else #warning "Atomic operators not found so memslap will not work correctly" -# define atomic_add_8(X, Y) -# define atomic_add_16(X, Y) -# define atomic_add_32(X, Y) -# define atomic_add_size(X, Y) -# define atomic_dec_8(X) -# define atomic_dec_16(X) -# define atomic_dec_32(X) -# define atomic_dec_size(X) +# define atomic_add_8(X, Y) 0 +# define atomic_add_16(X, Y) 0 +# define atomic_add_32(X, Y) 0 +# define atomic_add_size(X, Y) 0 +# define atomic_dec_8(X) 0 +# define atomic_dec_16(X) 0 +# define atomic_dec_32(X) 0 +# define atomic_dec_size(X) 0 /* The same as above, but these return the new value instead of void */ -# define atomic_add_8_nv(X, Y) -# define atomic_add_16_nv(X, Y) -# define atomic_add_32_nv(X, Y) -# define atomic_add_size_nv(X, Y) -# define atomic_dec_8_nv(X) -# define atomic_dec_16_nv(X) -# define atomic_dec_32_nv(X) -# define atomic_dec_size_nv(X) +# define atomic_add_8_nv(X, Y) 0 +# define atomic_add_16_nv(X, Y) 0 +# define atomic_add_32_nv(X, Y) 0 +# define atomic_add_size_nv(X, Y) 0 +# define atomic_dec_8_nv(X) 0 +# define atomic_dec_16_nv(X) 0 +# define atomic_dec_32_nv(X) 0 +# define atomic_dec_size_nv(X) 0 #endif /* defined(__SUNPRO_C) */ #endif /* CLIENTS_MS_ATOMIC_H */