X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fimpatomic.h;h=2fde095ee67e6ce5498c4a8dd61d62c0779f2fec;hb=9c42c31b487bf7319dba4d43e417e29420306977;hp=ad169c276f7630263133d3a323efe44584b4e1a0;hpb=b6b969bf49d31f44e736e67b95f98b7f834f54f1;p=model-checker.git diff --git a/include/impatomic.h b/include/impatomic.h index ad169c2..2fde095 100644 --- a/include/impatomic.h +++ b/include/impatomic.h @@ -1,22 +1,12 @@ +#include "memoryorder.h" +#include "cmodelint.h" #ifdef __cplusplus -#include namespace std { -#else -#include -#include #endif - #define CPP0X( feature ) - -typedef enum memory_order { - memory_order_relaxed, memory_order_acquire, memory_order_release, - memory_order_acq_rel, memory_order_seq_cst -} memory_order; - - typedef struct atomic_flag { #ifdef __cplusplus @@ -51,9 +41,6 @@ extern void __atomic_flag_wait__ ( volatile atomic_flag* ); extern void __atomic_flag_wait_explicit__ ( volatile atomic_flag*, memory_order ); -extern volatile atomic_flag* __atomic_flag_for_address__ -( const volatile void* __z__ ) -__attribute__((const)); #ifdef __cplusplus } @@ -73,56 +60,69 @@ inline void atomic_flag::fence( memory_order __x__ ) const volatile #endif -#define _ATOMIC_LOAD_( __a__, __x__ ) \ -({ volatile __typeof__((__a__)->__f__)* __p__ = &((__a__)->__f__); \ - volatile atomic_flag* __g__ = __atomic_flag_for_address__( __p__ ); \ - __atomic_flag_wait_explicit__( __g__, __x__ ); \ - __typeof__((__a__)->__f__) __r__ = *__p__; \ - atomic_flag_clear_explicit( __g__, __x__ ); \ - __r__; }) - -#define _ATOMIC_STORE_( __a__, __m__, __x__ ) \ -({ volatile __typeof__((__a__)->__f__)* __p__ = &((__a__)->__f__); \ - __typeof__(__m__) __v__ = (__m__); \ - volatile atomic_flag* __g__ = __atomic_flag_for_address__( __p__ ); \ - __atomic_flag_wait_explicit__( __g__, __x__ ); \ - *__p__ = __v__; \ - atomic_flag_clear_explicit( __g__, __x__ ); \ - __v__; }) - -#define _ATOMIC_MODIFY_( __a__, __o__, __m__, __x__ ) \ -({ volatile __typeof__((__a__)->__f__)* __p__ = &((__a__)->__f__); \ - __typeof__(__m__) __v__ = (__m__); \ - volatile atomic_flag* __g__ = __atomic_flag_for_address__( __p__ ); \ - __atomic_flag_wait_explicit__( __g__, __x__ ); \ - __typeof__((__a__)->__f__) __r__ = *__p__; \ - *__p__ __o__ __v__; \ - atomic_flag_clear_explicit( __g__, __x__ ); \ - __r__; }) - -#define _ATOMIC_CMPSWP_( __a__, __e__, __m__, __x__ ) \ -({ volatile __typeof__((__a__)->__f__)* __p__ = &((__a__)->__f__); \ - __typeof__(__e__) __q__ = (__e__); \ - __typeof__(__m__) __v__ = (__m__); \ - bool __r__; \ - volatile atomic_flag* __g__ = __atomic_flag_for_address__( __p__ ); \ - __atomic_flag_wait_explicit__( __g__, __x__ ); \ - __typeof__((__a__)->__f__) __t__ = *__p__; \ - if ( __t__ == *__q__ ) { *__p__ = __v__; __r__ = true; } \ - else { *__q__ = __t__; __r__ = false; } \ - atomic_flag_clear_explicit( __g__, __x__ ); \ - __r__; }) +/* + The remainder of the example implementation uses the following + macros. These macros exploit GNU extensions for value-returning + blocks (AKA statement expressions) and __typeof__. + + The macros rely on data fields of atomic structs being named __f__. + Other symbols used are __a__=atomic, __e__=expected, __f__=field, + __g__=flag, __m__=modified, __o__=operation, __r__=result, + __p__=pointer to field, __v__=value (for single evaluation), + __x__=memory-ordering, and __y__=memory-ordering. +*/ + +#define _ATOMIC_LOAD_( __a__, __x__ ) \ + ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); \ + __typeof__((__a__)->__f__) __r__ = (__typeof__((__a__)->__f__))model_read_action((void *)__p__, __x__); \ + __r__; }) + +#define _ATOMIC_STORE_( __a__, __m__, __x__ ) \ + ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); \ + __typeof__(__m__) __v__ = (__m__); \ + model_write_action((void *) __p__, __x__, (uint64_t) __v__); \ + __v__; }) + + +#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__; }) + +#define _ATOMIC_MODIFY_( __a__, __o__, __m__, __x__ ) \ + ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); \ + __typeof__((__a__)->__f__) __old__=(__typeof__((__a__)->__f__)) model_rmwr_action((void *)__p__, __x__); \ + __typeof__(__m__) __v__ = (__m__); \ + __typeof__((__a__)->__f__) __copy__= __old__; \ + __copy__ __o__ __v__; \ + model_rmw_action((void *)__p__, __x__, (uint64_t) __copy__); \ + __old__; }) + +#define _ATOMIC_CMPSWP_( __a__, __e__, __m__, __x__ ) \ + ({ volatile __typeof__((__a__)->__f__)* __p__ = & ((__a__)->__f__); \ + __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__ ) { \ + model_rmw_action((void *)__p__, __x__, (uint64_t) __v__); __r__ = true; } \ + else { model_rmwc_action((void *)__p__, __x__); *__q__ = __t__; __r__ = false;} \ + __r__; }) #define _ATOMIC_FENCE_( __a__, __x__ ) \ -({ volatile __typeof__((__a__)->__f__)* __p__ = &((__a__)->__f__); \ - volatile atomic_flag* __g__ = __atomic_flag_for_address__( __p__ ); \ - atomic_flag_fence( __g__, __x__ ); \ - }) - - -#define ATOMIC_INTEGRAL_LOCK_FREE 0 -#define ATOMIC_ADDRESS_LOCK_FREE 0 - + ({ model_fence_action(__x__);}) + + +#define ATOMIC_CHAR_LOCK_FREE 1 +#define ATOMIC_CHAR16_T_LOCK_FREE 1 +#define ATOMIC_CHAR32_T_LOCK_FREE 1 +#define ATOMIC_WCHAR_T_LOCK_FREE 1 +#define ATOMIC_SHORT_LOCK_FREE 1 +#define ATOMIC_INT_LOCK_FREE 1 +#define ATOMIC_LONG_LOCK_FREE 1 +#define ATOMIC_LLONG_LOCK_FREE 1 +#define ATOMIC_ADDRESS_LOCK_FREE 1 typedef struct atomic_bool { @@ -1541,15 +1541,16 @@ template<> struct atomic< wchar_t > : atomic_wchar_t #ifdef __cplusplus -inline bool atomic_is_lock_free( const volatile atomic_bool* __a__ ) +inline bool atomic_is_lock_free +( const volatile atomic_bool* __a__ ) { return false; } inline bool atomic_load_explicit ( volatile atomic_bool* __a__, memory_order __x__ ) { return _ATOMIC_LOAD_( __a__, __x__ ); } -inline bool atomic_load( volatile atomic_bool* __a__ ) -{ return atomic_load_explicit( __a__, memory_order_seq_cst ); } +inline bool atomic_load +( volatile atomic_bool* __a__ ) { return atomic_load_explicit( __a__, memory_order_seq_cst ); } inline void atomic_store_explicit ( volatile atomic_bool* __a__, bool __m__, memory_order __x__ ) @@ -1602,7 +1603,7 @@ inline void atomic_store inline void* atomic_swap_explicit ( volatile atomic_address* __a__, void* __m__, memory_order __x__ ) -{ return _ATOMIC_MODIFY_( __a__, =, __m__, __x__ ); } +{ return _ATOMIC_MODIFY_( __a__, =, __m__, __x__ ); } inline void* atomic_swap ( volatile atomic_address* __a__, void* __m__ ) @@ -2117,12 +2118,10 @@ inline void atomic_fence inline void* atomic_fetch_add_explicit ( volatile atomic_address* __a__, ptrdiff_t __m__, memory_order __x__ ) -{ void* volatile* __p__ = &((__a__)->__f__); - volatile atomic_flag* __g__ = __atomic_flag_for_address__( __p__ ); - __atomic_flag_wait_explicit__( __g__, __x__ ); - void* __r__ = *__p__; - *__p__ = (void*)((char*)(*__p__) + __m__); - atomic_flag_clear_explicit( __g__, __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__; } inline void* atomic_fetch_add @@ -2132,26 +2131,23 @@ inline void* atomic_fetch_add inline void* atomic_fetch_sub_explicit ( volatile atomic_address* __a__, ptrdiff_t __m__, memory_order __x__ ) -{ void* volatile* __p__ = &((__a__)->__f__); - volatile atomic_flag* __g__ = __atomic_flag_for_address__( __p__ ); - __atomic_flag_wait_explicit__( __g__, __x__ ); - void* __r__ = *__p__; - *__p__ = (void*)((char*)(*__p__) - __m__); - atomic_flag_clear_explicit( __g__, __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__; } inline void* atomic_fetch_sub ( volatile atomic_address* __a__, ptrdiff_t __m__ ) { return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } - inline char atomic_fetch_add_explicit ( volatile atomic_char* __a__, char __m__, memory_order __x__ ) { return _ATOMIC_MODIFY_( __a__, +=, __m__, __x__ ); } inline char atomic_fetch_add ( volatile atomic_char* __a__, char __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline char atomic_fetch_sub_explicit @@ -2160,7 +2156,7 @@ inline char atomic_fetch_sub_explicit inline char atomic_fetch_sub ( volatile atomic_char* __a__, char __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline char atomic_fetch_and_explicit @@ -2169,7 +2165,7 @@ inline char atomic_fetch_and_explicit inline char atomic_fetch_and ( volatile atomic_char* __a__, char __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline char atomic_fetch_or_explicit @@ -2178,7 +2174,7 @@ inline char atomic_fetch_or_explicit inline char atomic_fetch_or ( volatile atomic_char* __a__, char __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline char atomic_fetch_xor_explicit @@ -2187,7 +2183,7 @@ inline char atomic_fetch_xor_explicit inline char atomic_fetch_xor ( volatile atomic_char* __a__, char __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline signed char atomic_fetch_add_explicit @@ -2196,7 +2192,7 @@ inline signed char atomic_fetch_add_explicit inline signed char atomic_fetch_add ( volatile atomic_schar* __a__, signed char __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline signed char atomic_fetch_sub_explicit @@ -2205,7 +2201,7 @@ inline signed char atomic_fetch_sub_explicit inline signed char atomic_fetch_sub ( volatile atomic_schar* __a__, signed char __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline signed char atomic_fetch_and_explicit @@ -2214,7 +2210,7 @@ inline signed char atomic_fetch_and_explicit inline signed char atomic_fetch_and ( volatile atomic_schar* __a__, signed char __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline signed char atomic_fetch_or_explicit @@ -2223,7 +2219,7 @@ inline signed char atomic_fetch_or_explicit inline signed char atomic_fetch_or ( volatile atomic_schar* __a__, signed char __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline signed char atomic_fetch_xor_explicit @@ -2232,7 +2228,7 @@ inline signed char atomic_fetch_xor_explicit inline signed char atomic_fetch_xor ( volatile atomic_schar* __a__, signed char __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned char atomic_fetch_add_explicit @@ -2241,7 +2237,7 @@ inline unsigned char atomic_fetch_add_explicit inline unsigned char atomic_fetch_add ( volatile atomic_uchar* __a__, unsigned char __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned char atomic_fetch_sub_explicit @@ -2250,7 +2246,7 @@ inline unsigned char atomic_fetch_sub_explicit inline unsigned char atomic_fetch_sub ( volatile atomic_uchar* __a__, unsigned char __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned char atomic_fetch_and_explicit @@ -2259,7 +2255,7 @@ inline unsigned char atomic_fetch_and_explicit inline unsigned char atomic_fetch_and ( volatile atomic_uchar* __a__, unsigned char __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned char atomic_fetch_or_explicit @@ -2268,7 +2264,7 @@ inline unsigned char atomic_fetch_or_explicit inline unsigned char atomic_fetch_or ( volatile atomic_uchar* __a__, unsigned char __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned char atomic_fetch_xor_explicit @@ -2277,7 +2273,7 @@ inline unsigned char atomic_fetch_xor_explicit inline unsigned char atomic_fetch_xor ( volatile atomic_uchar* __a__, unsigned char __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline short atomic_fetch_add_explicit @@ -2286,7 +2282,7 @@ inline short atomic_fetch_add_explicit inline short atomic_fetch_add ( volatile atomic_short* __a__, short __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline short atomic_fetch_sub_explicit @@ -2295,7 +2291,7 @@ inline short atomic_fetch_sub_explicit inline short atomic_fetch_sub ( volatile atomic_short* __a__, short __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline short atomic_fetch_and_explicit @@ -2304,7 +2300,7 @@ inline short atomic_fetch_and_explicit inline short atomic_fetch_and ( volatile atomic_short* __a__, short __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline short atomic_fetch_or_explicit @@ -2313,7 +2309,7 @@ inline short atomic_fetch_or_explicit inline short atomic_fetch_or ( volatile atomic_short* __a__, short __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline short atomic_fetch_xor_explicit @@ -2322,7 +2318,7 @@ inline short atomic_fetch_xor_explicit inline short atomic_fetch_xor ( volatile atomic_short* __a__, short __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned short atomic_fetch_add_explicit @@ -2331,7 +2327,7 @@ inline unsigned short atomic_fetch_add_explicit inline unsigned short atomic_fetch_add ( volatile atomic_ushort* __a__, unsigned short __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned short atomic_fetch_sub_explicit @@ -2340,7 +2336,7 @@ inline unsigned short atomic_fetch_sub_explicit inline unsigned short atomic_fetch_sub ( volatile atomic_ushort* __a__, unsigned short __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned short atomic_fetch_and_explicit @@ -2349,7 +2345,7 @@ inline unsigned short atomic_fetch_and_explicit inline unsigned short atomic_fetch_and ( volatile atomic_ushort* __a__, unsigned short __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned short atomic_fetch_or_explicit @@ -2358,7 +2354,7 @@ inline unsigned short atomic_fetch_or_explicit inline unsigned short atomic_fetch_or ( volatile atomic_ushort* __a__, unsigned short __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned short atomic_fetch_xor_explicit @@ -2367,7 +2363,7 @@ inline unsigned short atomic_fetch_xor_explicit inline unsigned short atomic_fetch_xor ( volatile atomic_ushort* __a__, unsigned short __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline int atomic_fetch_add_explicit @@ -2376,7 +2372,7 @@ inline int atomic_fetch_add_explicit inline int atomic_fetch_add ( volatile atomic_int* __a__, int __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline int atomic_fetch_sub_explicit @@ -2385,7 +2381,7 @@ inline int atomic_fetch_sub_explicit inline int atomic_fetch_sub ( volatile atomic_int* __a__, int __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline int atomic_fetch_and_explicit @@ -2394,7 +2390,7 @@ inline int atomic_fetch_and_explicit inline int atomic_fetch_and ( volatile atomic_int* __a__, int __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline int atomic_fetch_or_explicit @@ -2403,7 +2399,7 @@ inline int atomic_fetch_or_explicit inline int atomic_fetch_or ( volatile atomic_int* __a__, int __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline int atomic_fetch_xor_explicit @@ -2412,7 +2408,7 @@ inline int atomic_fetch_xor_explicit inline int atomic_fetch_xor ( volatile atomic_int* __a__, int __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned int atomic_fetch_add_explicit @@ -2421,7 +2417,7 @@ inline unsigned int atomic_fetch_add_explicit inline unsigned int atomic_fetch_add ( volatile atomic_uint* __a__, unsigned int __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned int atomic_fetch_sub_explicit @@ -2430,7 +2426,7 @@ inline unsigned int atomic_fetch_sub_explicit inline unsigned int atomic_fetch_sub ( volatile atomic_uint* __a__, unsigned int __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned int atomic_fetch_and_explicit @@ -2439,7 +2435,7 @@ inline unsigned int atomic_fetch_and_explicit inline unsigned int atomic_fetch_and ( volatile atomic_uint* __a__, unsigned int __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned int atomic_fetch_or_explicit @@ -2448,7 +2444,7 @@ inline unsigned int atomic_fetch_or_explicit inline unsigned int atomic_fetch_or ( volatile atomic_uint* __a__, unsigned int __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned int atomic_fetch_xor_explicit @@ -2457,7 +2453,7 @@ inline unsigned int atomic_fetch_xor_explicit inline unsigned int atomic_fetch_xor ( volatile atomic_uint* __a__, unsigned int __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline long atomic_fetch_add_explicit @@ -2466,7 +2462,7 @@ inline long atomic_fetch_add_explicit inline long atomic_fetch_add ( volatile atomic_long* __a__, long __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline long atomic_fetch_sub_explicit @@ -2475,7 +2471,7 @@ inline long atomic_fetch_sub_explicit inline long atomic_fetch_sub ( volatile atomic_long* __a__, long __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline long atomic_fetch_and_explicit @@ -2484,7 +2480,7 @@ inline long atomic_fetch_and_explicit inline long atomic_fetch_and ( volatile atomic_long* __a__, long __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline long atomic_fetch_or_explicit @@ -2493,7 +2489,7 @@ inline long atomic_fetch_or_explicit inline long atomic_fetch_or ( volatile atomic_long* __a__, long __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline long atomic_fetch_xor_explicit @@ -2502,7 +2498,7 @@ inline long atomic_fetch_xor_explicit inline long atomic_fetch_xor ( volatile atomic_long* __a__, long __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long atomic_fetch_add_explicit @@ -2511,7 +2507,7 @@ inline unsigned long atomic_fetch_add_explicit inline unsigned long atomic_fetch_add ( volatile atomic_ulong* __a__, unsigned long __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long atomic_fetch_sub_explicit @@ -2520,7 +2516,7 @@ inline unsigned long atomic_fetch_sub_explicit inline unsigned long atomic_fetch_sub ( volatile atomic_ulong* __a__, unsigned long __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long atomic_fetch_and_explicit @@ -2529,7 +2525,7 @@ inline unsigned long atomic_fetch_and_explicit inline unsigned long atomic_fetch_and ( volatile atomic_ulong* __a__, unsigned long __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long atomic_fetch_or_explicit @@ -2538,7 +2534,7 @@ inline unsigned long atomic_fetch_or_explicit inline unsigned long atomic_fetch_or ( volatile atomic_ulong* __a__, unsigned long __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long atomic_fetch_xor_explicit @@ -2547,7 +2543,7 @@ inline unsigned long atomic_fetch_xor_explicit inline unsigned long atomic_fetch_xor ( volatile atomic_ulong* __a__, unsigned long __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline long long atomic_fetch_add_explicit @@ -2556,7 +2552,7 @@ inline long long atomic_fetch_add_explicit inline long long atomic_fetch_add ( volatile atomic_llong* __a__, long long __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline long long atomic_fetch_sub_explicit @@ -2565,7 +2561,7 @@ inline long long atomic_fetch_sub_explicit inline long long atomic_fetch_sub ( volatile atomic_llong* __a__, long long __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline long long atomic_fetch_and_explicit @@ -2574,7 +2570,7 @@ inline long long atomic_fetch_and_explicit inline long long atomic_fetch_and ( volatile atomic_llong* __a__, long long __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline long long atomic_fetch_or_explicit @@ -2583,7 +2579,7 @@ inline long long atomic_fetch_or_explicit inline long long atomic_fetch_or ( volatile atomic_llong* __a__, long long __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline long long atomic_fetch_xor_explicit @@ -2592,7 +2588,7 @@ inline long long atomic_fetch_xor_explicit inline long long atomic_fetch_xor ( volatile atomic_llong* __a__, long long __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long long atomic_fetch_add_explicit @@ -2601,7 +2597,7 @@ inline unsigned long long atomic_fetch_add_explicit inline unsigned long long atomic_fetch_add ( volatile atomic_ullong* __a__, unsigned long long __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long long atomic_fetch_sub_explicit @@ -2610,7 +2606,7 @@ inline unsigned long long atomic_fetch_sub_explicit inline unsigned long long atomic_fetch_sub ( volatile atomic_ullong* __a__, unsigned long long __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long long atomic_fetch_and_explicit @@ -2619,7 +2615,7 @@ inline unsigned long long atomic_fetch_and_explicit inline unsigned long long atomic_fetch_and ( volatile atomic_ullong* __a__, unsigned long long __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long long atomic_fetch_or_explicit @@ -2628,7 +2624,7 @@ inline unsigned long long atomic_fetch_or_explicit inline unsigned long long atomic_fetch_or ( volatile atomic_ullong* __a__, unsigned long long __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline unsigned long long atomic_fetch_xor_explicit @@ -2637,7 +2633,7 @@ inline unsigned long long atomic_fetch_xor_explicit inline unsigned long long atomic_fetch_xor ( volatile atomic_ullong* __a__, unsigned long long __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } inline wchar_t atomic_fetch_add_explicit @@ -2646,7 +2642,7 @@ inline wchar_t atomic_fetch_add_explicit inline wchar_t atomic_fetch_add ( volatile atomic_wchar_t* __a__, wchar_t __m__ ) -{ atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_add_explicit( __a__, __m__, memory_order_seq_cst ); } inline wchar_t atomic_fetch_sub_explicit @@ -2655,7 +2651,7 @@ inline wchar_t atomic_fetch_sub_explicit inline wchar_t atomic_fetch_sub ( volatile atomic_wchar_t* __a__, wchar_t __m__ ) -{ atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_sub_explicit( __a__, __m__, memory_order_seq_cst ); } inline wchar_t atomic_fetch_and_explicit @@ -2664,7 +2660,7 @@ inline wchar_t atomic_fetch_and_explicit inline wchar_t atomic_fetch_and ( volatile atomic_wchar_t* __a__, wchar_t __m__ ) -{ atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_and_explicit( __a__, __m__, memory_order_seq_cst ); } inline wchar_t atomic_fetch_or_explicit @@ -2673,7 +2669,7 @@ inline wchar_t atomic_fetch_or_explicit inline wchar_t atomic_fetch_or ( volatile atomic_wchar_t* __a__, wchar_t __m__ ) -{ atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_or_explicit( __a__, __m__, memory_order_seq_cst ); } inline wchar_t atomic_fetch_xor_explicit @@ -2682,7 +2678,7 @@ inline wchar_t atomic_fetch_xor_explicit inline wchar_t atomic_fetch_xor ( volatile atomic_wchar_t* __a__, wchar_t __m__ ) -{ atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } +{ return atomic_fetch_xor_explicit( __a__, __m__, memory_order_seq_cst ); } #else @@ -2697,6 +2693,9 @@ _ATOMIC_LOAD_( __a__, memory_order_seq_cst ) #define atomic_load_explicit( __a__, __x__ ) \ _ATOMIC_LOAD_( __a__, __x__ ) +#define atomic_init( __a__, __m__ ) \ +_ATOMIC_INIT_( __a__, __m__ ) + #define atomic_store( __a__, __m__ ) \ _ATOMIC_STORE_( __a__, __m__, memory_order_seq_cst )