From 9499484ed2f0377678b2b4d88573327ee0e4ce6d Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 14 Mar 2019 03:01:01 +0300 Subject: Implemented a faster way to access predefined TSRM resources - CG(), EG(), etc. --- TSRM/TSRM.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'TSRM/TSRM.h') diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index 061459e77d..a14e31e1f0 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -57,6 +57,14 @@ typedef uintptr_t tsrm_uintptr_t; #include #endif +#if SIZEOF_SIZE_T == 4 +# define TSRM_ALIGNED_SIZE(size) \ + (((size) + INT32_C(15)) & ~INT32_C(15)) +#else +# define TSRM_ALIGNED_SIZE(size) \ + (((size) + INT64_C(15)) & ~INT64_C(15)) +#endif + typedef int ts_rsrc_id; /* Define THREAD_T and MUTEX_T */ @@ -94,6 +102,10 @@ TSRM_API void tsrm_shutdown(void); /* allocates a new thread-safe-resource id */ TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor); +/* Fast resource in reserved (pre-allocated) space */ +TSRM_API void tsrm_reserve(size_t size); +TSRM_API ts_rsrc_id ts_allocate_fast_id(ts_rsrc_id *rsrc_id, size_t *offset, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor); + /* fetches the requested resource for the current thread */ TSRM_API void *ts_resource_ex(ts_rsrc_id id, THREAD_T *th_id); #define ts_resource(id) ts_resource_ex(id, NULL) @@ -162,9 +174,13 @@ TSRM_API const char *tsrm_api_name(void); #define TSRMLS_SET_CTX(ctx) ctx = (void ***) tsrm_get_ls_cache() #define TSRMG(id, type, element) (TSRMG_BULK(id, type)->element) #define TSRMG_BULK(id, type) ((type) (*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(id)]) +#define TSRMG_FAST(offset, type, element) (TSRMG_FAST_BULK(offset, type)->element) +#define TSRMG_FAST_BULK(offset, type) ((type) (((char*) tsrm_get_ls_cache())+(offset))) #define TSRMG_STATIC(id, type, element) (TSRMG_BULK_STATIC(id, type)->element) #define TSRMG_BULK_STATIC(id, type) ((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)]) +#define TSRMG_FAST_STATIC(offset, type, element) (TSRMG_FAST_BULK_STATIC(offset, type)->element) +#define TSRMG_FAST_BULK_STATIC(offset, type) ((type) (((char*) TSRMLS_CACHE)+(offset))) #define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE; #define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE = NULL; #if ZEND_DEBUG -- cgit v1.2.1