summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-04-21 17:26:37 +0000
committerZeev Suraski <zeev@php.net>1999-04-21 17:26:37 +0000
commita9f9ae792030e99b6552ff9090cc8e808d148fc1 (patch)
treee9099559593a0d4d45da69c7669ea2a2f07573af /Zend
parent48e350a94dbc50cec96c0ac7908c6bc1e12b1c1d (diff)
downloadphp-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.c35
-rw-r--r--Zend/zend_compile.c2
-rw-r--r--Zend/zend_constants.c30
-rw-r--r--Zend/zend_constants.h32
-rw-r--r--Zend/zend_list.c8
-rw-r--r--Zend/zend_list.h4
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);