From 00694826ef5b2f410cdd9d8a2274b34ea86bffdf Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 29 Jun 2017 10:56:32 -0700 Subject: Protect context switches with a lock in the router --- router/alc.c | 6 ++++++ router/router.c | 3 +++ router/router.h | 1 + 3 files changed, 10 insertions(+) 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); -- cgit v1.2.3