#ifndef _U_CURRENT_H_ #define _U_CURRENT_H_ #if defined(MAPI_MODE_UTIL) || defined(MAPI_MODE_GLAPI) || \ defined(MAPI_MODE_BRIDGE) #include "glapi/glapi.h" /* ugly renames to match glapi.h */ #define mapi_table _glapi_table #ifdef GLX_USE_TLS #define u_current_table _glapi_tls_Dispatch #define u_current_user _glapi_tls_Context #else #define u_current_table _glapi_Dispatch #define u_current_user _glapi_Context #endif #define u_current_get_internal _glapi_get_dispatch #define u_current_get_user_internal _glapi_get_context #define u_current_table_tsd _gl_DispatchTSD #else /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */ #include "u_compiler.h" struct mapi_table; #ifdef GLX_USE_TLS extern __thread struct mapi_table *u_current_table __attribute__((tls_model("initial-exec"))); extern __thread void *u_current_user __attribute__((tls_model("initial-exec"))); #else /* GLX_USE_TLS */ extern struct mapi_table *u_current_table; extern void *u_current_user; #endif /* GLX_USE_TLS */ #endif /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */ void u_current_init(void); void u_current_destroy(void); void u_current_set(const struct mapi_table *tbl); struct mapi_table * u_current_get_internal(void); void u_current_set_user(const void *ptr); void * u_current_get_user_internal(void); static INLINE const struct mapi_table * u_current_get(void) { #ifdef GLX_USE_TLS return u_current_table; #else return (likely(u_current_table) ? u_current_table : u_current_get_internal()); #endif } static INLINE const void * u_current_get_user(void) { #ifdef GLX_USE_TLS return u_current_user; #else return likely(u_current_user) ? u_current_user : u_current_get_user_internal(); #endif } #endif /* _U_CURRENT_H_ */