Use a standard mutex for the event callback lock
This commit is contained in:
@@ -2539,7 +2539,6 @@ static ALvoid InitContext(ALCcontext *Context)
|
||||
Context->SpeedOfSound = SPEEDOFSOUNDMETRESPERSEC;
|
||||
Context->MetersPerUnit = AL_DEFAULT_METERS_PER_UNIT;
|
||||
alsem_init(&Context->EventSem, 0);
|
||||
almtx_init(&Context->EventCbLock, almtx_plain);
|
||||
|
||||
Context->ExtensionList = alExtList;
|
||||
|
||||
@@ -2650,7 +2649,6 @@ ALCcontext_struct::~ALCcontext_struct()
|
||||
}
|
||||
TRACE("Freed " SZFMT " listener property object%s\n", count, (count==1)?"":"s");
|
||||
|
||||
almtx_destroy(&EventCbLock);
|
||||
alsem_destroy(&EventSem);
|
||||
|
||||
ll_ringbuffer_free(AsyncEvents);
|
||||
|
||||
+3
-1
@@ -1,6 +1,8 @@
|
||||
#ifndef ALCONTEXT_H
|
||||
#define ALCONTEXT_H
|
||||
|
||||
#include <mutex>
|
||||
#include <atomic>
|
||||
#include <memory>
|
||||
#include <thread>
|
||||
|
||||
@@ -102,7 +104,7 @@ struct ALCcontext_struct {
|
||||
alsem_t EventSem;
|
||||
ll_ringbuffer *AsyncEvents{nullptr};
|
||||
ATOMIC(ALbitfieldSOFT) EnabledEvts{0u};
|
||||
almtx_t EventCbLock;
|
||||
std::mutex EventCbLock;
|
||||
ALEVENTPROCSOFT EventCb{};
|
||||
void *EventParam{nullptr};
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ void alSetError(ALCcontext *context, ALenum errorCode, const char *msg, ...)
|
||||
context->LastError.compare_exchange_strong(curerr, errorCode);
|
||||
if((context->EnabledEvts.load(std::memory_order_relaxed)&EventType_Error))
|
||||
{
|
||||
std::lock_guard<almtx_t> _{context->EventCbLock};
|
||||
std::lock_guard<std::mutex> _{context->EventCbLock};
|
||||
ALbitfieldSOFT enabledevts{context->EnabledEvts.load(std::memory_order_relaxed)};
|
||||
if((enabledevts&EventType_Error) && context->EventCb)
|
||||
(*context->EventCb)(AL_EVENT_TYPE_ERROR_SOFT, 0, errorCode, msglen, msg,
|
||||
|
||||
@@ -664,8 +664,8 @@ AL_API ALvoid AL_APIENTRY alDopplerVelocity(ALfloat value)
|
||||
static constexpr ALCchar msg[] =
|
||||
"alDopplerVelocity is deprecated in AL1.1, use alSpeedOfSound";
|
||||
const ALsizei msglen = (ALsizei)strlen(msg);
|
||||
std::lock_guard<almtx_t> _{context->EventCbLock};
|
||||
ALbitfieldSOFT enabledevts{ATOMIC_LOAD(&context->EnabledEvts, almemory_order_relaxed)};
|
||||
std::lock_guard<std::mutex> _{context->EventCbLock};
|
||||
ALbitfieldSOFT enabledevts{context->EnabledEvts.load(std::memory_order_relaxed)};
|
||||
if((enabledevts&EventType_Deprecated) && context->EventCb)
|
||||
(*context->EventCb)(AL_EVENT_TYPE_DEPRECATED_SOFT, 0, 0, msglen, msg,
|
||||
context->EventParam);
|
||||
|
||||
+3
-3
@@ -27,7 +27,7 @@ static int EventThread(ALCcontext *context)
|
||||
continue;
|
||||
}
|
||||
|
||||
std::lock_guard<almtx_t> _{context->EventCbLock};
|
||||
std::lock_guard<std::mutex> _{context->EventCbLock};
|
||||
do {
|
||||
quitnow = evt.EnumType == EventType_KillThread;
|
||||
if(UNLIKELY(quitnow)) break;
|
||||
@@ -126,7 +126,7 @@ AL_API void AL_APIENTRY alEventControlSOFT(ALsizei count, const ALenum *types, A
|
||||
/* Wait to ensure the event handler sees the changed flags before
|
||||
* returning.
|
||||
*/
|
||||
std::lock_guard<almtx_t>{context->EventCbLock};
|
||||
std::lock_guard<std::mutex>{context->EventCbLock};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@ AL_API void AL_APIENTRY alEventCallbackSOFT(ALEVENTPROCSOFT callback, void *user
|
||||
if(UNLIKELY(!context)) return;
|
||||
|
||||
std::lock_guard<almtx_t> _{context->PropLock};
|
||||
std::lock_guard<almtx_t> __{context->EventCbLock};
|
||||
std::lock_guard<std::mutex> __{context->EventCbLock};
|
||||
context->EventCb = callback;
|
||||
context->EventParam = userParam;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user