Thread safety patch. It works now with 'just in time' resource initialization!

This commit is contained in:
Zeev Suraski 1999-04-21 17:26:37 +00:00
parent 48e350a94d
commit a9f9ae7920
6 changed files with 62 additions and 49 deletions

View 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
}

View 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);
}

View 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);

View 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

View 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);
}

View 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);