From bb4a19b5ad6a8fc6720154700aabfa32f4b71244 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Tue, 26 Nov 2013 11:46:49 +0000 Subject: [PATCH] Evas layer: Fix deletion of canvas with still-refed objects. This fixes the infinite loop while deleting canvases with still referenced objects. The canvas should not assume it can get rid of all of the objects. Some objects might be referenced. I also added a printf to let the user know about it. This fixes T565. --- src/lib/evas/canvas/evas_layer.c | 7 +++---- src/lib/evas/canvas/evas_main.c | 7 +++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/lib/evas/canvas/evas_layer.c b/src/lib/evas/canvas/evas_layer.c index 3c2a622..a52391e 100644 --- a/src/lib/evas/canvas/evas_layer.c +++ b/src/lib/evas/canvas/evas_layer.c @@ -77,11 +77,10 @@ evas_layer_pre_free(Evas_Layer *lay) void evas_layer_free_objects(Evas_Layer *lay) { - while (lay->objects) - { - Evas_Object_Protected_Data *obj; + Evas_Object_Protected_Data *obj; - obj = (Evas_Object_Protected_Data *)lay->objects; + EINA_INLIST_FREE(lay->objects, obj) + { evas_object_free(obj->object, 0); } } diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 60c23af..185b4a5 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -233,8 +233,11 @@ _destructor(Eo *eo_e, void *_pd, va_list *list EINA_UNUSED) { if (!o->delete_me) { - if (o->ref > 0) - ERR("obj(%p, %s) ref count(%d) is bigger than 0. This object couldn't be deleted", o, o->type, o->ref); + if ((o->ref > 0) || (eo_ref_get(o->object) > 0)) + { + ERR("obj(%p, %s) ref count(%d) is bigger than 0. This object couldn't be deleted", o, o->type, eo_ref_get(o->object)); + continue; + } del = EINA_TRUE; } } -- 2.7.4