From 974a8f8ad2a0ed923abb5c63cfc7d73e2c81e21f Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 31 Oct 2017 02:16:46 +0300 Subject: [PATCH] Use internet strings for EG(ini_entries) --- Zend/zend.c | 4 ---- Zend/zend_ini.c | 12 ++++++------ ext/opcache/ZendAccelerator.c | 17 +++++++++++++++++ ext/opcache/zend_accelerator_module.c | 6 +++--- main/main.c | 4 ++++ 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index fc2b15b54b..47c95c9dd1 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -948,10 +948,6 @@ void zend_shutdown(void) /* {{{ */ GLOBAL_CONSTANTS_TABLE = NULL; #endif zend_destroy_rsrc_list_dtors(); - -#ifndef ZTS - zend_interned_strings_dtor(); -#endif } /* }}} */ diff --git a/Zend/zend_ini.c b/Zend/zend_ini.c index f585bba2d2..4c1f52d4af 100644 --- a/Zend/zend_ini.c +++ b/Zend/zend_ini.c @@ -157,13 +157,13 @@ static void copy_ini_entry(zval *zv) /* {{{ */ Z_PTR_P(zv) = new_entry; memcpy(new_entry, old_entry, sizeof(zend_ini_entry)); if (old_entry->name) { - new_entry->name = zend_string_init(ZSTR_VAL(old_entry->name), ZSTR_LEN(old_entry->name), 1); + new_entry->name = zend_string_dup(old_entry->name, 1); } if (old_entry->value) { - new_entry->value = zend_string_init(ZSTR_VAL(old_entry->value), ZSTR_LEN(old_entry->value), 1); + new_entry->value = zend_string_dup(old_entry->value, 1); } if (old_entry->orig_value) { - new_entry->orig_value = zend_string_init(ZSTR_VAL(old_entry->orig_value), ZSTR_LEN(old_entry->orig_value), 1); + new_entry->orig_value = zend_string_dup(old_entry->orig_value, 1); } } /* }}} */ @@ -231,7 +231,7 @@ ZEND_API int zend_register_ini_entries(const zend_ini_entry_def *ini_entry, int while (ini_entry->name) { p = pemalloc(sizeof(zend_ini_entry), 1); - p->name = zend_string_init(ini_entry->name, ini_entry->name_length, 1); + p->name = zend_string_init_interned(ini_entry->name, ini_entry->name_length, 1); p->on_modify = ini_entry->on_modify; p->mh_arg1 = ini_entry->mh_arg1; p->mh_arg2 = ini_entry->mh_arg2; @@ -255,10 +255,10 @@ ZEND_API int zend_register_ini_entries(const zend_ini_entry_def *ini_entry, int if (((default_value = zend_get_configuration_directive(p->name)) != NULL) && (!p->on_modify || p->on_modify(p, Z_STR_P(default_value), p->mh_arg1, p->mh_arg2, p->mh_arg3, ZEND_INI_STAGE_STARTUP) == SUCCESS)) { - p->value = zend_string_copy(Z_STR_P(default_value)); + p->value = zend_new_interned_string(zend_string_copy(Z_STR_P(default_value))); } else { p->value = ini_entry->value ? - zend_string_init(ini_entry->value, ini_entry->value_length, 1) : NULL; + zend_string_init_interned(ini_entry->value, ini_entry->value_length, 1) : NULL; if (p->on_modify) { p->on_modify(p, p->value, p->mh_arg1, p->mh_arg2, p->mh_arg3, ZEND_INI_STAGE_STARTUP); diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 02de091a58..d2ad109254 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -662,6 +662,23 @@ static void accel_copy_permanent_strings(zend_new_interned_string_func_t new_int p->key = new_interned_string(p->key); } } ZEND_HASH_FOREACH_END(); + + ZEND_HASH_FOREACH_BUCKET(EG(ini_directives), p) { + zend_ini_entry *entry = (zend_ini_entry*)Z_PTR(p->val); + + if (p->key) { + p->key = new_interned_string(p->key); + } + if (entry->name) { + entry->name = new_interned_string(entry->name); + } + if (entry->value) { + entry->value = new_interned_string(entry->value); + } + if (entry->orig_value) { + entry->orig_value = new_interned_string(entry->orig_value); + } + } ZEND_HASH_FOREACH_END(); } static zend_string *accel_replace_string_by_shm_permanent(zend_string *str) diff --git a/ext/opcache/zend_accelerator_module.c b/ext/opcache/zend_accelerator_module.c index 6c8efac7c7..31e5e948a7 100644 --- a/ext/opcache/zend_accelerator_module.c +++ b/ext/opcache/zend_accelerator_module.c @@ -128,7 +128,7 @@ static ZEND_INI_MH(OnUpdateMemoryConsumption) return FAILURE; } - ini_entry->value = zend_string_init(new_new_value, 1, 1); + ini_entry->value = zend_string_init_interned(new_new_value, 1, 1); } if (UNEXPECTED(memsize > ZEND_ULONG_MAX / (1024 * 1024))) { *p = ZEND_ULONG_MAX; @@ -176,7 +176,7 @@ static ZEND_INI_MH(OnUpdateMaxAcceleratedFiles) sizeof("opcache.max_accelerated_files")-1)) == NULL) { return FAILURE; } - ini_entry->value = zend_string_init(new_new_value, strlen(new_new_value), 1); + ini_entry->value = zend_string_init_interned(new_new_value, strlen(new_new_value), 1); } *p = size; return SUCCESS; @@ -210,7 +210,7 @@ static ZEND_INI_MH(OnUpdateMaxWastedPercentage) sizeof("opcache.max_wasted_percentage")-1)) == NULL) { return FAILURE; } - ini_entry->value = zend_string_init(new_new_value, strlen(new_new_value), 1); + ini_entry->value = zend_string_init_interned(new_new_value, strlen(new_new_value), 1); } *p = (double)percentage / 100.0; return SUCCESS; diff --git a/main/main.c b/main/main.c index ef619a76fa..962b9d5e9b 100644 --- a/main/main.c +++ b/main/main.c @@ -2347,6 +2347,10 @@ void php_module_shutdown(void) php_output_shutdown(); +#ifndef ZTS + zend_interned_strings_dtor(); +#endif + module_initialized = 0; #ifndef ZTS -- 2.50.1