aboutsummaryrefslogtreecommitdiffstats
path: root/Alc/ALc.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2011-09-12 03:18:27 -0700
committerChris Robinson <[email protected]>2011-09-12 03:18:27 -0700
commit25e86e8e91eaa024deddb381fe62353bcd34f3b9 (patch)
tree886c000b975be9b911a77f7cc04b60a6c5d859e9 /Alc/ALc.c
parent780417ba398430a0c2b998b38f27be28029cefc8 (diff)
Get rid of IsContext
Diffstat (limited to 'Alc/ALc.c')
-rw-r--r--Alc/ALc.c134
1 files changed, 60 insertions, 74 deletions
diff --git a/Alc/ALc.c b/Alc/ALc.c
index dea9565f..3ba020f5 100644
--- a/Alc/ALc.c
+++ b/Alc/ALc.c
@@ -1024,31 +1024,6 @@ static ALCboolean IsValidALCChannels(ALCenum channels)
return ALC_FALSE;
}
-/* IsContext
- *
- * Check if the context pointer is valid (caller is responsible for holding the
- * list lock).
- */
-static ALCboolean IsContext(ALCcontext *context)
-{
- ALCdevice *tmp_dev;
-
- tmp_dev = g_pDeviceList;
- while(tmp_dev)
- {
- ALCcontext *tmp_ctx = tmp_dev->ContextList;
- while(tmp_ctx)
- {
- if(tmp_ctx == context)
- return ALC_TRUE;
- tmp_ctx = tmp_ctx->next;
- }
- tmp_dev = tmp_dev->next;
- }
-
- return ALC_FALSE;
-}
-
/* UpdateDeviceParams
*
@@ -1546,6 +1521,36 @@ static void ReleaseThreadCtx(void *ptr)
ALCcontext_DecRef(ptr);
}
+/* VerifyContext
+ *
+ * Checks that the given context is valid, and increments its reference count.
+ */
+static ALCcontext *VerifyContext(ALCcontext *context)
+{
+ ALCdevice *dev;
+
+ LockLists();
+ dev = g_pDeviceList;
+ while(dev)
+ {
+ ALCcontext *tmp_ctx = dev->ContextList;
+ while(tmp_ctx)
+ {
+ if(tmp_ctx == context)
+ {
+ ALCcontext_IncRef(tmp_ctx);
+ UnlockLists();
+ return tmp_ctx;
+ }
+ tmp_ctx = tmp_ctx->next;
+ }
+ dev = dev->next;
+ }
+ UnlockLists();
+
+ return NULL;
+}
+
ALCvoid LockContext(ALCcontext *context)
{
@@ -2312,34 +2317,23 @@ ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void)
*/
ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context)
{
- ALboolean bReturn = AL_TRUE;
-
- LockLists();
-
- // context must be a valid Context or NULL
- if(context == NULL || IsContext(context))
- {
- ALCcontext *old;
-
- if(context) ALCcontext_IncRef(context);
- old = ExchangePtr((void**)&GlobalContext, context);
- if(old) ALCcontext_DecRef(old);
-
- if((old=pthread_getspecific(LocalContext)) != NULL)
- {
- pthread_setspecific(LocalContext, NULL);
- ALCcontext_DecRef(old);
- }
- }
- else
+ /* context must be a valid Context or NULL */
+ if(context && !(context=VerifyContext(context)))
{
alcSetError(NULL, ALC_INVALID_CONTEXT);
- bReturn = AL_FALSE;
+ return ALC_FALSE;
}
+ /* context's reference count is already incremented */
+ context = ExchangePtr((void**)&GlobalContext, context);
+ if(context) ALCcontext_DecRef(context);
- UnlockLists();
+ if((context=pthread_getspecific(LocalContext)) != NULL)
+ {
+ pthread_setspecific(LocalContext, NULL);
+ ALCcontext_DecRef(context);
+ }
- return bReturn;
+ return ALC_TRUE;
}
/* alcSetThreadContext
@@ -2348,29 +2342,20 @@ ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context)
*/
ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context)
{
- ALboolean bReturn = AL_TRUE;
ALCcontext *old;
- // context must be a valid Context or NULL
- old = pthread_getspecific(LocalContext);
- if(old != context)
+ /* context must be a valid Context or NULL */
+ if(context && !(context=VerifyContext(context)))
{
- LockLists();
- if(context == NULL || IsContext(context))
- {
- if(context) ALCcontext_IncRef(context);
- pthread_setspecific(LocalContext, context);
- if(old) ALCcontext_DecRef(old);
- }
- else
- {
- alcSetError(NULL, ALC_INVALID_CONTEXT);
- bReturn = AL_FALSE;
- }
- UnlockLists();
+ alcSetError(NULL, ALC_INVALID_CONTEXT);
+ return ALC_FALSE;
}
+ /* context's reference count is already incremented */
+ old = pthread_getspecific(LocalContext);
+ pthread_setspecific(LocalContext, context);
+ if(old) ALCcontext_DecRef(old);
- return bReturn;
+ return ALC_TRUE;
}
@@ -2378,18 +2363,19 @@ ALC_API ALCboolean ALC_APIENTRY alcSetThreadContext(ALCcontext *context)
*
* Returns the Device that a particular Context is attached to
*/
-ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *pContext)
+ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *Context)
{
- ALCdevice *pDevice = NULL;
+ ALCdevice *Device;
- LockLists();
- if(IsContext(pContext))
- pDevice = pContext->Device;
- else
+ if(!(Context=VerifyContext(Context)))
+ {
alcSetError(NULL, ALC_INVALID_CONTEXT);
- UnlockLists();
+ return NULL;
+ }
+ Device = Context->Device;
+ ALCcontext_DecRef(Context);
- return pDevice;
+ return Device;
}