diff options
Diffstat (limited to 'TSRM')
-rw-r--r-- | TSRM/TSRM.c | 27 | ||||
-rw-r--r-- | TSRM/TSRM.h | 46 | ||||
-rw-r--r-- | TSRM/config.w32 | 1 | ||||
-rw-r--r-- | TSRM/tsrm_win32.c | 36 | ||||
-rw-r--r-- | TSRM/tsrm_win32.h | 9 |
5 files changed, 77 insertions, 42 deletions
diff --git a/TSRM/TSRM.c b/TSRM/TSRM.c index efdea5c880..8235b489b6 100644 --- a/TSRM/TSRM.c +++ b/TSRM/TSRM.c @@ -22,6 +22,10 @@ typedef struct _tsrm_tls_entry tsrm_tls_entry; +#if defined(TSRM_WIN32) +/* TSRMLS_CACHE_DEFINE; is already done in Zend, this is being always compiled statically. */ +#endif + struct _tsrm_tls_entry { void **storage; int count; @@ -177,7 +181,7 @@ TSRM_API void tsrm_shutdown(void) for (j=0; j<p->count; j++) { 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); + resource_types_table[j].dtor(p->storage[j]); } free(p->storage[j]); } @@ -252,7 +256,7 @@ TSRM_API ts_rsrc_id ts_allocate_id(ts_rsrc_id *rsrc_id, size_t size, ts_allocate for (j=p->count; j<id_count; j++) { p->storage[j] = (void *) malloc(resource_types_table[j].size); if (resource_types_table[j].ctor) { - resource_types_table[j].ctor(p->storage[j], &p->storage); + resource_types_table[j].ctor(p->storage[j]); } } p->count = id_count; @@ -282,7 +286,7 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_ tsrm_tls_set(*thread_resources_ptr); if (tsrm_new_thread_begin_handler) { - tsrm_new_thread_begin_handler(thread_id, &((*thread_resources_ptr)->storage)); + tsrm_new_thread_begin_handler(thread_id); } for (i=0; i<id_count; i++) { if (resource_types_table[i].done) { @@ -291,13 +295,13 @@ static void allocate_new_resource(tsrm_tls_entry **thread_resources_ptr, THREAD_ { (*thread_resources_ptr)->storage[i] = (void *) malloc(resource_types_table[i].size); if (resource_types_table[i].ctor) { - resource_types_table[i].ctor((*thread_resources_ptr)->storage[i], &(*thread_resources_ptr)->storage); + resource_types_table[i].ctor((*thread_resources_ptr)->storage[i]); } } } if (tsrm_new_thread_end_handler) { - tsrm_new_thread_end_handler(thread_id, &((*thread_resources_ptr)->storage)); + tsrm_new_thread_end_handler(thread_id); } tsrm_mutex_unlock(tsmm_mutex); @@ -390,7 +394,7 @@ void tsrm_free_interpreter_context(void *context) for (i=0; i<thread_resources->count; i++) { if (resource_types_table[i].dtor) { - resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); + resource_types_table[i].dtor(thread_resources->storage[i]); } } for (i=0; i<thread_resources->count; i++) { @@ -455,7 +459,7 @@ 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) { - resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); + resource_types_table[i].dtor(thread_resources->storage[i]); } } for (i=0; i<thread_resources->count; i++) { @@ -497,7 +501,7 @@ 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) { - resource_types_table[i].dtor(thread_resources->storage[i], &thread_resources->storage); + resource_types_table[i].dtor(thread_resources->storage[i]); } } for (i=0; i<thread_resources->count; i++) { @@ -543,7 +547,7 @@ void ts_free_id(ts_rsrc_id id) while (p) { if (p->count > j && p->storage[j]) { if (resource_types_table && resource_types_table[j].dtor) { - resource_types_table[j].dtor(p->storage[j], &p->storage); + resource_types_table[j].dtor(p->storage[j]); } free(p->storage[j]); p->storage[j] = NULL; @@ -791,4 +795,9 @@ void tsrm_error_set(int level, char *debug_filename) #endif } +TSRM_API inline void *tsrm_get_ls_cache(void) +{ + return tsrm_tls_get(); +} + #endif /* ZTS */ diff --git a/TSRM/TSRM.h b/TSRM/TSRM.h index b232429d4d..d3891b7c51 100644 --- a/TSRM/TSRM.h +++ b/TSRM/TSRM.h @@ -94,8 +94,8 @@ typedef struct { #include <signal.h> #endif -typedef void (*ts_allocate_ctor)(void *, void ***); -typedef void (*ts_allocate_dtor)(void *, void ***); +typedef void (*ts_allocate_ctor)(void *); +typedef void (*ts_allocate_dtor)(void *); #define THREAD_HASH_OF(thr,ts) (unsigned long)thr%(unsigned long)ts @@ -129,8 +129,8 @@ 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, void ***tsrm_ls); -typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id, void ***tsrm_ls); +typedef void (*tsrm_thread_begin_func_t)(THREAD_T thread_id); +typedef void (*tsrm_thread_end_func_t)(THREAD_T thread_id); TSRM_API int tsrm_error(int level, const char *format, ...); @@ -155,17 +155,33 @@ 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 inline void *tsrm_get_ls_cache(void); + +#ifdef TSRM_WIN32 +# define TSRM_TLS __declspec(thread) +#else +# define TSRM_TLS __thread +#endif + #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_ls -#define TSRMG(id, type, element) (((type) (*((void ***) tsrm_ls))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) -#define TSRMLS_D void ***tsrm_ls -#define TSRMLS_DC , TSRMLS_D -#define TSRMLS_C tsrm_ls -#define TSRMLS_CC , TSRMLS_C +#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 TSRMG_STATIC(id, type, element) (((type) (*((void ***) TSRMLS_CACHE))[TSRM_UNSHUFFLE_RSRC_ID(id)])->element) +#define TSRMLS_CACHE_EXTERN extern TSRM_TLS void *TSRMLS_CACHE +#define TSRMLS_CACHE_DEFINE TSRM_TLS void *TSRMLS_CACHE = NULL +#define TSRMLS_CACHE_UPDATE if (!TSRMLS_CACHE) TSRMLS_CACHE = tsrm_get_ls_cache() +#define TSRMLS_CACHE _tsrm_ls_cache + +/* BC only */ +#define TSRMLS_D void +#define TSRMLS_DC +#define TSRMLS_C +#define TSRMLS_CC +#define TSRMLS_FETCH() #ifdef __cplusplus } @@ -176,6 +192,14 @@ TSRM_API void tsrm_free_interpreter_context(void *context); #define TSRMLS_FETCH() #define TSRMLS_FETCH_FROM_CTX(ctx) #define TSRMLS_SET_CTX(ctx) + +#define TSRMG_STATIC(id, type, element) +#define TSRMLS_CACHE_EXTERN +#define TSRMLS_CACHE_DEFINE +#define TSRMLS_CACHE_UPDATE +#define TSRMLS_CACHE + +/* BC only */ #define TSRMLS_D void #define TSRMLS_DC #define TSRMLS_C diff --git a/TSRM/config.w32 b/TSRM/config.w32 index 91b4eead2a..e7d3f3b976 100644 --- a/TSRM/config.w32 +++ b/TSRM/config.w32 @@ -2,4 +2,5 @@ // $Id$ ADD_SOURCES("TSRM", "TSRM.c tsrm_strtok_r.c tsrm_win32.c"); +ADD_FLAG("CFLAGS_BD_TSRM", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); diff --git a/TSRM/tsrm_win32.c b/TSRM/tsrm_win32.c index 9765874448..bc2ea51724 100644 --- a/TSRM/tsrm_win32.c +++ b/TSRM/tsrm_win32.c @@ -40,8 +40,11 @@ static ts_rsrc_id win32_globals_id; static tsrm_win32_globals win32_globals; #endif -static void tsrm_win32_ctor(tsrm_win32_globals *globals TSRMLS_DC) +static void tsrm_win32_ctor(tsrm_win32_globals *globals) { +#ifdef ZTS +TSRMLS_CACHE_UPDATE; +#endif globals->process = NULL; globals->shm = NULL; globals->process_size = 0; @@ -59,7 +62,7 @@ static void tsrm_win32_ctor(tsrm_win32_globals *globals TSRMLS_DC) globals->impersonation_token_sid = NULL; } -static void tsrm_win32_dtor(tsrm_win32_globals *globals TSRMLS_DC) +static void tsrm_win32_dtor(tsrm_win32_globals *globals) { shm_pair *ptr; @@ -92,18 +95,18 @@ TSRM_API void tsrm_win32_startup(void) #ifdef ZTS 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); + tsrm_win32_ctor(&win32_globals); #endif } TSRM_API void tsrm_win32_shutdown(void) { #ifndef ZTS - tsrm_win32_dtor(&win32_globals TSRMLS_CC); + tsrm_win32_dtor(&win32_globals); #endif } -char * tsrm_win32_get_path_sid_key(const char *pathname TSRMLS_DC) +char * tsrm_win32_get_path_sid_key(const char *pathname) { PSID pSid = TWG(impersonation_token_sid); TCHAR *ptcSid = NULL; @@ -191,7 +194,7 @@ Finished: return NULL; } -TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC) +TSRM_API int tsrm_win32_access(const char *pathname, int mode) { time_t t; HANDLE thread_token = NULL; @@ -214,7 +217,7 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC) } else { if(!IS_ABSOLUTE_PATH(pathname, strlen(pathname)+1)) { real_path = (char *)malloc(MAX_PATH); - if(tsrm_realpath(pathname, real_path TSRMLS_CC) == NULL) { + if(tsrm_realpath(pathname, real_path) == NULL) { goto Finished; } pathname = real_path; @@ -278,14 +281,14 @@ TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC) if (CWDG(realpath_cache_size_limit)) { t = time(0); - bucket = realpath_cache_lookup(pathname, (int)strlen(pathname), t TSRMLS_CC); + bucket = realpath_cache_lookup(pathname, (int)strlen(pathname), t); if(bucket == NULL && real_path == NULL) { /* We used the pathname directly. Call tsrm_realpath */ /* so that entry is created in realpath cache */ real_path = (char *)malloc(MAX_PATH); - if(tsrm_realpath(pathname, real_path TSRMLS_CC) != NULL) { + if(tsrm_realpath(pathname, real_path) != NULL) { pathname = real_path; - bucket = realpath_cache_lookup(pathname, (int)strlen(pathname), t TSRMLS_CC); + bucket = realpath_cache_lookup(pathname, (int)strlen(pathname), t); } } } @@ -380,7 +383,7 @@ Finished: } -static process_pair *process_get(FILE *stream TSRMLS_DC) +static process_pair *process_get(FILE *stream) { process_pair *ptr; process_pair *newptr; @@ -410,7 +413,6 @@ static shm_pair *shm_get(int key, void *addr) { shm_pair *ptr; shm_pair *newptr; - TSRMLS_FETCH(); for (ptr = TWG(shm); ptr < (TWG(shm) + TWG(shm_size)); ptr++) { if (!ptr->descriptor) { @@ -448,12 +450,11 @@ static HANDLE dupHandle(HANDLE fh, BOOL inherit) { TSRM_API FILE *popen(const char *command, const char *type) { - TSRMLS_FETCH(); - return popen_ex(command, type, NULL, NULL TSRMLS_CC); + return popen_ex(command, type, NULL, NULL); } -TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env TSRMLS_DC) +TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env) { FILE *stream = NULL; int fno, type_len, read, mode; @@ -550,7 +551,7 @@ TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, } CloseHandle(process.hThread); - proc = process_get(NULL TSRMLS_CC); + proc = process_get(NULL); if (read) { fno = _open_osfhandle((tsrm_intptr_t)in, _O_RDONLY | mode); @@ -570,9 +571,8 @@ TSRM_API int pclose(FILE *stream) { DWORD termstat = 0; process_pair *process; - TSRMLS_FETCH(); - if ((process = process_get(stream TSRMLS_CC)) == NULL) { + if ((process = process_get(stream)) == NULL) { return 0; } diff --git a/TSRM/tsrm_win32.h b/TSRM/tsrm_win32.h index beff1e88cf..8cefb664be 100644 --- a/TSRM/tsrm_win32.h +++ b/TSRM/tsrm_win32.h @@ -71,7 +71,8 @@ typedef struct { } tsrm_win32_globals; #ifdef ZTS -# define TWG(v) TSRMG(win32_globals_id, tsrm_win32_globals *, v) +# define TWG(v) TSRMG_STATIC(win32_globals_id, tsrm_win32_globals *, v) +TSRMLS_CACHE_EXTERN; #else # define TWG(v) (win32_globals.v) #endif @@ -93,15 +94,15 @@ typedef struct { #define SHM_RND FILE_MAP_WRITE #define SHM_REMAP FILE_MAP_COPY -char * tsrm_win32_get_path_sid_key(const char *pathname TSRMLS_DC); +char * tsrm_win32_get_path_sid_key(const char *pathname ); TSRM_API void tsrm_win32_startup(void); TSRM_API void tsrm_win32_shutdown(void); -TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env TSRMLS_DC); +TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env); TSRM_API FILE *popen(const char *command, const char *type); TSRM_API int pclose(FILE *stream); -TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC); +TSRM_API int tsrm_win32_access(const char *pathname, int mode); TSRM_API int win32_utime(const char *filename, struct utimbuf *buf); TSRM_API int shmget(int key, int size, int flags); |