• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _U_CURRENT_H_
2 #define _U_CURRENT_H_
3 
4 #if defined(MAPI_MODE_UTIL) || defined(MAPI_MODE_GLAPI) || \
5     defined(MAPI_MODE_BRIDGE)
6 
7 #include "glapi/glapi.h"
8 
9 /* ugly renames to match glapi.h */
10 #define mapi_table _glapi_table
11 
12 #ifdef GLX_USE_TLS
13 #define u_current_table _glapi_tls_Dispatch
14 #define u_current_user _glapi_tls_Context
15 #else
16 #define u_current_table _glapi_Dispatch
17 #define u_current_user _glapi_Context
18 #endif
19 
20 #define u_current_get_internal _glapi_get_dispatch
21 #define u_current_get_user_internal _glapi_get_context
22 
23 #define u_current_table_tsd _gl_DispatchTSD
24 
25 #else /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
26 
27 #include "u_compiler.h"
28 
29 struct mapi_table;
30 
31 #ifdef GLX_USE_TLS
32 
33 extern __thread struct mapi_table *u_current_table
34     __attribute__((tls_model("initial-exec")));
35 
36 extern __thread void *u_current_user
37     __attribute__((tls_model("initial-exec")));
38 
39 #else /* GLX_USE_TLS */
40 
41 extern struct mapi_table *u_current_table;
42 extern void *u_current_user;
43 
44 #endif /* GLX_USE_TLS */
45 
46 #endif /* MAPI_MODE_UTIL || MAPI_MODE_GLAPI || MAPI_MODE_BRIDGE */
47 
48 void
49 u_current_init(void);
50 
51 void
52 u_current_destroy(void);
53 
54 void
55 u_current_set(const struct mapi_table *tbl);
56 
57 struct mapi_table *
58 u_current_get_internal(void);
59 
60 void
61 u_current_set_user(const void *ptr);
62 
63 void *
64 u_current_get_user_internal(void);
65 
66 static INLINE const struct mapi_table *
u_current_get(void)67 u_current_get(void)
68 {
69 #ifdef GLX_USE_TLS
70    return u_current_table;
71 #else
72    return (likely(u_current_table) ?
73          u_current_table : u_current_get_internal());
74 #endif
75 }
76 
77 static INLINE const void *
u_current_get_user(void)78 u_current_get_user(void)
79 {
80 #ifdef GLX_USE_TLS
81    return u_current_user;
82 #else
83    return likely(u_current_user) ? u_current_user : u_current_get_user_internal();
84 #endif
85 }
86 
87 #endif /* _U_CURRENT_H_ */
88