/** * We should call this periodically from a function such as glXMakeCurrent * in order to test if multiple threads are being used. */ void _glapi_check_multithread(void) { #if defined(THREADS) && !defined(GLX_USE_TLS) static unsigned long knownID; static GLboolean firstCall = GL_TRUE; if (ThreadSafe) return; CHECK_MULTITHREAD_LOCK(); if (firstCall) { /* initialize TSDs */ (void) _glthread_GetTSD(&ContextTSD); (void) _glthread_GetTSD(&_gl_DispatchTSD); knownID = _glthread_GetID(); firstCall = GL_FALSE; } else if (knownID != _glthread_GetID()) { ThreadSafe = GL_TRUE; _glapi_set_dispatch(NULL); _glapi_set_context(NULL); } CHECK_MULTITHREAD_UNLOCK(); #endif }
GLXContext PUBLIC glXGetCurrentContext(void) { #if defined(GLX_USE_TLS) return CurrentContext; #elif defined(THREADS) return (GLXContext) _glthread_GetTSD(&ContextTSD); #else return CurrentContext; #endif }
/** * Return pointer to current dispatch table for calling thread. */ PUBLIC struct _glapi_table * _glapi_get_dispatch(void) { struct _glapi_table * api; #if defined(GLX_USE_TLS) api = _glapi_tls_Dispatch; #elif defined(THREADS) api = (ThreadSafe) ? (struct _glapi_table *) _glthread_GetTSD(&_gl_DispatchTSD) : _glapi_Dispatch; #else api = _glapi_Dispatch; #endif return api; }
/** * Get the current context pointer for this thread. * The context pointer is an opaque type which should be cast from * void to the real context pointer type. */ PUBLIC void * _glapi_get_context(void) { #if defined(GLX_USE_TLS) return _glapi_tls_Context; #elif defined(THREADS) if (ThreadSafe) { return _glthread_GetTSD(&ContextTSD); } else { return _glapi_Context; } #else return _glapi_Context; #endif }