Mesa (master): glapi: Protect _glapi_check_multithread by a mutex.

Brian Paul brianp at kemper.freedesktop.org
Mon Aug 24 17:49:12 UTC 2009


Module: Mesa
Branch: master
Commit: 99939982ec76cb1fee84da9027375c55888dca20
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=99939982ec76cb1fee84da9027375c55888dca20

Author: Chia-I Wu <olvaffe at gmail.com>
Date:   Fri Jul 10 15:21:42 2009 +0800

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 at intel.com>
Signed-off-by: Chia-I Wu <olvaffe at gmail.com>

---

 src/mesa/glapi/glapi.c |   29 +++++++++++++++--------------
 1 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/src/mesa/glapi/glapi.c b/src/mesa/glapi/glapi.c
index 2b105d0..30aec20 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
 }
 




More information about the mesa-commit mailing list