From: Jim Zubov Date: Thu, 9 Feb 2017 17:40:33 +0000 (-0500) Subject: Added EG(flags) - executor global flags X-Git-Tag: php-7.2.0alpha1~389^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1b1399c95d1358b23f234c14e84dda9b5007904e;p=php Added EG(flags) - executor global flags EG_FLAGS_IN_SHUTDOWN - is set when PHP is in shutdown state --- diff --git a/Zend/zend.c b/Zend/zend.c index bcbca562b1..c5236ba7ea 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -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; } /* }}} */ diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h index 083875fc2c..3440edfc69 100644 --- a/Zend/zend_globals.h +++ b/Zend/zend_globals.h @@ -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; diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index b64d413fc2..3aedba1bda 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -26,15 +26,12 @@ #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 { diff --git a/main/main.c b/main/main.c index a8674a5d11..0d84763823 100644 --- a/main/main.c +++ b/main/main.c @@ -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);