]> granicus.if.org Git - php/commitdiff
Thread safety patch. It works now with 'just in time' resource initialization!
authorZeev Suraski <zeev@php.net>
Wed, 21 Apr 1999 17:26:37 +0000 (17:26 +0000)
committerZeev Suraski <zeev@php.net>
Wed, 21 Apr 1999 17:26:37 +0000 (17:26 +0000)
Zend/zend.c
Zend/zend_compile.c
Zend/zend_constants.c
Zend/zend_constants.h
Zend/zend_list.c
Zend/zend_list.h

index 1103983e24d07d0d796b7ae29103fbab40c0ad1c..e5df93f0460f3ce995c3bb5ed7c626caf4329e50 100644 (file)
@@ -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
 }
 
index 03e0efc69b430e8201777ce46c96fec60923eb33..9aafb0c9a8f6cb6f3f0eee04769dd87ec0b7e5bb 100644 (file)
@@ -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);
 }
 
 
index d94574f7cb6edd58dd23a6d3b4bbb56099c49637..a533026f486b5cae0eac972889ed815083e93d57 100644 (file)
@@ -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);
index b03ac9c766e248a51e2b7de8b368c3e79e91261d..f7c85476f16d191171dd636228bd7549110ef50e 100644 (file)
@@ -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
index 9c5c6caf8001fa07270dd35eb0086b0fa49bfd37..87e7c6bc3acbb4dbce600a1d0fe31dfba92dd273 100644 (file)
@@ -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);
 }
 
index b3e11a0c6967468a002f4c9cd0a336211e1a8649..5edfc4a818e74594984c306426d41abab34c33c2 100644 (file)
@@ -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);