1848b8605Smrg#ifndef _U_CURRENT_H_
2848b8605Smrg#define _U_CURRENT_H_
3848b8605Smrg
4b8e80941Smrg#include "c99_compat.h"
5b8e80941Smrg#include "util/macros.h"
6b8e80941Smrg
7b8e80941Smrg
8848b8605Smrg#if defined(MAPI_MODE_UTIL) || defined(MAPI_MODE_GLAPI) || \
9848b8605Smrg    defined(MAPI_MODE_BRIDGE)
10848b8605Smrg
11848b8605Smrg#include "glapi/glapi.h"
12848b8605Smrg
13848b8605Smrg#ifdef GLX_USE_TLS
14848b8605Smrg#define u_current_table _glapi_tls_Dispatch
15848b8605Smrg#define u_current_context _glapi_tls_Context
16848b8605Smrg#else
17848b8605Smrg#define u_current_table _glapi_Dispatch
18848b8605Smrg#define u_current_context _glapi_Context
19848b8605Smrg#endif
20848b8605Smrg
21848b8605Smrg#define u_current_get_table_internal _glapi_get_dispatch
22848b8605Smrg#define u_current_get_context_internal _glapi_get_context
23848b8605Smrg
24848b8605Smrg#define u_current_table_tsd _gl_DispatchTSD
25848b8605Smrg
26848b8605Smrg#else /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
27848b8605Smrg
28b8e80941Smrgstruct _glapi_table;
29848b8605Smrg
30848b8605Smrg#ifdef GLX_USE_TLS
31848b8605Smrg
32b8e80941Smrgextern __thread struct _glapi_table *u_current_table
33848b8605Smrg    __attribute__((tls_model("initial-exec")));
34848b8605Smrg
35848b8605Smrgextern __thread void *u_current_context
36848b8605Smrg    __attribute__((tls_model("initial-exec")));
37848b8605Smrg
38848b8605Smrg#else /* GLX_USE_TLS */
39848b8605Smrg
40b8e80941Smrgextern struct _glapi_table *u_current_table;
41848b8605Smrgextern void *u_current_context;
42848b8605Smrg
43848b8605Smrg#endif /* GLX_USE_TLS */
44848b8605Smrg
45848b8605Smrg#endif /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
46848b8605Smrg
47848b8605Smrgvoid
48848b8605Smrgu_current_init(void);
49848b8605Smrg
50848b8605Smrgvoid
51848b8605Smrgu_current_destroy(void);
52848b8605Smrg
53848b8605Smrgvoid
54b8e80941Smrgu_current_set_table(const struct _glapi_table *tbl);
55848b8605Smrg
56b8e80941Smrgstruct _glapi_table *
57848b8605Smrgu_current_get_table_internal(void);
58848b8605Smrg
59848b8605Smrgvoid
60848b8605Smrgu_current_set_context(const void *ptr);
61848b8605Smrg
62848b8605Smrgvoid *
63848b8605Smrgu_current_get_context_internal(void);
64848b8605Smrg
65b8e80941Smrgstatic inline const struct _glapi_table *
66848b8605Smrgu_current_get_table(void)
67848b8605Smrg{
68b8e80941Smrg#if defined(GLX_USE_TLS) && !defined(__NetBSD__)
69848b8605Smrg   return u_current_table;
70848b8605Smrg#else
71848b8605Smrg   return (likely(u_current_table) ?
72848b8605Smrg         u_current_table : u_current_get_table_internal());
73848b8605Smrg#endif
74848b8605Smrg}
75848b8605Smrg
76b8e80941Smrgstatic inline const void *
77848b8605Smrgu_current_get_context(void)
78848b8605Smrg{
79848b8605Smrg#ifdef GLX_USE_TLS
80848b8605Smrg   return u_current_context;
81848b8605Smrg#else
82848b8605Smrg   return likely(u_current_context) ? u_current_context : u_current_get_context_internal();
83848b8605Smrg#endif
84848b8605Smrg}
85848b8605Smrg
86848b8605Smrg#endif /* _U_CURRENT_H_ */
87