X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fimpatomic.h;h=70b77de2ddc28cf2c3a5c356f718666eb0ea5a65;hb=bac8bc0661e904fc2b1b9aba07d239679483b2b4;hp=60e5d365efffc7bc365ef197be47275d31c23ae8;hpb=beedbb56b50163e4fbf2cbc44785ebd962d1692d;p=c11tester.git diff --git a/include/impatomic.h b/include/impatomic.h index 60e5d365..70b77de2 100644 --- a/include/impatomic.h +++ b/include/impatomic.h @@ -1,3 +1,4 @@ +#include /** * @file impatomic.h * @brief Common header for C11/C++11 atomics @@ -88,14 +89,16 @@ inline void atomic_flag::clear( memory_order __x__ ) volatile ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); \ __typeof__(__m__) __v__ = (__m__); \ model_write_action((void *) __p__, __x__, (uint64_t) __v__); \ - __v__; }) + __v__ = __v__; /* Silence clang (-Wunused-value) */ \ + }) #define _ATOMIC_INIT_( __a__, __m__ ) \ ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); \ __typeof__(__m__) __v__ = (__m__); \ model_init_action((void *) __p__, (uint64_t) __v__); \ - __v__; }) + __v__ = __v__; /* Silence clang (-Wunused-value) */ \ + }) #define _ATOMIC_MODIFY_( __a__, __o__, __m__, __x__ ) \ ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); \ @@ -104,7 +107,8 @@ inline void atomic_flag::clear( memory_order __x__ ) volatile __typeof__((__a__)->__f__) __copy__= __old__; \ __copy__ __o__ __v__; \ model_rmw_action((void *)__p__, __x__, (uint64_t) __copy__); \ - __old__; }) + __old__ = __old__; /* Silence clang (-Wunused-value) */ \ + }) /* No spurious failure for now */ #define _ATOMIC_CMPSWP_WEAK_ _ATOMIC_CMPSWP_ @@ -114,8 +118,8 @@ inline void atomic_flag::clear( memory_order __x__ ) volatile __typeof__(__e__) __q__ = (__e__); \ __typeof__(__m__) __v__ = (__m__); \ bool __r__; \ - __typeof__((__a__)->__f__) __t__=(__typeof__((__a__)->__f__)) model_rmwr_action((void *)__p__, __x__); \ - if (__t__ == * __q__ ) { \ + __typeof__((__a__)->__f__) __t__=(__typeof__((__a__)->__f__)) model_rmwrcas_action((void *)__p__, __x__, (uint64_t) * __q__, sizeof((__a__)->__f__)); \ + if (__t__ == * __q__ ) {; \ model_rmw_action((void *)__p__, __x__, (uint64_t) __v__); __r__ = true; } \ else { model_rmwc_action((void *)__p__, __x__); *__q__ = __t__; __r__ = false;} \ __r__; }) @@ -2327,23 +2331,28 @@ inline bool atomic_compare_exchange_strong inline void* atomic_fetch_add_explicit ( volatile atomic_address* __a__, ptrdiff_t __m__, memory_order __x__ ) { - void* volatile* __p__ = &((__a__)->__f__); - void* __r__ = (void *) model_rmwr_action((void *)__p__, __x__); - model_rmw_action((void *)__p__, __x__, (uint64_t) ((char*)(*__p__) + __m__)); - return __r__; } + volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); + __typeof__((__a__)->__f__) __old__=(__typeof__((__a__)->__f__)) model_rmwr_action((void *)__p__, __x__); + __typeof__((__a__)->__f__) __copy__= __old__; + __copy__ = (void *) (((char *)__copy__) + __m__); + model_rmw_action((void *)__p__, __x__, (uint64_t) __copy__); + return __old__; +} -inline void* atomic_fetch_add + inline void* atomic_fetch_add ( volatile atomic_address* __a__, ptrdiff_t __m__ ) { return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline void* atomic_fetch_sub_explicit ( volatile atomic_address* __a__, ptrdiff_t __m__, memory_order __x__ ) -{ - void* volatile* __p__ = &((__a__)->__f__); - void* __r__ = (void *) model_rmwr_action((void *)__p__, __x__); - model_rmw_action((void *)__p__, __x__, (uint64_t)((char*)(*__p__) - __m__)); - return __r__; } +{ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); + __typeof__((__a__)->__f__) __old__=(__typeof__((__a__)->__f__)) model_rmwr_action((void *)__p__, __x__); + __typeof__((__a__)->__f__) __copy__= __old__; + __copy__ = (void *) (((char *)__copy__) - __m__); + model_rmw_action((void *)__p__, __x__, (uint64_t) __copy__); + return __old__; +} inline void* atomic_fetch_sub ( volatile atomic_address* __a__, ptrdiff_t __m__ ) @@ -3902,11 +3911,11 @@ T* atomic::fetch_sub( ptrdiff_t __v__, memory_order __x__ ) volatile #ifdef __cplusplus extern "C" { #endif -inline void atomic_thread_fence(memory_order order) +static inline void atomic_thread_fence(memory_order order) { _ATOMIC_FENCE_(order); } /** @todo Do we want to try to support a user's signal-handler? */ -inline void atomic_signal_fence(memory_order order) +static inline void atomic_signal_fence(memory_order order) { /* No-op? */ } #ifdef __cplusplus }