aboutsummaryrefslogtreecommitdiffstats
path: root/OpenAL32
diff options
context:
space:
mode:
Diffstat (limited to 'OpenAL32')
-rw-r--r--OpenAL32/Include/alMain.h2
-rw-r--r--OpenAL32/alError.c6
-rw-r--r--OpenAL32/alState.c6
-rw-r--r--OpenAL32/event.c19
4 files changed, 26 insertions, 7 deletions
diff --git a/OpenAL32/Include/alMain.h b/OpenAL32/Include/alMain.h
index 5b31696e..ef5ad0e9 100644
--- a/OpenAL32/Include/alMain.h
+++ b/OpenAL32/Include/alMain.h
@@ -665,7 +665,7 @@ struct ALCcontext_struct {
ATOMIC(struct ALeffectslotArray*) ActiveAuxSlots;
almtx_t EventLock;
- ALbitfieldSOFT EnabledEvts;
+ ATOMIC(ALbitfieldSOFT) EnabledEvts;
ALEVENTPROCSOFT EventCb;
void *EventParam;
diff --git a/OpenAL32/alError.c b/OpenAL32/alError.c
index e3909742..22aed458 100644
--- a/OpenAL32/alError.c
+++ b/OpenAL32/alError.c
@@ -72,10 +72,12 @@ void alSetError(ALCcontext *context, ALenum errorCode, const char *msg, ...)
}
ATOMIC_COMPARE_EXCHANGE_STRONG_SEQ(&context->LastError, &curerr, errorCode);
- if((context->EnabledEvts&EventType_Error))
+ if((ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed)&EventType_Error))
{
+ ALbitfieldSOFT enabledevts;
almtx_lock(&context->EventLock);
- if((context->EnabledEvts&EventType_Error) && context->EventCb)
+ enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed);
+ if((enabledevts&EventType_Error) && context->EventCb)
(*context->EventCb)(AL_EVENT_TYPE_ERROR_SOFT, 0, errorCode, msglen, msg,
context->EventParam);
almtx_unlock(&context->EventLock);
diff --git a/OpenAL32/alState.c b/OpenAL32/alState.c
index d4f3c6cf..10fce3b5 100644
--- a/OpenAL32/alState.c
+++ b/OpenAL32/alState.c
@@ -716,13 +716,15 @@ AL_API ALvoid AL_APIENTRY alDopplerVelocity(ALfloat value)
context = GetContextRef();
if(!context) return;
- if((context->EnabledEvts&EventType_Deprecated))
+ if((ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed)&EventType_Deprecated))
{
static const ALCchar msg[] =
"alDopplerVelocity is deprecated in AL1.1, use alSpeedOfSound";
const ALsizei msglen = (ALsizei)strlen(msg);
+ ALbitfieldSOFT enabledevts;
almtx_lock(&context->EventLock);
- if((context->EnabledEvts&EventType_Deprecated) && context->EventCb)
+ enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed);
+ if((enabledevts&EventType_Deprecated) && context->EventCb)
(*context->EventCb)(AL_EVENT_TYPE_DEPRECATED_SOFT, 0, 0, msglen, msg,
context->EventParam);
almtx_unlock(&context->EventLock);
diff --git a/OpenAL32/event.c b/OpenAL32/event.c
index 3b70c9f3..93d68d7a 100644
--- a/OpenAL32/event.c
+++ b/OpenAL32/event.c
@@ -39,9 +39,24 @@ AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, A
almtx_lock(&context->EventLock);
if(enable)
- context->EnabledEvts |= flags;
+ {
+ ALbitfieldSOFT enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed);
+ while(ATOMIC_COMPARE_EXCHANGE_WEAK(&context->EnabledEvts, &enabledevts, enabledevts|flags,
+ almemory_order_acq_rel, almemory_order_acquire) == 0)
+ {
+ /* enabledevts is (re-)filled with the current value on failure, so
+ * just try again.
+ */
+ }
+ }
else
- context->EnabledEvts &= ~flags;
+ {
+ ALbitfieldSOFT enabledevts = ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed);
+ while(ATOMIC_COMPARE_EXCHANGE_WEAK(&context->EnabledEvts, &enabledevts, enabledevts&~flags,
+ almemory_order_acq_rel, almemory_order_acquire) == 0)
+ {
+ }
+ }
almtx_unlock(&context->EventLock);
done: