summaryrefslogtreecommitdiff
path: root/TSRM/TSRM.h
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-03-14 03:01:01 +0300
committerDmitry Stogov <dmitry@zend.com>2019-03-14 03:01:01 +0300
commit9499484ed2f0377678b2b4d88573327ee0e4ce6d (patch)
tree2253189b70e711565902d2c372fe5d93ce111358 /TSRM/TSRM.h
parenta1b7bc0c8148eaf728fccdffe147e3bc0c03f18e (diff)
downloadphp-git-9499484ed2f0377678b2b4d88573327ee0e4ce6d.tar.gz
Implemented a faster way to access predefined TSRM resources - CG(), EG(), etc.
Diffstat (limited to 'TSRM/TSRM.h')
-rw-r--r--TSRM/TSRM.h16
1 files changed, 16 insertions, 0 deletions
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 <TLS.h>
#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