summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChia-I Wu <olvaffe@gmail.com>2009-07-10 15:21:42 +0800
committerBrian Paul <brianp@vmware.com>2009-08-24 11:45:57 -0600
commit99939982ec76cb1fee84da9027375c55888dca20 (patch)
tree13e9f2aedb680ad74f7e189ae0d90f0444009ce2 /src
parent53db19b57d41a5e6beea5cb5dff4f7f638ca7b50 (diff)
glapi: Protect _glapi_check_multithread by a mutex.
Multiple threads might call _glapi_check_multithread at roughly the same time. It is possbile that all of them are wrongly regarded as firstCall if there is no mutex. This bug causes xeglthreads to crash sometimes. Acked-by: Ian Romanick <ian.d.romanick@intel.com> Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/glapi/glapi.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c
index 2b105d0f17d..30aec209e7d 100644
--- a/src/mesa/glapi/glapi.c
+++ b/src/mesa/glapi/glapi.c
@@ -198,6 +198,7 @@ PUBLIC const void *_glapi_Context = NULL;
#if defined(THREADS)
+_glthread_DECLARE_STATIC_MUTEX(ThreadCheckMutex);
static GLboolean ThreadSafe = GL_FALSE; /**< In thread-safe mode? */
_glthread_TSD _gl_DispatchTSD; /**< Per-thread dispatch pointer */
static _glthread_TSD ContextTSD; /**< Per-thread context pointer */
@@ -231,23 +232,23 @@ void
_glapi_check_multithread(void)
{
#if defined(THREADS) && !defined(GLX_USE_TLS)
- if (!ThreadSafe) {
- static unsigned long knownID;
- static GLboolean firstCall = GL_TRUE;
- if (firstCall) {
- knownID = _glthread_GetID();
- firstCall = GL_FALSE;
- }
- else if (knownID != _glthread_GetID()) {
- ThreadSafe = GL_TRUE;
- _glapi_set_dispatch(NULL);
- _glapi_set_context(NULL);
- }
+ static unsigned long knownID;
+ static GLboolean firstCall = GL_TRUE;
+
+ if (ThreadSafe)
+ return;
+
+ _glthread_LOCK_MUTEX(ThreadCheckMutex);
+ if (firstCall) {
+ knownID = _glthread_GetID();
+ firstCall = GL_FALSE;
}
- else if (!_glapi_get_dispatch()) {
- /* make sure that this thread's dispatch pointer isn't null */
+ else if (knownID != _glthread_GetID()) {
+ ThreadSafe = GL_TRUE;
_glapi_set_dispatch(NULL);
+ _glapi_set_context(NULL);
}
+ _glthread_UNLOCK_MUTEX(ThreadCheckMutex);
#endif
}