summaryrefslogtreecommitdiff
path: root/TSRM/TSRM.h
diff options
context:
space:
mode:
Diffstat (limited to 'TSRM/TSRM.h')
-rw-r--r--TSRM/TSRM.h42
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