mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
Partially enable leak reports for objects
Cycle leaks are currently not reported, because this needs further work. The last GC run has been moved to run earlier (before the object store free), so that array cycles that hold references to objects don't show up as leaks. Fingers crossed that this doesn't adversely affect anything else.
This commit is contained in:
parent
f616a6f1eb
commit
aef96d5169
3 changed files with 11 additions and 9 deletions
|
@ -967,12 +967,6 @@ ZEND_API void zend_deactivate(void) /* {{{ */
|
|||
shutdown_compiler();
|
||||
} zend_end_try();
|
||||
|
||||
#if ZEND_DEBUG
|
||||
if (GC_G(gc_enabled) && !CG(unclean_shutdown)) {
|
||||
gc_collect_cycles();
|
||||
}
|
||||
#endif
|
||||
|
||||
zend_destroy_rsrc_list(&EG(regular_list));
|
||||
|
||||
#if GC_BENCH
|
||||
|
|
|
@ -331,6 +331,12 @@ void shutdown_executor(void) /* {{{ */
|
|||
zend_close_rsrc_list(&EG(regular_list));
|
||||
} zend_end_try();
|
||||
|
||||
#if ZEND_DEBUG
|
||||
if (GC_G(gc_enabled) && !CG(unclean_shutdown)) {
|
||||
gc_collect_cycles();
|
||||
}
|
||||
#endif
|
||||
|
||||
zend_try {
|
||||
zend_objects_store_free_object_storage(&EG(objects_store));
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
|
|||
{
|
||||
uint32_t i;
|
||||
|
||||
/* Free object properties but don't free object their selves */
|
||||
/* Free object contents, but don't free objects themselves */
|
||||
for (i = objects->top - 1; i > 0 ; i--) {
|
||||
zend_object *obj = objects->object_buckets[i];
|
||||
|
||||
|
@ -94,11 +94,13 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
|
|||
}
|
||||
}
|
||||
|
||||
/* Now free objects theirselves */
|
||||
/* Free objects themselves if they now have a refcount of 0, which means that
|
||||
* they were previously part of a cycle. Everything else will report as a leak.
|
||||
* Cycles are allowed because not all internal objects currently support GC. */
|
||||
for (i = 1; i < objects->top ; i++) {
|
||||
zend_object *obj = objects->object_buckets[i];
|
||||
|
||||
if (IS_OBJ_VALID(obj)) {
|
||||
if (IS_OBJ_VALID(obj) && GC_REFCOUNT(obj) == 0) {
|
||||
/* Not adding to free list as we are shutting down anyway */
|
||||
void *ptr = ((char*)obj) - obj->handlers->offset;
|
||||
GC_REMOVE_FROM_BUFFER(obj);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue