tasn pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=bb4a19b5ad6a8fc6720154700aabfa32f4b71244

commit bb4a19b5ad6a8fc6720154700aabfa32f4b71244
Author: Tom Hacohen <[email protected]>
Date:   Tue Nov 26 11:46:49 2013 +0000

    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;
                     }
                }

-- 


Reply via email to