]> granicus.if.org Git - php/commitdiff
Added EG(flags) - executor global flags
authorJim Zubov <jim@commercebyte.com>
Thu, 9 Feb 2017 17:40:33 +0000 (12:40 -0500)
committerJim Zubov <jim@commercebyte.com>
Thu, 9 Feb 2017 17:40:33 +0000 (12:40 -0500)
EG_FLAGS_IN_SHUTDOWN - is set when PHP is in shutdown state

Zend/zend.c
Zend/zend_globals.h
Zend/zend_objects_API.c
main/main.c

index bcbca562b198b08cb0860696e25cf455d743e719..c5236ba7ea6dd546f40ecfc2b52a47551082ec83 100644 (file)
@@ -648,6 +648,7 @@ static void executor_globals_ctor(zend_executor_globals *executor_globals) /* {{
 #ifdef ZEND_WIN32
        zend_get_windows_version_info(&executor_globals->windows_version_info);
 #endif
+       executor_globals->flags = EG_FLAGS_INITIAL;
 }
 /* }}} */
 
index 083875fc2ce37f3c95bfb778122e4796a968db06..3440edfc69bbce1a92aba91a9f8026f63fac5f81 100644 (file)
@@ -214,6 +214,7 @@ struct _zend_executor_globals {
 
        zend_bool active;
        zend_bool valid_symbol_table;
+       zend_uchar flags;
 
        zend_long assertions;
 
@@ -235,6 +236,9 @@ struct _zend_executor_globals {
        void *reserved[ZEND_MAX_RESERVED_RESOURCES];
 };
 
+#define EG_FLAGS_INITIAL       0x00
+#define EG_FLAGS_IN_SHUTDOWN   0x01
+
 struct _zend_ini_scanner_globals {
        zend_file_handle *yy_in;
        zend_file_handle *yy_out;
index b64d413fc233fd82fe70bfc5f62c9e457db4f58e..3aedba1bda3f6a0b47943be4834463eaf1b38025 100644 (file)
 #include "zend_API.h"
 #include "zend_objects_API.h"
 
-ZEND_TLS zend_objects_store_no_reuse; /* Would make more sense to make it a member of zend_objects_store, defining as a global to not break alignments */
-
 ZEND_API void zend_objects_store_init(zend_objects_store *objects, uint32_t init_size)
 {
        objects->object_buckets = (zend_object **) emalloc(init_size * sizeof(zend_object*));
        objects->top = 1; /* Skip 0 so that handles are true */
        objects->size = init_size;
        objects->free_list_head = -1;
-       zend_objects_store_no_reuse = 0;
        memset(&objects->object_buckets[0], 0, sizeof(zend_object*));
 }
 
@@ -46,7 +43,6 @@ ZEND_API void zend_objects_store_destroy(zend_objects_store *objects)
 
 ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects)
 {
-       zend_objects_store_no_reuse = 1; /* new objects spawned by dtors will never reuse unused slots, so their own dtors will be called further down the loop */
        if (objects->top > 1) {
                uint32_t i;
                for (i = 1; i < objects->top; i++) {
@@ -115,7 +111,10 @@ ZEND_API void zend_objects_store_put(zend_object *object)
 {
        int handle;
 
-       if (!zend_objects_store_no_reuse && EG(objects_store).free_list_head != -1) {
+       /* When in shutdown sequesnce - do not reuse previously freed handles, to make sure
+        * the dtors for newly created objects are called in zend_objects_store_call_destructors() loop
+        */
+       if (!(EG(flags) & EG_FLAGS_IN_SHUTDOWN) && EG(objects_store).free_list_head != -1) {
                handle = EG(objects_store).free_list_head;
                EG(objects_store).free_list_head = GET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]);
        } else {
index a8674a5d11784c3fcc1a5954acb09dbd40dbf4c2..0d847638237fb59c87170929cb2b174c6289ecd3 100644 (file)
@@ -1798,6 +1798,8 @@ void php_request_shutdown_for_hook(void *dummy)
 void php_request_shutdown(void *dummy)
 {
        zend_bool report_memleaks;
+       
+       EG(flags) |= EG_FLAGS_IN_SHUTDOWN;
 
        report_memleaks = PG(report_memleaks);