diff options
author | Chris Robinson <[email protected]> | 2011-08-29 21:30:12 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2011-08-29 21:30:12 -0700 |
commit | 7408396fd4bc1e99c1f8bd66006c5587362a5d8e (patch) | |
tree | c01e5440dcfe31efa4eda1c001386b68659c554e /OpenAL32/Include/alMain.h | |
parent | da081b81c425805eef5b3d4a07c7a213490e04b7 (diff) |
Use a generic int type to handle enum swaps
Diffstat (limited to 'OpenAL32/Include/alMain.h')
-rw-r--r-- | OpenAL32/Include/alMain.h | 86 |
1 files changed, 36 insertions, 50 deletions
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index a0c83254..454bb715 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -231,14 +231,13 @@ static __inline RefCount IncrementRef(volatile RefCount *ptr) static __inline RefCount DecrementRef(volatile RefCount *ptr) { return __sync_sub_and_fetch(ptr, 1); } -#define DECL_TEMPLATE(T) \ -static __inline T Exchange_##T(volatile T *ptr, T newval) \ -{ \ - return __sync_lock_test_and_set(ptr, newval); \ -} \ -static __inline ALboolean CompExchange_##T(volatile T *ptr, T oldval, T newval)\ -{ \ - return __sync_bool_compare_and_swap(ptr, oldval, newval); \ +static __inline int ExchangeInt(volatile int *ptr, int newval) +{ + return __sync_lock_test_and_set(ptr, newval); +} +static __inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int newval) +{ + return __sync_bool_compare_and_swap(ptr, oldval, newval); } #elif defined(_WIN32) @@ -249,22 +248,23 @@ static __inline RefCount IncrementRef(volatile RefCount *ptr) static __inline RefCount DecrementRef(volatile RefCount *ptr) { return InterlockedDecrement(ptr); } -#define DECL_TEMPLATE(T) \ -static __inline T Exchange_##T(volatile T *ptr, T newval) \ -{ \ - union { \ - volatile T *t; \ - volatile LONG *l; \ - } u = { ptr }; \ - return InterlockedExchange(u.l, newval); \ -} \ -static __inline ALboolean CompExchange_##T(volatile T *ptr, T oldval, T newval)\ -{ \ - union { \ - volatile T *t; \ - volatile LONG *l; \ - } u = { ptr }; \ - return InterlockedCompareExchange(u.l, newval, oldval) == oldval; \ +static LONG_size_does_not_match_int[(sizeof(LONG)==sizeof(int))?0:-1]; + +static __inline int ExchangeInt(volatile int *ptr, int newval) +{ + union { + volatile int *i; + volatile LONG *l; + } u = { ptr }; + return InterlockedExchange(u.l, newval); +} +static __inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int newval) +{ + union { + volatile int *i; + volatile LONG *l; + } u = { ptr }; + return InterlockedCompareExchange(u.l, newval, oldval) == oldval; } #elif defined(__APPLE__) @@ -277,39 +277,25 @@ static __inline RefCount IncrementRef(volatile RefCount *ptr) static __inline RefCount DecrementRef(volatile RefCount *ptr) { return OSAtomicDecrement32Barrier(ptr); } -#define DECL_TEMPLATE(T) \ -static __inline T Exchange_##T(volatile T *ptr, T newval) \ -{ \ - union { \ - volatile T *t; \ - volatile int32_t *l; \ - } u = { ptr }; \ - /* Really? No regular old atomic swap? */ \ - T oldval; \ - do { \ - oldval = *u.i; \ - } while(!OSAtomicCompareAndSwap32Barrier(oldval, newval, u.i)); \ - return oldval; \ -} \ -static __inline ALboolean CompExchange_##T(volatile T *ptr, T oldval, T newval)\ -{ \ - union { \ - volatile T *t; \ - volatile int32_t *i; \ - } u = { ptr }; \ - return OSAtomicCompareAndSwap32Barrier(oldval, newval, u.i); \ +static __inline int ExchangeInt(volatile int *ptr, int newval) +{ + /* Really? No regular old atomic swap? */ + int oldval; + do { + oldval = *ptr; + } while(!OSAtomicCompareAndSwap32Barrier(oldval, newval, ptr)); + return oldval; +} +static __inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int newval) +{ + return OSAtomicCompareAndSwap32Barrier(oldval, newval, ptr); } #else #error "No atomic functions available on this platform!" typedef ALuint RefCount; -#define DECL_TEMPLATE(T) #endif -DECL_TEMPLATE(ALenum) - -#undef DECL_TEMPLATE - typedef struct { volatile RefCount read_count; |