diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2018-09-16 13:42:00 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2018-09-17 10:13:55 +0200 |
commit | 178dcd47490f7d7842c6c412e2331ed160e55809 (patch) | |
tree | 971fb1ce25b1a0e2c7f274e97072d173146caa99 /Zend/zend_execute_API.c | |
parent | ba3bd4ae063103dd63e53a614dd714195a947898 (diff) | |
download | php-git-178dcd47490f7d7842c6c412e2331ed160e55809.tar.gz |
Perform final GC before the object store is freed
free_object_storage intentionally does not free the object allocations
to make sure that they show up as leaks. However, if the object is in
the GC root buffer, the later GC run may end up freeing the allocation,
hiding the leak.
Avoid this by moving the final GC run before free_object_storage, the
way it was done before fast_shutdown was integrated into core.
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r-- | Zend/zend_execute_API.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 57a7e80819..5b6012767c 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -265,6 +265,16 @@ void shutdown_executor(void) /* {{{ */ zend_close_rsrc_list(&EG(regular_list)); } zend_end_try(); + if (!fast_shutdown) { + zend_hash_graceful_reverse_destroy(&EG(symbol_table)); + +#if ZEND_DEBUG + if (gc_enabled() && !CG(unclean_shutdown)) { + gc_collect_cycles(); + } +#endif + } + zend_objects_store_free_object_storage(&EG(objects_store), fast_shutdown); /* All resources and objects are destroyed. */ @@ -286,14 +296,6 @@ void shutdown_executor(void) /* {{{ */ zend_hash_discard(EG(class_table), EG(persistent_classes_count)); zend_cleanup_internal_classes(); } else { - zend_hash_graceful_reverse_destroy(&EG(symbol_table)); - -#if ZEND_DEBUG - if (gc_enabled() && !CG(unclean_shutdown)) { - gc_collect_cycles(); - } -#endif - /* remove error handlers before destroying classes and functions, * so that if handler used some class, crash would not happen */ if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) { |