40 #define AK_ATOMIC_FENCE_FULL_BARRIER() __sync_synchronize();
42 static inline int32_t
AkAtomicLoad32(
AkAtomic32* pSrc ) { int32_t ret; __atomic_load( ( int32_t* )pSrc, &ret, __ATOMIC_ACQUIRE );
return ret; }
43 static inline void AkAtomicStore32(
AkAtomic32* pDest, int32_t value ) { __atomic_store( ( int32_t* )pDest, &value, __ATOMIC_RELEASE ); }
47 static inline int32_t
AkAtomicAdd32(
AkAtomic32* pDest, int32_t value ) {
return __sync_add_and_fetch( ( int32_t* )pDest, value ); }
48 static inline int32_t
AkAtomicSub32(
AkAtomic32* pDest, int32_t value ) {
return __sync_sub_and_fetch( ( int32_t* )pDest, value ); }
49 static inline int AkAtomicCas32(
AkAtomic32* pDest, int32_t proposed, int32_t expected ) {
return __sync_bool_compare_and_swap( ( int32_t* )pDest, expected, proposed ); }
51 #if defined( __i386 ) || ( defined( __ARM_ARCH ) && ( __ARM_ARCH <= 7 ) )
53 static inline void AkAtomicStore64(
AkAtomic64* pDest, int64_t value ) { int64_t tmp;
do { tmp = *pDest; }
while( __sync_val_compare_and_swap( pDest, tmp, value ) != tmp ); }
55 static inline int64_t
AkAtomicLoad64(
AkAtomic64* pSrc ) { int64_t ret; __atomic_load( ( int64_t* )pSrc, &ret, __ATOMIC_ACQUIRE );
return ret; }
56 static inline void AkAtomicStore64(
AkAtomic64* pDest, int64_t value ) { __atomic_store( ( int64_t* )pDest, &value, __ATOMIC_RELEASE ); }
62 static inline int64_t
AkAtomicAdd64(
AkAtomic64* pDest, int64_t value ) {
return __sync_add_and_fetch( ( int64_t* )pDest, value ); }
63 static inline int64_t
AkAtomicSub64(
AkAtomic64* pDest, int64_t value ) {
return __sync_sub_and_fetch( ( int64_t* )pDest, value ); }
64 static inline int AkAtomicCas64(
AkAtomic64* pDest, int64_t proposed, int64_t expected ) {
return __sync_bool_compare_and_swap( ( int64_t* )pDest, expected, proposed ); }
66 static inline void*
AkAtomicLoadPtr(
AkAtomicPtr* pSrc ) {
size_t ret; __atomic_load( (
size_t* )pSrc, &ret, __ATOMIC_ACQUIRE );
return (
void* )ret; }
67 static inline void AkAtomicStorePtr(
AkAtomicPtr* pDest,
void* value ) { __atomic_store( (
size_t* )pDest, (
size_t* )&value, __ATOMIC_RELEASE ); }
69 static inline int AkAtomicCasPtr(
AkAtomicPtr* pDest,
void* proposed,
void* expected ) {
return __sync_bool_compare_and_swap( (
void** )pDest, expected, proposed ); }