summaryrefslogtreecommitdiff
path: root/TSRM
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-09-18 14:03:07 +0300
committerDmitry Stogov <dmitry@zend.com>2019-09-18 14:03:07 +0300
commit2aefd112114bd150f5dbba0be6d0f8601561da4e (patch)
tree872e20583665f96651719d1cad934b152225cf6b /TSRM
parentd7b4cdff3f048ce232bd16870695ffbfcba45f4e (diff)
downloadphp-git-2aefd112114bd150f5dbba0be6d0f8601561da4e.tar.gz
Optimize access to thread local cache.
This patch saves one CPU instruction on each "_tsrm_ls_cache" access in ZTS CLI/CGI/FPM builds. This reduce typical instruction sequence for EG(current_execute_data) access from 4 to 3 CPU instructions.
Diffstat (limited to 'TSRM')
-rw-r--r--TSRM/TSRM.h12
1 files changed, 10 insertions, 2 deletions
diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h
index 9b67c0c2df..b25e3db149 100644
--- a/TSRM/TSRM.h
+++ b/TSRM/TSRM.h
@@ -143,6 +143,14 @@ TSRM_API const char *tsrm_api_name(void);
# define TSRM_TLS __thread
#endif
+#if !defined(__has_attribute) || !__has_attribute(tls_model)
+# define TSRM_TLS_MODEL_ATTR
+#elif __PIC__
+# define TSRM_TLS_MODEL_ATTR __attribute__((tls_model("initial-exec")))
+#else
+# define TSRM_TLS_MODEL_ATTR __attribute__((tls_model("local-exec")))
+#endif
+
#define TSRM_SHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)+1)
#define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
@@ -155,8 +163,8 @@ TSRM_API const char *tsrm_api_name(void);
#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;
+#define TSRMLS_CACHE_EXTERN() extern TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR;
+#define TSRMLS_CACHE_DEFINE() TSRM_TLS void *TSRMLS_CACHE TSRM_TLS_MODEL_ATTR = NULL;
#define TSRMLS_CACHE_UPDATE() TSRMLS_CACHE = tsrm_get_ls_cache()
#define TSRMLS_CACHE _tsrm_ls_cache