summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnatol Belski <ab@php.net>2014-09-25 18:48:27 +0200
committerAnatol Belski <ab@php.net>2014-09-25 18:48:27 +0200
commitd11734b4b00f57de80d931ad1c522e00082443af (patch)
treec4fdd11760b3db34994144b4cd5b4c169eaf71d4
parenta2dd6069420c77b4f070ef10916be0d5c9afe84f (diff)
downloadphp-git-d11734b4b00f57de80d931ad1c522e00082443af.tar.gz
reworked the patch, less new stuff but worky
TLS is already used in TSRM, the way exporting the tsrm cache through a thread local variable is not portable. Additionally, the current patch suffers from bugs which are hard to find, but prevent it to be worky with apache. What is done here is mainly uses the idea from the RFC patch, but - __thread variable is removed - offset math and declarations are removed - extra macros and definitions are removed What is done merely is - use an inline function to access the tsrm cache. The function uses the portable tsrm_tls_get macro which is cheap - all the TSRM_* macros are set to placebo. Thus this opens the way remove them later Except that, the logic is old. TSRMLS_FETCH will have to be done once per thread, then tsrm_get_ls_cache() can be used. Things seeming to be worky are cli, cli server and apache. I also tried to enable bz2 shared and it has worked out of the box. The change is yet minimal diffing to the current master bus is a worky start, IMHO. Though will have to recheck the other previously done SAPIs - embed and cgi. The offsets can be added to the tsrm_resource_type struct, then it'll not be needed to declare them in the userspace. Even the "done" member type can be changed to int16 or smaller, then adding the offset as int16 will not change the struct size. As well on the todo might be removing the hashed storage, thread_id != thread_id and linked list logic in favour of the explicit TLS operations.
-rw-r--r--TSRM/TSRM.c147
-rw-r--r--TSRM/TSRM.h103
-rw-r--r--TSRM/configure.in5
-rw-r--r--TSRM/tsrm.m468
-rw-r--r--TSRM/tsrm_win32.c4
-rw-r--r--TSRM/tsrm_win32.h1
-rw-r--r--Zend/zend.c16
-rw-r--r--Zend/zend.h5
-rw-r--r--Zend/zend_API.c2
-rw-r--r--Zend/zend_API.h6
-rw-r--r--Zend/zend_alloc.c4
-rw-r--r--Zend/zend_compile.c6
-rw-r--r--Zend/zend_execute_API.c23
-rw-r--r--Zend/zend_gc.c4
-rw-r--r--Zend/zend_gc.h2
-rw-r--r--Zend/zend_globals.h4
-rw-r--r--Zend/zend_globals_macros.h10
-rw-r--r--Zend/zend_ini_parser.y2
-rw-r--r--Zend/zend_ini_scanner.c2
-rw-r--r--Zend/zend_ini_scanner.l2
-rw-r--r--Zend/zend_language_parser.y4
-rw-r--r--Zend/zend_language_scanner.c2
-rw-r--r--Zend/zend_language_scanner.l2
-rw-r--r--Zend/zend_modules.h7
-rw-r--r--Zend/zend_operators.c28
-rw-r--r--Zend/zend_stack.c5
-rw-r--r--Zend/zend_virtual_cwd.c4
-rw-r--r--Zend/zend_virtual_cwd.h2
-rw-r--r--Zend/zend_vm_def.h81
-rw-r--r--Zend/zend_vm_execute.h170
-rw-r--r--ext/date/php_date.h1
-rw-r--r--ext/opcache/ZendAccelerator.c4
-rw-r--r--ext/opcache/ZendAccelerator.h2
-rw-r--r--ext/pdo/pdo_sql_parser.c22
-rw-r--r--ext/spl/php_spl.h2
-rw-r--r--ext/standard/basic_functions.c8
-rw-r--r--ext/standard/basic_functions.h2
-rw-r--r--ext/standard/browscap.c3
-rw-r--r--ext/standard/dir.c4
-rw-r--r--ext/standard/file.c4
-rw-r--r--ext/standard/file.h2
-rw-r--r--ext/standard/info.c4
-rw-r--r--ext/standard/lcg.c4
-rw-r--r--main/SAPI.c4
-rw-r--r--main/SAPI.h2
-rw-r--r--main/main.c9
-rw-r--r--main/output.c2
-rw-r--r--main/php.h2
-rw-r--r--main/php_globals.h2
-rw-r--r--main/php_output.h1
-rw-r--r--sapi/apache/php_apache.c2
-rw-r--r--sapi/apache2handler/php_apache.h2
-rw-r--r--sapi/apache2handler/php_functions.c4
-rw-r--r--sapi/apache2handler/sapi_apache2.c3
-rw-r--r--sapi/apache_hooks/php_apache.c2
-rw-r--r--sapi/cgi/cgi_main.c10
-rw-r--r--sapi/cli/php_cli.c5
-rw-r--r--sapi/cli/php_cli_server.c14
-rw-r--r--sapi/cli/php_cli_server.h1
-rw-r--r--sapi/embed/php_embed.c7
-rw-r--r--sapi/embed/php_embed.h6
-rw-r--r--win32/build/config.w323
-rw-r--r--win32/globals.c2
-rw-r--r--win32/php_win32_globals.h2
64 files changed, 258 insertions, 610 deletions
diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c
index 82d8413e76..b1f992c91d 100644
--- a/TSRM/TSRM.c
+++ b/TSRM/TSRM.c
@@ -23,7 +23,7 @@
typedef struct _tsrm_tls_entry tsrm_tls_entry;
struct _tsrm_tls_entry {
- void *storage;
+ void **storage;
int count;
THREAD_T thread_id;
tsrm_tls_entry *next;
@@ -31,7 +31,6 @@ struct _tsrm_tls_entry {
typedef struct {
- ts_rsrc_offset offset;
size_t size;
ts_allocate_ctor ctor;
ts_allocate_dtor dtor;
@@ -43,7 +42,7 @@ typedef struct {
static tsrm_tls_entry **tsrm_tls_table=NULL;
static int tsrm_tls_table_size;
static ts_rsrc_id id_count;
-static size_t rsrcs_size;
+
/* The resource sizes table */
static tsrm_resource_type *resource_types_table=NULL;
static int resource_types_table_size;
@@ -62,62 +61,31 @@ int tsrm_error(int level, const char *format, ...);
static int tsrm_error_level;
static FILE *tsrm_error_file;
-#ifdef USE___THREAD
-TSRM_TLS void *tsrm_ls_cache = 0;
-#endif
-
-#ifdef PASS_TSRMLS
-# define CALL_TSRMG_CTOR(ctor, globale, storage) (ctor)((globale), (storage))
-# define CALL_TSRMG_DTOR(ctor, globale, storage) (ctor)((globale), (storage))
-# define CALL_NEW_THREAD_BEGIN_HANDLER(thread_id, storage) tsrm_new_thread_begin_handler((thread_id), (storage))
-# define CALL_NEW_THREAD_END_HANDLER(thread_id, storage) tsrm_new_thread_end_handler((thread_id), (storage))
-#else
-# define CALL_TSRMG_CTOR(ctor, globale, storage) (ctor)((globale))
-# define CALL_TSRMG_DTOR(ctor, globale, storage) (ctor)((globale))
-# define CALL_NEW_THREAD_BEGIN_HANDLER(thread_id, storage) tsrm_new_thread_begin_handler((thread_id))
-# define CALL_NEW_THREAD_END_HANDLER(thread_id, storage) tsrm_new_thread_end_handler((thread_id))
-#endif
-
-#ifndef TSRM_MM_ALIGNMENT
-# define TSRM_MM_ALIGNMENT 8
-#elif TSRM_MM_ALIGNMENT < 4
-# undef TSRM_MM_ALIGNMENT
-# define TSRM_MM_ALIGNMENT 8
-#endif
-
-#define TSRMG_PTR(storage, offset) ((void *)((tsrm_uintptr_t)storage + offset))
-
-#ifdef USE___THREAD
-# define TSRM_RETURN_TSRM_LS(array) array
-#else
-# define TSRM_RETURN_TSRM_LS(array) &array
-#endif
-
#if TSRM_DEBUG
#define TSRM_ERROR(args) tsrm_error args
-#define TSRM_SAFE_RETURN_RSRC(array, id, range) \
+#define TSRM_SAFE_RETURN_RSRC(array, offset, range) \
{ \
- int unshuffled_id = TSRM_UNSHUFFLE_RSRC_ID(id); \
+ int unshuffled_offset = TSRM_UNSHUFFLE_RSRC_ID(offset); \
\
- if (id==0) { \
- return TSRM_RETURN_TSRM_LS(array); \
- } else if ((unshuffled_id)>=0 && (unshuffled_id)<(range)) { \
+ if (offset==0) { \
+ return &array; \
+ } else if ((unshuffled_offset)>=0 && (unshuffled_offset)<(range)) { \
TSRM_ERROR((TSRM_ERROR_LEVEL_INFO, "Successfully fetched resource id %d for thread id %ld - 0x%0.8X", \
- unshuffled_id, (long) thread_resources->thread_id, TSRMG_PTR(array, resource_types_table[unshuffled_id].offset))); \
- return TSRMG_PTR(array, resource_types_table[unshuffled_id].offset); \
+ unshuffled_offset, (long) thread_resources->thread_id, array[unshuffled_offset])); \
+ return array[unshuffled_offset]; \
} else { \
TSRM_ERROR((TSRM_ERROR_LEVEL_ERROR, "Resource id %d is out of range (%d..%d)", \
- unshuffled_id, TSRM_SHUFFLE_RSRC_ID(0), TSRM_SHUFFLE_RSRC_ID(thread_resources->count-1))); \
+ unshuffled_offset, TSRM_SHUFFLE_RSRC_ID(0), TSRM_SHUFFLE_RSRC_ID(thread_resources->count-1))); \
return NULL; \
} \
}
#else
#define TSRM_ERROR(args)
-#define TSRM_SAFE_RETURN_RSRC(array, id, range) \
- if (id==0) { \
- return TSRM_RETURN_TSRM_LS(array); \
- } else { \
- return TSRMG_PTR(array, resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(id)].offset); \
+#define TSRM_SAFE_RETURN_RSRC(array, offset, range) \
+ if (offset==0) { \
+ return &array; \
+ } else { \
+ return array[TSRM_UNSHUFFLE_RSRC_ID(offset)]; \
}
#endif
@@ -207,8 +175,11 @@ TSRM_API void tsrm_shutdown(void)
next_p = p->next;
for (j=0; j<p->count; j++) {
- if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) {
- CALL_TSRMG_CTOR(resource_types_table[j].dtor, TSRMG_PTR(p->storage, resource_types_table[j].offset), &p->storage);
+ if (p->storage[j]) {
+ if (resource_types_table && !resource_types_table[j].done && resource_types_table[j].dtor) {
+ resource_types_table[j].dtor(p->storage[j], &p->storage);
+ }
+ free(p->storage[j]);
}
}
free(p->storage);
@@ -241,10 +212,9 @@ 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, ts_rsrc_offset *rsrc_offset, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor)
+TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor)
{
int i;
- ts_rsrc_offset offset = 0;
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Obtaining a new resource id, %d bytes", size));
@@ -265,17 +235,6 @@ TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, ts_rsrc_offset *rsrc_off
}
resource_types_table_size = id_count;
}
-
- if (TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id) > 0) {
- offset = resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id-1)].offset
- +resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id-1)].size;
- }
- offset = ((TSRM_MM_ALIGNMENT + offset - 1) & ~(TSRM_MM_ALIGNMENT - 1));
- if (rsrc_offset) {
- *rsrc_offset = offset;
- }
-
- resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].offset = offset;
resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].size = size;
resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].ctor = ctor;
resource_types_table[TSRM_UNSHUFFLE_RSRC_ID(*rsrc_id)].dtor = dtor;
@@ -289,13 +248,11 @@ TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, ts_rsrc_offset *rsrc_off
if (p->count < id_count) {
int j;
- p->storage = realloc(p->storage, offset + size);
-#ifdef USE___THREAD
- tsrm_ls_cache = p->storage;
-#endif
+ p->storage = (void *) realloc(p->storage, sizeof(void *)*id_count);
for (j=p->count; j<id_count; j++) {
+ p->storage[j] = (void *) malloc(resource_types_table[j].size);
if (resource_types_table[j].ctor) {
- CALL_TSRMG_CTOR(resource_types_table[j].ctor, TSRMG_PTR(p->storage, resource_types_table[j].offset), &p->storage);
+ resource_types_table[j].ctor(p->storage[j], &p->storage);
}
}
p->count = id_count;
@@ -303,10 +260,9 @@ TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, ts_rsrc_offset *rsrc_off
p = p->next;
}
}
- rsrcs_size = offset + size;
tsrm_mutex_unlock(tsmm_mutex);
- TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Successfully allocated new resource id %d, offset %u", *rsrc_id, *rsrc_offset));
+ TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Successfully allocated new resource id %d", *rsrc_id));
return *rsrc_id;
}
@@ -317,7 +273,7 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_
TSRM_ERROR((TSRM_ERROR_LEVEL_CORE, "Creating data structures for thread %x", thread_id));
(*thread_resources_ptr) = (tsrm_tls_entry *) malloc(sizeof(tsrm_tls_entry));
- (*thread_resources_ptr)->storage = malloc(rsrcs_size);
+ (*thread_resources_ptr)->storage = (void **) malloc(sizeof(void *)*id_count);
(*thread_resources_ptr)->count = id_count;
(*thread_resources_ptr)->thread_id = thread_id;
(*thread_resources_ptr)->next = NULL;
@@ -325,23 +281,23 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_
/* Set thread local storage to this new thread resources structure */
tsrm_tls_set(*thread_resources_ptr);
-#ifdef USE___THREAD
- tsrm_ls_cache = (*thread_resources_ptr)->storage;
-#endif
-
if (tsrm_new_thread_begin_handler) {
- CALL_NEW_THREAD_BEGIN_HANDLER(thread_id, &(*thread_resources_ptr)->storage);
+ tsrm_new_thread_begin_handler(thread_id, &((*thread_resources_ptr)->storage));
}
for (i=0; i<id_count; i++) {
- if (!resource_types_table[i].done) {
+ if (resource_types_table[i].done) {
+ (*thread_resources_ptr)->storage[i] = NULL;
+ } else
+ {
+ (*thread_resources_ptr)->storage[i] = (void *) malloc(resource_types_table[i].size);
if (resource_types_table[i].ctor) {
- CALL_TSRMG_CTOR(resource_types_table[i].ctor, TSRMG_PTR((*thread_resources_ptr)->storage, resource_types_table[i].offset), &(*thread_resources_ptr)->storage);
+ resource_types_table[i].ctor((*thread_resources_ptr)->storage[i], &(*thread_resources_ptr)->storage);
}
}
}
if (tsrm_new_thread_end_handler) {
- CALL_NEW_THREAD_END_HANDLER(thread_id, &(*thread_resources_ptr)->storage);
+ tsrm_new_thread_end_handler(thread_id, &((*thread_resources_ptr)->storage));
}
tsrm_mutex_unlock(tsmm_mutex);
@@ -434,10 +390,12 @@ void tsrm_free_interpreter_context(void *context)
for (i=0; i<thread_resources->count; i++) {
if (resource_types_table[i].dtor) {
- CALL_TSRMG_DTOR(resource_types_table[i].dtor, TSRMG_PTR(thread_resources->storage, resource_types_table[i].offset), &thread_resources->storage);
+ resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage);
}
}
-
+ for (i=0; i<thread_resources->count; i++) {
+ free(thread_resources->storage[i]);
+ }
free(thread_resources->storage);
free(thread_resources);
thread_resources = next;
@@ -455,10 +413,6 @@ void *tsrm_set_interpreter_context(void *new_ctx)
/* Set thread local storage to this new thread resources structure */
tsrm_tls_set(new_ctx);
-
-#ifdef USE___THREAD
- tsrm_ls_cache = ((tsrm_tls_entry*)new_ctx)->storage;
-#endif
/* return old context, so caller can restore it when they're done */
return current;
@@ -501,9 +455,12 @@ void ts_free_thread(void)
if (thread_resources->thread_id == thread_id) {
for (i=0; i<thread_resources->count; i++) {
if (resource_types_table[i].dtor) {
- CALL_TSRMG_DTOR(resource_types_table[i].dtor, TSRMG_PTR(thread_resources->storage, resource_types_table[i].offset), &thread_resources->storage);
+ resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage);
}
}
+ for (i=0; i<thread_resources->count; i++) {
+ free(thread_resources->storage[i]);
+ }
free(thread_resources->storage);
if (last) {
last->next = thread_resources->next;
@@ -540,9 +497,12 @@ void ts_free_worker_threads(void)
if (thread_resources->thread_id != thread_id) {
for (i=0; i<thread_resources->count; i++) {
if (resource_types_table[i].dtor) {
- CALL_TSRMG_DTOR(resource_types_table[i].dtor, TSRMG_PTR(thread_resources->storage, resource_types_table[i].offset), &thread_resources->storage);
+ resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage);
}
}
+ for (i=0; i<thread_resources->count; i++) {
+ free(thread_resources->storage[i]);
+ }
free(thread_resources->storage);
if (last) {
last->next = thread_resources->next;
@@ -581,10 +541,12 @@ void ts_free_id(ts_rsrc_id id)
tsrm_tls_entry *p = tsrm_tls_table[i];
while (p) {
- if (p->count > j) {
+ if (p->count > j && p->storage[j]) {
if (resource_types_table && resource_types_table[j].dtor) {
- CALL_TSRMG_DTOR(resource_types_table[j].dtor, TSRMG_PTR(p->storage, resource_types_table[j].offset), &p->storage);
+ resource_types_table[j].dtor(p->storage[j], &p->storage);
}
+ free(p->storage[j]);
+ p->storage[j] = NULL;
}
p = p->next;
}
@@ -829,14 +791,9 @@ void tsrm_error_set(int level, char *debug_filename)
#endif
}
-TSRM_API void *get_tsrm_ls_cache(void)
-{
- return tsrm_ls_cache;
-}
-
-TSRM_API void set_tsrm_ls_cache(void **cache)
+TSRM_API inline void *tsrm_get_ls_cache(void)
{
- tsrm_ls_cache = *cache;
+ return tsrm_tls_get();
}
#endif /* ZTS */
diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h
index de211ad075..41cd9485e7 100644
--- a/TSRM/TSRM.h
+++ b/TSRM/TSRM.h
@@ -21,8 +21,6 @@
#endif
#ifdef TSRM_WIN32
-# define TSRM_EXP_API __declspec(dllexport)
-# define TSRM_IMP_API __declspec(dllimport)
# ifdef TSRM_EXPORTS
# define TSRM_API __declspec(dllexport)
# else
@@ -30,12 +28,8 @@
# endif
#elif defined(__GNUC__) && __GNUC__ >= 4
# define TSRM_API __attribute__ ((visibility("default")))
-# define TSRM_EXP_API TSRM_API
-# define TSRM_IMP_API TSRM_API
#else
# define TSRM_API
-# define TSRM_EXP_API
-# define TSRM_IMP_API
#endif
#ifdef _WIN64
@@ -67,7 +61,6 @@ typedef unsigned long tsrm_uintptr_t;
#endif
typedef int ts_rsrc_id;
-typedef tsrm_uintptr_t ts_rsrc_offset;
/* Define THREAD_T and MUTEX_T */
#ifdef TSRM_WIN32
@@ -101,88 +94,21 @@ typedef struct {
#include <signal.h>
#endif
+typedef void (*ts_allocate_ctor)(void *, void ***);
+typedef void (*ts_allocate_dtor)(void *, void ***);
+
#define THREAD_HASH_OF(thr,ts) (unsigned long)thr%(unsigned long)ts
#ifdef __cplusplus
extern "C" {
#endif
-#ifdef USE___THREAD
-
-# ifdef TSRM_WIN32
-# define TSRM_TLS __declspec(thread)
-# else
-# define TSRM_TLS __thread
-# endif
-
-#define TSRMG(id, type, element) \
- ((type)((tsrm_uintptr_t) get_tsrm_ls_cache() + id##_offset))->element
-
-#define TSRMLS_INIT() do { \
- void *cache = (void *) ts_resource_ex(0, NULL); \
- set_tsrm_ls_cache(&cache); \
- } while (0)
-
-#define TSRMLS_FETCH()
-#define TSRMLS_FETCH_FROM_CTX(ctx)
-#define TSRMLS_SET_CTX(ctx)
-#define TSRMLS_D void
-#define TSRMLS_DC
-#define TSRMLS_C
-#define TSRMLS_CC
-
-#else /* USE___THREAD */
-
-#define TSRMG(id, type, element) \
- ((type)(*(tsrm_uintptr_t *)tsrm_ls + id##_offset))->element
-
-#define TSRMLS_INIT() TSRMLS_FETCH()
-#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 TSRMLS_D void **tsrm_ls
-#define TSRMLS_DC , TSRMLS_D
-#define TSRMLS_C tsrm_ls
-#define TSRMLS_CC , TSRMLS_C
-#define PASS_TSRMLS 1
-
-#endif /* USE___THREAD */
-
-#define TSRMG_DHE(type, id) \
- TSRM_EXP_API extern ts_rsrc_id id; \
- TSRM_EXP_API extern ts_rsrc_offset id##_offset
-
-#define TSRMG_DE(type, id) \
- TSRM_EXP_API ts_rsrc_id id; \
- TSRM_EXP_API ts_rsrc_offset id##_offset
-
-#define TSRMG_DH(type, id) \
- TSRM_API extern ts_rsrc_id id; \
- TSRM_API extern ts_rsrc_offset id##_offset
-
-#define TSRMG_D(type, id) \
- TSRM_API ts_rsrc_id id; \
- TSRM_API ts_rsrc_offset id##_offset
-
-#define TSRMG_ALLOCATE(id, size, ctor, dtor) \
- TSRMG_ALLOCATE_EX(id, id##_offset, size, ctor, dtor);
-
-#define TSRMG_ALLOCATE_EX(id, offset, size, ctor, dtor) \
- ts_allocate_id(&(id), &(offset), (size), (ctor), (dtor));
-
-#define TSRM_SHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)+1)
-#define TSRM_UNSHUFFLE_RSRC_ID(rsrc_id) ((rsrc_id)-1)
-
-typedef void (*ts_allocate_ctor)(void * TSRMLS_DC);
-typedef void (*ts_allocate_dtor)(void * TSRMLS_DC);
-
/* startup/shutdown */
TSRM_API int tsrm_startup(int expected_threads, int expected_resources, int debug_level, char *debug_filename);
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, ts_rsrc_offset *rsrc_offset, size_t size, ts_allocate_ctor ctor, ts_allocate_dtor dtor);
+TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, 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);
@@ -203,8 +129,9 @@ 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 TSRMLS_DC);
-typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id TSRMLS_DC);
+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);
+
TSRM_API int tsrm_error(int level, const char *format, ...);
TSRM_API void tsrm_error_set(int level, char *debug_filename);
@@ -228,8 +155,19 @@ 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 void *get_tsrm_ls_cache(void);
-TSRM_API void set_tsrm_ls_cache(void **tsrm_ls_cache);
+TSRM_API inline void *tsrm_get_ls_cache(void);
+
+#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_get_ls_cache()
+#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element)
+#define TSRMLS_D
+#define TSRMLS_DC
+#define TSRMLS_C
+#define TSRMLS_CC
#ifdef __cplusplus
}
@@ -237,7 +175,6 @@ TSRM_API void set_tsrm_ls_cache(void **tsrm_ls_cache);
#else /* non ZTS */
-#define TSRMLS_INIT()
#define TSRMLS_FETCH()
#define TSRMLS_FETCH_FROM_CTX(ctx)
#define TSRMLS_SET_CTX(ctx)
diff --git a/TSRM/configure.in b/TSRM/configure.in
index 1c79dafc7f..6f10f5ab13 100644
--- a/TSRM/configure.in
+++ b/TSRM/configure.in
@@ -12,11 +12,10 @@ AH_TOP([
])
sinclude(tsrm.m4)
-
+
TSRM_BASIC_CHECKS
TSRM_THREADS_CHECKS
-TSRM___THREAD_CHECKS
-
+
AM_PROG_LIBTOOL
if test "$enable_debug" != "yes"; then
AM_SET_LIBTOOL_VARIABLE([--silent])
diff --git a/TSRM/tsrm.m4 b/TSRM/tsrm.m4
index b9690f5d8f..b53a4bb805 100644
--- a/TSRM/tsrm.m4
+++ b/TSRM/tsrm.m4
@@ -21,72 +21,6 @@ AC_DEFUN([TSRM_CHECK_GCC_ARG],[
fi
])
-AC_DEFUN([TSRM___THREAD_CHECKS],[
- AC_ARG_WITH(tsrm-native-tls,
- [ --with-tsrm-native-tls
- Use native TLS],[
- USE___THREAD=yes
- ],[
- USE___THREAD=no
-])
-
-if test $USE___THREAD = yes; then
- AC_CACHE_CHECK([for __thread specifier], ac_cv_tsrm_have___thread, [
- AC_TRY_RUN([
- __thread int foo = 42;
- int main() {
- return foo - 42;
- }
- ],[
- ac_cv_tsrm_have___thread=yes
- ],[
- ac_cv_tsrm_have___thread=no
- ])
- ])
- AC_MSG_CHECKING(wether to use native TLS)
- if test $ac_cv_tsrm_have___thread = yes; then
- AC_DEFINE(USE___THREAD, 1, [wether to use native TLS])
- else
- AC_MSG_ERROR([__thread specifier not available])
- fi
- AC_MSG_RESULT(yes)
- fi
-])
-
-dnl test and set the memory alignment
-AC_DEFUN([TSRM_MM_ALIGN_CHECK], [
- AC_CACHE_CHECK([for MM alignment], ac_cv_tsrm_mm_align, [
- AC_TRY_RUN([
- #include <stdio.h>
-
- typedef union _mm_align_test {
- void *ptr;
- double dbl;
- long lng;
- } mm_align_test;
-
- #if (defined (__GNUC__) && __GNUC__ >= 2)
- # define TSRM_MM_ALIGNMENT (__alignof__ (mm_align_test))
- #else
- # define TSRM_MM_ALIGNMENT (sizeof(mm_align_test))
- #endif
-
- int main()
- {
- FILE *fp;
- fp = fopen("conftest.tsrm", "w");
- fprintf(fp, "%d\n", TSRM_MM_ALIGNMENT);
- fclose(fp);
- return 0;
- }
- ],[
- ac_cv_tsrm_mm_align=`cat conftest.tsrm | cut -d ' ' -f 1`
- ])
- ])
- AC_DEFINE_UNQUOTED(TSRM_MM_ALIGNMENT, $ac_cv_tsrm_mm_align, [ ])
-])
-
-
AC_DEFUN([TSRM_BASIC_CHECKS],[
AC_REQUIRE([AC_PROG_CC])dnl
@@ -95,7 +29,7 @@ AC_REQUIRE([AC_PROG_CC_C_O])dnl
AC_REQUIRE([AC_PROG_RANLIB])dnl
AC_CHECK_HEADERS(stdarg.h)
-TSRM_MM_ALIGN_CHECK()
+
AC_CHECK_FUNCS(sigprocmask)
])
diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c
index 7002802cb8..b6ac4231ee 100644
--- a/TSRM/tsrm_win32.c
+++ b/TSRM/tsrm_win32.c
@@ -35,7 +35,7 @@
#include "zend_virtual_cwd.h"
#ifdef ZTS
-TSRMG_D(win32_globals, win32_globals_id);
+static ts_rsrc_id win32_globals_id;
#else
static tsrm_win32_globals win32_globals;
#endif
@@ -90,7 +90,7 @@ static void tsrm_win32_dtor(tsrm_win32_globals *globals TSRMLS_DC)
TSRM_API void tsrm_win32_startup(void)
{
#ifdef ZTS
- TSRMG_ALLOCATE(win32_globals_id, sizeof(tsrm_win32_globals), (ts_allocate_ctor)tsrm_win32_ctor, (ts_allocate_dtor)tsrm_win32_dtor);
+ ts_allocate_id(&win32_globals_id, sizeof(tsrm_win32_globals), (ts_allocate_ctor)tsrm_win32_ctor, (ts_allocate_ctor)tsrm_win32_dtor);
#else
tsrm_win32_ctor(&win32_globals TSRMLS_CC);
#endif
diff --git a/TSRM/tsrm_win32.h b/TSRM/tsrm_win32.h
index a78937a34a..5933b54ddf 100644
--- a/TSRM/tsrm_win32.h
+++ b/TSRM/tsrm_win32.h
@@ -69,7 +69,6 @@ typedef struct {
#ifdef ZTS
# define TWG(v) TSRMG(win32_globals_id, tsrm_win32_globals *, v)
-TSRMG_DH(win32_globals, win32_globals_id);
#else
# define TWG(v) (win32_globals.v)
#endif
diff --git a/Zend/zend.c b/Zend/zend.c
index 8b9459ff3d..4b1b89087f 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -113,8 +113,8 @@ ZEND_INI_END()
#ifdef ZTS
-TSRMG_D(zend_compiler_globals, compiler_globals_id);
-TSRMG_D(zend_executor_globals, executor_globals_id);
+ZEND_API int compiler_globals_id;
+ZEND_API int executor_globals_id;
static HashTable *global_function_table = NULL;
static HashTable *global_class_table = NULL;
static HashTable *global_constants_table = NULL;
@@ -578,8 +578,8 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions TS
#ifdef ZTS
zend_compiler_globals *compiler_globals;
zend_executor_globals *executor_globals;
- TSRMG_DH(zend_ini_scanner_globals, ini_scanner_globals_id);
- TSRMG_DH(zend_php_scanner_globals, language_scanner_globals_id);
+ extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
+ extern ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
extern zend_ini_scanner_globals ini_scanner_globals;
extern zend_php_scanner_globals language_scanner_globals;
@@ -652,10 +652,10 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions TS
zend_init_rsrc_list_dtors();
#ifdef ZTS
- TSRMG_ALLOCATE(compiler_globals_id, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
- TSRMG_ALLOCATE(executor_globals_id, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
- TSRMG_ALLOCATE(language_scanner_globals_id, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
- TSRMG_ALLOCATE(ini_scanner_globals_id, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
+ ts_allocate_id(&compiler_globals_id, sizeof(zend_compiler_globals), (ts_allocate_ctor) compiler_globals_ctor, (ts_allocate_dtor) compiler_globals_dtor);
+ ts_allocate_id(&executor_globals_id, sizeof(zend_executor_globals), (ts_allocate_ctor) executor_globals_ctor, (ts_allocate_dtor) executor_globals_dtor);
+ ts_allocate_id(&language_scanner_globals_id, sizeof(zend_php_scanner_globals), (ts_allocate_ctor) php_scanner_globals_ctor, NULL);
+ ts_allocate_id(&ini_scanner_globals_id, sizeof(zend_ini_scanner_globals), (ts_allocate_ctor) ini_scanner_globals_ctor, NULL);
compiler_globals = ts_resource(compiler_globals_id);
executor_globals = ts_resource(executor_globals_id);
diff --git a/Zend/zend.h b/Zend/zend.h
index 7fa66cde55..517d419665 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -71,11 +71,6 @@ void zend_error_noreturn(int type, const char *format, ...) ZEND_NORETURN;
# define zend_error_noreturn zend_error
#endif
-#ifdef ZTS
-TSRMG_DH(zend_compiler_globals, compiler_globals_id);
-TSRMG_DH(zend_executor_globals, executor_globals_id);
-#endif
-
/* overloaded elements data types */
#define OE_IS_ARRAY (1<<0)
#define OE_IS_OBJECT (1<<1)
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index bfb2f0e5a1..41adbeba8f 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1876,7 +1876,7 @@ ZEND_API int zend_startup_module_ex(zend_module_entry *module TSRMLS_DC) /* {{{
/* Initialize module globals */
if (module->globals_size) {
#ifdef ZTS
- TSRMG_ALLOCATE_EX((*module->globals_id_ptr), (*module->globals_offset), module->globals_size, module->globals_ctor, module->globals_dtor);
+ ts_allocate_id(module->globals_id_ptr, module->globals_size, (ts_allocate_ctor) module->globals_ctor, (ts_allocate_dtor) module->globals_dtor);
#else
if (module->globals_ctor) {
module->globals_ctor(module->globals_ptr TSRMLS_CC);
diff --git a/Zend/zend_API.h b/Zend/zend_API.h
index 1e41ecdd18..657d1d04de 100644
--- a/Zend/zend_API.h
+++ b/Zend/zend_API.h
@@ -145,11 +145,11 @@ typedef struct _zend_fcall_info_cache {
#ifdef ZTS
#define ZEND_DECLARE_MODULE_GLOBALS(module_name) \
- TSRMG_DE(zend_##module_name##_globals, module_name##_globals_id);
+ ts_rsrc_id module_name##_globals_id;
#define ZEND_EXTERN_MODULE_GLOBALS(module_name) \
- TSRMG_DH(zend_##module_name##_globals, module_name##_globals_id);
+ extern ts_rsrc_id module_name##_globals_id;
#define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor) \
- TSRMG_ALLOCATE(module_name##_globals_id, sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, (ts_allocate_dtor) globals_dtor);
+ ts_allocate_id(&module_name##_globals_id, sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, (ts_allocate_dtor) globals_dtor);
#else
diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c
index 57b3b5d281..ac403617a6 100644
--- a/Zend/zend_alloc.c
+++ b/Zend/zend_alloc.c
@@ -2008,7 +2008,7 @@ typedef struct _zend_alloc_globals {
} zend_alloc_globals;
#ifdef ZTS
-TSRMG_D(zend_alloc_globals, alloc_globals_id);
+static int alloc_globals_id;
# define AG(v) TSRMG(alloc_globals_id, zend_alloc_globals *, v)
#else
# define AG(v) (alloc_globals.v)
@@ -2340,7 +2340,7 @@ static void alloc_globals_dtor(zend_alloc_globals *alloc_globals TSRMLS_DC)
ZEND_API void start_memory_manager(TSRMLS_D)
{
#ifdef ZTS
- TSRMG_ALLOCATE(alloc_globals_id, sizeof(zend_alloc_globals), (ts_allocate_ctor) alloc_globals_ctor, (ts_allocate_dtor) alloc_globals_dtor);
+ ts_allocate_id(&alloc_globals_id, sizeof(zend_alloc_globals), (ts_allocate_ctor) alloc_globals_ctor, (ts_allocate_dtor) alloc_globals_dtor);
#else
alloc_globals_ctor(&alloc_globals);
#endif
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index ce0cb36766..8dda5e5d38 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3085,7 +3085,11 @@ static void zend_free_foreach_and_switch_variables(TSRMLS_D) /* {{{ */
opnum_start = get_next_op_number(CG(active_op_array));
- zend_stack_apply(&CG(loop_var_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element)) generate_free_loop_var);
+#ifdef ZTS
+ zend_stack_apply_with_argument(&CG(loop_var_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element, void *)) generate_free_loop_var, NULL);
+#else
+ zend_stack_apply(&CG(loop_var_stack), ZEND_STACK_APPLY_TOPDOWN, (int (*)(void *element)) generate_free_loop_var);
+#endif
opnum_end = get_next_op_number(CG(active_op_array));
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index 9c849598b1..fdefa9eb05 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -1178,17 +1178,19 @@ static LRESULT CALLBACK zend_timeout_WndProc(HWND hWnd, UINT message, WPARAM wPa
KillTimer(timeout_window, wParam);
} else {
#ifdef ZTS
- void *tsrm_ls_cache;
+ void ***tsrm_ls;
#endif
SetTimer(timeout_window, wParam, lParam*1000, NULL);
#ifdef ZTS
- tsrm_ls_cache = get_tsrm_ls_cache();
- if (!tsrm_ls_cache) {
+ tsrm_ls = ts_resource_ex(0, &wParam);
+ if (!tsrm_ls) {
/* shouldn't normally happen */
break;
}
#endif
- EG(timed_out) = 0;
+ /* XXX this won't work with TLS enabled, EG is on a different thread.
+ But nothing happened anyway, no timeout here. */
+ /* EG(timed_out) = 0; */
}
break;
case WM_UNREGISTER_ZEND_TIMEOUT:
@@ -1197,16 +1199,19 @@ static LRESULT CALLBACK zend_timeout_WndProc(HWND hWnd, UINT message, WPARAM wPa
break;
case WM_TIMER: {
#ifdef ZTS
- void *tsrm_ls_cache;
+ void ***tsrm_ls;
- tsrm_ls_cache = get_tsrm_ls_cache();
- if (!tsrm_ls_cache) {
+ tsrm_ls = ts_resource_ex(0, &wParam);
+ if (!tsrm_ls) {
/* Thread died before receiving its timeout? */
break;
}
#endif
KillTimer(timeout_window, wParam);
- EG(timed_out) = 1;
+
+ /* XXX this won't work with TLS enabled, EG is on a different thread.
+ Maybe an ide were to throw the timeout window right from here. */
+ /*EG(timed_out) = 1; */
}
break;
default:
@@ -1280,6 +1285,8 @@ void zend_shutdown_timeout_thread(void) /* {{{ */
void zend_set_timeout(zend_long seconds, int reset_signals) /* {{{ */
{
+ TSRMLS_FETCH();
+
EG(timeout_seconds) = seconds;
#ifdef ZEND_WIN32
diff --git a/Zend/zend_gc.c b/Zend/zend_gc.c
index a848e8eb58..b331f979fd 100644
--- a/Zend/zend_gc.c
+++ b/Zend/zend_gc.c
@@ -26,7 +26,7 @@
#define GC_ROOT_BUFFER_MAX_ENTRIES 10001
#ifdef ZTS
-TSRMG_D(zend_gc_globals, gc_globals_id);
+ZEND_API int gc_globals_id;
#else
ZEND_API zend_gc_globals gc_globals;
#endif
@@ -82,7 +82,7 @@ static void gc_globals_ctor_ex(zend_gc_globals *gc_globals TSRMLS_DC)
ZEND_API void gc_globals_ctor(TSRMLS_D)
{
#ifdef ZTS
- TSRMG_ALLOCATE(gc_globals_id, sizeof(zend_gc_globals), (ts_allocate_ctor) gc_globals_ctor_ex, (ts_allocate_dtor) root_buffer_dtor);
+ ts_allocate_id(&gc_globals_id, sizeof(zend_gc_globals), (ts_allocate_ctor) gc_globals_ctor_ex, (ts_allocate_dtor) root_buffer_dtor);
#else
gc_globals_ctor_ex(&gc_globals);
#endif
diff --git a/Zend/zend_gc.h b/Zend/zend_gc.h
index 05cde67874..2eb8ea6ea3 100644
--- a/Zend/zend_gc.h
+++ b/Zend/zend_gc.h
@@ -110,7 +110,7 @@ typedef struct _zend_gc_globals {
#ifdef ZTS
BEGIN_EXTERN_C()
-TSRMG_DH(zend_gc_globals, gc_globals_id);
+ZEND_API extern int gc_globals_id;
END_EXTERN_C()
#define GC_G(v) TSRMG(gc_globals_id, zend_gc_globals *, v)
#else
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index 66376837f2..69e1cf9e68 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -44,8 +44,8 @@
#ifdef ZTS
BEGIN_EXTERN_C()
-TSRMG_DH(zend_compiler_globals, compiler_globals_id);
-TSRMG_DH(zend_executor_globals, executor_globals_id);
+ZEND_API extern int compiler_globals_id;
+ZEND_API extern int executor_globals_id;
END_EXTERN_C()
#endif
diff --git a/Zend/zend_globals_macros.h b/Zend/zend_globals_macros.h
index 67b5b66317..e6e7136fb3 100644
--- a/Zend/zend_globals_macros.h
+++ b/Zend/zend_globals_macros.h
@@ -36,12 +36,8 @@ BEGIN_EXTERN_C()
# define CG(v) (compiler_globals.v)
extern ZEND_API struct _zend_compiler_globals compiler_globals;
#endif
+int zendparse(void);
-#ifdef PASS_TSRMLS
-int zendparse(void *compiler_globals);
-#else
-int zend_parse(void);
-#endif
/* Executor */
#ifdef ZTS
@@ -54,7 +50,7 @@ extern ZEND_API zend_executor_globals executor_globals;
/* Language Scanner */
#ifdef ZTS
# define LANG_SCNG(v) TSRMG(language_scanner_globals_id, zend_php_scanner_globals *, v)
-TSRMG_DH(zend_php_scanner_globals, language_scanner_globals_id);
+extern ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
# define LANG_SCNG(v) (language_scanner_globals.v)
extern ZEND_API zend_php_scanner_globals language_scanner_globals;
@@ -64,7 +60,7 @@ extern ZEND_API zend_php_scanner_globals language_scanner_globals;
/* INI Scanner */
#ifdef ZTS
# define INI_SCNG(v) TSRMG(ini_scanner_globals_id, zend_ini_scanner_globals *, v)
-TSRMG_DH(zend_ini_scanner_globals, ini_scanner_globals_id);
+extern ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
# define INI_SCNG(v) (ini_scanner_globals.v)
extern ZEND_API zend_ini_scanner_globals ini_scanner_globals;
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index 4a8c03cd02..e343fcd92a 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -32,7 +32,7 @@
#define YYERROR_VERBOSE
#define YYSTYPE zval
-#ifdef PASS_TSRMLS
+#ifdef ZTS
#define YYPARSE_PARAM tsrm_ls
#define YYLEX_PARAM tsrm_ls
int ini_parse(void *arg);
diff --git a/Zend/zend_ini_scanner.c b/Zend/zend_ini_scanner.c
index 7b2a0e25ff..2abf1140fc 100644
--- a/Zend/zend_ini_scanner.c
+++ b/Zend/zend_ini_scanner.c
@@ -103,7 +103,7 @@
/* Globals Macros */
#define SCNG INI_SCNG
#ifdef ZTS
-TSRMG_D(zend_ini_scanner_globals, ini_scanner_globals_id);
+ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
ZEND_API zend_ini_scanner_globals ini_scanner_globals;
#endif
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index 2c4801e00a..3bfb1557b1 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -101,7 +101,7 @@
/* Globals Macros */
#define SCNG INI_SCNG
#ifdef ZTS
-TSRMG_D(zend_ini_scanner_globals, ini_scanner_globals_id);
+ZEND_API ts_rsrc_id ini_scanner_globals_id;
#else
ZEND_API zend_ini_scanner_globals ini_scanner_globals;
#endif
diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y
index 407d78be29..1849840553 100644
--- a/Zend/zend_language_parser.y
+++ b/Zend/zend_language_parser.y
@@ -49,10 +49,6 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
%expect 2
%code requires {
-#ifdef PASS_TSRMLS
-# define YYPARSE_PARAM tsrm_ls
-# define YYLEX_PARAM tsrm_ls
-#endif
}
%destructor { zend_ast_destroy($$); } <ast>
diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c
index 51c585dd66..5bd2798cde 100644
--- a/Zend/zend_language_scanner.c
+++ b/Zend/zend_language_scanner.c
@@ -90,7 +90,7 @@
/* Globals Macros */
#define SCNG LANG_SCNG
#ifdef ZTS
-TSRMG_D(zend_php_scanner_globals, language_scanner_globals_id);
+ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
ZEND_API zend_php_scanner_globals language_scanner_globals;
#endif
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 4875c37d1b..bcc341e8a1 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -88,7 +88,7 @@
/* Globals Macros */
#define SCNG LANG_SCNG
#ifdef ZTS
-TSRMG_D(zend_php_scanner_globals, language_scanner_globals_id);
+ZEND_API ts_rsrc_id language_scanner_globals_id;
#else
ZEND_API zend_php_scanner_globals language_scanner_globals;
#endif
diff --git a/Zend/zend_modules.h b/Zend/zend_modules.h
index cc3a0aedb5..0cd9ca4d16 100644
--- a/Zend/zend_modules.h
+++ b/Zend/zend_modules.h
@@ -50,14 +50,10 @@
#define STANDARD_MODULE_PROPERTIES_EX 0, 0, NULL, 0, ZEND_MODULE_BUILD_ID
-#ifdef ZTS
-#define NO_MODULE_GLOBALS 0, NULL, NULL, NULL, NULL
-#else
#define NO_MODULE_GLOBALS 0, NULL, NULL, NULL
-#endif
#ifdef ZTS
-# define ZEND_MODULE_GLOBALS(module_name) sizeof(zend_##module_name##_globals), &module_name##_globals_id, &module_name##_globals_id_offset
+# define ZEND_MODULE_GLOBALS(module_name) sizeof(zend_##module_name##_globals), &module_name##_globals_id
#else
# define ZEND_MODULE_GLOBALS(module_name) sizeof(zend_##module_name##_globals), &module_name##_globals
#endif
@@ -92,7 +88,6 @@ struct _zend_module_entry {
size_t globals_size;
#ifdef ZTS
ts_rsrc_id* globals_id_ptr;
- ts_rsrc_offset* globals_offset;
#else
void* globals_ptr;
#endif
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index f3e0680f9e..b0a0e7519e 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -2159,7 +2159,19 @@ try_again:
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, get)
+ && Z_OBJ_HANDLER_P(op1, set)) {
+ /* proxy object */
+ zval rv;
+ zval *val;
+ TSRMLS_FETCH();
+
+ val = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC);
+ Z_ADDREF_P(val);
+ fast_increment_function(val);
+ Z_OBJ_HANDLER_P(op1, set)(op1, val TSRMLS_CC);
+ zval_ptr_dtor(val);
+ } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
TSRMLS_FETCH();
@@ -2222,7 +2234,19 @@ try_again:
}
break;
case IS_OBJECT:
- if (Z_OBJ_HANDLER_P(op1, do_operation)) {
+ if (Z_OBJ_HANDLER_P(op1, get)
+ && Z_OBJ_HANDLER_P(op1, set)) {
+ /* proxy object */
+ zval rv;
+ zval *val;
+ TSRMLS_FETCH();
+
+ val = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC);
+ Z_ADDREF_P(val);
+ fast_decrement_function(val);
+ Z_OBJ_HANDLER_P(op1, set)(op1, val TSRMLS_CC);
+ zval_ptr_dtor(val);
+ } else if (Z_OBJ_HANDLER_P(op1, do_operation)) {
zval op2;
int res;
TSRMLS_FETCH();
diff --git a/Zend/zend_stack.c b/Zend/zend_stack.c
index a006a0581b..03b23427cb 100644
--- a/Zend/zend_stack.c
+++ b/Zend/zend_stack.c
@@ -124,6 +124,7 @@ ZEND_API void zend_stack_apply(zend_stack *stack, int type, int (*apply_function
}
}
+
ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*apply_function)(void *element, void *arg), void *arg)
{
int i;
@@ -131,14 +132,14 @@ ZEND_API void zend_stack_apply_with_argument(zend_stack *stack, int type, int (*
switch (type) {
case ZEND_STACK_APPLY_TOPDOWN:
for (i=stack->top-1; i>=0; i--) {
- if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
+ if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
break;
}
}
break;
case ZEND_STACK_APPLY_BOTTOMUP:
for (i=0; i<stack->top; i++) {
- if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
+ if (apply_function(ZEND_STACK_ELEMENT(stack, i), arg)) {
break;
}
}
diff --git a/Zend/zend_virtual_cwd.c b/Zend/zend_virtual_cwd.c
index 5fc6fb6165..b061d5a00d 100644
--- a/Zend/zend_virtual_cwd.c
+++ b/Zend/zend_virtual_cwd.c
@@ -76,7 +76,7 @@ MUTEX_T cwd_mutex;
#endif
#ifdef ZTS
-TSRMG_D(virtual_cwd_globals, cwd_globals_id);
+ts_rsrc_id cwd_globals_id;
#else
virtual_cwd_globals cwd_globals;
#endif
@@ -475,7 +475,7 @@ CWD_API void virtual_cwd_startup(void) /* {{{ */
main_cwd_state.cwd = strdup(cwd);
#ifdef ZTS
- TSRMG_ALLOCATE(cwd_globals_id, sizeof(virtual_cwd_globals), (ts_allocate_ctor) cwd_globals_ctor, (ts_allocate_dtor) cwd_globals_dtor);
+ ts_allocate_id(&cwd_globals_id, sizeof(virtual_cwd_globals), (ts_allocate_ctor) cwd_globals_ctor, (ts_allocate_dtor) cwd_globals_dtor);
#else
cwd_globals_ctor(&cwd_globals TSRMLS_CC);
#endif
diff --git a/Zend/zend_virtual_cwd.h b/Zend/zend_virtual_cwd.h
index 5878a5506b..f40a2deb7e 100644
--- a/Zend/zend_virtual_cwd.h
+++ b/Zend/zend_virtual_cwd.h
@@ -236,7 +236,7 @@ typedef struct _virtual_cwd_globals {
} virtual_cwd_globals;
#ifdef ZTS
-TSRMG_DH(virtual_cwd_globals, cwd_globals_id);
+extern ts_rsrc_id cwd_globals_id;
# define CWDG(v) TSRMG(cwd_globals_id, virtual_cwd_globals *, v)
#else
extern virtual_cwd_globals cwd_globals;
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 00f647e487..0162902c48 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -883,7 +883,6 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -891,19 +890,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -939,7 +926,6 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -947,19 +933,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -974,7 +948,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
@@ -991,34 +965,19 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
@@ -1029,7 +988,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW);
@@ -1046,34 +1005,19 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
FREE_OP1_VAR_PTR();
CHECK_EXCEPTION();
@@ -1647,7 +1591,6 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMP|VAR|UNUSED|CV)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 8ab3f3b2e3..df53c72ed9 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -15335,7 +15335,6 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -15343,19 +15342,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -15391,7 +15378,6 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -15399,19 +15385,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -15426,7 +15400,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -15443,34 +15417,19 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
@@ -15481,7 +15440,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
zend_free_op free_op1;
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
@@ -15498,34 +15457,19 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
CHECK_EXCEPTION();
@@ -18307,7 +18251,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HAN
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -20523,7 +20466,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDL
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -22642,7 +22584,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -24278,7 +24219,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HA
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -26015,7 +25955,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -32664,7 +32603,6 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -32672,19 +32610,7 @@ static int ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -32719,7 +32645,6 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
@@ -32727,19 +32652,7 @@ static int ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
ZVAL_DEREF(var_ptr);
SEPARATE_ZVAL_NOREF(var_ptr);
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
if (RETURN_VALUE_USED(opline)) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -32753,7 +32666,7 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
{
USE_OPLINE
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
@@ -32770,34 +32683,19 @@ static int ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_increment_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- increment_function(var_ptr);
- }
+ increment_function(var_ptr);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -32807,7 +32705,7 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
{
USE_OPLINE
- zval *var_ptr, *retval;
+ zval *var_ptr;
SAVE_OPLINE();
var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var TSRMLS_CC);
@@ -32824,34 +32722,19 @@ static int ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) {
ZVAL_NULL(EX_VAR(opline->result.var));
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
- retval = EX_VAR(opline->result.var);
-
if (UNEXPECTED(Z_ISREF_P(var_ptr))) {
var_ptr = Z_REFVAL_P(var_ptr);
- ZVAL_DUP(retval, var_ptr);
+ ZVAL_DUP(EX_VAR(opline->result.var), var_ptr);
} else {
- ZVAL_DUP(retval, var_ptr);
- SEPARATE_ZVAL_NOREF(var_ptr);
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr);
+ zval_opt_copy_ctor(var_ptr);
}
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT)
- && Z_OBJ_HANDLER_P(var_ptr, get)
- && Z_OBJ_HANDLER_P(var_ptr, set)) {
- /* proxy object */
- zval rv;
- zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
- Z_ADDREF_P(val);
- fast_decrement_function(val);
- Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
- zval_ptr_dtor(val);
- } else {
- decrement_function(var_ptr);
- }
+ decrement_function(var_ptr);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -35370,7 +35253,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HAND
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -37428,7 +37310,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLE
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -39428,7 +39309,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -40944,7 +40824,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HAN
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
@@ -42545,7 +42424,6 @@ static int ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
if (RETURN_VALUE_USED(opline)) {
ZVAL_NULL(EX_VAR(opline->result.var));
}
- FREE_OP_VAR_PTR(free_op_data2);
} else {
value = zend_assign_to_variable(variable_ptr, value, (opline+1)->op1_type TSRMLS_CC);
if ((opline+1)->op1_type == IS_VAR) {
diff --git a/ext/date/php_date.h b/ext/date/php_date.h
index a49a4c26b0..aa46aa1b6c 100644
--- a/ext/date/php_date.h
+++ b/ext/date/php_date.h
@@ -197,7 +197,6 @@ ZEND_BEGIN_MODULE_GLOBALS(date)
ZEND_END_MODULE_GLOBALS(date)
#ifdef ZTS
-TSRMG_DH(zend_date_globals, date_globals_id);
#define DATEG(v) TSRMG(date_globals_id, zend_date_globals *, v)
#else
#define DATEG(v) (date_globals.v)
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c
index f280305d6c..b5c20f91e4 100644
--- a/ext/opcache/ZendAccelerator.c
+++ b/ext/opcache/ZendAccelerator.c
@@ -89,7 +89,7 @@ ZEND_EXTENSION();
#ifndef ZTS
zend_accel_globals accel_globals;
#else
-TSRMG_D(zend_accel_globals, accel_globals_id);
+int accel_globals_id;
#endif
/* Points to the structure shared across all PHP processes */
@@ -2270,7 +2270,7 @@ static int accel_startup(zend_extension *extension)
TSRMLS_FETCH();
#ifdef ZTS
- TSRMG_ALLOCATE(accel_globals_id, sizeof(zend_accel_globals), (ts_allocate_ctor) accel_globals_ctor, (ts_allocate_dtor) accel_globals_dtor);
+ accel_globals_id = ts_allocate_id(&accel_globals_id, sizeof(zend_accel_globals), (ts_allocate_ctor) accel_globals_ctor, (ts_allocate_dtor) accel_globals_dtor);
#else
accel_globals_ctor(&accel_globals);
#endif
diff --git a/ext/opcache/ZendAccelerator.h b/ext/opcache/ZendAccelerator.h
index c4bc8f82cd..c3c7285c48 100644
--- a/ext/opcache/ZendAccelerator.h
+++ b/ext/opcache/ZendAccelerator.h
@@ -282,7 +282,7 @@ extern zend_accel_shared_globals *accel_shared_globals;
#ifdef ZTS
# define ZCG(v) TSRMG(accel_globals_id, zend_accel_globals *, v)
-TSRMG_DH(zend_accel_globals, accel_globals_id);
+extern int accel_globals_id;
#else
# define ZCG(v) (accel_globals.v)
extern zend_accel_globals accel_globals;
diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c
index 90da947179..9dd7305723 100644
--- a/ext/pdo/pdo_sql_parser.c
+++ b/ext/pdo/pdo_sql_parser.c
@@ -1,5 +1,4 @@
/* Generated by re2c 0.13.5 */
-#line 1 "ext/pdo/pdo_sql_parser.re"
/*
+----------------------------------------------------------------------+
| PHP Version 7 |
@@ -47,11 +46,9 @@ static int scan(Scanner *s)
char *cursor = s->cur;
s->tok = cursor;
- #line 55 "ext/pdo/pdo_sql_parser.re"
-#line 55 "ext/pdo/pdo_sql_parser.c"
{
YYCTYPE yych;
unsigned int yyaccept = 0;
@@ -79,9 +76,7 @@ yy3:
yych = *(YYMARKER = ++YYCURSOR);
if (yych >= 0x01) goto yy43;
yy4:
-#line 63 "ext/pdo/pdo_sql_parser.re"
{ SKIP_ONE(PDO_PARSER_TEXT); }
-#line 85 "ext/pdo/pdo_sql_parser.c"
yy5:
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
@@ -163,9 +158,7 @@ yy7:
default: goto yy8;
}
yy8:
-#line 62 "ext/pdo/pdo_sql_parser.re"
{ RET(PDO_PARSER_BIND_POS); }
-#line 169 "ext/pdo/pdo_sql_parser.c"
yy9:
++YYCURSOR;
switch ((yych = *YYCURSOR)) {
@@ -173,9 +166,7 @@ yy9:
default: goto yy13;
}
yy10:
-#line 65 "ext/pdo/pdo_sql_parser.re"
{ RET(PDO_PARSER_TEXT); }
-#line 179 "ext/pdo/pdo_sql_parser.c"
yy11:
yych = *++YYCURSOR;
switch (yych) {
@@ -210,9 +201,7 @@ yy14:
default: goto yy14;
}
yy16:
-#line 64 "ext/pdo/pdo_sql_parser.re"
{ RET(PDO_PARSER_TEXT); }
-#line 216 "ext/pdo/pdo_sql_parser.c"
yy17:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -290,9 +279,7 @@ yy29:
default: goto yy31;
}
yy31:
-#line 60 "ext/pdo/pdo_sql_parser.re"
{ RET(PDO_PARSER_TEXT); }
-#line 296 "ext/pdo/pdo_sql_parser.c"
yy32:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -364,9 +351,7 @@ yy32:
default: goto yy34;
}
yy34:
-#line 61 "ext/pdo/pdo_sql_parser.re"
{ RET(PDO_PARSER_BIND); }
-#line 370 "ext/pdo/pdo_sql_parser.c"
yy35:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -394,9 +379,7 @@ yy39:
goto yy37;
yy40:
++YYCURSOR;
-#line 59 "ext/pdo/pdo_sql_parser.re"
{ RET(PDO_PARSER_TEXT); }
-#line 400 "ext/pdo/pdo_sql_parser.c"
yy42:
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -416,20 +399,17 @@ yy44:
goto yy42;
yy45:
++YYCURSOR;
-#line 58 "ext/pdo/pdo_sql_parser.re"
{ RET(PDO_PARSER_TEXT); }
-#line 422 "ext/pdo/pdo_sql_parser.c"
}
-#line 66 "ext/pdo/pdo_sql_parser.re"
}
struct placeholder {
char *pos;
+ char *quoted; /* quoted value */
int len;
int bindno;
int qlen; /* quoted length of value */
- char *quoted; /* quoted value */
int freeq;
struct placeholder *next;
};
diff --git a/ext/spl/php_spl.h b/ext/spl/php_spl.h
index cd8ea05f39..534a03885e 100644
--- a/ext/spl/php_spl.h
+++ b/ext/spl/php_spl.h
@@ -68,7 +68,7 @@ ZEND_END_MODULE_GLOBALS(spl)
#ifdef ZTS
# define SPL_G(v) TSRMG(spl_globals_id, zend_spl_globals *, v)
-TSRMG_DH(zend_spl_globals, sapi_globals_id);
+extern int spl_globals_id;
#else
# define SPL_G(v) (spl_globals.v)
extern zend_spl_globals spl_globals;
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 6c652cdd38..36611b812b 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -108,7 +108,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE;
#include "php_ticks.h"
#ifdef ZTS
-TSRMG_D(php_basic_globals, basic_globals_id);
+PHPAPI int basic_globals_id;
#else
PHPAPI php_basic_globals basic_globals;
#endif
@@ -3375,7 +3375,7 @@ zend_module_entry basic_functions_module = { /* {{{ */
PHP_RSHUTDOWN(basic), /* request shutdown */
PHP_MINFO(basic), /* extension info */
PHP_VERSION, /* extension version */
- STANDARD_MODULE_PROPERTIES_EX
+ STANDARD_MODULE_PROPERTIES
};
/* }}} */
@@ -3530,9 +3530,9 @@ PHPAPI double php_get_inf(void) /* {{{ */
PHP_MINIT_FUNCTION(basic) /* {{{ */
{
#ifdef ZTS
- TSRMG_ALLOCATE(basic_globals_id, sizeof(php_basic_globals), (ts_allocate_ctor) basic_globals_ctor, (ts_allocate_dtor) basic_globals_dtor);
+ ts_allocate_id(&basic_globals_id, sizeof(php_basic_globals), (ts_allocate_ctor) basic_globals_ctor, (ts_allocate_dtor) basic_globals_dtor);
#ifdef PHP_WIN32
- TSRMG_ALLOCATE(php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor)php_win32_core_globals_ctor, (ts_allocate_dtor)php_win32_core_globals_dtor);
+ ts_allocate_id(&php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor)php_win32_core_globals_ctor, (ts_allocate_dtor)php_win32_core_globals_dtor );
#endif
#else
basic_globals_ctor(&basic_globals TSRMLS_CC);
diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h
index a6d8496d75..eaac7a1609 100644
--- a/ext/standard/basic_functions.h
+++ b/ext/standard/basic_functions.h
@@ -232,7 +232,7 @@ typedef struct _php_basic_globals {
#ifdef ZTS
#define BG(v) TSRMG(basic_globals_id, php_basic_globals *, v)
-TSRMG_DH(php_basic_globals, basic_globals_id);
+PHPAPI extern int basic_globals_id;
#else
#define BG(v) (basic_globals.v)
PHPAPI extern php_basic_globals basic_globals;
diff --git a/ext/standard/browscap.c b/ext/standard/browscap.c
index fa2740e0ec..a591a67d44 100644
--- a/ext/standard/browscap.c
+++ b/ext/standard/browscap.c
@@ -311,7 +311,8 @@ PHP_MINIT_FUNCTION(browscap) /* {{{ */
char *browscap = INI_STR("browscap");
#ifdef ZTS
- TSRMG_ALLOCATE(browscap_globals_id, sizeof(browser_data), (ts_allocate_ctor) browscap_globals_ctor, NULL);
+ ts_allocate_id(&browscap_globals_id, sizeof(browser_data),
+ browscap_globals_ctor, NULL);
#endif
/* ctor call not really needed for non-ZTS */
diff --git a/ext/standard/dir.c b/ext/standard/dir.c
index 6d62a5f9ef..7b4ab1cd3e 100644
--- a/ext/standard/dir.c
+++ b/ext/standard/dir.c
@@ -57,7 +57,7 @@ typedef struct {
#ifdef ZTS
#define DIRG(v) TSRMG(dir_globals_id, php_dir_globals *, v)
-TSRMG_D(php_dir_globals, dir_globals_id);
+int dir_globals_id;
#else
#define DIRG(v) (dir_globals.v)
php_dir_globals dir_globals;
@@ -137,7 +137,7 @@ PHP_MINIT_FUNCTION(dir)
dir_class_entry_ptr = zend_register_internal_class(&dir_class_entry TSRMLS_CC);
#ifdef ZTS
- TSRMG_ALLOCATE(dir_globals_id, sizeof(php_dir_globals), NULL, NULL);
+ ts_allocate_id(&dir_globals_id, sizeof(php_dir_globals), NULL, NULL);
#endif
dirsep_str[0] = DEFAULT_SLASH;
diff --git a/ext/standard/file.c b/ext/standard/file.c
index 4147604e03..446da20fb3 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -106,7 +106,7 @@ extern int fclose(FILE *);
#include "zend_API.h"
#ifdef ZTS
-TSRMG_D(php_file_globals, file_globals_id);
+int file_globals_id;
#else
php_file_globals file_globals;
#endif
@@ -181,7 +181,7 @@ PHP_MINIT_FUNCTION(file)
le_stream_context = zend_register_list_destructors_ex(file_context_dtor, NULL, "stream-context", module_number);
#ifdef ZTS
- TSRMG_ALLOCATE(file_globals_id, sizeof(php_file_globals), (ts_allocate_ctor) file_globals_ctor, (ts_allocate_dtor) file_globals_dtor);
+ ts_allocate_id(&file_globals_id, sizeof(php_file_globals), (ts_allocate_ctor) file_globals_ctor, (ts_allocate_dtor) file_globals_dtor);
#else
file_globals_ctor(&file_globals TSRMLS_CC);
#endif
diff --git a/ext/standard/file.h b/ext/standard/file.h
index 1b9c90478d..fdace75d3b 100644
--- a/ext/standard/file.h
+++ b/ext/standard/file.h
@@ -131,7 +131,7 @@ typedef struct {
#ifdef ZTS
#define FG(v) TSRMG(file_globals_id, php_file_globals *, v)
-TSRMG_DH(php_file_globals, file_globals_id);
+extern PHPAPI int file_globals_id;
#else
#define FG(v) (file_globals.v)
extern PHPAPI php_file_globals file_globals;
diff --git a/ext/standard/info.c b/ext/standard/info.c
index 932a8f4226..bc0ddddcc0 100644
--- a/ext/standard/info.c
+++ b/ext/standard/info.c
@@ -778,11 +778,7 @@ PHPAPI void php_print_info(int flag TSRMLS_DC)
#endif
#ifdef ZTS
-# ifdef USE___THREAD
- php_info_print_table_row(2, "Thread Safety", "enabled, native TLS" );
-# else
php_info_print_table_row(2, "Thread Safety", "enabled" );
-# endif
#else
php_info_print_table_row(2, "Thread Safety", "disabled" );
#endif
diff --git a/ext/standard/lcg.c b/ext/standard/lcg.c
index 4cb4064927..8bfa05555b 100644
--- a/ext/standard/lcg.c
+++ b/ext/standard/lcg.c
@@ -32,7 +32,7 @@
#endif
#ifdef ZTS
-TSRMG_D(php_lcg_globals, lcg_globals_id);
+int lcg_globals_id;
#else
static php_lcg_globals lcg_globals;
#endif
@@ -106,7 +106,7 @@ static void lcg_init_globals(php_lcg_globals *lcg_globals_p TSRMLS_DC) /* {{{ */
PHP_MINIT_FUNCTION(lcg) /* {{{ */
{
#ifdef ZTS
- TSRMG_ALLOCATE(lcg_globals_id, sizeof(php_lcg_globals), (ts_allocate_ctor) lcg_init_globals, NULL);
+ ts_allocate_id(&lcg_globals_id, sizeof(php_lcg_globals), (ts_allocate_ctor) lcg_init_globals, NULL);
#else
lcg_init_globals(&lcg_globals);
#endif
diff --git a/main/SAPI.c b/main/SAPI.c
index f00e3c728b..50ea8c0a16 100644
--- a/main/SAPI.c
+++ b/main/SAPI.c
@@ -52,7 +52,7 @@
#include "php_content_types.h"
#ifdef ZTS
-TSRMG_D(sapi_globals_struct, sapi_globals_id);
+SAPI_API int sapi_globals_id;
#else
sapi_globals_struct sapi_globals;
#endif
@@ -88,7 +88,7 @@ SAPI_API void sapi_startup(sapi_module_struct *sf)
sapi_module = *sf;
#ifdef ZTS
- TSRMG_ALLOCATE(sapi_globals_id, sizeof(sapi_globals_struct), (ts_allocate_ctor) sapi_globals_ctor, (ts_allocate_dtor) sapi_globals_dtor);
+ ts_allocate_id(&sapi_globals_id, sizeof(sapi_globals_struct), (ts_allocate_ctor) sapi_globals_ctor, (ts_allocate_dtor) sapi_globals_dtor);
# ifdef PHP_WIN32
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
# endif
diff --git a/main/SAPI.h b/main/SAPI.h
index 4e2b4cd420..79661371d9 100644
--- a/main/SAPI.h
+++ b/main/SAPI.h
@@ -143,7 +143,7 @@ typedef struct _sapi_globals_struct {
BEGIN_EXTERN_C()
#ifdef ZTS
# define SG(v) TSRMG(sapi_globals_id, sapi_globals_struct *, v)
-TSRMG_DH(sapi_globals_struct, sapi_globals_id);
+SAPI_API extern int sapi_globals_id;
#else
# define SG(v) (sapi_globals.v)
extern SAPI_API sapi_globals_struct sapi_globals;
diff --git a/main/main.c b/main/main.c
index 2a78d4b0d2..63144de418 100644
--- a/main/main.c
+++ b/main/main.c
@@ -124,7 +124,7 @@ PHPAPI int (*php_register_internal_extensions_func)(TSRMLS_D) = php_register_int
#ifndef ZTS
php_core_globals core_globals;
#else
-TSRMG_D(php_core_globals, core_globals_id);
+PHPAPI int core_globals_id;
#endif
#ifdef PHP_WIN32
@@ -2048,6 +2048,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
zend_module_entry *module;
#ifdef ZTS
zend_executor_globals *executor_globals;
+ void ***tsrm_ls;
php_core_globals *core_globals;
#endif
@@ -2072,7 +2073,7 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
#endif
#ifdef ZTS
- TSRMLS_INIT();
+ tsrm_ls = ts_resource(0);
#endif
#ifdef PHP_WIN32
@@ -2111,10 +2112,10 @@ int php_module_startup(sapi_module_struct *sf, zend_module_entry *additional_mod
#ifdef ZTS
executor_globals = ts_resource(executor_globals_id);
- TSRMG_ALLOCATE(core_globals_id, sizeof(php_core_globals), (ts_allocate_ctor) core_globals_ctor, (ts_allocate_dtor) core_globals_dtor);
+ ts_allocate_id(&core_globals_id, sizeof(php_core_globals), (ts_allocate_ctor) core_globals_ctor, (ts_allocate_dtor) core_globals_dtor);
core_globals = ts_resource(core_globals_id);
#ifdef PHP_WIN32
- TSRMG_ALLOCATE(php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor) php_win32_core_globals_ctor, (ts_allocate_dtor) php_win32_core_globals_dtor);
+ ts_allocate_id(&php_win32_core_globals_id, sizeof(php_win32_core_globals), (ts_allocate_ctor) php_win32_core_globals_ctor, (ts_allocate_dtor) php_win32_core_globals_dtor);
#endif
#else
php_startup_ticks(TSRMLS_C);
diff --git a/main/output.c b/main/output.c
index 65c8152bc0..2f3f8d5a34 100644
--- a/main/output.c
+++ b/main/output.c
@@ -160,7 +160,7 @@ PHPAPI void php_output_shutdown(void)
PHPAPI int php_output_activate(TSRMLS_D)
{
#ifdef ZTS
- //memset((*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(output_globals_id)], 0, sizeof(zend_output_globals));
+ memset((*((void ***) tsrm_get_ls_cache()))[TSRM_UNSHUFFLE_RSRC_ID(output_globals_id)], 0, sizeof(zend_output_globals));
#else
memset(&output_globals, 0, sizeof(zend_output_globals));
#endif
diff --git a/main/php.h b/main/php.h
index 224a65dd82..2a683e1924 100644
--- a/main/php.h
+++ b/main/php.h
@@ -301,7 +301,7 @@ static inline ZEND_ATTRIBUTE_DEPRECATED void php_std_error_handling() {}
PHPAPI void php_verror(const char *docref, const char *params, int type, const char *format, va_list args TSRMLS_DC) PHP_ATTRIBUTE_FORMAT(printf, 4, 0);
-#ifdef PASS_TSRMLS
+#ifdef ZTS
#define PHP_ATTR_FMT_OFFSET 1
#else
#define PHP_ATTR_FMT_OFFSET 0
diff --git a/main/php_globals.h b/main/php_globals.h
index 0e088d20f0..a60efe69de 100644
--- a/main/php_globals.h
+++ b/main/php_globals.h
@@ -27,7 +27,7 @@ typedef struct _php_core_globals php_core_globals;
#ifdef ZTS
# define PG(v) TSRMG(core_globals_id, php_core_globals *, v)
-TSRMG_DH(php_core_globals, core_globals_id);
+extern PHPAPI int core_globals_id;
#else
# define PG(v) (core_globals.v)
extern ZEND_API struct _php_core_globals core_globals;
diff --git a/main/php_output.h b/main/php_output.h
index d3c3e072d0..02b2b85d13 100644
--- a/main/php_output.h
+++ b/main/php_output.h
@@ -153,7 +153,6 @@ ZEND_END_MODULE_GLOBALS(output)
/* there should not be a need to use OG() from outside of output.c */
#ifdef ZTS
-TSRMG_DH(php_output_globals, output_globals_id);
# define OG(v) TSRMG(output_globals_id, zend_output_globals *, v)
#else
# define OG(v) (output_globals.v)
diff --git a/sapi/apache/php_apache.c b/sapi/apache/php_apache.c
index 05bf75b226..f6e9e61203 100644
--- a/sapi/apache/php_apache.c
+++ b/sapi/apache/php_apache.c
@@ -129,7 +129,7 @@ static void php_apache_globals_ctor(php_apache_info_struct *apache_globals TSRML
static PHP_MINIT_FUNCTION(apache)
{
#ifdef ZTS
- TSRMG_ALLOCATE(php_apache_info_id, sizeof(php_apache_info_struct), (ts_allocate_ctor) php_apache_globals_ctor, NULL);
+ ts_allocate_id(&php_apache_info_id, sizeof(php_apache_info_struct), (ts_allocate_ctor) php_apache_globals_ctor, NULL);
#else
php_apache_globals_ctor(&php_apache_info TSRMLS_CC);
#endif
diff --git a/sapi/apache2handler/php_apache.h b/sapi/apache2handler/php_apache.h
index 26ddf222c4..f6f4f7a7c9 100644
--- a/sapi/apache2handler/php_apache.h
+++ b/sapi/apache2handler/php_apache.h
@@ -78,7 +78,7 @@ typedef struct {
extern zend_module_entry apache2_module_entry;
#ifdef ZTS
-TSRMG_DHE(php_apache2_info_struct, php_apache2_info_id);
+extern int php_apache2_info_id;
#define AP2(v) TSRMG(php_apache2_info_id, php_apache2_info_struct *, v)
#else
extern php_apache2_info_struct php_apache2_info;
diff --git a/sapi/apache2handler/php_functions.c b/sapi/apache2handler/php_functions.c
index 3fc88edfbc..d9ae4d97ea 100644
--- a/sapi/apache2handler/php_functions.c
+++ b/sapi/apache2handler/php_functions.c
@@ -49,7 +49,7 @@
#include "php_apache.h"
#ifdef ZTS
-TSRMG_DE(php_apache2_info_struct, php_apache2_info_id);
+int php_apache2_info_id;
#else
php_apache2_info_struct php_apache2_info;
#endif
@@ -536,7 +536,7 @@ PHP_INI_END()
static PHP_MINIT_FUNCTION(apache)
{
#ifdef ZTS
- TSRMG_ALLOCATE(php_apache2_info_id, sizeof(php_apache2_info_struct), NULL, NULL);
+ ts_allocate_id(&php_apache2_info_id, sizeof(php_apache2_info_struct), (ts_allocate_ctor) NULL, NULL);
#endif
REGISTER_INI_ENTRIES();
return SUCCESS;
diff --git a/sapi/apache2handler/sapi_apache2.c b/sapi/apache2handler/sapi_apache2.c
index 86372e126d..fe200304fd 100644
--- a/sapi/apache2handler/sapi_apache2.c
+++ b/sapi/apache2handler/sapi_apache2.c
@@ -451,7 +451,6 @@ php_apache_server_startup(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp
}
#ifdef ZTS
tsrm_startup(1, 1, 0, NULL);
- TSRMLS_INIT();
#endif
sapi_startup(&apache2_sapi_module);
apache2_sapi_module.startup(&apache2_sapi_module);
@@ -541,7 +540,7 @@ static int php_handler(request_rec *r)
apr_bucket *bucket;
apr_status_t rv;
request_rec * volatile parent_req = NULL;
- TSRMLS_INIT();
+ TSRMLS_FETCH();
#define PHPAP_INI_OFF php_apache_ini_dtor(r, parent_req TSRMLS_CC);
diff --git a/sapi/apache_hooks/php_apache.c b/sapi/apache_hooks/php_apache.c
index 771ebf821c..e5bd3f5d61 100644
--- a/sapi/apache_hooks/php_apache.c
+++ b/sapi/apache_hooks/php_apache.c
@@ -1392,7 +1392,7 @@ static PHP_MINIT_FUNCTION(apache)
zend_class_entry ce;
#ifdef ZTS
- TSRMG_ALLOCATE(php_apache_info_id, sizeof(php_apache_info_struct), (ts_allocate_ctor) php_apache_globals_ctor, NULL);
+ ts_allocate_id(&php_apache_info_id, sizeof(php_apache_info_struct), (ts_allocate_ctor) php_apache_globals_ctor, NULL);
#else
php_apache_globals_ctor(&php_apache_info TSRMLS_CC);
#endif
diff --git a/sapi/cgi/cgi_main.c b/sapi/cgi/cgi_main.c
index 5f7b655dc6..dead1c3213 100644
--- a/sapi/cgi/cgi_main.c
+++ b/sapi/cgi/cgi_main.c
@@ -197,7 +197,7 @@ static void user_config_cache_entry_dtor(zval *el)
/* }}} */
#ifdef ZTS
-TSRMG_D(php_cgi_globals_struct, php_cgi_globals_id);
+static int php_cgi_globals_id;
#define CGIG(v) TSRMG(php_cgi_globals_id, php_cgi_globals_struct *, v)
#else
static php_cgi_globals_struct php_cgi_globals;
@@ -1486,7 +1486,7 @@ static void php_cgi_globals_ctor(php_cgi_globals_struct *php_cgi_globals TSRMLS_
static PHP_MINIT_FUNCTION(cgi)
{
#ifdef ZTS
- TSRMG_ALLOCATE(php_cgi_globals_id, sizeof(php_cgi_globals_struct), (ts_allocate_ctor) php_cgi_globals_ctor, NULL);
+ ts_allocate_id(&php_cgi_globals_id, sizeof(php_cgi_globals_struct), (ts_allocate_ctor) php_cgi_globals_ctor, NULL);
#else
php_cgi_globals_ctor(&php_cgi_globals TSRMLS_CC);
#endif
@@ -1741,6 +1741,10 @@ int main(int argc, char *argv[])
int ini_entries_len = 0;
/* end of temporary locals */
+#ifdef ZTS
+ void ***tsrm_ls;
+#endif
+
int max_requests = 500;
int requests = 0;
int fastcgi;
@@ -1785,7 +1789,7 @@ int main(int argc, char *argv[])
#ifdef ZTS
tsrm_startup(1, 1, 0, NULL);
- TSRMLS_INIT();
+ tsrm_ls = ts_resource(0);
#endif
sapi_startup(&cgi_sapi_module);
diff --git a/sapi/cli/php_cli.c b/sapi/cli/php_cli.c
index 8c9792162b..19e56284e3 100644
--- a/sapi/cli/php_cli.c
+++ b/sapi/cli/php_cli.c
@@ -1177,6 +1177,9 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
int main(int argc, char *argv[])
#endif
{
+#ifdef ZTS
+ void ***tsrm_ls;
+#endif
#ifdef PHP_CLI_WIN32_NO_CONSOLE
int argc = __argc;
char **argv = __argv;
@@ -1232,7 +1235,7 @@ int main(int argc, char *argv[])
#ifdef ZTS
tsrm_startup(1, 1, 0, NULL);
- TSRMLS_INIT();
+ tsrm_ls = ts_resource_ex(0, NULL);
#endif
#ifdef PHP_WIN32
diff --git a/sapi/cli/php_cli_server.c b/sapi/cli/php_cli_server.c
index 13ebcf0b8e..1e42bd6c7b 100644
--- a/sapi/cli/php_cli_server.c
+++ b/sapi/cli/php_cli_server.c
@@ -1188,11 +1188,8 @@ static void php_cli_server_logf(const char *format TSRMLS_DC, ...) /* {{{ */
{
char *buf = NULL;
va_list ap;
-#ifdef PASS_TSRMLS
- va_start(ap, tsrm_ls);
-#else
+
va_start(ap, format);
-#endif
vspprintf(&buf, 0, format, ap);
va_end(ap);
@@ -2353,7 +2350,7 @@ static int php_cli_server_send_event(php_cli_server *server, php_cli_server_clie
/* }}} */
typedef struct php_cli_server_do_event_for_each_fd_callback_params {
-#ifdef PASS_TSRMLS
+#ifdef ZTS
void ***tsrm_ls;
#endif
php_cli_server *server;
@@ -2364,6 +2361,9 @@ typedef struct php_cli_server_do_event_for_each_fd_callback_params {
static int php_cli_server_do_event_for_each_fd_callback(void *_params, php_socket_t fd, int event) /* {{{ */
{
php_cli_server_do_event_for_each_fd_callback_params *params = _params;
+#ifdef ZTS
+ void ***tsrm_ls = params->tsrm_ls;
+#endif
php_cli_server *server = params->server;
if (server->server_sock == fd) {
php_cli_server_client *client = NULL;
@@ -2415,8 +2415,8 @@ static int php_cli_server_do_event_for_each_fd_callback(void *_params, php_socke
static void php_cli_server_do_event_for_each_fd(php_cli_server *server, int(*rhandler)(php_cli_server*, php_cli_server_client* TSRMLS_DC), int(*whandler)(php_cli_server*, php_cli_server_client* TSRMLS_DC) TSRMLS_DC) /* {{{ */
{
php_cli_server_do_event_for_each_fd_callback_params params = {
-#ifdef PASS_TSRMLS
- tsrm_ls,
+#ifdef ZTS
+ (void ***) tsrm_get_ls_cache(),
#endif
server,
rhandler,
diff --git a/sapi/cli/php_cli_server.h b/sapi/cli/php_cli_server.h
index e970008d79..476ee2919c 100644
--- a/sapi/cli/php_cli_server.h
+++ b/sapi/cli/php_cli_server.h
@@ -33,7 +33,6 @@ ZEND_END_MODULE_GLOBALS(cli_server)
#ifdef ZTS
#define CLI_SERVER_G(v) TSRMG(cli_server_globals_id, zend_cli_server_globals *, v)
-TSRMG_DHE(zend_cli_server_globals, cli_server_globals_id);
#else
#define CLI_SERVER_G(v) (cli_server_globals.v)
#endif
diff --git a/sapi/embed/php_embed.c b/sapi/embed/php_embed.c
index 1884604b77..e0df666108 100644
--- a/sapi/embed/php_embed.c
+++ b/sapi/embed/php_embed.c
@@ -155,6 +155,9 @@ static const zend_function_entry additional_functions[] = {
EMBED_SAPI_API int php_embed_init(int argc, char **argv PTSRMLS_DC)
{
zend_llist global_vars;
+#ifdef ZTS
+ void ***tsrm_ls = NULL;
+#endif
#ifdef HAVE_SIGNAL_H
#if defined(SIGPIPE) && defined(SIG_IGN)
@@ -169,8 +172,8 @@ EMBED_SAPI_API int php_embed_init(int argc, char **argv PTSRMLS_DC)
#ifdef ZTS
tsrm_startup(1, 1, 0, NULL);
- TSRMLS_INIT();
- *ptsrm_ls = ts_resource_ex(0, NULL);
+ tsrm_ls = ts_resource(0);
+ *ptsrm_ls = tsrm_ls;
#endif
sapi_startup(&php_embed_module);
diff --git a/sapi/embed/php_embed.h b/sapi/embed/php_embed.h
index a109a1bba2..b62fd9fe24 100644
--- a/sapi/embed/php_embed.h
+++ b/sapi/embed/php_embed.h
@@ -27,14 +27,14 @@
#include <main/php_ini.h>
#include <zend_ini.h>
-#ifdef PASS_TSRMLS
-#define PTSRMLS_D void ***ptsrm_ls
+#ifdef ZTS
+#define PTSRMLS_D void ****ptsrm_ls
#define PTSRMLS_DC , PTSRMLS_D
#define PTSRMLS_C &tsrm_ls
#define PTSRMLS_CC , PTSRMLS_C
#define PHP_EMBED_START_BLOCK(x,y) { \
- void **tsrm_ls; \
+ void ***tsrm_ls; \
php_embed_init(x, y PTSRMLS_CC); \
zend_first_try {
diff --git a/win32/build/config.w32 b/win32/build/config.w32
index f0689c2792..5806343518 100644
--- a/win32/build/config.w32
+++ b/win32/build/config.w32
@@ -221,8 +221,7 @@ if (PHP_DEBUG == "yes") {
}
if (PHP_ZTS == "yes") {
- var tsrm_align = X64 ? 8 : 4;
- ADD_FLAG("CFLAGS", "/D ZTS=1 /D USE___THREAD=1 /D TSRM_MM_ALIGNMENT=" + tsrm_align);
+ ADD_FLAG("CFLAGS", "/D ZTS=1");
ADD_FLAG("ZTS", "1");
} else {
ADD_FLAG("ZTS", "0");
diff --git a/win32/globals.c b/win32/globals.c
index 47f4ebacce..ec4180db38 100644
--- a/win32/globals.c
+++ b/win32/globals.c
@@ -23,7 +23,7 @@
#include "syslog.h"
#ifdef ZTS
-TSRMG_D(php_win32_core_globals, php_win32_core_globals_id);
+PHPAPI int php_win32_core_globals_id;
#else
php_win32_core_globals the_php_win32_core_globals;
#endif
diff --git a/win32/php_win32_globals.h b/win32/php_win32_globals.h
index ae975dcb31..42f5ec9411 100644
--- a/win32/php_win32_globals.h
+++ b/win32/php_win32_globals.h
@@ -27,7 +27,7 @@ typedef struct _php_win32_core_globals php_win32_core_globals;
#ifdef ZTS
# define PW32G(v) TSRMG(php_win32_core_globals_id, php_win32_core_globals*, v)
-TSRMG_DH(php_win32_core_globals, php_win32_core_globals_id);
+extern PHPAPI int php_win32_core_globals_id;
#else
# define PW32G(v) (the_php_win32_core_globals.v)
extern PHPAPI struct _php_win32_core_globals the_php_win32_core_globals;