[Mesa-dev] [PATCH 1/4] dispatch: Use general-dynamic TLS model rather than initial-exec.

christopher.halse.rogers at canonical.com christopher.halse.rogers at canonical.com
Wed Mar 23 16:33:36 PDT 2011


From: Christopher James Halse Rogers <christopher.halse.rogers at canonical.com>

The initial-exec static TLS model is inappropriate for libraries
that might be dynamically loaded.  Since libGL is dynamically loaded
by any number of projects mesa must instead use the general-dynamic
TLS model.

This has apparently always been broken for projects dynamically loading
libGL and libstdc++, but now that libGL links to libstdc++ it's much
more visible.

cf: Launchpad bug: https://bugs.launchpad.net/bugs/259219
First part of fix for https://bugs.freedesktop.org/show_bug.cgi?id=35268
---
 src/egl/main/eglcurrent.c              |    2 +-
 src/glx/glxclient.h                    |    2 +-
 src/glx/glxcurrent.c                   |    2 +-
 src/mapi/glapi/glapi.h                 |    4 ++--
 src/mapi/mapi/u_current.c              |    4 ++--
 src/mapi/mapi/u_current.h              |    4 ++--
 src/mesa/drivers/dri/common/dri_test.c |    4 ++--
 src/mesa/drivers/x11/glxapi.c          |    2 +-
 8 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/src/egl/main/eglcurrent.c b/src/egl/main/eglcurrent.c
index 4221a9b..8a30122 100644
--- a/src/egl/main/eglcurrent.c
+++ b/src/egl/main/eglcurrent.c
@@ -24,7 +24,7 @@ static void (*_egl_FreeTSD)(_EGLThreadInfo *);
 
 #ifdef GLX_USE_TLS
 static __thread const _EGLThreadInfo *_egl_TLS
-   __attribute__ ((tls_model("initial-exec")));
+   __attribute__ ((tls_model("global-dynamic")));
 #endif
 
 static INLINE void _eglSetTSD(const _EGLThreadInfo *t)
diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h
index 2b6966f..39ba37c 100644
--- a/src/glx/glxclient.h
+++ b/src/glx/glxclient.h
@@ -619,7 +619,7 @@ extern void __glXSetCurrentContext(struct glx_context * c);
 # if defined( GLX_USE_TLS )
 
 extern __thread void *__glX_tls_Context
-   __attribute__ ((tls_model("initial-exec")));
+   __attribute__ ((tls_model("global-dynamic")));
 
 #  define __glXGetCurrentContext() __glX_tls_Context
 
diff --git a/src/glx/glxcurrent.c b/src/glx/glxcurrent.c
index 1f845ce..b80d5ad 100644
--- a/src/glx/glxcurrent.c
+++ b/src/glx/glxcurrent.c
@@ -86,7 +86,7 @@ _X_HIDDEN pthread_mutex_t __glXmutex = PTHREAD_MUTEX_INITIALIZER;
  * \b never be \c NULL.  This is important!  Because of this
  * \c __glXGetCurrentContext can be implemented as trivial macro.
  */
-__thread void *__glX_tls_Context __attribute__ ((tls_model("initial-exec")))
+__thread void *__glX_tls_Context __attribute__ ((tls_model("global-dynamic")))
    = &dummyContext;
 
 _X_HIDDEN void
diff --git a/src/mapi/glapi/glapi.h b/src/mapi/glapi/glapi.h
index e909cf8..ec21641 100644
--- a/src/mapi/glapi/glapi.h
+++ b/src/mapi/glapi/glapi.h
@@ -81,10 +81,10 @@ struct _glapi_table;
 #if defined (GLX_USE_TLS)
 
 _GLAPI_EXPORT extern __thread struct _glapi_table * _glapi_tls_Dispatch
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 
 _GLAPI_EXPORT extern __thread void * _glapi_tls_Context
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 
 _GLAPI_EXPORT extern const struct _glapi_table *_glapi_Dispatch;
 _GLAPI_EXPORT extern const void *_glapi_Context;
diff --git a/src/mapi/mapi/u_current.c b/src/mapi/mapi/u_current.c
index 21a07ab..1775bf0 100644
--- a/src/mapi/mapi/u_current.c
+++ b/src/mapi/mapi/u_current.c
@@ -100,11 +100,11 @@ extern void (*__glapi_noop_table[])(void);
 #if defined(GLX_USE_TLS)
 
 __thread struct mapi_table *u_current_table
-    __attribute__((tls_model("initial-exec")))
+    __attribute__((tls_model("global-dynamic")))
     = (struct mapi_table *) table_noop_array;
 
 __thread void *u_current_user
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 
 #else
 
diff --git a/src/mapi/mapi/u_current.h b/src/mapi/mapi/u_current.h
index f9cffd8..64ca558 100644
--- a/src/mapi/mapi/u_current.h
+++ b/src/mapi/mapi/u_current.h
@@ -31,10 +31,10 @@ struct mapi_table;
 #ifdef GLX_USE_TLS
 
 extern __thread struct mapi_table *u_current_table
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 
 extern __thread void *u_current_user
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 
 #else /* GLX_USE_TLS */
 
diff --git a/src/mesa/drivers/dri/common/dri_test.c b/src/mesa/drivers/dri/common/dri_test.c
index 793f0c3..920cd17 100644
--- a/src/mesa/drivers/dri/common/dri_test.c
+++ b/src/mesa/drivers/dri/common/dri_test.c
@@ -12,10 +12,10 @@ extern char __driDriverExtensions[];
 #if defined(GLX_USE_TLS)
 
 PUBLIC __thread struct _glapi_table * _glapi_tls_Dispatch
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 
 PUBLIC __thread void * _glapi_tls_Context
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 
 PUBLIC const struct _glapi_table *_glapi_Dispatch;
 PUBLIC const void *_glapi_Context;
diff --git a/src/mesa/drivers/x11/glxapi.c b/src/mesa/drivers/x11/glxapi.c
index 255a37b..b3a51a1 100644
--- a/src/mesa/drivers/x11/glxapi.c
+++ b/src/mesa/drivers/x11/glxapi.c
@@ -160,7 +160,7 @@ get_dispatch(Display *dpy)
  */
 #if defined(GLX_USE_TLS)
 PUBLIC __thread void * CurrentContext
-    __attribute__((tls_model("initial-exec")));
+    __attribute__((tls_model("global-dynamic")));
 #elif defined(THREADS)
 static _glthread_TSD ContextTSD;         /**< Per-thread context pointer */
 #else
-- 
1.7.4.1



More information about the mesa-dev mailing list