diff options
author | Chris Robinson <[email protected]> | 2011-09-02 02:57:21 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2011-09-02 02:57:21 -0700 |
commit | 9080d5fda03d16143e2a446df72fe16d94a40c59 (patch) | |
tree | afaa5df4a41570a3bd3234b7dda0e54a04434799 | |
parent | 108b43458f8c011e6cb43d2b623952ae13108029 (diff) |
Do an atomic compare-exchange on the global context when destroying a context
-rw-r--r-- | Alc/ALc.c | 9 | ||||
-rw-r--r-- | OpenAL32/Include/alMain.h | 12 |
2 files changed, 15 insertions, 6 deletions
@@ -2147,17 +2147,14 @@ ALC_API ALCvoid ALC_APIENTRY alcDestroyContext(ALCcontext *context) } UnlockDevice(Device); + if(CompExchangePtr((void**)&GlobalContext, context, NULL)) + ALCcontext_DecRef(context); + if(Device->NumContexts == 0) { ALCdevice_StopPlayback(Device); Device->Flags &= ~DEVICE_RUNNING; } - - if(GlobalContext == context) - { - GlobalContext = NULL; - ALCcontext_DecRef(context); - } UnlockLists(); ALCcontext_DecRef(context); diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h index ae24f54c..4e596d09 100644 --- a/OpenAL32/Include/alMain.h +++ b/OpenAL32/Include/alMain.h @@ -243,6 +243,10 @@ static __inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int new { return __sync_bool_compare_and_swap(ptr, oldval, newval); } +static __inline ALboolean CompExchangePtr(void *volatile*ptr, void *oldval, void *newval) +{ + return __sync_bool_compare_and_swap(ptr, oldval, newval); +} #elif defined(_WIN32) @@ -274,6 +278,10 @@ static __inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int new } u = { ptr }; return InterlockedCompareExchange(u.l, newval, oldval) == oldval; } +static __inline void *CompExchangePtr(void *volatile*ptr, void *oldval, void *newval) +{ + return InterlockedCompareExchangePointer(ptr, newval, oldval); +} #elif defined(__APPLE__) @@ -306,6 +314,10 @@ static __inline ALboolean CompExchangeInt(volatile int *ptr, int oldval, int new { return OSAtomicCompareAndSwap32Barrier(oldval, newval, ptr); } +static __inline ALboolean CompExchangeInt(void *volatile*ptr, void *oldval, void *newval) +{ + return OSAtomicCompareAndSwapPtrBarrier(oldval, newval, ptr); +} #else #error "No atomic functions available on this platform!" |