diff options
author | Chris Robinson <[email protected]> | 2017-06-29 10:56:32 -0700 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2017-06-29 10:56:32 -0700 |
commit | 00694826ef5b2f410cdd9d8a2274b34ea86bffdf (patch) | |
tree | 35ec897340abc6a9f79950cf80cf9f4d55426c06 /router | |
parent | 058d57ef0352ee0f46fc5e0ebe76479660bfc44e (diff) |
Protect context switches with a lock in the router
Diffstat (limited to 'router')
-rw-r--r-- | router/alc.c | 6 | ||||
-rw-r--r-- | router/router.c | 3 | ||||
-rw-r--r-- | router/router.h | 1 |
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); |