From: Christopher James Halse Rogers <christopher.halse.rog...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev