[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