diff options
author | Zeev Suraski <zeev@php.net> | 1999-04-21 17:26:37 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 1999-04-21 17:26:37 +0000 |
commit | a9f9ae792030e99b6552ff9090cc8e808d148fc1 (patch) | |
tree | e9099559593a0d4d45da69c7669ea2a2f07573af /Zend | |
parent | 48e350a94dbc50cec96c0ac7908c6bc1e12b1c1d (diff) | |
download | php-git-a9f9ae792030e99b6552ff9090cc8e808d148fc1.tar.gz |
Thread safety patch. It works now with 'just in time' resource initialization!
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend.c | 35 | ||||
-rw-r--r-- | Zend/zend_compile.c | 2 | ||||
-rw-r--r-- | Zend/zend_constants.c | 30 | ||||
-rw-r--r-- | Zend/zend_constants.h | 32 | ||||
-rw-r--r-- | Zend/zend_list.c | 8 | ||||
-rw-r--r-- | Zend/zend_list.h | 4 |
6 files changed, 62 insertions, 49 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index 1103983e24..e5df93f046 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -161,8 +161,6 @@ static FILE *zend_fopen_wrapper(const char *filename) static void register_standard_class() { - CLS_FETCH(); - standard_class.type = ZEND_INTERNAL_CLASS; standard_class.name_length = sizeof("stdClass") - 1; standard_class.name = zend_strndup("stdClass", standard_class.name_length); @@ -198,11 +196,32 @@ static void compiler_globals_dtor(zend_compiler_globals *compiler_globals) zend_hash_destroy(compiler_globals->class_table); free(compiler_globals->class_table); } + + +static void executor_globals_ctor(zend_executor_globals *executor_globals) +{ + zend_startup_constants(ELS_C); +} + + +static void executor_globals_dtor(zend_executor_globals *executor_globals) +{ + zend_shutdown_constants(ELS_C); +} + + #endif int zend_startup(zend_utility_functions *utility_functions, char **extensions) { +#ifdef ZTS + zend_executor_globals *executor_globals; + + tsrm_startup(1,1,0); + alloc_globals_id = ts_allocate_id(sizeof(zend_alloc_globals), NULL, NULL); +#endif + start_memory_manager(); /* Set up utility functions and values */ @@ -227,7 +246,7 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) /* Prepare data structures */ #ifndef ZTS - zend_startup_constants(); + zend_startup_constants(ELS_C); #endif GLOBAL_FUNCTION_TABLE = (HashTable *) malloc(sizeof(HashTable)); GLOBAL_CLASS_TABLE = (HashTable *) malloc(sizeof(HashTable)); @@ -235,16 +254,16 @@ int zend_startup(zend_utility_functions *utility_functions, char **extensions) zend_hash_init(GLOBAL_CLASS_TABLE, 10, NULL, (void (*)(void *)) destroy_zend_class, 1); register_standard_class(); zend_hash_init(&module_registry, 50, NULL, (void (*)(void *)) module_destructor, 1); - init_resource_plist(); zend_hash_init(&list_destructors, 50, NULL, NULL, 1); #ifdef ZTS - tsrm_startup(1,1,0); compiler_globals_id = ts_allocate_id(sizeof(zend_compiler_globals), (void (*)(void *)) compiler_globals_ctor, (void (*)(void *)) compiler_globals_dtor); - executor_globals_id = ts_allocate_id(sizeof(zend_executor_globals), NULL, NULL); - alloc_globals_id = ts_allocate_id(sizeof(zend_alloc_globals), NULL, NULL); + executor_globals_id = ts_allocate_id(sizeof(zend_executor_globals), (void (*)(void *)) executor_globals_ctor, (void (*)(void *)) executor_globals_dtor); + executor_globals = ts_resource(executor_globals_id); #endif + init_resource_plist(ELS_C); + return SUCCESS; } @@ -261,7 +280,7 @@ void zend_shutdown() zend_shutdown_extensions(); free(zend_version_info); #ifndef ZTS - zend_shutdown_constants(); + zend_shutdown_constants(ELS_C); #endif } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 03e0efc69b..9aafb0c9a8 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -65,7 +65,7 @@ void init_compiler(CLS_D ELS_DC) CG(asp_tags) = ZEND_UV(asp_tags); CG(handle_op_arrays) = 1; zend_hash_apply(&module_registry, (int (*)(void *)) module_registry_request_startup); - init_resource_list(); + init_resource_list(ELS_C); } diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index d94574f7cb..a533026f48 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -59,7 +59,7 @@ void clean_module_constants(int module_number) } -int zend_startup_constants(void) +int zend_startup_constants(ELS_D) { #if WIN32|WINNT DWORD dwBuild=0; @@ -67,7 +67,6 @@ int zend_startup_constants(void) DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); #endif - ELS_FETCH(); /* ZEND_FIX: Move to PHP */ @@ -114,23 +113,21 @@ int zend_startup_constants(void) c.name_len = 5; c.value.value.lval = 1; c.value.type = IS_BOOL; - zend_register_constant(&c); + zend_register_constant(&c ELS_CC); c.name = zend_strndup("FALSE",5); c.name_len = 6; c.value.value.lval = 0; c.value.type = IS_BOOL; - zend_register_constant(&c); + zend_register_constant(&c ELS_CC); } return SUCCESS; } -int zend_shutdown_constants(void) +int zend_shutdown_constants(ELS_D) { - ELS_FETCH(); - zend_hash_destroy(EG(zend_constants)); free(EG(zend_constants)); return SUCCESS; @@ -145,7 +142,7 @@ void clean_non_persistent_constants(void) } -ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number) +ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number ELS_DC) { zend_constant c; @@ -155,11 +152,11 @@ ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, c.name = zend_strndup(name,name_len); c.name_len = name_len; c.module_number = module_number; - zend_register_constant(&c); + zend_register_constant(&c ELS_CC); } -ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number) +ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number ELS_DC) { zend_constant c; @@ -169,11 +166,11 @@ ZEND_API void zend_register_double_constant(char *name, uint name_len, double dv c.name = zend_strndup(name,name_len); c.name_len = name_len; c.module_number = module_number; - zend_register_constant(&c); + zend_register_constant(&c ELS_CC); } -ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number) +ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number ELS_DC) { zend_constant c; @@ -184,13 +181,13 @@ ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *st c.name = zend_strndup(name,name_len); c.name_len = name_len; c.module_number = module_number; - zend_register_constant(&c); + zend_register_constant(&c ELS_CC); } -ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number) +ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number ELS_DC) { - zend_register_stringl_constant(name, name_len, strval, strlen(strval), flags, module_number); + zend_register_stringl_constant(name, name_len, strval, strlen(strval), flags, module_number ELS_CC); } @@ -220,10 +217,9 @@ ZEND_API int zend_get_constant(char *name, uint name_len, zval *result) } -ZEND_API void zend_register_constant(zend_constant *c) +ZEND_API void zend_register_constant(zend_constant *c ELS_DC) { char *lowercase_name = zend_strndup(c->name, c->name_len); - ELS_FETCH(); #if 0 printf("Registering constant for module %d\n",c->module_number); diff --git a/Zend/zend_constants.h b/Zend/zend_constants.h index b03ac9c766..f7c85476f1 100644 --- a/Zend/zend_constants.h +++ b/Zend/zend_constants.h @@ -17,6 +17,8 @@ #ifndef _CONSTANTS_H #define _CONSTANTS_H +#include "zend_globals.h" + #define CONST_CS 0x1 /* Case Sensitive */ #define CONST_PERSISTENT 0x2 @@ -28,26 +30,26 @@ typedef struct { int module_number; } zend_constant; -#define REGISTER_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),module_number) -#define REGISTER_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),module_number) -#define REGISTER_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),module_number) -#define REGISTER_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),module_number) +#define REGISTER_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),module_number ELS_CC) +#define REGISTER_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),module_number ELS_CC) +#define REGISTER_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),module_number ELS_CC) +#define REGISTER_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),module_number ELS_CC) -#define REGISTER_MAIN_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),0) -#define REGISTER_MAIN_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),0) -#define REGISTER_MAIN_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),0) -#define REGISTER_MAIN_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),0) +#define REGISTER_MAIN_LONG_CONSTANT(name,lval,flags) zend_register_long_constant((name),sizeof(name),(lval),(flags),0 ELS_CC) +#define REGISTER_MAIN_DOUBLE_CONSTANT(name,dval,flags) zend_register_double_constant((name),sizeof(name),(dval),(flags),0 ELS_CC) +#define REGISTER_MAIN_STRING_CONSTANT(name,str,flags) zend_register_string_constant((name),sizeof(name),(str),(flags),0 ELS_CC) +#define REGISTER_MAIN_STRINGL_CONSTANT(name,str,len,flags) zend_register_stringl_constant((name),sizeof(name),(str),(len),(flags),0 ELS_CC) void clean_module_constants(int module_number); void free_zend_constant(zend_constant *c); -int zend_startup_constants(void); -int zend_shutdown_constants(void); +int zend_startup_constants(ELS_D); +int zend_shutdown_constants(ELS_D); void clean_non_persistent_constants(void); ZEND_API int zend_get_constant(char *name, uint name_len, zval *result); -ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number); -ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number); -ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number); -ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number); -ZEND_API void zend_register_constant(zend_constant *c); +ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number ELS_DC); +ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number ELS_DC); +ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number ELS_DC); +ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number ELS_DC); +ZEND_API void zend_register_constant(zend_constant *c ELS_DC); #endif diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 9c5c6caf80..87e7c6bc3a 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -175,18 +175,14 @@ void plist_entry_destructor(void *ptr) } -int init_resource_list(void) +int init_resource_list(ELS_D) { - ELS_FETCH(); - return zend_hash_init(&EG(regular_list), 0, NULL, list_entry_destructor, 0); } -int init_resource_plist(void) +int init_resource_plist(ELS_D) { - ELS_FETCH(); - return zend_hash_init(&EG(persistent_list), 0, NULL, plist_entry_destructor, 1); } diff --git a/Zend/zend_list.h b/Zend/zend_list.h index b3e11a0c69..5edfc4a818 100644 --- a/Zend/zend_list.h +++ b/Zend/zend_list.h @@ -45,8 +45,8 @@ void list_entry_destructor(void *ptr); void plist_entry_destructor(void *ptr); int clean_module_resource_destructors(list_destructors_entry *ld, int *module_number); -int init_resource_list(void); -int init_resource_plist(void); +int init_resource_list(ELS_D); +int init_resource_plist(ELS_D); void destroy_resource_list(void); void destroy_resource_plist(void); |