aboutsummaryrefslogtreecommitdiffstats
path: root/router
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2017-06-29 10:56:32 -0700
committerChris Robinson <[email protected]>2017-06-29 10:56:32 -0700
commit00694826ef5b2f410cdd9d8a2274b34ea86bffdf (patch)
tree35ec897340abc6a9f79950cf80cf9f4d55426c06 /router
parent058d57ef0352ee0f46fc5e0ebe76479660bfc44e (diff)
Protect context switches with a lock in the router
Diffstat (limited to 'router')
-rw-r--r--router/alc.c6
-rw-r--r--router/router.c3
-rw-r--r--router/router.h1
3 files changed, 10 insertions, 0 deletions
diff --git a/router/alc.c b/router/alc.c
index 0fb9cf4e..1ea9df17 100644
--- a/router/alc.c
+++ b/router/alc.c
@@ -420,16 +420,21 @@ ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context)
{
ALint idx = -1;
+ almtx_lock(&ContextSwitchLock);
if(context)
{
idx = LookupPtrIntMapKey(&ContextIfaceMap, context);
if(idx < 0)
{
ATOMIC_STORE_SEQ(&LastError, ALC_INVALID_CONTEXT);
+ almtx_unlock(&ContextSwitchLock);
return ALC_FALSE;
}
if(!DriverList[idx].alcMakeContextCurrent(context))
+ {
+ almtx_unlock(&ContextSwitchLock);
return ALC_FALSE;
+ }
}
/* Unset the context from the old driver if it's different from the new
@@ -446,6 +451,7 @@ ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context)
if(oldiface && oldiface != &DriverList[idx])
oldiface->alcMakeContextCurrent(NULL);
}
+ almtx_unlock(&ContextSwitchLock);
return ALC_TRUE;
}
diff --git a/router/router.c b/router/router.c
index 4dfae314..f54643f4 100644
--- a/router/router.c
+++ b/router/router.c
@@ -16,6 +16,7 @@ int DriverListSize = 0;
static int DriverListSizeMax = 0;
almtx_t EnumerationLock;
+almtx_t ContextSwitchLock;
static void LoadDriverList(void);
@@ -29,6 +30,7 @@ BOOL APIENTRY DllMain(HINSTANCE UNUSED(module), DWORD reason, void* UNUSED(reser
case DLL_PROCESS_ATTACH:
LoadDriverList();
almtx_init(&EnumerationLock, almtx_recursive);
+ almtx_init(&ContextSwitchLock, almtx_plain);
break;
case DLL_THREAD_ATTACH:
@@ -37,6 +39,7 @@ BOOL APIENTRY DllMain(HINSTANCE UNUSED(module), DWORD reason, void* UNUSED(reser
case DLL_PROCESS_DETACH:
ReleaseALC();
+ almtx_destroy(&ContextSwitchLock);
almtx_destroy(&EnumerationLock);
for(i = 0;i < DriverListSize;i++)
{
diff --git a/router/router.h b/router/router.h
index 78f7b6c0..1eef017f 100644
--- a/router/router.h
+++ b/router/router.h
@@ -152,6 +152,7 @@ ALint LookupPtrIntMapKey(PtrIntMap *map, ALvoid *key);
extern almtx_t EnumerationLock;
+extern almtx_t ContextSwitchLock;
void ReleaseALC(void);