void _glthread_SetTSD(_glthread_TSD *tsd, void *ptr) { if (tsd->initMagic != INIT_MAGIC) { _glthread_InitTSD(tsd); } xthread_set_specific(tsd->key, ptr); }
static void _glitz_glx_thread_info_destroy (glitz_glx_thread_info_t *thread_info) { xthread_set_specific (info_tsd, NULL); if (thread_info) { _glitz_glx_thread_info_fini (thread_info); free (thread_info); } }
static glitz_glx_thread_info_t * _glitz_glx_thread_info_get (const char *gl_library) { glitz_glx_thread_info_t *thread_info; void *p; if (!tsd_initialized) { xthread_key_create (&info_tsd, _tsd_destroy); tsd_initialized = 1; } xthread_get_specific (info_tsd, &p); if (p == NULL) { thread_info = malloc (sizeof (glitz_glx_thread_info_t)); _glitz_glx_thread_info_init (thread_info); xthread_set_specific (info_tsd, thread_info); } else thread_info = (glitz_glx_thread_info_t *) p; if (gl_library) { int len = strlen (gl_library); if (thread_info->gl_library) { free (thread_info->gl_library); thread_info->gl_library = NULL; } thread_info->gl_library = malloc (len + 1); if (thread_info->gl_library) { memcpy (thread_info->gl_library, gl_library, len); thread_info->gl_library[len] = '\0'; } } return thread_info; }