diff options
Diffstat (limited to 'TSRM/TSRM.h')
-rw-r--r-- | TSRM/TSRM.h | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index b232429d4d..83999c3521 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -129,8 +129,8 @@ TSRM_API void ts_free_id(ts_rsrc_id id); #define TSRM_ERROR_LEVEL_CORE 2 #define TSRM_ERROR_LEVEL_INFO 3 -typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id, void ***tsrm_ls); -typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id, void ***tsrm_ls); +typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id); +typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id); TSRM_API int tsrm_error(int level, const char *format, ...); @@ -155,17 +155,33 @@ TSRM_API void *tsrm_new_interpreter_context(void); TSRM_API void *tsrm_set_interpreter_context(void *new_ctx); TSRM_API void tsrm_free_interpreter_context(void *context); +TSRM_API inline void *tsrm_get_ls_cache(void); + +#ifdef TSRM_WIN32 +# define TSRM_TLS __declspec(thread) +#else +# define TSRM_TLS __thread +#endif + #define TSRM_SHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)+1) #define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1) -#define TSRMLS_FETCH() void ***tsrm_ls = (void ***) ts_resource_ex(0, NULL) #define TSRMLS_FETCH_FROM_CTX(ctx) void ***tsrm_ls = (void ***) ctx -#define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_ls -#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) -#define TSRMLS_D void ***tsrm_ls -#define TSRMLS_DC , TSRMLS_D -#define TSRMLS_C tsrm_ls -#define TSRMLS_CC , TSRMLS_C +#define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_get_ls_cache() +#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) + +#define TSRMG_STATIC(id, type, element) (((type) (*((void ***) _tsrm_ls_cache))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) +#define TSRMLS_CACHE_EXTERN extern TSRM_TLS void *_tsrm_ls_cache +#define TSRMLS_CACHE_DEFINE TSRM_TLS void *_tsrm_ls_cache = NULL +#define TSRMLS_CACHE_UPDATE if (!TSRMLS_CACHE) _tsrm_ls_cache = tsrm_get_ls_cache() +#define TSRMLS_CACHE _tsrm_ls_cache + +/* BC only */ +#define TSRMLS_D void +#define TSRMLS_DC +#define TSRMLS_C +#define TSRMLS_CC +#define TSRMLS_FETCH() #ifdef __cplusplus } @@ -176,6 +192,14 @@ TSRM_API void tsrm_free_interpreter_context(void *context); #define TSRMLS_FETCH() #define TSRMLS_FETCH_FROM_CTX(ctx) #define TSRMLS_SET_CTX(ctx) + +#define TSRMG_STATIC(id, type, element) +#define TSRMLS_CACHE_EXTERN +#define TSRMLS_CACHE_DEFINE +#define TSRMLS_CACHE_UPDATE +#define TSRMLS_CACHE + +/* BC only */ #define TSRMLS_D void #define TSRMLS_DC #define TSRMLS_C |