aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2011-09-02 02:57:21 -0700
committerChris Robinson <[email protected]>2011-09-02 02:57:21 -0700
commit9080d5fda03d16143e2a446df72fe16d94a40c59 (patch)
treeafaa5df4a41570a3bd3234b7dda0e54a04434799
parent108b43458f8c011e6cb43d2b623952ae13108029 (diff)
Do an atomic compare-exchange on the global context when destroying a context
-rw-r--r--Alc/ALc.c9
-rw-r--r--OpenAL32/Include/alMain.h12
2 files changed, 15 insertions, 6 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index df2ba12c..6ce6feaa 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -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!"