mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Thread safety patch. It works now with 'just in time' resource initialization!
This commit is contained in:
parent
48e350a94d
commit
a9f9ae7920
6 changed files with 62 additions and 49 deletions
35
Zend/zend.c
35
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
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue