summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;