]> granicus.if.org Git - php/commitdiff
fix known interned strings init with TS per request
authorAnatol Belski <ab@php.net>
Thu, 2 Jun 2016 15:55:48 +0000 (17:55 +0200)
committerAnatol Belski <ab@php.net>
Thu, 2 Jun 2016 15:55:48 +0000 (17:55 +0200)
Zend/zend.c
Zend/zend_string.c
Zend/zend_string.h

index c4b91ce31aa038c9ff8da8aee2c7b19bf25e848b..f2fa4b12d9269e5b9ce4975b1e94e392bc7e8ad5 100644 (file)
@@ -504,6 +504,8 @@ static void compiler_globals_ctor(zend_compiler_globals *compiler_globals) /* {{
        compiler_globals->empty_string = zend_zts_interned_string_init("", sizeof("")-1);
 
        memset(compiler_globals->one_char_string, 0, sizeof(compiler_globals->one_char_string));
+
+       zend_known_interned_strings_init(&compiler_globals->known_strings, &compiler_globals->known_strings_count);
 }
 /* }}} */
 
@@ -530,6 +532,9 @@ static void compiler_globals_dtor(zend_compiler_globals *compiler_globals) /* {{
        compiler_globals->last_static_member = 0;
 
        zend_zts_interned_string_free(&compiler_globals->empty_string);
+
+       compiler_globals->known_strings = NULL;
+       compiler_globals->known_strings_count = 0;
 }
 /* }}} */
 
index 4866b64949ee085d8545ae057c8153f66feda44b..3da95bd67449098378a3dcc4205e2581da5de16f 100644 (file)
@@ -42,22 +42,26 @@ static void _str_dtor(zval *zv)
 }
 #endif
 
+/* Readonly, so assigned also per thread. */
+static const zend_string **known_interned_strings = NULL;
+static uint32_t known_interned_strings_count = 0;
+
 ZEND_API uint32_t zend_intern_known_strings(const char **strings, uint32_t count)
 {
-       uint32_t i, old_count = CG(known_strings_count);
+       uint32_t i, old_count = known_interned_strings_count;
 
-       CG(known_strings) = perealloc(CG(known_strings), sizeof(char*) * (old_count + count), 1);
+       known_interned_strings = perealloc(known_interned_strings, sizeof(char*) * (old_count + count), 1);
        for (i = 0; i < count; i++) {
 #ifndef ZTS
                zend_string *str = zend_string_init(strings[i], strlen(strings[i]), 1);
-               CG(known_strings)[CG(known_strings_count) + i] =
+               known_interned_strings[known_interned_strings_count + i] =
                        zend_new_interned_string_int(str);
 #else
-               CG(known_strings)[CG(known_strings_count) + i] =
+               known_interned_strings[known_interned_strings_count + i] =
                        zend_zts_interned_string_init(strings[i], strlen(strings[i]));
 #endif
        }
-       CG(known_strings_count) = old_count + count;
+       known_interned_strings_count = old_count + count;
        return old_count;
 }
 
@@ -68,6 +72,12 @@ ZEND_KNOWN_STRINGS(_ZEND_STR_DSC)
        NULL
 };
 
+void zend_known_interned_strings_init(zend_string ***strings, uint32_t *count)
+{
+       *strings = known_interned_strings;
+       *count   = known_interned_strings_count;
+}
+
 void zend_interned_strings_init(void)
 {
 #ifndef ZTS
@@ -90,9 +100,8 @@ void zend_interned_strings_init(void)
        memset(CG(one_char_string), 0, sizeof(CG(one_char_string)));
 
        /* known strings */
-       CG(known_strings) = NULL;
-       CG(known_strings_count) = 0;
        zend_intern_known_strings(known_strings, (sizeof(known_strings) / sizeof(known_strings[0])) - 1);
+       zend_known_interned_strings_init(&CG(known_strings), &CG(known_strings_count));
 
        zend_new_interned_string = zend_new_interned_string_int;
        zend_interned_strings_snapshot = zend_interned_strings_snapshot_int;
index 05bf4ef7b8cc93b9e919a031aed0b1e1f338d931..8a1ac6f506d4eb97ac61fa17b07420708f95b153 100644 (file)
@@ -32,6 +32,7 @@ ZEND_API extern void (*zend_interned_strings_restore)(void);
 ZEND_API zend_ulong zend_hash_func(const char *str, size_t len);
 void zend_interned_strings_init(void);
 void zend_interned_strings_dtor(void);
+void zend_known_interned_strings_init(zend_string ***, uint32_t *);
 
 END_EXTERN_C()